2011-01-24 15 views
7

Seçicinin bit sayısını ve kodu çözülmüş çıkış sinyallerini değiştirirken kullanmam için yeterince esnek bir kod çözücü oluşturmak istiyorum.VHDL'de esnek/genel bir kod çözücüsü için fikirler

Yani, bunun yerine bir statik sahip (sabit giriş/çıkış boyutu) Dekoder şuna benzer olduğunu:

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; 
:

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; 

şöyle general/daha esnek olan bir şeyi, var

Bu kodun geçerli olmadığını ve "ne zaman" sınama durumlarının sabit olması gerektiğini ve bu tür bir durum deyiminde for-generate'ı kullanamayacağımı biliyorum, ancak sonra ne olduğumu gösterir : ihtiyaçlarıma yetecek kadar akıllı bir varlık.

Bu problem için çok başarılı bir çözüm bulmaya çalışıyorum, herhangi bir öneriye açığım. peşin

sayesinde Erick

+1

'numeric_std' bir sağlar Bir vektörü belirtilen bir sayıya kaydıran işlev. Yani muhtemelen '0 =>' 1 'vektörünü, diğerleri =>' 0 '' vektörünü (giriş numarası - 1) değiştirebilirsin. –

cevap

13

Anlaşılan giriş ayarlanmalıdır çıkış biti indeksi olmak istiyorum.

Bunu böyle yazın. (NUMERIC_STD gelen türlerini varsayarak) gibi bir şey:

output <= (others => '0'); -- default 
output(to_integer(input)) <= '1'; 
+2

Kısa ve etkili (ve harika çalıştı!) Bu, bazen donanım açıklamasında (donanım uygulamasının neye benzeyeceğine daha yakın bir mantığı tanımlamaya çalışarak) biraz "aşağı" gitmek istendiğini fark etmemi sağlıyor. tasarım yükünün bir kısmını sizin yerine yazılımın üzerine koyan çözümler. –

+2

numaralı çözüm için teşekkürler. Meta mesajını aldığınız için çok mutluyum :-) HDL tasarım dünyasında şaşırtıcı bir şekilde görülmeyen bu içgörüden dolayı tebrikler! –

1

Hep üzerindeki her bir bit zaman sadece döngü takip etmek daha kolay bu tür bir şey bulduk, bu nedenle bir şey gibi:

 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;