LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
Entity DDFF IS
PORT
(
OUTER : OUT STD_LOGIC;
INCOUNTO: OUT INTEGER RANGE 0 TO 3;
INNER : IN STD_LOGIC;
EN : IN STD_LOGIC;
CLK : IN STD_LOGIC
);
END ENTITY DDFF;
ARCHITECTURE ONE OF DDFF IS
SIGNAL INCOUNT : INTEGER RANGE 0 TO 3 := 0;
BEGIN
PROCESS(CLK,EN)
BEGIN
IF EN = '1' THEN
IF CLK'EVENT AND CLK = '1' THEN
OUTER <= NOT INNER;
IF INCOUNT < 3 THEN
INCOUNT <= INCOUNT + 1;
INCOUNTO <= INCOUNT;
END IF;
IF INCOUNT = 3 THEN
INCOUNT <= 0;
INCOUNTO <= INCOUNT;
END IF;
END IF;
ELSE
INCOUNT <= 0;
OUTER <= '0';
INCOUNTO <= INCOUNT;
END IF;
END PROCESS;
END ONE;
这是我自己写的一个小程序。目的是来一个时钟,OUTER就输出INNER的反向,同时另一个输出INCOUNTO加1输出。现在的现象就是OUTER能实现我的目的,而INCOUNTO却要在下一个时钟周期到来的时候才会加1,请问这是为什么呢?谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
信号赋值与变量赋值不一样,信号赋值时有延时的,
INCOUNT <= INCOUNT + 1;
INCOUNTO <= INCOUNT;
进程运行时有一个模拟定时器,时间是δ,在δ内完成程序的执行,每个赋值语句都是同时执行,但并没有赋值,赋值是在执行到end process时才赋值的。在执行到end process时,此时的incount的值是0,并没有被incount+1更新,在incount更新到incount+1时,incount已经将0赋给了incount0,也就是在下一个上升沿来的时候才是1。并不是上升沿来了,1立刻赋值给了incount0,它是将上升沿来之前的incount赋给了incount0。总之是信号赋值延时的问题。说的有点乱,推荐你看下潘松的EDA,后面有一节专门讲信号赋值延时的问题。
一周热门 更多>