FPGA学习笔记之按键控制
2015-11-26 22:49
253 查看
参考:
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二:按键模块① - 消抖
源码如下:
key_funcmod.v
下载: 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
【黑金原创教程】【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
相关文章推荐
- 负载均衡设计
- ORA-01858: 在要求输入数字处找到非数字字符
- maven中的 dependencies 和 dependencyManagement 的区别
- idea中切换svn地址不起作用
- 使用 Linux 自带的 logrotate 程序来控制日志文件尺寸
- java远程调试(idea)
- 黑马程序员——Java笔记——StringBuffer类常用方法
- 小学四则运算APP 第一个冲刺 第八天
- 1. 尚硅谷_佟刚_JavaWEB_Tomcat 的安装和配置.wmv
- JAVA创建XML文件(二)---SAX方式创建XML
- 使用C++实现simplex算法
- 项目打包脚本
- iOS 汉字下加下划线
- Saltstack实战配置client_acl
- 《JavaScript权威指南》学习笔记 第三天 找个对象
- Java笔记--JDBC篇(一)
- 黑马程序员—JAVA基础—多态、抽象类、接口、修饰符
- 泛型+hibernate封装任意数据库数据的通用方法
- 【转】蓝牙通信-打开和关闭蓝牙设备
- 使用Windows Form 制作一个简易资源管理器