Des idées pour un décodeur flexible / générique en VHDL
Question
Je veux créer une adresse décodeur qui est suffisamment souple pour moi d'utiliser lors de la modification du nombre de bits du sélecteur et des signaux de sortie décodés.
Ainsi, au lieu d'avoir une statique (entrée fixe / taille de sortie) décodeur qui ressemble à quelque chose comme ceci:
entity Address_Decoder is
Generic
(
C_INPUT_SIZE: integer := 2
);
Port
(
input : in STD_LOGIC_VECTOR (C_INPUT_SIZE-1 downto 0);
output : out STD_LOGIC_VECTOR ((2**C_INPUT_SIZE)-1 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC
);
end Address_Decoder;
architecture Behavioral of Address_Decoder is
begin
process(clk)
begin
if rising_edge(clk) then
if (rst = '1') then
output <= "0000";
else
case <input> is
when "00" => <output> <= "0001";
when "01" => <output> <= "0010";
when "10" => <output> <= "0100";
when "11" => <output> <= "1000";
when others => <output> <= "0000";
end case;
end if;
end if;
end process;
end Behavioral;
Vous avez quelque chose qui est plus souple / général, qui ressemble à ceci:
entity Address_Decoder is
Generic
(
C_INPUT_SIZE: integer := 2
);
Port
(
input : in STD_LOGIC_VECTOR (C_INPUT_SIZE-1 downto 0);
output : out STD_LOGIC_VECTOR ((2**C_INPUT_SIZE)-1 downto 0);
clk : in STD_LOGIC;
rst : in STD_LOGIC
);
end Address_Decoder;
architecture Behavioral of Address_Decoder is
begin
DECODE_PROC:
process (clk)
begin
if(rising_edge(clk)) then
if ( rst = '1') then
output <= conv_std_logic_vector(0, output'length);
else
case (input) is
for i in 0 to (2**C_INPUT_SIZE)-1 generate
begin
when (i = conv_integer(input)) => output <= conv_std_logic_vector((i*2), output'length);
end generate;
when others => output <= conv_std_logic_vector(0, output'length);
end case;
end if;
end if;
end process;
end Behavioral;
Je sais que ce code n'est pas valide et que le « quand » les cas de test doit être constantes et que je ne peux pas utiliser pour-générer entre la déclaration de cas comme ça, mais il montre ce qu'il est que je suis après :. une entité assez intelligent pour se développer à mes besoins
J'ai essayé de trouver une solution élégante à ce problème sans beaucoup de succès, donc, je suis ouvert à toute suggestion.
Merci à l'avance, Erick
La solution
Il semble que vous voulez que l'entrée soit l'indice du bit de sortie qui devrait être réglée.
Ecrire comme ça. Quelque chose comme (en supposant les types de numeric_std):
output <= (others => '0'); -- default
output(to_integer(input)) <= '1';
Autres conseils
Je l'ai toujours trouvé ce genre de chose plus facile à suivre lorsque vous boucle un peu plus de chaque bit, donc quelque chose comme:
if ( rst = '1') then
output <= (others=>'0');
else
for i in 0 to (2**C_INPUT_SIZE)-1 generate
begin
if (i = conv_integer(input)) then
output(i) <= '1';
else
output(i) <= '0';
end if;
end generate;
end if;