0

对于我正在创建的应用程序,我想使用有助于写入 42 个寄存器之一的解码器。为了考虑所有可能的寄存器,我需要一个 6 位输入,因为 lg(42) 的上限是 6。

但是,这将创建一个 6 到 64 的解码器,给我留下额外的 12 个我不知道如何处理的输出。我知道在 VHDL 中我可以为它写一个 case 语句:

case input is
   when "000000" => output <= reg0;
   when "000001" => output <= reg1;
   .
   .
   .
   when others => output <= ???;
end case;

希望其他一切都被设计成不会出现输入 > 41,但是应该如何编写代码来处理这种情况呢?有没有办法在不停止应用程序的情况下处理它?或者,作为替代方案,有没有办法编写一个只有 42 个输出的解码器?

4

1 回答 1

3

更简单的写法是:

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'.

于 2015-03-26T15:58:58.963 回答