关于VHDL设计可逆计数器的问题

[复制链接]
5688|9
 楼主| 6666lf 发表于 2008-8-11 21:02 | 显示全部楼层 |阅读模式
<br />刚刚开始接触VHDL,现在也设计一个可逆的计数器,输入是三个按键,一个复位清零,一个增加,一个减少,输出为4位的二进制数<br />这时我编的代码:<br /><br />Library&nbsp;IEEE;<br />Use&nbsp;IEEE.std_logic_1164.All;<br />Use&nbsp;IEEE.std_logic_unsigned.All;<br /><br />Entity&nbsp;test&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;port(up,down:&nbsp;in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reset:&nbsp;in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q:&nbsp;buffer&nbsp;std_logic_vector(3&nbsp;downto&nbsp;0));<br />end&nbsp;Entity&nbsp;test;<br /><br />Architecture&nbsp;art&nbsp;of&nbsp;test&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;process(up,reset)is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;reset='0'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q&lt=&quot;0000&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(up'event&nbsp;and&nbsp;up='1')&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Q=9&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q&lt=&quot;0000&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Q&lt=Q+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />&nbsp;&nbsp;&nbsp;&nbsp;process(down,reset)is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;reset='0'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q&lt=&quot;0000&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(down'event&nbsp;and&nbsp;down='1')&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Q=0&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q&lt=&quot;1001&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Q&lt=Q-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;&nbsp;&nbsp;&nbsp;&nbsp;<br />end&nbsp;Architecture&nbsp;art;<br /><br />编译的时候提示错误如图<br />请教高手如何解决?不胜感激!<br />VHDL语言感觉好别扭啊!
mr.king 发表于 2008-8-11 21:05 | 显示全部楼层

物理结构上,计数器是DFF做的,DFF只有一个时钟端

没法综合出两个时钟的
 楼主| 6666lf 发表于 2008-8-11 21:54 | 显示全部楼层

那楼上前辈,我应该怎么处理?

我应该怎么来设计这个计数器比较好?您给指点一下思路吧
 楼主| 6666lf 发表于 2008-8-12 10:27 | 显示全部楼层

谢谢

谢谢前辈指点!<br />我好好学一下!谢谢!=^_^=
 楼主| 6666lf 发表于 2008-8-14 09:34 | 显示全部楼层

反馈

这几天又郁闷了,按照qinxg前辈的方法做,编译能通过只有一个警告,但是仿真没有结果<br />我自作主张将variable改成了signal,结果出来了<br />不过没有弄明白怎么回事,希望通过慢慢学习,会领会VHDL的!<br />
birenai 发表于 2008-8-15 17:25 | 显示全部楼层

应该是对时钟进行加减的

我没学过VHDL,但我看LZ的程序似乎是在对UP和DOWN进行加减的。LS的说的没错,要加个时钟,但我跟他的思想不同,我是让时钟和复位信号为敏感信号,在进程中判断UP和DOWN那个有效,根据状态进行是加还是减。
birenai 发表于 2008-8-15 17:34 | 显示全部楼层

不好意思,上面我晕头了

是对UP和DOWN进行计算的,LZ没错。编译出错的原因就该是Q这个变量不能在两个进程中进行赋值,必须放在一个进程中。
wildcat 发表于 2008-11-5 16:36 | 显示全部楼层

双时钟

今天刚好在写74ls192,<br />你遇到的问题是在同一端口,可能出现两次(种)赋值吧<br /><br />ps我打算用两个文件来做,一个加,一个减,最后在原理图编辑中生成顶层文件,不知道行不行。待会结果出来就来说一嗓子
liuts0129 发表于 2008-11-7 19:41 | 显示全部楼层

其实还有更简单的实现方法

其实还有更简单的实现方法,用UP和DOWN启动加减计数器,计数结果相加<br />程序如下:<br />LIBRARY&nbsp;IEEE;<br />USE&nbsp;IEEE.STD_LOGIC_1164.ALL;<br />USE&nbsp;IEEE.STD_LOGIC_UNSIGNED.ALL;<br />ENTITY&nbsp;counter_up_down&nbsp;IS<br />&nbsp;PORT(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UP,DOWN&nbsp;:&nbsp;IN&nbsp;STD_LOGIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res_n&nbsp;&nbsp;&nbsp;:&nbsp;IN&nbsp;STD_LOGIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dout&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;OUT&nbsp;STD_LOGIC_VECTOR(3&nbsp;DOWNTO&nbsp;0));<br />END;<br />ARCHITECTURE&nbsp;bhv&nbsp;OF&nbsp;counter_up_down&nbsp;IS&nbsp;<br />SIGNAL&nbsp;up_cnt,down_cnt,cnt&nbsp;:&nbsp;STD_LOGIC_VECTOR(3&nbsp;DOWNTO&nbsp;0);<br />BEGIN<br /><br />cnt&lt=up_cnt+down_cnt;--加减计数相加为结果<br />dout&lt=cnt;<br /><br />PROCESS(res_n,UP)--加计数器<br />BEGIN<br /><br />IF&nbsp;res_n='0'&nbsp;THEN<br />&nbsp;&nbsp;&nbsp;up_cnt&lt=&quot;0000&quot;;<br />ELSIF&nbsp;UP'EVENT&nbsp;AND&nbsp;UP='1'&nbsp;THEN<br />&nbsp;&nbsp;IF&nbsp;cnt&lt15&nbsp;THEN<br />&nbsp;&nbsp;&nbsp;up_cnt&lt=up_cnt+1;<br />&nbsp;&nbsp;END&nbsp;IF;<br />END&nbsp;IF;<br /><br />END&nbsp;PROCESS;<br /><br />PROCESS(res_n,DOWN)--减计数器<br />BEGIN<br /><br />IF&nbsp;res_n='0'&nbsp;THEN<br />&nbsp;&nbsp;&nbsp;down_cnt&lt=&quot;0000&quot;;<br />ELSIF&nbsp;DOWN'EVENT&nbsp;AND&nbsp;DOWN='1'&nbsp;THEN<br />&nbsp;&nbsp;IF&nbsp;cnt&gt0&nbsp;THEN<br />&nbsp;&nbsp;&nbsp;down_cnt&lt=down_cnt-1;<br />&nbsp;&nbsp;END&nbsp;IF;<br />END&nbsp;IF;<br /><br />END&nbsp;PROCESS;<br /><br />END&nbsp;bhv;
g19860529 发表于 2008-11-9 13:21 | 显示全部楼层

这个是我编的,感觉句法上还是比较精炼的,哈哈,,嚣张

library&nbsp;ieee;<br />use&nbsp;ieee.std_logic_1164.all;<br />use&nbsp;ieee.std_logic_unsigned.all;<br /><br />entity&nbsp;addsub&nbsp;is<br />port(<br />&nbsp;&nbsp;&nbsp;&nbsp;clk,rst&nbsp;:&nbsp;in&nbsp;std_logic;<br />&nbsp;&nbsp;&nbsp;&nbsp;sel&nbsp;:&nbsp;in&nbsp;std_logic_vector(1&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;q&nbsp;:&nbsp;out&nbsp;std_logic_vector(3&nbsp;downto&nbsp;0));<br />end&nbsp;addsub;<br /><br />architecture&nbsp;rtl&nbsp;of&nbsp;addsub&nbsp;is<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp;process(clk,rst,sel)<br />&nbsp;&nbsp;&nbsp;&nbsp;variable&nbsp;tmp&nbsp;:&nbsp;std_logic_vector(3&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;clk'event&nbsp;and&nbsp;clk='1'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;rst='1'&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;:=&nbsp;&quot;0000&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;sel&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;&quot;01&quot;&nbsp;=&gt&nbsp;&nbsp;&nbsp;if&nbsp;tmp&nbsp;=&nbsp;&quot;1001&quot;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;:=&nbsp;&quot;0000&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;:=&nbsp;tmp&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;&quot;10&quot;&nbsp;=&gt&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;tmp&nbsp;=&nbsp;&quot;0000&quot;&nbsp;then&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;:=&nbsp;&quot;1001&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;:=&nbsp;tmp&nbsp;-&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;others&nbsp;=&gt&nbsp;null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;case;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q&nbsp;&lt=&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;if;<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;process;<br />end&nbsp;rtl;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

16

帖子

0

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