如何设计一个具有额外输出的解码器?

时间:2015-03-26 15:38:47

标签: vhdl decoder digital-logic

对于我正在创建的应用程序,我想使用一个有助于写入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;

希望其他所有内容都经过精心设计,以便输入&gt; 41不会发生,但如何编写代码来处理这种情况?有没有办法处理它而不停止应用程序如何?或者,作为替代方案,有没有办法编写只有42个输出的解码器?

1 个答案:

答案 0 :(得分: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));

假设'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'替换为{{1}}。