我正在尝试比较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;
代码编译并运行正常但是当我看到模拟窗口时,无论其他值是什么,标志都会被设置。我做错了什么或其他的价值是波动的。 以上是伪代码,语法上的一切都是正确的。 请帮忙
提前致谢
答案 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;