www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Idee für universeller Decoder VHDL Code?


Autor: Max Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander,

hat jemand mit eine Idee, wie ich ein universellen  x to 1 Decoder in
VDHL beschreiben kann?

Die Parameterübergabe ist ja noch einfach mittels "generic" lösbar,
aber wie kann ich die "case" Anweisung gestalten, das alle
Kombinationen einen Decodier werden.
Also wie kann ich die "when" Zeilen universal schreiben, so das
SEL_WIDTH = 4 und  SIG_WIDTH = 16 sein kann?

Hier mal den Grundcode:

library IEEE;
use IEEE.std_logic_1164.all;

entity DECODE_Xto1 is
   generic (SEL_WIDTH         : integer :=3;
            SIG_WIDTH         : integer :=8
   );
   port (   SEL               : in std_logic_vector(SEL_WIDTH-1 downto
0);
            SIG_IN            : in std_logic_vector(SIG_WIDTH-1 downto
0);

            SIG_OUT           : out std_logic
   );
end DECODE_Xto1;

architecture RTL of DECODE_Xto1 is
begin

   process (SEL, SIG_IN)
   begin
      case SEL is
         when "000" => SIG_OUT <= SIG_IN(0);
         when "001" => SIG_OUT <= SIG_IN(1);
         when "010" => SIG_OUT <= SIG_IN(2);
         when "011" => SIG_OUT <= SIG_IN(3);
         when "100" => SIG_OUT <= SIG_IN(4);
         when "101" => SIG_OUT <= SIG_IN(5);
         when "110" => SIG_OUT <= SIG_IN(6);
         when "111" => SIG_OUT <= SIG_IN(7);

         -- For simulation only
         when others => SIG_OUT <= 'X';
      end case;
   end process ;
end RTL;

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine lokale Integer Variable beginnend von 0 solange per LOOP
inkrementieren bis sie mit SEL identisch ist. Der Zähler ist dann
identisch mit dem Index, eg. von SIG_OUT <= SIG_IN(Zähler).

Gruß Hagen

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na wenn das mal synthesefähig ist. Man kann auch die generate-Anweisung
bemühen.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity ONEtoN is
    generic(
        SEL_WIDTH: natural := 3;
        SIG_WIDTH: natural := 8
    );
    port(
        SIG_IN: in std_logic_vector(SIG_WIDTH downto 0);
        SIG_OUT: out std_logic;

        SEL: in std_logic_vector(SEL_WIDTH downto 0)
    );
end entity;


architecture BEHAVIOUR of ONEtoN is
begin

Demux_1toN: for index in SIG_WIDTH downto 0 generate
    begin
        SIG_OUT <= SIG_IN(index) when UNSIGNED(SEL) = index else
'Z';
    end generate;

end architecture;


Das 'Z' wird von allen mir bekannten Synthesetools richtig
umgesetzt.

ciao, Stefan.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.