Forum: FPGA, VHDL & Co. Fehler beim Kodieren mit vhdl


von Eddy H. (Firma: student) (eddy_2007)


Lesenswert?

Ich versuche ein Multiplexer mittels VHDL zu schreiben, der mir auch 
Parallel mehrere Signale gleichzeizig multipleziert...
(da ich neu mit VHDL bin) ich habe aber paar Verständnis Probleme...

ich habe 6 Multiplexer erstellt IC1,IC2...IC6, ich habe aber nur eine 
definiert (denn sie sollen ähnliche Eigenschaften haben) und davon den 6 
gewünschten Multiplexern instanziert..

architecture Behavioral of behav is


           component IC
      Port ( Clk : in STD_LOGIC;
               RST : in STD_LOGIC;
               A  : in  STD_LOGIC_VECTOR(2 downto 0);
               EN  : in  STD_LOGIC;
               N01 : in  STD_LOGIC;
               N02 : in  STD_LOGIC;
               N03 : in  STD_LOGIC;
               N04 : in  STD_LOGIC;
               N05 : in  STD_LOGIC;
               N06 : in  STD_LOGIC;
               COM : out  STD_LOGIC);
           end component IC;

begin

     --Instantiate Components

  --IC1: Process
      IC1 : IC
        port map (
          Clk => CLK,
          RST => RST,
          A   => D_IC1,
          EN   => D8,
          N01 => N1,
          N02 => N2,
          N03 => N3,
          N04 => N4,
          N05 => N5,
          N06 => N6,
          COM => COM6
        );
  --end process IC1;

  --IC2: Process
     IC2 : IC
        port map (
          Clk => CLK,
          RST => RST,
          A   => D_IC2,
          EN   => D7,
          N01 => N1,
          N02 => N2,
          N03 => N3,
          N04 => N4,
          N05 => N5,
          N06 => N6,
          COM => COM5
        );
  --end process IC2;

  --IC3: Process
     IC3 : IC
        port map (
          Clk => CLK,
          RST => RST,
          A   => D_IC3,
          EN   => D6,
          N01 => N1,
          N02 => N2,
          N03 => N3,
          N04 => N4,
          N05 => N5,
          N06 => N6,
          COM => COM4
        );
  --end process IC3;

  --IC4: Process
     IC4 : IC
        port map (
          Clk => CLK,
          RST => RST,
          A   => D_IC4,
          EN   => D5,
          N01 => N1,
          N02 => N2,
          N03 => N3,
          N04 => N4,
          N05 => N5,
          N06 => N6,
          COM => COM3
        );
  --end process IC4;

  --IC5: Process
      IC5 : IC
        port map (
          Clk => CLK,
          RST => RST,
          A   => D_IC5,
          EN   => D4,
          N01 => N1,
          N02 => N2,
          N03 => N3,
          N04 => N4,
          N05 => N5,
          N06 => N6,
          COM => COM2
        );
  --end process IC5;

  --IC6: Process
       IC6 : IC
        port map (
          Clk => CLK,
          RST => RST,
          A   => D_IC6,
          EN   => D3,
          N01 => N1,
          N02 => N2,
          N03 => N3,
          N04 => N4,
          N05 => N5,
          N06 => N6,
          COM => COM1
        );
  --end process IC6;


end Behav;

die 6 multiplexer IC1...6 sollen auch paralle Signale Steurn:
deswegen habe ich mir gedacht ich kann sie Als Process deklarieren da 
wie es komentiert ist.

oder soll ich Process deklarieren beim definition der IC:

begin

    Mux:process
    begin
      if ( RST = '1' ) then COM <= '0';
      else
        if rising_edge (Clk) then
          if(EN = '1') then
            if( A = "001") then COM <= N01;
            elsif( A = "010") then COM <= N02;
            elsif( A = "011") then COM <= N03;
            elsif( A = "100") then COM <= N04;
            elsif( A = "101") then COM <= N05;
            elsif( A = "110") then COM <= N06;
            end if;
          end if;
        end if;
      end if;
    end process;


end Behavioral;

LG Eddy

von Falk B. (falk)


Lesenswert?

@ Eddy Hoffmann (Firma student) (eddy_2007)

>ich habe 6 Multiplexer erstellt IC1,IC2...IC6, ich habe aber nur eine
>definiert (denn sie sollen ähnliche Eigenschaften haben) und davon den 6
>gewünschten Multiplexern instanziert..

OK, aber mal ein paar Hinweise. Für breite Dateneingänge nutzt man 
Vekoren, nicht N1, N2, N3 ...
Mir ist nicht wirklich klar, was du da machen willst. Dein MUX Prozess 
unten ist auch ungünstig. Die vielen IFs erzeugen ungewollte 
Prioritäten, die das Design ggf. verlangsamen bzw. aufblähen. Ein CASE 
Statement ist dort das Mittel der Wahl.

MFG
Falk

von Eddy H. (Firma: student) (eddy_2007)


Lesenswert?

@Falk
danke für die Hinweise.

> OK, aber mal ein paar Hinweise. Für breite Dateneingänge nutzt man
> Vekoren, nicht N1, N2, N3 ...

die eingänge N01...N06 sind Signale die kommen von meiner externen HW
die will ich je nach A(steuersignal) zum Output COM multiplexen

> Mir ist nicht wirklich klar, was du da machen willst. Dein MUX Prozess
> unten ist auch ungünstig. Die vielen IFs erzeugen ungewollte
> Prioritäten, die das Design ggf. verlangsamen bzw. aufblähen. Ein CASE
> Statement ist dort das Mittel der Wahl.

habe ich jetzt geändert:

architecture Behavioral of IC is
begin
    process(N01,N02,N03,N04,N05,N06,A)
    begin

        --use Case statement
        case A is
            when "001" => COM <= N01;
            when "010" => COM <= N02;
            when "011" => COM <= N03;
            when "100" => COM <= N04;
            when "101" => COM <= N05;
            when "110" => COM <= N06;
            when others => COM <= "ZZZ";
        end case;
    end process;
end Behavioral;

bin immer nich sicher ob die ICs so parallel die signale multiplezieren 
können ?

LG Eddy

von Falk B. (falk)


Lesenswert?

@ Eddy Hoffmann (Firma student) (eddy_2007)

>> OK, aber mal ein paar Hinweise. Für breite Dateneingänge nutzt man
>> Vekoren, nicht N1, N2, N3 ...

>die eingänge N01...N06 sind Signale die kommen von meiner externen HW
>die will ich je nach A(steuersignal) zum Output COM multiplexen

Ja und? Die kann man trotzdem sinnvollerweise zu einem Vektor 
zusammenfassen.

>bin immer nich sicher ob die ICs so parallel die signale multiplezieren
>können ?

Welcher? IC? Ein FPGA/CPLD? Sicher, warum nicht?

MG
Falk

von Eddy H. (Firma: student) (eddy_2007)


Lesenswert?

@Falk Brunner

> Welcher? IC? Ein FPGA/CPLD? Sicher, warum nicht?

die ICs!!

ich will sicher gehen dass die ICs signale gleichzeitig multiplezieren 
können. (parallel) --> deswegen habe ich vorhin mit Presess versucht(was 
ich komentiert habe) !!

mein Ziel ist sicher zu stellen dass die IC1,IC2...und IC6 Signale 
parallel multiplezieren werden.

von Falk B. (falk)


Lesenswert?

@ Eddy Hoffmann (Firma student) (eddy_2007)

>> Welcher? IC? Ein FPGA/CPLD? Sicher, warum nicht?

>die ICs!!

Ahhhh, du meinst deine Komponenten. Das sind keine ICs, naja, vielleicht 
könnte man sie als virtuelle ICs bezeichnen. Der Rest der Designer nennt 
sie Components.

>ich will sicher gehen dass die ICs signale gleichzeitig multiplezieren
>können. (parallel)

Warum sollten sie das nicht?

>mein Ziel ist sicher zu stellen dass die IC1,IC2...und IC6 Signale
>parallel multiplezieren werden.

Wenn es nicht total vergurkst werden sie dass.

MFG
Falk

von Eddy H. (Firma: student) (eddy_2007)


Lesenswert?

@ Falk Brunner
> Ahhhh, du meinst deine Komponenten. Das sind keine ICs, naja, vielleicht
> könnte man sie als virtuelle ICs bezeichnen. Der Rest der Designer nennt
> sie Components.

genau Komponenten! (sorry ich bin neu Einsteiger mit VHDL..)
ich habe sie in meinem Design IC genannt, denn ich versuche ein 
vorhandener WH mit VHDL zu Simulieren :-)

Danke sehr Falk

LG
Eddy

von Ralf (Gast)


Lesenswert?

Hallo Eddy,

so wie ich dich verstanden habe,
würde ich zunächst einen Multiplexer definieren:
1
  entity mux
2
    Port (
3
      Clk : in std_logic;
4
      RST : in std_logic;
5
      EN  : in std_logic;
6
      A   : in std_logic_vector(2 downto 0);
7
      N   : in std_logic_vector(2 downto 0);
8
      com : out std_logic
9
    );
10
   end mux;
11
12
   architecture behavioral of mux is
13
   begin
14
     process(RST, Clk)
15
     begin
16
      if (RST = '1') then
17
        com <= '0';
18
      elsif rising_edge (Clk) then
19
        if (EN = '1') then
20
          com <= N(to_integer(unsigned(A)));
21
        end if;
22
      end if;
23
    end process;
24
  end behavioral;

diesen in einem eigenen package abspeichern,
und in einem anderen package dann diesen mux
6 mal instanzieren.

1
  entity mux6
2
    Port (
3
      Clk  : in std_logic;
4
      RST  : in std_logic;
5
      d    : in std_logic_vector(2 downto 0);
6
      d_ic : in std_logic_vector(2 downto 0);
7
      N    : in std_logic_vector(2 downto 0);
8
      com  : out std_logic_vector(2 downto 0)
9
    );
10
  end mux6;
11
12
  architecture behavioral of mux6is
13
  begin
14
    MUX_GEN: for i in d'range generate
15
      inst: mux
16
      port map (
17
        rst => rst,
18
        clk => clk,
19
        en  => d(i),
20
        a   => d_ic(i),
21
        n   => n,
22
        com => com
23
      );
24
  end generate;
25
26
27
  end behavioral;

Diese werden auf jeden Fall alle parallel schalten
(sofern das physikalisch überhaupt möglich ist).
Das ist nur ein Vorschlag und nicht getestet. Ist
übrigens ein gutes Beispiel für das "generate"
Statement.

Gruß

Ralf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.