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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6111|回复: 20

请帮我看看这程序有什么错?

[复制链接]
发表于 2004-11-10 09:22:45 | 显示全部楼层 |阅读模式

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

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

x
小弟刚刚接触CPLD,不知道为什么,第一个念头就是实现一个抢答器的功能,但是都两天了,还是不得要领,请各位走在前面的前辈拉小弟一把,先谢过了:)
一共8个按键,分别为  keyin0 , keyin1 ,...... keyin7,
还有8个LED,分别对应  ledout0,ledout1,.......ledout7;
我要实现的功能是抢答的功能,哪个键先按下,对应的led点亮,然后再按别的6个键(不包括可keyin0,keyin0用来复位)不起作用,按理说这个很容易实现的,但是就是没搞定,我想一定是在哪个环节上钻了牛角尖。
我的想法是按复位按钮则复位,清零,
否则就开始记录按键的次数,其实每次只有复位之后才能按一次别的按钮,仅仅一次。所以
我每次按键的时候flag+1,然后判断flag的值
但是现象是我每次只有按下复位才能点亮另外的键,并且只有先抬起复位键,另外的键才可以保持,我只想请教我的代码为什么会出现这样的现象,解释解释就可以了
代码如下:盼前辈指点迷津,再次谢过了
module keyin (keyin,ledout);
input[7:0] keyin;
output[7:0] ledout;
reg[7:0] ledout;
reg[7:0] flag;
always @ (keyin)
begin
   if(keyin==8'b1111_1110)   //如果是复位键
     begin
       //flag=0;            //不知道能不能这样写?????
       flag=8'b0000_0000;
       ledout=8'b1111_1111;
     end
   else                      //不是复位键
     begin
       flag=flag+1;         
       //if(flag==1)          //不知道能不能这样写?????
       if(flag==8'b0000_0001)//第一次按下
       begin
ledout[7:1]=keyin[7:1];
       end
     end
end
endmodule
发表于 2004-11-10 09:30:31 | 显示全部楼层

请帮我看看这程序有什么错?

思路不对
1。引入时钟做成同步电路。
2。设计一个状态转移图。
先做好这两步。如果你愿意,可以做完后贴上来大家帮你看看,编程不在话下。
 楼主| 发表于 2004-11-10 09:38:34 | 显示全部楼层

请帮我看看这程序有什么错?

非常感谢您的回答,我想知道为什么思路不对?这样为什么行不通?????
 楼主| 发表于 2004-11-10 09:57:26 | 显示全部楼层

请帮我看看这程序有什么错?

如果要设计状态转移图的话?是不是应该是7种状态加复位状态?
5_1919_3.jpg
 楼主| 发表于 2004-11-10 10:00:00 | 显示全部楼层

请帮我看看这程序有什么错?

斑竹,帮我看看,对不对啊?如果确定的话我想一概差不多了
发表于 2004-11-10 13:23:14 | 显示全部楼层

请帮我看看这程序有什么错?

最好把状态之间转化的条件写上(注意防抖动),按你现在这种做法将会有8个状态,你把它写成状态机即可。
 楼主| 发表于 2004-11-10 13:32:11 | 显示全部楼层

请帮我看看这程序有什么错?

非常感谢斑竹,我明白了,我用Mealy状态机,采用独热码,只要把8种状态表示出来就可以了,是吗?我的理解对吗?
发表于 2004-11-10 16:17:54 | 显示全部楼层

请帮我看看这程序有什么错?

对。
发表于 2004-11-10 17:57:12 | 显示全部楼层

请帮我看看这程序有什么错?

[这个贴子最后由风再起在 2004/11/10 05:59pm 第 1 次编辑]

这点逻辑不需要用到状态机那么复杂,就是两个状态:复位后没有抢答按键,这时第一个按键为有效;在这之后,后面的按键为无效,复位后重新来过。所以用一个信号来表示这两个状态就可以了,在该信号为0时,锁存按键信号,并开始亮灯,在该信号为1时,不采样按键信号,亮灯不变,复位时,该信号、按键锁存信号、亮灯信号全部清零,重新开始判断。楼主好像没有组合逻辑、时序逻辑的概念。
发表于 2004-11-10 18:09:22 | 显示全部楼层

请帮我看看这程序有什么错?

楼上的思路比较简单,实现起来比较容易。
另外还要注意一点:这个电路应该无需很高的时钟速度,那么如果真有可能有同时按键的呢?如果用优先级判断就会失去公平。这个问题怎么解决?不过这种概率太小,也许没有实际作用。但如果你不做同时按键的处理,你的电路就可能会出错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-22 13:13 , Processed in 0.041546 second(s), 11 queries , Gzip On, Redis On.

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