您的位置:首页 > 其它

FPGA学习笔记之按键控制

2015-11-26 22:49 253 查看
参考:

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二:按键模块① - 消抖

源码如下:

key_funcmod.v

module key_funcmod(clk, rst, key, led, debug_led);

input clk, rst, key;

`define DEG

`ifndef DEG
output reg [1:0] led;
`else
output [1:0] led;
`endif

output reg debug_led;

//`define DEBUG debug_led <= 1'b1;

parameter T10MS=32'd500_000;

reg F1, F2;

always @(posedge clk or negedge rst)
begin
if (!rst)
{F2, F1} <= 2'b11;
else
{F2, F1} <= {F1, key};
end

wire isH2L;
wire isL2H;

assign isH2L = (F2 == 1'b1 && F1 == 1'b0);
assign isL2H = (F2 == 1'b0 && F1 == 1'b1);

reg[3:0] i;
reg[31:0] C1;
reg isPress, isRelease;

always @(posedge clk or negedge rst)
begin
if (!rst)
begin
i <= 4'd0;
{isPress, isRelease} <= 2'b00;
C1 <= 32'd0;
end
else
begin
case(i)
0:
begin
if (isH2L)
i <= i + 1'b1;
//`DEBUG
end
1:
begin
if (C1 == T10MS) begin C1 <= 32'd0; i <= i + 1'b1; end
else begin  C1 <= C1 + 1'b1; end
end
2:
begin
isPress <= 1'b1;
i <= i + 1'b1;
end
3:
begin
isPress <= 1'b0;
i <= i + 1'b1;
end
4:
begin
if(isL2H)
i <= i + 1'b1;
end
5:
begin
if (C1 == T10MS) begin C1 <= 32'd0; i <= i + 1'b1; end
else begin  C1 <= C1 + 1'b1; end
end
6:
begin
isRelease <= 1'b1;
i <= i + 1'b1;
end
7:
begin
isRelease <= 1'b0;
i <= 4'd0;
//`DEBUG
end
endcase
end
end

reg[1:0] D1;

always @(posedge clk or negedge rst)
begin
if (!rst)
`ifdef DEG
D1 <= 2'b00;
`else
led <= 2'b00;
`endif
else
if (isPress)
begin
`ifdef DEG
D1[0] <= ~D1[0];
`else
led[0] <= ~led[0];
`endif
//`DEBUG
end
else if (isRelease)
`ifdef DEG
D1[1] <= ~D1[1];
`else
led[1] <= ~led[1];
`endif
end

`ifdef DEG
assign led = D1;
`endif

endmodule


下载: http://files.cnblogs.com/files/pengdonglin137/key_demo1.zip

学到的知识:

1、Verilog下条件编译以及宏定义的使用;

2、一种调试方法:判断代码是不是执行到了,可以在关键位置加一个点灯的语句;

3、刚开始我把led设置为了 output reg [1:0] led,然后再最后assign led = D1,结果不管怎么按键,灯不亮。问题是:assign 语句后的led的类型应该是wire,而不应该是reg类型;

4、{isPress, isRelease} <= 2'b00; 其中, 不能写成 2'd11
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: