FPGA开发笔记--按键


文章摘要:
本文主要描述了基于FPGA的按键处理模式及思路;

设计思路:
对于机械按键,在按下及弹起时,都会不可避免的产生机械抖动,按键处理的重点就在于消除抖动;FPGA处理的基本思路就是采用抽样的模式,降低采样频率,以滤去高频成分,通俗点讲,就是跳过抖动区域采样,(这种方法思路与单片机处理是完全不同的);

知识要点:下降沿检测逻辑(以后在信号处理中会经常用到);


硬件平台: EP4CE6F17C8
开发环境: Quartus II 13.1


示例代码:

/*
 * 功能描述:按键例程,每一次有效按键反转LED显示
 */
module key_test (
    input clk,   // 时钟
    input keys,  // 按键
    output light // 显示
);


// 50MHz时钟,1us = 50个计数,20ms = 1_000_000个计数;
parameter KEY_SMP_CNT = 32'd1_000_000;

reg[31:0] count;
reg curr_status;   // 当前的状态
reg last_status;   // 前一次的状态(每20ms检测一次)
reg light_status;  // 当前LED状态

wire key_flag;     // 按键有效标志

//-------------------------------------------
/*
 * 下降沿检测逻辑(重点):
 * 当前状态为低,前一次为高时,产生一个上跳信号;
 * (只保持1个时钟周期)
 */
assign key_flag = last_status & ~curr_status;

// 按键采样时序(这里是重点)
always @(posedge clk)
begin

  last_status <= curr_status; // 保存上次的采样值 

  if(count == KEY_SMP_CNT)    // 采样频率
  begin  
      count <= 32'd0;
      curr_status <= keys;    // 按键采样  
  end
  else  
      count <= count + 1'b1;
end

//-------------------------------------------
/*
 * 以下按键测试代码(不重要),每按一次LED显示反转
 */
always @(posedge clk)
begin 
    if(key_flag)
        light_status <= ~light_status; // 每次有效按键反转LED状态
end

assign light = light_status;    // 更新LED显示

endmodule

结果验证: 每按下一次按键,LED灯反转一次;

- 阅读全文 -

FPGA开发笔记--HelloWorld


文章摘要:
近日花巨资从某宝购置了一个套FPGA开发板,拿到板子的第一件事肯定是先跑上大名鼎鼎的跑马灯例程,应当算是硬件开发中的HelloWorld了,本文中要从新建工程到仿真下载验证,来说明FPGA的开发流程,本文的代码不重要,重点在于流程,流程,流程...


硬件平台: EP4CE6F17C8
开发环境: Quartus II 13.1


第一步:新建工程

File --> Open Project Wizard...

1.选择工程目录,指定工程名及设计入口,一般情况下建议工程目录,工程名称及设计入口同名,不能有中文路径;

2.添加已有文件,如果新建的工程,则直接跳过;

3.器件选择,需要与实际用到的器件相同,这里选择EP4CE6F17C8;

4.设置工具,一般直接跳过;

5.信息确认,如果无误则点击Finish完成;

修改默认配置:

Assignments --> Device...
--> Device and Pin Option...

Unused Pins:未用到引脚选择,As input tri-stated;
Valtage 引脚默认电压值,选择 3.3-V LVTTL;


第二步:建立HDL文件

File--> New...
Design Files --> Verilog HDL File

示例代码:

/*
 * 功能描述:流水灯演示
 */
module led_test (
    input clk,              // 时钟输入(外部50MHz晶振)
    input rst_n,            // 复位按键 
    output reg [3:0] led    // 4位LED
);  

// 寄存器定义            
reg [31:0] timer;       // 用于定时器计数

// 计时时钟
always @(posedge clk or negedge rst_n)  
begin
    if(~rst_n)
        timer <= 0;
    else if(timer == 32'd200_000_000)
        timer <= 0;
    else
        timer <= timer + 1'b1;    // 通过脉冲数计算时间
end

// 检测时钟的下降沿和复位的下降沿
always @(posedge clk or negedge rst_n)   
begin
    if (~rst_n)            // 复位信号低电平有效
        led <= 4'b0000;    // LED灯输出全为低,四个LED灯灭     
        
    // 时钟下降沿    
    else
    begin           
        // 50HMz的时钟下,50个时钟为1us
        if(timer == 32'd50_000_000)
            led <= 4'b0001;
        else if (timer == 32'd100_000_000)
            led <= 4'b0010;
        else if (timer == 32'd150_000_000)
            led <= 4'b0100;
        else if (timer == 32'd200_000_000)
            led <= 4'b1000;          
    end      
end

endmodule

保存文件,名称与之前设置的入口文件相同;


第三步:综合

点击Analysis & Synthesis进行综合;


第四步:引脚分配
Assignments --> Pins Planner打开引脚分配页面进行分配;

按照原理图上分配对应的引脚:

CLK --> E1
LED0 --> E10
LED1 --> F9
LED2 --> C9
LED3 --> D9

I/O Standard 根据实际电路选择电平标准,这里选择3.3-V LVTTL;
同一个Bank的引脚的电平标准必须相同;

注意事项:
必须综合之后,才能进行引脚分配,否则系统并不知道你用了哪些引脚;


第五步:编译

点击Complile Design进行全编译;


第六步:下载测试

通过JTAG下载至RAM

点击Program Device打开编译器;
点击Add File...添加output_files目录下生成的sof文件;
点击Start即可进行下载;
下载完成后会自动运行,掉电后会丢失;


固化至配置芯片

文件转换:
File --> Convert Programming Files...
Programming file type:
选择文件格式,指定为jic格式,JTAG Indirect Configuration File(.jic)
Configuration device:
选择配置芯片型号,与目标板上的型号一致(EPCS16)
Flash Loader:与目标板上FPGA的类别一致;
Sof Data:选择编译好的sof文件;
点击Generate生成jic目标文件;
(此时可选择Save Conversion Setup... 保本配置参数,以便下次调入)

下载固化
点击Program Device打开编译器;
点击Add File...添加output_files目录下生成的jic文件;
点击Start即可进行下载;
下载完成后,不会自动运行,需要重上电才能正常运行;


注意事项:

一般只有在完成调试完成后,交付测试时才需要固化,而在调试过程中,则没必要进行固化下载;

- 阅读全文 -

NTP服务器移植及应用


测试平台:S3C2410
内核版本:linux-3.10.1


1.下载源码
http://www.ntp.org/


2.配置及编译

$ ./configure --host=arm-linux --prefix=/opt/rootfs/
$ make
$ make install

部署说明:

1.复制生成的文件至开发板对应的目录;
2.对于生成的二进制文件最好先用strip命令优化一下,以提高运行速度和节省空间;


NTP时间服务器设置:

建立配置文件/etc/ntp.conf

# restrict 命令用于权限设定
# 格式:restrict {IP} [mask netmask] [parameter]
# ignore:   拒绝该地址的所有的NTP服务;
# nomodify: 客户端可通过服务器来授时,但不能使用 ntpc和ntpq这两个命令来修改服务器的时间参数;
# noquery:  不对该客户端提供授时服务;
# notrap:   不提供 trap 远端事件登陆 (remote event logging) 的服务;
# notrust:  拒绝没有认证的客户端;
# 没有参数项,表示不受任何限制;    

# 权限设定,本机地址不受任何限制
restrict 127.0.0.1

# 允许192.168.0.0 网段的所有主机对时
restrict 192.168.0.0 mask 255.255.255.0 nomodify

# 允许192.168.100.20这台主机对时
restrict 192.168.100.20 mask 255.255.255.255 nomodify

# server 用于指定上层的时间服务器
# 格式:server {IP} [ prefer ]
# prefer表示优先使用的服务器
server 210.72.145.44
server time.nist.gov
server time.stdtime.gov.tw


# 对上层服务器开放所有权限
restrict 210.72.145.44
restrict time.nist.gov
restrict time.stdtime.gov.tw
    
# 指定自动更新时间(单位为分钟)
# fudge胡说八道??

fudge time.nist.gov stratum 60

配置完成,启动ntpd.


如果运行时出现错误:

Error resolving 210.72.145.44: Servname not supported for ai_socktype (-8) 1 Jan 02:58:36 
ntpdate[1148]: Can't find host 210.72.145.44: Servname not supported for ai_socktype (-8) 1 Jan 02:58:36 
ntpdate[1148]: no servers can be used, exiting

原因是未指定ntp端口号,修改/etc/services文件,添加以下两行

ntp     123/tcp
ntp     123/udp

客户端手动更新本地时间:

# ntpdata 210.72.145.44

将系统时间写入BIOS

# hwclock -w

几个常用的时间服务器:

time.nist.gov 美国国家标准与技术研究院
210.72.145.44 中国科学院国家授时中心

- 阅读全文 -

服务器搭建--基于arm-linux的web服务器搭建


文章摘要:
本文描述了基于arm-linux平台的web服务器搭建(nginx + php);


硬件平台: s3c2410
内核版本: linux-3.10.1
编译器版本:arm-linux-gcc v4.4.3


nginx服务器搭建

软件版本:nginx-0.6.39/pcre-8.35


1.下载PCRE源码并解压至/usr/src

pcre主要是为了使nginx支持rewrite属性,主要用于php;


2.下载nginx源码,并解压至/usr/src

$./configure --prefix=/usr/local/nginx -conf-path=/etc/nginx/nginx.conf --with-pcre=../pcre-8.34/ 

注意事项:
--conf-path=/etc/nginx/nginx.conf 用来指明运行配置文件的位置


3.修改objs/Makefile

CC =  arm-linux-gcc 
CPP = arm-linux-gcc -E

由于nginx不支持--host选项,所以需要手动更改编译器;


4.配置pcre

$ cd ../pcre-8.35
$ ./configure --disable-shared --host=arm-linux

注意事项:
这一步不能提前,只能在修改Makefile后进行,否则Makefile会丢失;
--host指定主机类型后,会自动生成arm-linux-gcc的编译命令;


5.编译

$cd ../nginx-0.6.39
$make

编译好的nginx文件位于objs目录中;


6.部署安装
将nginx文件复制到开发板的/usr/sbin目录中;
将conf目录的所有文件复制到开发板的/etc/nginx目录;


7.运行

# /usr/sbin/nginx

至此可以浏览器访问通过访问静态html页面;


注意事项:
nginx-0.7.69及以上版本,需要md5支持;


php环境搭建

软件版本:php-5.6.27

1.下载php源码
http://www.php.net/downloads.php

2.编译安装

$CC=arm-linux-gcc
$./configure --host=arm-linux --prefix=/opt/php5 --disable-all --enable-fpm --enable-pdo  --with-zlib --without-iconv
$make
$make install

选项说明:
使能fpm模块(重要): --enable-fpm

嵌入式一般不采用mysql数据库,而是采用sqlite数据库:
--with-sqlite3
--with-sqlite
--with-pdo-sqlite


php-fpm.conf

将etc/php-fpm.conf.default文件复制至目标板/etc/php5/fpm/php-fpm.conf

修改php-fpm.conf,指定pid(重要)
pid = /var/run/php5-fpm.pid


如果目标板没有/var/run和/var/log目录的话,则建立该目录;


3.运行php-fpm

# /usr/local/php5/sbin/php-fpm -y /etc/php-fpm.conf

nginx配置示例:

server {
    listen       80;
    server_name  192.168.9.166;
    
    location / {
        root   /var/www/html;
        index  index.php index.html index.htm;
    }

    location ~ \.php$ {
        root   /var/www/html;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        include        fastcgi_params;
    }

fastcgi_params文件说明:
主要声明了相关的变量

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

在网站根目录建立index.php文件:

<?php
    phpinfo();
?>

重启nginx,即可通过浏览器访问php页面;


相关下载:
http://www.pcre.org/
http://nginx.org/en/download.html
ftp://ftp.penguin.cz/pub/users/mhi/libmd/libmd-0.3.tar.bz2
http://www.php.net/downloads.php

- 阅读全文 -

Typecho应用笔记


函数及变量说明:

站点名称:$this->options->title();
域名地址:$this->options->siteUrl();
后台地址:$this->options->adminUrl();

作者名称:$this->author();
作者邮箱:$this->author->mail();

文件标题:$this->title();
发表时间:$this->date();


模版文件夹地址:$this->options->themeUrl();
阅读全文的链接:$this->permalink;


上一篇: $this->thePrev('%s','没有了');
下一篇: $this->theNext('%s','没有了');


显示全部内容:$this->content();
显示摘要:$this->content('- 阅读全文 -');

显示前N个字节:

$this->excerpt(240, '...<p class="more"><a href="'.$this->permalink.'">- 阅读全文 -</a></p>');

显示内容的前240个字符,并将后边的字符串附加在后边;


参考内容:
http://yijile.com/log/185.html
http://docs.typecho.org/themes/quick-tutorial


修改文件上传路径:
/var/Widget/Upload.php
根目录:const UPLOAD_DIR = '/usr/uploads';
文件名称及路径:共有两处;


插件说明

插件位于usr/plugins/目录中;

代码高亮 GoogleCodePrettify

src目录保存了样式表,每个配置文件一种样式;
github.css

代码间距:
ol.linenums的line-height属性
line-height:1.2em

行号显示:
ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE }
li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none;line-height:1.2em}

list-style-type属性
默认值为:
decimal 显示数字
none 不显示行号
其他值请参考list-style-type的取值;

注意事项:
因为里边没有L4和L9,所以每逢遇到L4或L9的地方,就会显示行号,
如果需要全部都不显示行号,将L4和L9添加进去就可以了;

- 阅读全文 -


Copyright©2025 春天花会开, All Rights Reserved. Email: webmaster@oroct.com