请教一个奇怪的问题

2020-02-23 10:44发布

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,请问这是为什么呢?谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
zhangwenxinzck
2020-02-24 03:22
我是VHDL的初学者,曾在书上看到你这个问题。
信号赋值与变量赋值不一样,信号赋值时有延时的,
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,后面有一节专门讲信号赋值延时的问题。

一周热门 更多>