完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 徐林如风 于 2015-10-21 00:39 编辑
一个很简单的功能,就是设定counter为计数器,key_add电平变化时counter加一,key_sub电平变化时counter减一,然后把counter的数值送到数码管中显示出来。在运行的时候总是出现一些很诡异的问题,不知是何原因,还请各位大神帮忙看看,谢谢了! |
|
相关推荐
8个回答
|
|
以下问题提供你参考,
1、从第一个always来看,你的counter是通过下降沿出发,不是通过电平变化; 2、你的数码管控制应该是分时控制的,需要动态刷新显示你的各个数码管; |
|
|
|
specil_y 发表于 2015-10-21 09:03 谢谢你的答复,关于你提出的两点意见,我之前也有过尝试 1、我把第二个always块里面的条件有设成过和第一个always块一样,但是问题还是存在; 2、我目前还没做到动态显示那个步骤,仅仅是在单一的一个数码管中显示数据,所以就没用到动态刷新了; 另外相关出现的一些诡异的问题包括 我在按下减一的按钮后,明明那个按键对应的电平变化只出现了一次,但是在显示的时候数据却是一直在降低,不知是何原因,还请再指点一下,谢谢! |
|
|
|
我记得明德扬点拨FPGA基础视频有Verilog的讲解,可以参考。
|
|
|
|
徐林如风 发表于 2015-10-21 09:53 如果是按键按下一次确数据一直变化,就是你的按键抖动太严重,或者查看下你的按键电路上下拉是否正确。 |
|
|
|
谢谢你的意见!我有试过消抖的方法了,但是问题依然存在,下面是我实现的代码,麻烦你看看是否有什么不对的地方,谢谢!我的想法就是在检测到电平变化以后延时一段时间,如果仍然是低电平的话,就认为这是一次正确的按键按下动作。
|
|
|
|
你所写的程序,在按键按下时,由系统时钟的作用,会一直有clk下降沿,导致always块不停运行,而你的按键是处于按下状态,所以计数器会不停地加数或减数,显示的数字变化频率过快,人眼看到数码管是全亮的。所以你应该加一个寄存器,在按键按下时只记一次数,输出always块中判断用此寄存器值,则会正常显示的。
|
|
|
|
你所写的程序,在按键按下时,由系统时钟的作用,会一直有clk下降沿,导致always块不停运行,而你的按键是出于按下状态,所以计数器会不停地加数或减数,显示的数字变化频率过快,人眼看到数码管是全亮的。所以你应该加一个寄存器,在按键按下时只记一次数,输出always块中判断用此寄存器值,则会正常显示的。
|
|
|
|
module qdq
#( parameter KEY_WIDTH = 2 ) ( input clk, input rst_n, input [KEY_WIDTH-1:0] key_data, output reg [7:0]seg, output reg [3:0]segw ); wire key_flag; reg [KEY_WIDTH-1:0] key_value ; reg [3:0]data;//送数码管显示 reg [9:0]dataclk;//计数 reg [19:0] cnt; //delay_5ms(249999) reg [2:0] state; //-------------按键消抖计数延时---------------------- always @(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 20'd0; else begin if(cnt == 20'd249999) cnt <= 20'd0; else cnt <= cnt + 1'b1; end end //-------------按键消抖检测---------------------- reg key_flag_r; reg [KEY_WIDTH-1:0] key_data_r; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin key_flag_r <= 1'b0; key_value <= {KEY_WIDTH{1'b0}}; end else if(cnt == 20'd249999) //Delay_5ms begin case(state) 0: begin if(key_data != {KEY_WIDTH{1'b1}}) state <= 1; else state <= 0; end 1: begin if(key_data != {KEY_WIDTH{1'b1}}) state <= 2; else state <= 0; end 2: begin key_flag_r <= 1'b1; key_value <= key_data; //lock the key_value state <= 3; end 3: begin key_flag_r <= 1'b0; //read the key_value if(key_data == {KEY_WIDTH{1'b1}}) state <= 4; else state <= 3; end 4: begin if(key_data == {KEY_WIDTH{1'b1}}) state <= 0; else state <= 4; end endcase end end //----------------按键有效标志位----------------------- reg key_flag_r0,key_flag_r1; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin key_flag_r0 <= 0; key_flag_r1 <= 0; end else begin key_flag_r0 <= key_flag_r; key_flag_r1 <= key_flag_r0; end end assign key_flag = key_flag_r1 & ~key_flag_r0; //----------------按键有效处理------------------- always@(posedge clk or negedge rst_n) begin if(!rst_n) begin dataclk<=0; end else begin if(key_flag&&(key_value==2'b01 )) begin if(dataclk>=999) dataclk<=0; else dataclk<=dataclk+1; end else if(key_flag&&(key_value==2'b10 )) begin if(dataclk<=0) dataclk<=999; else dataclk<=dataclk-1; end else dataclk<=dataclk; end end //--------------数码管位选--------------------- always@(posedge clk or negedge rst_n) begin if(!rst_n) begin segw<=4'b1111; end else begin if(cnt[13:12]==2'b00) begin segw<=4'b0111;data<=dataclk/100; end else if(cnt[13:12]==2'b01) begin segw<=4'b1011;data<=dataclk%100/10; end else if(cnt[13:12]==2'b10) begin segw<=4'b1101;data<=dataclk%100%10; end end end //---------------数码管段码-------------------- always@(posedge clk or negedge rst_n) begin if(!rst_n) begin seg<=8'b1111_1111; end else begin case(data) 4'd0:seg<=8'b0000_0011; 4'd1:seg<=8'b1001_1111; 4'd2:seg<=8'b0010_0101; 4'd3:seg<=8'b0000_1101; 4'd4:seg<=8'b1001_1001; 4'd5:seg<=8'b0100_1001; 4'd6:seg<=8'b0100_0001; 4'd7:seg<=8'b0001_1111; 4'd8:seg<=8'b0000_0001; 4'd9:seg<=8'b0000_1001; default:seg<=8'b1111_1111; endcase end end endmodule //以上代码仅供参考,数码管的段码按照实际情况修改 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1367 浏览 1 评论
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
1046 浏览 0 评论
2442 浏览 1 评论
2146 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
2408 浏览 0 评论
1898 浏览 50 评论
6018 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 01:53 , Processed in 0.612843 second(s), Total 54, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号