clDL循环中的VHDL变量检查

时间:2014-03-14 04:46:06

标签: vhdl

我正在尝试比较clk循环中的两个值 例如:

if(riding_edge(clk)) then
  if (some signal = other) then
    other<=other+1;
  else other<=other;

  if(other=3)then
    flag=1;
  end if;

 end if;

代码编译并运行正常但是当我看到模拟窗口时,无论其他值是什么,标志都会被设置。我做错了什么或其他的价值是波动的。 以上是伪代码,语法上的一切都是正确的。 请帮忙

提前致谢

2 个答案:

答案 0 :(得分:1)

如果没有最小的工作示例,我只能在flag不是other时指定LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY example IS PORT (some_signal : IN STD_LOGIC; other : IN STD_LOGIC; clk : IN STD_LOGIC; flag : OUT STD_LOGIC; ); END example; ARCHITECTURE minimal OF example IS BEGIN minexample:PROCESS(clk) BEGIN IF (clk'EVENT and clk='1') THEN IF some_signal = other THEN other <= other + '1'; ELSE other <= other; END IF; IF(other = '1') THEN flag <= '1'; ELSE flag <= '0'; -- always specify all cases END IF; END IF; END PROCESS minexample; END minimal; 会发生什么情况来猜测你是在推断一个锁存器。为了防止这种情况,你要指定所有情况任何决策树。

{{1}}

答案 1 :(得分:1)

我使用N8TRO的代码并添加一个复位,在启动时将信号设置为零,并将信号改为整数(因为你想检查值3)并检查rising_edge(应该是更好的方法) )。

现在,在复位设置为低电平后,信号标志应在4个时钟后升至高电平。这是你期望的行为吗?

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;    

ENTITY  example IS
   PORT (some_signal      : IN  STD_LOGIC;
         other            : IN  integer range 0 to 3; --this should be an integer 2 bit widht
         clk              : IN  STD_LOGIC;
         reset            : IN  STD_LOGIC;
         flag             : OUT STD_LOGIC;
        );
END example;

ARCHITECTURE minimal OF example IS

BEGIN 

minexample:PROCESS(clk,reset)
BEGIN
IF (reset = '1') then   --i think a reset is a good idea
      flag <= '0';
      other <= 0;
ELSIF (rising_edge(clk)) THEN
      IF some_signal = other THEN
         other <= other + 1;
      ELSE 
         other <= other;
      END IF;

      IF(other = 3) THEN --other is now an integer, so you can check on 3
         flag <= '1';
      ELSE 
         flag <= '0'; -- always specify all cases
      END IF;

END IF;

END PROCESS minexample;

END minimal;