微波EDA网,见证研发工程师的成长! 2025年04月02日 星期三
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助,Verilog编程,四个按键控制72个LED

求助,Verilog编程,四个按键控制72个LED

时间:10-02 整理:3721RD 点击:

大家好,我是新手,对于verilog还在学习中,遇到很大的逻辑问题,想不明白,特来请教。
要做一个倒计时钟,但是是用LED的熄灭来倒计时。用四个按键控制。
其中三个按键是控制倒计时间长短。另一个是开始计时键。
逻辑基本上是这样的:
第一个按键按下后,其中60个LED全亮,代表60分钟倒计时。然后按下“开始键”开始倒计时。每一分钟灭一个LED。所有LED灭掉之后倒计时结束。
第二个键按下,亮66个LED,代表90分钟倒计时。还是按下“开始键”后,最开始的六个LED每5分钟灭一个,然后从第60个LED,每一分钟灭一个。也是所有LED灭掉之后倒计时结束。
第三个键按下,亮72个LED,代表120分钟倒计时。开始键按下,最开始的12个LED每5分钟灭一个,之后剩下的60个LED每一分钟灭一个。所有LED灭,倒计时结束。
我用Xilinx的cool runner2, 晶振是1.8432MHz。 求达人点拨

这个问题很简单。
不过我考虑的在没有模数转换条件下:
1.你先做时钟分频,用来计数;最后用来计数的频率最好是500HZ左右。
2.在做一个计数器计数1秒、5秒等。
3.在控制方面最好是能够复用这个计数器,不要做多个。
这是俺,看到后的一点初步想法,实际的设计还是你自己考虑!
有更多的课题,可以继续讨论!

简单的分频而已

同意楼上的意见,简单分频率计数而已

开始计时时,灯全亮。晶振分频得一个1/60Hz的时钟,对灯进行移位输出即可。
如果觉得5分钟灭一个灯要内置计数器和比较麻烦,那就改移位输出,5分钟一次的灯,给它5位就OK.。

谢谢大家提点
我现在最大的问题是按键与LED之间的控制问题,只能说我具体操作的不好。
以我的逻辑写出来的程序,在按下倒计时时间的那三个键的时候都可以按照要求点亮LED
但是这个开始键我应该怎么把它和那三个键联系起来呢?
我没有用case语法,而是都用的if
把我想写的简单化一点,大概就是这样的
module test2222222222222(key_in, LED,CLK,start
    );
input CLK;
input[2:0] key_in;
input start;
output [7:0] LED;
reg[7:0] LED_r;
//reg[7:0] LED_l;
reg[2:0] buffer;
reg start_r;
//reg[3:0] buffer1;
reg[23:0] counter;


always@(posedge CLK)
        begin
        start_r=1'b1;
        buffer=3'b111;
        buffer=key_in;
        start_r=start;
               
        if (buffer==3'b110)
                begin
                LED_r = 8'b00011111;
               
                if (!start_r)
                        begin
                        counter<=counter+1;
                                if (counter==24'd1843200)
                                        begin
                                       
                                        LED_r=LED_r<<1;
                                        counter<=0;
                                        end
                        end
                end
        else if (buffer==3'b101)
                begin
                LED_r=8'b11110000;
                if (!start_r)
                        begin
                        counter<=counter+1;
                        if (counter==24'd1843200)
                                begin
                                LED_r=LED_r<<1;
                                counter<=0;
                                end
                        end
                end
        else if (buffer==3'b011)
                begin
                LED_r=8'b11111111;
                if (!start_r)
                        begin
                        counter<=counter+1;
                        if (counter==24'd1843200)
                                begin
                                LED_r=LED_r<<1;
                                counter<=0;
                                end
                        end
                end               
          end
assign LED=LED_r;
endmodule
我想当业余的水平,请轻拍



         start_r=1'b1;
        buffer=3'b111;
        buffer=key_in;
        start_r=start;
你的start_r, buffer里面的内容锁存不住的,当你按键抬起时,这start_r,buffer内容会改变,逻辑就不对了。
另外建议增加按键去毛刺电路。这种写法也不太好。


嗯嗯,按键去毛刺程序是要加的,但是我这个大框都没写好,所以就先没细致的写这个程序
按照你的看法,我应该怎么样才能锁住start_r 和 buffer 的值呢。
求赐教



     用状态机实现



   
看了下有关状态机的知识,还是一头雾水
说状态机一般用三段写,能请你再说详细点么,谢谢

三段式的状态机,网上有很多例子的,可以参考参考

上一篇:频率生成问题
下一篇:FPGA 约束?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top