更简单的写法是:
type regs_type is array (integer range <>) of std_logic_vector(7 downto 0);
signal regs : regs_type (0 to 41) := (others => (others => '0'));
...
output <= regs(to_integer(unsigned(input));
假设“输入”是一个std_logic_vector,并且您的寄存器是 8 位宽。
然后将regs数组用于寄存器 0-41。我想如果您想明确说明 42+ 的寄存器,您可以创建一个大小为 64 的数组,并使上面的元素保持不连接,但我相信上面的代码会达到同样的效果。
如果您的寄存器实际上有有意义的名称,而不仅仅是reg0等等,您可以有一个单独的代码块将它们连接到regs数组,例如:
regs(0) <= setup_reg;
regs(1) <= data_out;
等等。如果我这样做,我会为regs索引值定义常量,例如:
constant SETUP_REG_ADDRESS : integer := 0;
constant DATA_OUT_ADDRESS : integer := 1;
...
regs(SETUP_REG_ADDRESS) <= setup_reg;
regs(DATA_OUT_ADDRESS) <= data_out;
或者,如果您想保留该case声明,您可以将您的others条款写为
when others => output <= (others => '-');
这种“不关心”值允许工具在您认为无论如何都无法访问的情况下执行最有效的任何操作。如果您担心output如果input以某种方式确实超过了 41 会分配给未定义的东西,您总是可以将 替换'-'为'0'.