VHDL编程碰到一个小问题,请教

[复制链接]
2527|8
 楼主| tigris 发表于 2009-3-5 15:44 | 显示全部楼层 |阅读模式
想写一个小程序,读按键是否被按下,用到下面这个进程。不过编译的时候总是出现错误,刚学VHDL,不会解决....<br /><br />process(key_push,clk2)<br />begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;if&nbsp;(key_push='1'&nbsp;and&nbsp;Clk2='1')&nbsp;then&nbsp;---这一句报错,不知道如何解决<br />&nbsp;&nbsp;&nbsp;cnt2&lt=cnt2+1;<br />&nbsp;&nbsp;&nbsp;else&nbsp;null;<br />&nbsp;&nbsp;end&nbsp;if;<br />end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
worrior_1 发表于 2009-3-5 16:10 | 显示全部楼层

VHDL编程碰到一个小问题,请教

你赋值的时候应该用:=或者&lt=看你定义的Key_push&nbsp;和Clk2是什么类型的,是signal型,还是variable型
 楼主| tigris 发表于 2009-3-5 18:39 | 显示全部楼层

~~

都是signal的&nbsp;&nbsp;当有按键按下且延时20ms后,key_push就赋予1.&nbsp;&nbsp;这个进程是想当key_push变成1后,cnt2+1。&nbsp;&nbsp;cnt变化,小灯就变化。不过失败了&nbsp;呵呵
何苦 发表于 2009-3-5 22:15 | 显示全部楼层

程序太少

把整个程序关键部分贴进来,别人才能帮你分析
 楼主| tigris 发表于 2009-3-6 10:16 | 显示全部楼层

程序就是想,按一次键改变一次小灯状态

entity&nbsp;LED1&nbsp;is<br />port(Clk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rst&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key1&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buzz&nbsp;&nbsp;&nbsp;&nbsp;:out&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ledout&nbsp;&nbsp;&nbsp;&nbsp;:out&nbsp;std_logic_vector(7&nbsp;downto&nbsp;0)&nbsp;);<br />end&nbsp;LED1;<br /><br /><br />architecture&nbsp;Behavioral&nbsp;of&nbsp;led1&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;Cnt&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic_vector(3&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;Clk_cnt&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic_vector(21&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;key_cnt&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic_vector(20&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;Clk2&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;cnt2&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic_vector(1&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;Led_t1&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic_vector(7&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;Key&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;key_push&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;std_logic;<br />begin<br /><br />process(Rst,Clk)&nbsp;&nbsp;&nbsp;&nbsp;----时钟分频,将40Mhz时钟分频&nbsp;得到clk2<br />begin<br />&nbsp;&nbsp;if&nbsp;Rst='0'&nbsp;then<br />&nbsp;&nbsp;&nbsp;Clk_cnt&lt=(others=&gt'0');<br />&nbsp;&nbsp;&nbsp;Clk2&lt='0';<br />&nbsp;&nbsp;elsif&nbsp;&nbsp;Clk'event&nbsp;and&nbsp;Clk='1'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;Clk_cnt=&quot;1111111111111111111111&quot;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;Clk2&lt=not&nbsp;Clk2;<br />&nbsp;&nbsp;&nbsp;&nbsp;Clk_cnt&lt=(others=&gt'0');<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clk_cnt&lt=Clk_cnt+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />end&nbsp;process;<br /><br /><br /><br />process(Clk)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;----按键消除抖动进程<br />begin<br />&nbsp;&nbsp;if(clk'event&nbsp;and&nbsp;clk='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;key&lt=Key1;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(key='1')then<br />&nbsp;&nbsp;&nbsp;&nbsp;key_cnt&lt=(others=&gt'0');<br />&nbsp;&nbsp;&nbsp;&nbsp;elsif(key_cnt(20)='0')then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key_cnt&lt=key_cnt+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />end&nbsp;process;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />key_push&lt=key_cnt(20);&nbsp;--将按键信息赋予key_push<br /><br /><br /><br />process(key_push,clk2)--啊,啊这个进程太难把握了.....使得按键总有冲突<br />begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;if&nbsp;(key_push='1'&nbsp;and&nbsp;clk2='1')&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;cnt2&lt=cnt2+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;null;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;led_t1&lt=&quot;01000001&quot;&nbsp;when&nbsp;cnt2=&quot;00&quot;&nbsp;else--小灯随cnt2改变而改变<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;11000011&quot;&nbsp;when&nbsp;cnt2=&quot;01&quot;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;11000111&quot;&nbsp;when&nbsp;cnt2=&quot;10&quot;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&quot;11001111&quot;;<br /><br />Ledout&lt=Led_t1;&nbsp;&nbsp;--把led信号传给小灯输出<br />&nbsp;buzz&lt='1';&nbsp;&nbsp;--嗡鸣器<br /><br /><br />end&nbsp;Behavioral;
 楼主| tigris 发表于 2009-3-6 12:04 | 显示全部楼层

发现问题了

哪句话的括号用的是全角的,所以有问题了,不好意思,耽误大家时间了
Joys 发表于 2009-3-7 18:12 | 显示全部楼层

所以最好用英文注释

哈哈
sleepybear 发表于 2009-3-13 10:26 | 显示全部楼层

……代码风格……

PROCESS(clk2)<br />BEGIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;IF&nbsp;clk2='event&nbsp;AND&nbsp;clk2&nbsp;=&nbsp;'1'&nbsp;THEN<br />&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;key_push='1'&nbsp;THEN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt2&lt=cnt2+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;IF;<br />&nbsp;&nbsp;END&nbsp;IF;<br />END&nbsp;PROCESS;
至尊宝 发表于 2009-3-19 10:55 | 显示全部楼层

呵呵,支持楼上

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

175

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部