完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
6 条评论
2个回答
|
|
按键消抖 源代码:
module A4_Key2 ( //输入端口 CLK_50M,RST_N,KEY, //输出端口 LED ); //--------------------------------------------------------------------------- //-- 外部端口声明 //--------------------------------------------------------------------------- input CLK_50M; //时钟的端口,开发板用的50MHz晶振 input RST_N; //复位的端口,低电平复位 input [ 7:0] KEY; //对应开发板上的KEY output [ 7:0] LED; //对应开发板上的LED //--------------------------------------------------------------------------- //-- 内部端口声明 //--------------------------------------------------------------------------- reg [19:0] time_cnt; //用来计数按键延迟的定时计数器 reg [19:0] time_cnt_n; //time_cnt的下一个状态 reg [ 7:0] key_reg; //用来接收按键信号的寄存器 reg [ 7:0] key_reg_n; //key_reg的下一个状态 wire [ 7:0] key_out; //消抖完成输出按键 reg [ 7:0] LED; //对应开发板上的LED reg [ 7:0] LED_N; //LED的下一个状态 //设置定时器的时间为20ms,计算方法为 (20*10^6)ns / (1/50)ns 50MHz为开发板晶振 parameter SET_TIME_20MS = 27'd1_000; //--------------------------------------------------------------------------- //-- 逻辑功能实现 //--------------------------------------------------------------------------- //时序电路,用来给time_cnt寄存器赋值 always @ (posedge CLK_50M, negedge RST_N) begin if(!RST_N) //判断复位 time_cnt <= 20'h0; //初始化time_cnt值 else time_cnt <= time_cnt_n; //用来给time_cnt赋值 end //组合电路,实现20ms的定时计数器 always @ (*) begin if(time_cnt == SET_TIME_20MS) //判断20ms时间 time_cnt_n = 20'h0; //如果到达20ms,定时计数器将会被清零 else time_cnt_n <= time_cnt + 1'b1;//如果未到20ms,定时计数器将会继续累加 end //时序电路,用来key_reg寄存器赋值 always @ (posedge CLK_50M, negedge RST_N) begin if(!RST_N) //判断复位 key_reg <= 8'h0; //初始化key_reg值 else key_reg <= key_reg_n; //用来给key_reg赋值 end //组合电路,每20ms接收一次按键的值 always @ (*) begin if(time_cnt == SET_TIME_20MS) //判断20ms时间 key_reg_n <= KEY; //如果到达20ms,接收一次按键的值 else key_reg_n <= key_reg; //如果未到20ms,保持原状态不变 end assign key_out = key_reg & (~key_reg_n);//判断按键有没有按下并点亮相应的LED //时序电路,用来LED寄存器赋值 always @ (posedge CLK_50M, negedge RST_N) begin if(!RST_N) //判断复位 LED <= 8'h0; //初始化LED值 else LED <= LED_N; //用来给LED赋值 end //组合电路,根据按键的值点亮相应的LED always @ (*) begin case(key_out) 8'h01 : LED_N = 8'b00000001; //按键1熄灭LED1 8'h02 : LED_N = 8'b00000010; //按键2熄灭LED2 8'h04 : LED_N = 8'b00000100; //按键3熄灭LED3 8'h08 : LED_N = 8'b00001000; //按键4熄灭LED4 8'h10 : LED_N = 8'b00010000; //按键5熄灭LED5 8'h20 : LED_N = 8'b00100000; //按键6熄灭LED6 8'h40 : LED_N = 8'b01000000; //按键7熄灭LED7 8'h80 : LED_N = 8'b10000000; //按键8熄灭LED8 default: LED_N = LED; endcase end endmodule |
|
|
|
test bench
`timescale 1 ps/ 1 ps module A4_Key2_vlg_tst(); // constants // general purpose registers reg eachvec; // test vector input registers reg CLK_50M; reg [7:0] KEY; reg RST_N; // wires wire [7:0] LED; // assign statements (if any) A4_Key2 i1 ( // port map - connection between master ports and signals/registers .CLK_50M(CLK_50M), .KEY(KEY), .LED(LED), .RST_N(RST_N) ); initial begin #0 CLK_50M = 1'b0; #10000 RST_N = 1'b0; #10000 RST_N = 1'b1; end always // optional sensitivity list // @(event1 or event2 or .... eventn) begin #10000 CLK_50M=~CLK_50M; end endmodule |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1735 浏览 1 评论
1482 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1696 浏览 0 评论
949 浏览 0 评论
2486 浏览 0 评论
1524 浏览 38 评论
5779 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 15:15 , Processed in 0.515316 second(s), Total 54, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号