打印
[FPGA]

防抖小程序

[复制链接]
1367|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq470373513|  楼主 | 2015-1-23 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新手一枚,刚开始学FPGA,从学长那里拿来了一块开发板,可是他把例程全丢了,幸亏还给我留了一张原理图,哎哎哎。 这寒假就这么匆匆的来了,时间这么多,不能浪费啊,开始自学,废话不多说,上主题 。
用的是按键驱动LED,在网上找了几个程序,在此特地感谢特权同学给我提供了很多帮助,可是我还是觉得下面的这个防抖程序更简单。
`define ud #1
module ANTI_SHAKE(
                                  //input ports
                                  SYSCLK,
                                  RST_B,
                                  KEY_B,
                                  //output ports
                                  LED_B
                                                );
//****************************************
//input and output declaration
//****************************************
input                          SYSCLK;
input                          RST_B;
input                [3:0]     KEY_B;
output                [3:0]     LED_B;
//****************************************
//reg and wire declaration
//****************************************
wire                          SYSCLK;
wire                          RST_B;
wire                [3:0]     KEY_B;
reg                [3:0]     LED_B;
//****************************************
//reg and wire declaration in the  module
//****************************************
reg                [3:0]     LED_B_N;
reg                [19:0]    TIME_CNT;
wire                [19:0]    TIME_CNT_N;
reg                [3:0]     KEY_B_REG;
wire                [3:0]     KEY_B_REG_N;
wire                [3:0]     PRESS;

//counter
always        @        (posedge SYSCLK or negedge RST_B)
begin
        if(!RST_B)
                TIME_CNT        <=        `ud 20'h0;
        else
                TIME_CNT        <=        `ud TIME_CNT_N;
end
assign TIME_CNT_N        =        TIME_CNT+20'h1;

always        @        (posedge SYSCLK or negedge RST_B)
begin
        if(!RST_B)
                KEY_B_REG        <=        `ud 4'hf;
        else
                KEY_B_REG        <=        `ud KEY_B_REG_N;
end
assign KEY_B_REG_N = (TIME_CNT==20'hfffff)? KEY_B : KEY_B_REG;
assign PRESS = (KEY_B_REG)&(~KEY_B_REG_N);        //pulse edge detected method
//****************************************
//Logic about ANTI_SHAKE,LED control
//****************************************
always        @        (posedge SYSCLK or negedge RST_B)
begin
        if(!RST_B)
                LED_B        <=        `ud        4'hf;
        else
                LED_B        <=        `ud LED_B_N;
end
always        @        (*)
begin
        case (PRESS)
                4'b0001:        LED_B_N = {LED_B[3:1],(~LED_B[0])};
                4'b0010:        LED_B_N = {LED_B[3:2],(~LED_B[1]),LED_B[0]};
                4'b0100:        LED_B_N = {LED_B[3],(~LED_B[2]),LED_B[1:0]};
                4'b1000:        LED_B_N = {(~LED_B[3]),LED_B[2:0]};
                default:LED_B_N = LED_B;
        endcase
end
endmodule

相关帖子

沙发
风魔小象| | 2015-1-23 13:33 | 只看该作者
在学校有寒假真幸福~

使用特权

评论回复
板凳
chenzhi658| | 2015-1-23 15:21 | 只看该作者
//counter
always        @        (posedge SYSCLK or negedge RST_B)
begin
        if(!RST_B)
                TIME_CNT        <=        20'h0;
        else
                TIME_CNT        <=    TIME_CNT+20'h1;
end

为何不这样?异步加法器比同步加法器,资源省点还是其他的?请教

使用特权

评论回复
地板
qq470373513|  楼主 | 2015-1-29 22:23 | 只看该作者
chenzhi658 发表于 2015-1-23 15:21
//counter
always        @        (posedge SYSCLK or negedge RST_B)
begin

额。我只是觉得这样比较好理解啊,还没想过这个问题呐

使用特权

评论回复
5
qq470373513|  楼主 | 2015-1-29 22:59 | 只看该作者
qq470373513 发表于 2015-1-29 22:23
额。我只是觉得这样比较好理解啊,还没想过这个问题呐

嗷,我刚仿真了一下,发现你的写法执行加一更快!但是占的资源都是一样的
你可以试一下。
我也是新手,可以相互学习

使用特权

评论回复
6
qq470373513|  楼主 | 2015-1-29 22:59 | 只看该作者
chenzhi658 发表于 2015-1-23 15:21
//counter
always        @        (posedge SYSCLK or negedge RST_B)
begin

嗷,我刚仿真了一下,发现你的写法执行加一更快!但是占的资源都是一样的
你可以试一下。
我也是新手,可以相互学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝