clk循环中的VHDL变量检查

clk循环中的VHDL变量检查,vhdl,Vhdl,我试图比较clk循环中的两个值 例如: if(行驶边缘(clk))然后 如果(某些信号=其他),则 other如果没有一个最小的工作示例,我只能猜测您是通过不指定标志在other不是3时发生的情况来推断闩锁。为了防止这种情况,您需要指定任何决策树的所有案例 LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY example IS PORT (some_signal : IN STD_LOGIC; ot

我试图比较clk循环中的两个值 例如:

if(行驶边缘(clk))然后
如果(某些信号=其他),则

other如果没有一个最小的工作示例,我只能猜测您是通过不指定
标志
other
不是3时发生的情况来推断闩锁。为了防止这种情况,您需要指定任何决策树的所有案例

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;
ieee库;
使用ieee.std_logic_1164.ALL;
实体示例是
端口(某些_信号:在标准_逻辑中;
其他:标准逻辑;
clk:标准逻辑中;
标志:输出标准逻辑;
);
结束示例;
示例的架构是
开始
Mine示例:过程(clk)
开始
如果(clk'事件和clk='1'),则
如果某个信号=其他,则

other我使用N8TRO代码并添加一个复位,在启动时将信号设置为零,并将信号other更改为整数(因为您喜欢检查值3)和上升沿(应该是更好的方法)

现在,复位设置为低后,信号标志应在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;
ieee库;
使用ieee.std_logic_1164.ALL;
实体示例是
端口(某些_信号:在标准_逻辑中;
其他:在0到3的整数范围内;--这应该是一个2位宽的整数
clk:标准逻辑中;
复位:在标准逻辑中;
标志:输出标准逻辑;
);
结束示例;
示例的架构是
开始
示例:进程(clk、重置)
开始
如果(reset='1'),那么——我认为reset是个好主意

flag请发布真实代码,而不是伪代码。听起来不错,但信号分配不应该是
你是对的。。我现在不在编译器附近,我只是在转换一些旧代码。谢谢。我试着做同样的事情,但它仍然声明条件为真,即使我添加了其他条件。我认为问题在于,当它在值之间波动时,它也会得到3,并将标志设置为高,从而使条件变为真。我知道问题是什么,但我该如何解决它。@user3217602你需要重新思考你想做什么。如果某个_信号
为“3”,则标志将为真,否则标志将为假(在其他增量足以等于某个_信号之后)。。我建议在你的问题描述中加入更多细节。。以及更多的努力来做出一个有效的例子。
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;