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

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top