VHDL:将信号与多个值进行比较

VHDL: compare a signal against multiple values

我想将信号与预定义值列表进行比较,并检查该列表是否至少有相等的值(或者,如果列表中没有相等的值)。

示例应用:将接收到的命令与预定义的有效命令列表进行比较,如果命令无效则进入错误状态。想象一下,我们只有 3 个有效命令:0x00、0x01 和 0xFF。那么这段代码就可以完成工作:

--valid commands: 0x00, 0x01, 0xFF

process(clk) is
--somewhere in the middle of FSM
  if cmd /= x"00" and cmd /= x"01" and cmd /= x"01" then
    next_state <= error;
  end if;
end process;

但我想知道如何有效地(在编码风格方面)为更长列表实现同样的事情,而无需手动与每个值进行比较(即避免写这样的行:)

if cmd=val1 or cmd=val2 or ... or cmd=valN then --imagine N=100

我想这与数组和循环有关?

引用值数组的循环可能更容易维护:

subtype ref_value is std_ulogic_vector(7 downto 0);
type ref_value_array is array (natural range <>) of ref_value;
constant ref_values: ref_value_array(0 to 2) := (x"00", x"01",...);
...
next_state <= error;
for i in ref_values'range loop
  if cmd = ref_values(i) then
    next_state <= no_error;
    break;
  end if;
end loop;