Hallo zusammen! Ich habe einen einfachen 4-Bit-Zähler mit D-FF und Halbaddierern mit dem Webpack erstellt. Wollte das ganze mit dem Simulator testen, wozu ich eine Testbench in VHDL erstellt habe, bzw. von der Software erstellen ließ. Wenn ich die Simulation starte, funktioniert lediglich die clock. Alle anderen Ausgänge bleiben auf 'U' (unassigned nehme ich an?) Ich hoffe jemand kann mir weiterhelfen, vielen Dank schonmal! Hier der Zähler und die Testbench: entity f_bit_counter is Port ( clock : in STD_LOGIC; Qa : inout STD_LOGIC; Qb : inout STD_LOGIC; Qc : inout STD_LOGIC; Qd : inout STD_LOGIC); end f_bit_counter; architecture Behavioral of f_bit_counter is component half_adder port (a, b : in std_logic; sum, carry : out std_logic); end component; component d_ff port (d, clock : in std_logic; q : out std_logic); end component; signal Qan1, Qbn1, Qcn1, Qdn1, c_a, c_b, c_c, c_d : std_logic; begin ha_a : half_adder port map ( a => Qa, b => '1', sum => Qan1, carry => c_a ); ha_b : half_adder port map ( a => Qb, b => c_a, sum => Qbn1, carry => c_b ); ha_c : half_adder port map ( a => Qc, b => c_b, sum => Qcn1, carry => c_c ); ha_d : half_adder port map ( a => Qd, b => c_c, sum => Qdn1, carry => c_d ); d_ff_a : d_ff port map ( d => Qan1, clock => clock, q => Qa ); d_ff_b : d_ff port map ( d => Qbn1, clock => clock, q => Qb ); d_ff_c : d_ff port map ( d => Qcn1, clock => clock, q => Qc ); d_ff_d : d_ff port map ( d => Qdn1, clock => clock, q => Qd ); end Behavioral; ENTITY testbench_counter IS END testbench_counter; ARCHITECTURE behavior OF testbench_counter IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT f_bit_counter PORT( clock : IN std_logic; Qa : INOUT std_logic; Qb : INOUT std_logic; Qc : INOUT std_logic; Qd : INOUT std_logic ); END COMPONENT; --Inputs signal clock : std_logic := '0'; --BiDirs signal Qa : std_logic; signal Qb : std_logic; signal Qc : std_logic; signal Qd : std_logic; -- Clock period definitions constant clock_period : time := 1us; BEGIN -- Instantiate the Unit Under Test (UUT) uut: f_bit_counter PORT MAP ( clock => clock, Qa => Qa, Qb => Qb, Qc => Qc, Qd => Qd ); -- Clock process definitions clock_process :process begin clock <= '0'; wait for clock_period/2; clock <= '1'; wait for clock_period/2; end process; -- Stimulus process stim_proc: process begin hold reset state for 100ms. wait for 100ms; wait for clock_period*10; -- insert stimulus here wait; end process; END;
Hallo! Erstmal danke für die schnelle Antwort. Ja den Satz hab ich natürlich gesehen ;-) Reicht denn nicht der Takt als Stimulus für den Zähler? Muss ich die einzelnen Ausgänge (Qa bis Qd) erst auf 0 irgendwie initialisieren?
Kein Wunder. Du schaltest ja die Ausgänge der D-FF direkt auf die IONOUTS, ohne irgendwie die Richtung der Ports umzuschalten. Außerdem brauchst du natürlich dann einen Stimulus für die Eingänge.
danke für die Antwort! Ich habe jetzt anstelle der inout ports signals genommen. Wie sollte denn beispielhaft ein Stimulus auf die Eingänge aussehen? Bin recht neu bei VHDL und habe noch so meine Probleme. Wäre super, wenn jemand zu obigen einen Vorschlag machen könnte. Oder kennt jemand eine Quelle in der Testbenches ausführlich erklärt werden? Habe bisher nichts wirklich brauchbares gefunden (und eigentlich schon viel gesucht) Tobias
> Bin recht neu bei VHDL und habe noch so meine Probleme. Lies mal das Buch "VHDL Synthese" von Reichardt/Schwarz ISBN: 3486581929 > Oder kennt jemand eine Quelle in der Testbenches ausführlich erklärt > werden? Dir reicht vorerst eine oberflächliche, dafür aber praxisnahe Betrachtung des Themas. Im o.g. Buch ist das enthalten.
Ich habe eine andere Frage zum gleichen Thema. Nutzt jemand ISIM? Ich finde keinen Button in der ISE zum starten. Von der Console kann ich es starten. Leider weiss ich nicht wie ich ISIM eine Simulation starte. Es ist immer alles ausgegraut.
Hallo! Um ISIM zu starten musst du Links im "Design" Panel unter "Sources for..." "Behavioral Simulation" auswählen. Da kannst du dann (wenn du eine Testbench erstellt hast) unter Processes unter anderem "Run simulation" auswählen. Tobias
Hallo zusammen! Um nochmal auf die obige Frage von mir zurückzukommen: Ich kriege einfach keine Simulation für den 4bit-Zähler zum laufen. Ich habe jetzt schon einiges gelesen, wie eine Testbench funktioniert etc. ist mir auch klar. Ich habe auch die einzelnen Komponenten getestet mit einer Simulation (also das D-FF und den Halbaddierer). Wenn ich die ganze Schaltung testen will, bleiben jedoch immer alle Werte auf 'U'. Langsam verzweifle ich daran ;-) Kann jemand helfen? Vielen Dank! Hier die aktuelle Testbench: ENTITY testbench IS END testbench; ARCHITECTURE behavior OF testbench IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT f_bit_counter PORT( clock : IN std_logic; Qa : OUT std_logic; Qb : OUT std_logic; Qc : OUT std_logic; Qd : OUT std_logic ); END COMPONENT; --Inputs signal clock : std_logic := '0'; --Outputs signal Qa : std_logic := '0'; signal Qb : std_logic := '0'; signal Qc : std_logic := '0'; signal Qd : std_logic := '0'; -- Clock period definitions constant clock_period : time := 1us; BEGIN -- Instantiate the Unit Under Test (UUT) uut: f_bit_counter PORT MAP ( clock => clock, Qa => Qa, Qb => Qb, Qc => Qc, Qd => Qd ); -- Clock process definitions clock_process :process begin clock <= '0'; wait for clock_period/2; clock <= '1'; wait for clock_period/2; end process; -- Stimulus process stim_proc: process begin wait for 100us; wait for clock_period*10; Qa <= Qa; Qb <= Qb; Qc <= Qc; Qd <= Qd; end process; END;
1 | Qa <= Qa; |
2 | Qb <= Qb; |
3 | Qc <= Qc; |
4 | Qd <= Qd; |
Das darfst du nicht machen. Der einzige Eingang in deine Komponente f_bit_counter ist der Takt. Und nur der wird auch stimuliert.
Hallo! Danke für die Antwort. Ja so dachte ich das auch, dass ich nur den Takt benötige. Aber auch dann passiert rein garnichts.
Gib mal den Signalen Defaultwerte:
1 | signal c_a : std_logic := '0'; |
2 | signal c_b : std_logic := '0'; |
3 | signal c_c : std_logic := '0'; |
4 | :
|
Wo tu ich das am besten? Bisher habe ich das in der Architektur-Beschreibung getan. Dadurch hat sich allerdings auch nichts verändert. Mich wundert das doch sehr... Ich habe sogar in dem Stimuli-Prozess den Ausgangssignalen mal feste Werte zugewiesen. Trotzdem blieben sie uninitialisiert. Woran kann das nur liegen?
> Woran kann das nur liegen?
Das hier ist gerade wie im Trüben fischen :-/
Pack mal deine beiden aktuellen Dateien zusammen und poste die...
Hi! Ich gehe mal davon aus, dass du auch eine Verhaltensbeschreibung für die Komponenten half_adder und d_ff hast, und nicht blos eine entity!? Gruß
Tobias schrieb: > Hallo! > Um ISIM zu starten musst du Links im "Design" Panel unter "Sources > for..." > "Behavioral Simulation" auswählen. Da kannst du dann (wenn du eine > Testbench erstellt hast) unter Processes unter anderem "Run simulation" > auswählen. > > Tobias Hallo Tobias, ich kann es einfach nicht finden, kannst du mir einen Screenshot senden. Es ist als bin ich bla.
Hallo nochmal, hier sind jetzt die aktuellen Dateien mit dem vhdl-Code. Vielleicht hat jemand Lust sich einmal anzuschauen, wo das Problem liegen könnte. Danke und Viele Grüße, Tobias
Tobias schrieb:
> hier sind jetzt die aktuellen Dateien mit dem vhdl-Code.
Dein and2 muß erst mal andtwo heißen.
Und dann sollte noch das d_ff initialisiert werden:
1 | entity d_ff is |
2 | Port ( D : in STD_LOGIC; |
3 | clock : in STD_LOGIC; |
4 | Q : out STD_LOGIC := '0'); |
5 | end d_ff; |
Dann gehts (Screenshot) ;-) EDIT: Alternativ auch so:
1 | entity d_ff is |
2 | Port ( D : in STD_LOGIC; |
3 | clock : in STD_LOGIC; |
4 | Q : out STD_LOGIC); |
5 | end d_ff; |
6 | |
7 | architecture Behavioral of d_ff is |
8 | signal q_loc : std_logic := '0'; |
9 | begin
|
10 | |
11 | process (clock) |
12 | begin
|
13 | if clock'event and clock='1' then |
14 | q_loc <= D; |
15 | end if; |
16 | Q <= q_loc; |
17 | end process; |
18 | |
19 | end Behavioral; |
Super! Vielen Dank! Es lag also nur an der fehlenden Initialisierung...hätt ich ja noch lange suchen können! Tobias
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.