帮忙解释:一个VHDL语言描述的10进制计数器cnt10

angelanpan 2005-01-07 02:31:15
十进制计数器cn10
cnt10的输入端口:
en——允许计数
clk--时钟;
reset--复位;
输出端口为:
q--计数值输出;
carry--进位输出;

具体描述如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY cnt10 IS
PORT(reset,en,clk:IN STD_LOGIC;
carry:OUT STD_ULOGIC;
q:OUT STD_ULOGIC_VECTOR(3 DOWNTO 0));
END cnt10;

ARCHITECTURE rtl OF cnt10 IS
SIGNAL qs:STD_LOGIC_VECTOR(3 DOWNTO O);
SIGNAL ca:STD_ULOGIC;
BEGIN
PROCESS(clk)
VARIABLE q10:INTEGER;
BEGIN
IF(clk'EVENT AND clk='1')THEN
IF(reset='1')THEN
q10:=0;
ELSIF(en='1')THEN
IF(q10=9)THEN
q10:=0
ca<='0'; ---(1)
ELSIF(q10=8)THEN
q10:=q10+1;
ca<='1'; ---(2)
ELSE
q10:=q10+1;
ca<='0';
END IF;
END IF;
END IF;
qs<=CONV_STD_LOGIC_VECTOR(q10,4);
q<=TO_STDULOGICVECTOR(qs);
END PROCESS;
PROCESS(ca,en)
BEGIN
carry<=ca AND en;
END PROCESS;
END rtl;

我初学vhdl,对这个描述有点问题:为什么当q10是9的时候,再加1,不进位,而是8的时候,加1就进位呢?就是上面的(1)(2)两个句子,按我的理解,难道不是应该当9加1的时候,carry不应该是1吗,8加1的时候,carry应该是0啊?
...全文
2094 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
neilkn 2005-01-09
  • 打赏
  • 举报
回复
也刚学vhdl,说些个人看法:
signal 赋值跟 variable 赋值不同
variable是即时赋值的,而signal赋值是有一定延时的,如果carry out有clk事件限制的话,就很容易从仿真图中看出这个方案跟你自己的方案见的差别在哪了。

其实你可以按自己的思路,更改下,然后看看仿真结果相差在哪。
然后再在carry的那个进程里,加入 clk'event and clk = '0' 的限制,再看看两个方案的仿真结果差别。

这个方案这么做,应该是为了确保carry在 q 为 9 时有效。
angelanpan 2005-01-07
  • 打赏
  • 举报
回复
有没有高手写VHDL的啊?
0909424 2005-01-07
  • 打赏
  • 举报
回复
没写过VHDL,你的赋值好像是混合赋值的,可能是考虑了实际赋值延迟的问题

6,163

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧