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.