在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5480|回复: 10

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

[复制链接]
发表于 2011-8-8 20:51:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 kitzen100 于 2011-8-8 20:54 编辑

大家好,我是新手,对于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。 求达人点拨
发表于 2011-8-9 06:37:17 | 显示全部楼层
这个问题很简单。
不过我考虑的在没有模数转换条件下:
1.你先做时钟分频,用来计数;最后用来计数的频率最好是500HZ左右。
2.在做一个计数器计数1秒、5秒等。
3.在控制方面最好是能够复用这个计数器,不要做多个。
这是俺,看到后的一点初步想法,实际的设计还是你自己考虑!!!
有更多的课题,可以继续讨论!!
发表于 2011-8-9 08:28:17 | 显示全部楼层
简单的分频而已
发表于 2011-8-9 08:52:19 | 显示全部楼层
同意楼上的意见,简单分频率计数而已
发表于 2011-8-10 18:02:22 | 显示全部楼层
开始计时时,灯全亮。晶振分频得一个1/60Hz的时钟,对灯进行移位输出即可。
如果觉得5分钟灭一个灯要内置计数器和比较麻烦,那就改移位输出,5分钟一次的灯,给它5位就OK.。
 楼主| 发表于 2011-8-10 21:33:16 | 显示全部楼层
谢谢大家提点
我现在最大的问题是按键与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

我想当业余的水平,请轻拍
发表于 2011-8-10 21:42:06 | 显示全部楼层
回复 6# kitzen100


         start_r=1'b1;
        buffer=3'b111;
        buffer=key_in;
        start_r=start;
你的start_r, buffer里面的内容锁存不住的,当你按键抬起时,这start_r,buffer内容会改变,逻辑就不对了。。
另外建议增加按键去毛刺电路。。。这种写法也不太好。。。
 楼主| 发表于 2011-8-10 22:12:16 | 显示全部楼层
回复 7# maxbin

嗯嗯,按键去毛刺程序是要加的,但是我这个大框都没写好,所以就先没细致的写这个程序
按照你的看法,我应该怎么样才能锁住start_r 和 buffer 的值呢。
求赐教
发表于 2011-8-10 23:07:07 | 显示全部楼层
回复 8# kitzen100


     用状态机实现
 楼主| 发表于 2011-8-11 17:34:46 | 显示全部楼层
本帖最后由 kitzen100 于 2011-8-12 20:44 编辑

回复 9# maxbin


   
看了下有关状态机的知识,还是一头雾水
说状态机一般用三段写,能请你再说详细点么,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 23:42 , Processed in 0.037771 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表