Loops VHDL:将一个信号与多个值进行比较
我想将一个信号与预定义值列表进行比较,并检查该列表中是否有至少相等的值(或者,如果列表中没有相等的值) 示例应用程序:将收到的命令与预定义的有效命令列表进行比较,如果命令无效,则转到错误状态。想象一下,我们只有3个有效的命令:0x00、0x01和0xFF。然后,此代码将执行以下操作: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
--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;