Hi, mit dieser Komponente will ich ein Signal um einen Takt verschieben. Zudem will ich, dass im allerersten Takt out_hsync und out_vsync auf 1 sind. Jedoch wenn ich mit Modelsim simuliere, ist im allerersten Takt hsync, vsync, out_vsync und out_hsync auf 0! in_hsync und in_vsync sind beide auf 1 im ersten Takt! Woran liegt das und kann ich das irgendwie beheben? :( Danke!! entity taktverschieber is port( takt: in bit; in_vsync: in bit; in_hsync: in bit; out_vsync: out bit; out_hsync: out bit ); end taktverschieber; architecture behaviour of taktverschieber is signal hsync,vsync :bit :='1'; begin process(takt, in_vsync, in_hsync, hsync, vsync) begin if(takt'event and takt='1') then hsync<=in_hsync; vsync<=in_vsync; end if; end process; out_hsync<=hsync; out_vsync<=vsync; end behaviour;
ich hab das nun so behoben, aber irgendwie befriedigt mich das nicht... entity taktverschieber is port( takt: in bit; in_vsync: in bit; in_hsync: in bit; out_vsync: out bit; out_hsync: out bit ); end taktverschieber; architecture behaviour of taktverschieber is signal hsync,vsync, erstertakt :bit :='1'; begin process(takt, in_vsync, in_hsync, hsync, vsync, erstertakt) begin if(takt'event and takt='1') then if(erstertakt='1') then erstertakt<='0'; hsync<='1'; vsync<='1'; else hsync<=in_hsync; vsync<=in_vsync; end if; end if; end process; out_hsync<=hsync; out_vsync<=vsync; end behaviour;
> Woran liegt das und kann ich das irgendwie beheben? :(
Zeig doch mal deine Testbench dazu.
1 | |
2 | process(takt, in_vsync, in_hsync, hsync, vsync, erstertakt) |
In diesem Prozess hängt alles nur vom Takt ab. Die Senisitiv-Liste ist überdefiniert. Richtig wäre das:
1 | process(takt) |
Denn zumindest diese Anweisungen:
1 | out_hsync<=hsync; |
2 | out_vsync<=vsync; |
sind concurrent.
Außerdem gehört sowieso ein reset dazu, der dir dann die Signale in einen definierten Anfangszustand bringt.
@Smocky: > Außerdem gehört sowieso ein reset dazu, der dir dann die Signale in > einen definierten Anfangszustand bringt. Wozu? Er hat seine Signale alle vorbelegt so das auch in der Simulation kein "U" auftaucht.
kann es sein, dass es im Nullten Takt nicht geht, weil die Ausgänge erstmal nicht belegt sind?
> Wozu? Er hat seine Signale alle vorbelegt so das auch in der Simulation > kein "U" auftaucht. Trotzdem gehört ein Flip Flop in Hinblick auf synthetisierung resetet. Und bei der Simulation ist es auch vernünftiger, weil es ja sein könnte, dass manche Tools die Initilisierung nicht bzw. unterschiedlich unterstützen.
>> Woran liegt das und kann ich das irgendwie beheben? :(
Also, bei mir klappt das mit
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity taktverschieber is |
6 | port( takt: in bit; |
7 | in_vsync: in bit; |
8 | in_hsync: in bit; |
9 | out_vsync: out bit; |
10 | out_hsync: out bit |
11 | );
|
12 | end taktverschieber; |
13 | architecture behaviour of taktverschieber is |
14 | signal hsync, vsync : bit :='1'; |
15 | begin
|
16 | |
17 | process(takt) begin |
18 | -- if rising_edge(takt) then -- alternativ
|
19 | if(takt'event and takt='1') then |
20 | hsync<=in_hsync; |
21 | vsync<=in_vsync; |
22 | end if; |
23 | end process; |
24 | |
25 | out_hsync<=hsync; |
26 | out_vsync<=vsync; |
27 | end behaviour; |
Und die Stimuli-Testbench
1 | LIBRARY ieee; |
2 | USE ieee.std_logic_1164.ALL; |
3 | USE ieee.numeric_std.ALL; |
4 | |
5 | ENTITY tb_TS_vhd IS |
6 | END tb_TS_vhd; |
7 | |
8 | ARCHITECTURE behavior OF tb_TS_vhd IS |
9 | |
10 | -- Component Declaration for the Unit Under Test (UUT)
|
11 | COMPONENT taktverschieber |
12 | PORT( |
13 | takt : IN bit; |
14 | in_vsync : IN bit; |
15 | in_hsync : IN bit; |
16 | out_vsync : OUT bit; |
17 | out_hsync : OUT bit |
18 | );
|
19 | END COMPONENT; |
20 | |
21 | --Inputs
|
22 | SIGNAL takt : bit := '0'; |
23 | SIGNAL in_vsync : bit := '1'; |
24 | SIGNAL in_hsync : bit := '1'; |
25 | |
26 | --Outputs
|
27 | SIGNAL out_vsync : bit; |
28 | SIGNAL out_hsync : bit; |
29 | |
30 | BEGIN
|
31 | |
32 | -- Instantiate the Unit Under Test (UUT)
|
33 | uut: taktverschieber PORT MAP( |
34 | takt => takt, |
35 | in_vsync => in_vsync, |
36 | in_hsync => in_hsync, |
37 | out_vsync => out_vsync, |
38 | out_hsync => out_hsync |
39 | );
|
40 | |
41 | takt <= not takt after 10 ns; |
42 | |
43 | tb : PROCESS |
44 | BEGIN
|
45 | wait for 77 ns; |
46 | in_vsync <= '1'; |
47 | in_hsync <= '0'; |
48 | wait for 77 ns; |
49 | in_vsync <= '0'; |
50 | in_hsync <= '0'; |
51 | wait for 77 ns; |
52 | in_vsync <= '0'; |
53 | in_hsync <= '1'; |
54 | wait for 77 ns; |
55 | in_vsync <= '0'; |
56 | in_hsync <= '0'; |
57 | wait for 77 ns; |
58 | in_vsync <= '1'; |
59 | in_hsync <= '1'; |
60 | wait for 77 ns; |
61 | in_vsync <= '0'; |
62 | in_hsync <= '0'; |
63 | wait for 77 ns; |
64 | in_vsync <= '1'; |
65 | in_hsync <= '1'; |
66 | wait; -- will wait forever |
67 | END PROCESS; |
68 | END; |
Das ergibt das Bild im Anhang --> alles im grünen Bereich... :-o Zu deiner Beruhigung: In der Praxis ist das vollkommen uninteressant, du wirst das nicht sehen. Denn dort gibt es gar kein System, das ab dem ersten Takt losläuft. Irgendeine Art Initialisierung wird garantiert durchlaufen...
> Trotzdem gehört ein Flip Flop in Hinblick auf synthetisierung resetet. Zum Thema Reset der Beitrag "Re: Xilinx und die Resets" und als Abkürzung der Beitrag "Re: Hardware mit VHDL "richtig" beschreiben."
Danke für die vielen Antworten. also die Sensitivity-list ist überdefiniert, das weiß ich, aber da es nicht funktioniert hat, habe ich mal alles ausprobiert, auch wenn es quatsch ist. Also ja ich habe hier nicht alles dazu gesagt. Also der Taktverschieber als eigene Komponente hat bei der Simulation wunderbar geklappt, bloß in der Gesamtschaltung kam der Fehler, wobei der Fehler mit Sicherheit aus dem Taktverschieber kam. Auf jeden Fall funktioniert das nun mit dem Quelltext aus meinem 2.post. Danke auf jeden Fall. Reset werde ich dann auch mal noch einfügen!
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.