Forum: FPGA, VHDL & Co. Falsche Signalausgabe im allerersten Takt!


von Oliver (Gast)


Lesenswert?

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;

von Oliver (Gast)


Lesenswert?

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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Smocky (Gast)


Lesenswert?

Außerdem gehört sowieso ein reset dazu, der dir dann die Signale in 
einen definierten Anfangszustand bringt.

von Mike (Gast)


Lesenswert?

@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.

von Gast (Gast)


Lesenswert?

kann es sein, dass es im Nullten Takt nicht geht, weil die Ausgänge 
erstmal nicht belegt sind?

von Smocky (Gast)


Lesenswert?

> 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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

>> 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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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."

von Oliver (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.