mikrocontroller.net

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


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Woran liegt das und kann ich das irgendwie beheben? :(
Zeig doch mal deine Testbench dazu.
   
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:
process(takt)

Denn zumindest diese Anweisungen:
out_hsync<=hsync;
out_vsync<=vsync;
sind concurrent.

Autor: Smocky (Gast)
Datum:

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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

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

Autor: Smocky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>> Woran liegt das und kann ich das irgendwie beheben? :(
Also, bei mir klappt das mit
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

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) begin
--    if rising_edge(takt) then -- alternativ
    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;

Und die Stimuli-Testbench
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY tb_TS_vhd IS
END tb_TS_vhd;

ARCHITECTURE behavior OF tb_TS_vhd IS 

  -- Component Declaration for the Unit Under Test (UUT)
  COMPONENT taktverschieber
  PORT(
    takt : IN bit;
    in_vsync : IN bit;
    in_hsync : IN bit;          
    out_vsync : OUT bit;
    out_hsync : OUT bit
    );
  END COMPONENT;

  --Inputs
  SIGNAL takt     :  bit := '0';
  SIGNAL in_vsync :  bit := '1';
  SIGNAL in_hsync :  bit := '1';

  --Outputs
  SIGNAL out_vsync :  bit;
  SIGNAL out_hsync :  bit;

BEGIN

  -- Instantiate the Unit Under Test (UUT)
  uut: taktverschieber PORT MAP(
    takt => takt,
    in_vsync => in_vsync,
    in_hsync => in_hsync,
    out_vsync => out_vsync,
    out_hsync => out_hsync
  );

      takt <= not takt after 10 ns;

      tb : PROCESS
      BEGIN
      wait for 77 ns;
      in_vsync <= '1';
      in_hsync <= '0';
      wait for 77 ns;
      in_vsync <= '0';
      in_hsync <= '0';
      wait for 77 ns;
      in_vsync <= '0';
      in_hsync <= '1';
      wait for 77 ns;
      in_vsync <= '0';
      in_hsync <= '0';
      wait for 77 ns;
      in_vsync <= '1';
      in_hsync <= '1';
      wait for 77 ns;
      in_vsync <= '0';
      in_hsync <= '0';
      wait for 77 ns;
      in_vsync <= '1';
      in_hsync <= '1';
      wait; -- will wait forever
   END PROCESS;
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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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."

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.