Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops VHDL:将一个信号与多个值进行比较_Loops_Vhdl_Fpga - Fatal编程技术网

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

Loops VHDL:将一个信号与多个值进行比较,loops,vhdl,fpga,Loops,Vhdl,Fpga,我想将一个信号与预定义值列表进行比较,并检查该列表中是否有至少相等的值(或者,如果列表中没有相等的值) 示例应用程序:将收到的命令与预定义的有效命令列表进行比较,如果命令无效,则转到错误状态。想象一下,我们只有3个有效的命令:0x00、0x01和0xFF。然后,此代码将执行以下操作: --valid commands: 0x00, 0x01, 0xFF process(clk) is --somewhere in the middle of FSM if cmd /= x"00" and

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

示例应用程序:将收到的命令与预定义的有效命令列表进行比较,如果命令无效,则转到错误状态。想象一下,我们只有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;

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

参考值数组上的循环可能更容易维护:

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;
子类型参考值为标准逻辑向量(7到0);
类型ref_值数组是ref_值的数组(自然范围);
常数参考值:参考值数组(0到2):=(x“00”,x“01”,等等);
...

下一个状态还有一个case语句,其中cmd的有效选项是显式的,所有其他值都包含在“其他”选项中。@user1155120如果有大量选项,这可能会变得不那么紧凑和不可维护。没有操作的选项(下一个状态未指定为error)您的ref_值文字是否由“|”而不是“,”分隔,这说明了缺乏上下文——下一个_状态的含义(它的类型和用途)。您假设的值与问题中的示例不同(无错误)。它是直接枚举值还是间接枚举值?
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;