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;
@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.
> 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
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entitytaktverschieberis
6
port(takt:inbit;
7
in_vsync:inbit;
8
in_hsync:inbit;
9
out_vsync:outbit;
10
out_hsync:outbit
11
);
12
endtaktverschieber;
13
architecturebehaviouroftaktverschieberis
14
signalhsync,vsync:bit:='1';
15
begin
16
17
process(takt)begin
18
-- if rising_edge(takt) then -- alternativ
19
if(takt'eventandtakt='1')then
20
hsync<=in_hsync;
21
vsync<=in_vsync;
22
endif;
23
endprocess;
24
25
out_hsync<=hsync;
26
out_vsync<=vsync;
27
endbehaviour;
Und die Stimuli-Testbench
1
LIBRARYieee;
2
USEieee.std_logic_1164.ALL;
3
USEieee.numeric_std.ALL;
4
5
ENTITYtb_TS_vhdIS
6
ENDtb_TS_vhd;
7
8
ARCHITECTUREbehaviorOFtb_TS_vhdIS
9
10
-- Component Declaration for the Unit Under Test (UUT)
11
COMPONENTtaktverschieber
12
PORT(
13
takt:INbit;
14
in_vsync:INbit;
15
in_hsync:INbit;
16
out_vsync:OUTbit;
17
out_hsync:OUTbit
18
);
19
ENDCOMPONENT;
20
21
--Inputs
22
SIGNALtakt:bit:='0';
23
SIGNALin_vsync:bit:='1';
24
SIGNALin_hsync:bit:='1';
25
26
--Outputs
27
SIGNALout_vsync:bit;
28
SIGNALout_hsync:bit;
29
30
BEGIN
31
32
-- Instantiate the Unit Under Test (UUT)
33
uut:taktverschieberPORTMAP(
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<=nottaktafter10ns;
42
43
tb:PROCESS
44
BEGIN
45
waitfor77ns;
46
in_vsync<='1';
47
in_hsync<='0';
48
waitfor77ns;
49
in_vsync<='0';
50
in_hsync<='0';
51
waitfor77ns;
52
in_vsync<='0';
53
in_hsync<='1';
54
waitfor77ns;
55
in_vsync<='0';
56
in_hsync<='0';
57
waitfor77ns;
58
in_vsync<='1';
59
in_hsync<='1';
60
waitfor77ns;
61
in_vsync<='0';
62
in_hsync<='0';
63
waitfor77ns;
64
in_vsync<='1';
65
in_hsync<='1';
66
wait;-- will wait forever
67
ENDPROCESS;
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...
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!