Hallo, Von vornherein es ist ist mein zweiter VHDL Versuch. Wenn ich die Schaltung in ISIM simulieren will kommt gar nicht raus. Was mache ich falsch? Danke im Voraus
Weiss nicht, ob das mit dem concurrent statement für den Clock im Testbench geht. Ich generier sie jeweils so:
1 | clk_osc : process |
2 | |
3 | procedure clk is |
4 | begin
|
5 | SysxC <= '0' after (0.25*clk_cycle); |
6 | wait for 0.5 * clk_cycle; |
7 | SysxC <= '1' after (0.25*clk_cycle); |
8 | wait for 0.5 * clk_cycle; |
9 | end clk; |
10 | |
11 | begin
|
12 | while true loop |
13 | clk; |
14 | end loop; |
15 | end process clk_osc; |
Auf jeden fall sollten mal mindestenst die Inputs sinnvolle Werte haben.
1 | -- Clock period definitions
|
2 | constant clk_period : time := 10 ns; |
3 | |
4 | BEGIN
|
5 | |
6 | -- Instantiate the Unit Under Test (UUT)
|
7 | uut: FULL_PWM PORT MAP ( |
8 | clk => clk, |
9 | pwmvalue_up => pwmvalue_up, |
10 | pwmvalue_down => pwmvalue_down, |
11 | pwmout => pwmout |
12 | );
|
13 | |
14 | -- Clock process definitions
|
15 | clk_process :process |
16 | begin
|
17 | clk <= '0'; |
18 | wait for clk_period/2; |
19 | clk <= '1'; |
20 | wait for clk_period/2; |
21 | end process; |
22 | |
23 | |
24 | |
25 | |
26 | -- Stimulus process
|
27 | stim_proc: process |
28 | begin
|
29 | -- hold reset state for 100 ns.
|
30 | wait for 100 ns; |
31 | |
32 | wait for clk_period*10; |
33 | |
34 | -- insert stimulus here
|
35 | |
36 | wait; |
37 | end process; |
Habe auch Standardroutine die vom Xilinx selbst generiert wurde probiert, hat es aber nicht gebracht. HILFE
Hm, kann es sein, dass du nur deinen FULL_PWM.vhd simulierst und nicht die Testbench? Bei mir sieht die Simulation wie erwartet aus (siehe Anhang). Die PWM-Register sind übrigens undefiniert, bis der Counter zum ersten Mal auf 254 läuft (wird auch als Warnung in Isim ausgegeben). Gruss, Tschaebe
Ich tippe auch auf einen falsch gesetzten Toplevel-Eintrag: du simulierst das PWM-Modul, nicht die Testbench.... :-o
>>Lothar Miller
Es war wirklich so. Danke.
Eine Frage hätte ich trotzdem: mach es Sinn in dem Fall Signal zu
benützen? Wäre Variable nicht bessere Alternative?
> mach es Sinn in dem Fall Signal zu benützen? Bei was? > Wäre Variable nicht bessere Alternative? Grundregel für Anfänger: Finger weg von Variablen. So ziemlich jede Nutzung von Variablen von Anfängern beruht auf falschen Annahmen bis zu totalem Unverständnis des Unterschieds Signal/Variable.
>>Georg
1 | signal pwm_reg_up : STD_LOGIC_VECTOR (7 downto 0); --Temporärer Wert für den 1 Zahler |
2 | signal pwm_reg_down : STD_LOGIC_VECTOR (7 downto 0); --Temporärer Wert für den 2 Zahler |
3 | signal cnt : integer range 0 to 254 := 0; --Counter |
ich meine es macht keinen Unterschied ob ich Signale oder Variable verwende. Oder liege da falsch?
So im schnellen Codeüberflug würde es vermutlich einen (Timing-)Unterschied machen. Also Finger weg.
Student schrieb:
1 | signal pwm_reg_up : STD_LOGIC_VECTOR (7 downto 0); --Temporärer Wert für den 1 Zahler |
2 | signal pwm_reg_down : STD_LOGIC_VECTOR (7 downto 0); --Temporärer Wert für den 2 Zahler |
3 | signal cnt : integer range 0 to 254 := 0; --Counter |
> ich meine es macht keinen Unterschied ob ich Signale oder Variable > verwende. Oder liege da falsch? frage an Radio Eriwan... Wenn du ein als 'signal' deklariertes Signal mit einem 'concurrent' statement beschreibst, dann hast du halt ein Stueck Draht, das aus einem fliegenden Logikteil rauskommt. Wenn du es in einem getakteten Prozess verwendest,dann ist es der Ausgang eines FlipFlops. Bei concurrent also der D-Eingang eines FFs, bei process also der Q-Ausgang eines FFs. Und ein process ohne Takt, also nur mit Input-Parametern, ist nix anderes als ein concurrent statement, macht genau das gleiche... Eine Variable kannst du nur im 'process' definieren (von dem Unsinn mit shared variables mal abgesehen). Sie beschreibt einen Eingang eines FFs. Das kann auch in ein FF muenden, aber Vorsicht, die Reihenfolge der Zuweisungen spielt hier eine Rolle. Die Zuweisung an eine variable wird sofort wirksam, nicht erst wenn du das naechste Mal den process durchlauefst. Variablen sind, wenn sie nicht nur ausschliesslich als Zwischenwert an genau einer Stelle verwendet werden, ziemlich tueckisch. Und genau deshalb braucht man sie in >90% aller Faelle nicht! Lothar hat auf seiner Seite ein paar Beispiele die sehr lehrreich sind. Und da kann man sich noch weitere Gemeinheiten basteln... Also mein Rat: Vergiss 'variable'! Ich verwende die nur, wenn ich damit einen Ausdruck zusammen fassen kann und mir dafuer Tipparbeit spare. Und ich verwende sie nie als Speicherelement (aka FF). Und sogar in diesen paar Faellen koennte ich sie mit einem 'signal' sowie einer 'concurrent' Zuweisung ersetzen...
PS: Variablen verwende ich exzessiv in Testbenches. Aber das ist etwas ganz anderes...
Ich verweise gern auf den Beitrag "Variable vs Signal" Fazit: wenn schon Variablen, dann nur für temporäre Ergebnisse, niemals speichernd!
Lothar Miller schrieb: > wenn schon Variablen, dann nur für temporäre Ergebnisse ich gehe da noch weiter: Wenn schon, dann fuer genau ein temporaeres Ergebniss!
>>berndl, Lothar Miller
Leute, danke für so eine ausführliche Erklährung.
berndl schrieb: > PS: Variablen verwende ich exzessiv in Testbenches. Aber das ist etwas > > ganz anderes... Variablen verwende ich nur zum zwischenzeitlichen Zusammenfassen von Signalen, wenn die Formulierung mit einer Zeile nicht funktioniert.
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.