Forum: FPGA, VHDL & Co. 1zu4 Demultiplexer


von Alfred (Gast)


Lesenswert?

Hallo,
ich erstelle gerade einen 1zu4 Demultiplexer in VHDL.
Ersteinmal der Quellcode des Demultiplexers:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
5
ENTITY output_mux IS
6
    GENERIC(
7
        g_slice_count : positive := 4; -- number of output ports
8
        g_slice_width : positive := 64 -- g_precision
9
    );
10
    PORT(
11
        input_vector    : IN  std_logic_vector(g_slice_width - 1 DOWNTO 0);
12
        index           : IN  std_logic_vector(1 DOWNTO 0);
13
        output_vector   : OUT std_logic_vector((g_slice_width * g_slice_count) - 1 DOWNTO 0);
14
        ena             : IN  std_logic := '0';
15
        clk             : IN  std_logic
16
    );
17
END ENTITY output_mux;
18
19
ARCHITECTURE behavior OF output_mux IS
20
21
BEGIN
22
23
    PROCESS(clk, ena)
24
    BEGIN
25
        IF (rising_edge(clk) and clk = '1') THEN
26
            IF (ena = '1') THEN
27
      -- build Flip-flop that holds value if other output-port is used
28
      if ( to_integer(unsigned(index)) = 0) then
29
      output_vector((1 * g_slice_width) - 1  DOWNTO 0) <= input_vector;
30
      elsif ( to_integer(unsigned(index)) = 1) then
31
      output_vector((2 * g_slice_width) - 1  DOWNTO (1 * g_slice_width)) <= input_vector;
32
      elsif ( to_integer(unsigned(index)) = 2) then
33
      output_vector((3 * g_slice_width) - 1  DOWNTO (2 * g_slice_width)) <= input_vector;
34
      elsif ( to_integer(unsigned(index)) = 3) then
35
      output_vector((4 * g_slice_width) - 1  DOWNTO (3 * g_slice_width)) <= input_vector;
36
      END IF; --if ( to_integer(unsigned(index)) = 0)
37
              END IF; --IF (ena = '1')
38
        END IF; -- clk
39
    END PROCESS;
40
END ARCHITECTURE behavior;

Hierbei habe ich zwei wesentliche Probleme:
1. Wenn ich diese Komponente, so wie sie dort steht nehme und in eine 
Testbench packe und z.B. auf Post-Translate teste im simulator (Isim), 
tut sie exakt was sie soll. Der Input wird auf den jeweilig korrekten 
Teil des Outputs gelegt, sofern Ena ='1' und steigende Taktflanke.
Binde ich exakt diese Komponente jetzt in mein eigentliches Projekt ein, 
die Eingaben sind exakt die gleichen die in der TB, funktioniert diese 
nicht mehr. der Ausgabevektor ist "UUU..." und "nur" die letzten 64 Bit 
sind belegt, aber nicht mit der korrekten Ausgabe.
Anbei ein Screen um das ganze zu verdeutlichen. Zum vergleich mal die 
Simulation von NUR der Komponente und TB darunter.

Die Einbindung der Komponente sieht wie folgt aus (im gesamten Projekt):
1
        OutputMux : COMPONENT output_mux
2
        GENERIC MAP(
3
            g_slice_count   => (2 ** g_ArrayLength),
4
            g_slice_width   => g_precision
5
        )
6
        PORT MAP(
7
            input_vector    => s_Result_delay,
8
            index           => s_WbAdr_delay3(g_ArrayLength - 1 DOWNTO 0),
9
            output_vector   => s_MData,
10
            --ena             => output_ena,
11
      ena             => '1',
12
            clk             => Clk
13
        );
14
    END GENERATE;

--> Zu testzwecken habe ich ena dauerhaft auf '1' gelegt.
Jetzt meine zwei wesentlichen Fragen dazu:
1. Ena ist mit '0' initialisiert in der Komponente selbst und als Wert 
wird immer eine '1' übergeben. Warum zeigt der Simulator 'U' an ?!
2. Warum demuliplext die Komponente, sofern diese "nur" innerhalb einer 
Testbench läuft, korrekt und sobald ich diese einbinde , sie aber exakt 
die gleichen Inputs erhält, funktioniert sie nichtmehr ?
Simulationen sind die gleichen (Post-Translate), Inputs die gleichen, 
Outputs auch alle verbunden und bis nach Aussen komplett durchgeführt.

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

Sry für Doppelpost, habe den Screen vergessen.

von ChristophZ (Gast)


Lesenswert?

Alfred schrieb:
> 1. Ena ist mit '0' initialisiert in der Komponente selbst und als Wert
> wird immer eine '1' übergeben. Warum zeigt der Simulator 'U' an ?!

Dazu kann ich dir leider nichts konstruktives sagen.
Diese Frage ist aber wichtig, dass sie zuerst gelöst wird, da ja "ena" 
deinen demultiplexer steuert.

Am Ausgang deines Demultiplexers wirst du während der Simulation für 
einzelne Ports länger "U" sehen, nähmlich genau so lange bis jeder der 4 
Ports einmal selektiert wurde.

Alfred schrieb:
> Hierbei habe ich zwei wesentliche Probleme:
> 1. Wenn ich diese Komponente, so wie sie dort steht nehme und in eine
> Testbench packe und z.B. auf Post-Translate teste im simulator (Isim),
> tut sie exakt was sie soll.

Gegenfrage, was tut deine Schaltung wenn du eine Verhaltenssimulation 
machst anstatt Post-Translate?

Sie muss auch in der Verhaltenssimulation das machen, was du von ihr 
verlangst, vielleicht ist es dann einfacher dein Problem zu finden.

von Alfred (Gast)


Angehängte Dateien:

Lesenswert?

ChristophZ schrieb:
> Alfred schrieb:
>> 1. Ena ist mit '0' initialisiert in der Komponente selbst und als Wert
>> wird immer eine '1' übergeben. Warum zeigt der Simulator 'U' an ?!
>
> Dazu kann ich dir leider nichts konstruktives sagen.
> Diese Frage ist aber wichtig, dass sie zuerst gelöst wird, da ja "ena"
> deinen demultiplexer steuert.
Hm das ist schlecht.

> Gegenfrage, was tut deine Schaltung wenn du eine Verhaltenssimulation
> machst anstatt Post-Translate?


Siehe Anhang. In der Verhaltenssimulation funktioniert es einwandfrei.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alfred schrieb:
> IF (rising_edge(clk) and clk = '1') THEN
Sieh dir mal die Funktion rising_edge() an...

Welchen Wert hat ena in der Simulation? Ich bin mir nicht sicher, ob es 
eine schlaue Idee ist, das nicht speichernde Signal ena im Header mit 
einem Wert vorzubelegen.

'U' bedeutet uninitalised, es sieht so aus, wie wenn nichts zugewiesen 
wird...

: Bearbeitet durch Moderator
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.