www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Warum klappt seriell zu parallel mit FF


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: CheckNix (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

mal eine Frage wegen Timing beim seriell zu parallel.

Ich  möchte über ein Shiftregister Daten von seriell nach parallel 
konvertieren. Dazu verwende ich ein Schiftregister und einen Counter der 
entscheidet wann die daten parallel ausgelesen werden können.

------------------------------------------------------------------------ 
--

vereinfachtes Beispiel: seriel zu 4bit parallel

counter: process(clk)
if reset = '1'then
counter = 4;
else if rising_edge(clk) then
  counter <= counter - 1;
  if counter = 0 then
  data_bereit <= '1';
  else
  data_bereit <= '0';
  end if;
end if;
end process;

FF_Shift: process(clk)
begin
if rising_edge(clk) then
  FF(3 downto 0) <= FF(2 downto 0) & Data_Seriell; -- shift nach links
end if;
end process

process(clk)
begin
if rising_edge(clk) then
  if data_bereit = 1 then
    data_parallel(3 downto 0) <= FF(3 downto 0);
  end if;
end if;
end process;

------------------------------------------------------------------------ 
--

Laut Simulation funktioniert das auch sehr gut. Aber ich frage mich nun 
ob das auch immer auf der Hardware gut geht. Was wenn das Shiftregister 
früher schiftet als die Zuweisung an data_parallel erfolgt. Dann hätte 
ich ja entweder einen metastabilen Zustand bei dem alles sein kann oder 
ich hab bekomme eben den Zustand der erst ein clk später im FF stehen 
dürfte.

Kann mir jemand erklären ob und wen ja warum das immer funktioniert.
Gibt es bessere alternativen um von seriell zu parallel zu kommen?

Vielen Dank

Autor: voodoofrei (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
CheckNix schrieb:
> Kann mir jemand erklären ob und wen ja warum das immer funktioniert.

deshalb:
if rising_edge(clk) then

ohne den Takt hättest du recht.

Der Wert steht erst einen Takt später am Ausgang.

Autor: Entwickler12345 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

Du solltest aber auch ein Timing Constraint(Period bei Xilinx) 
verwenden, damit du auch sicher sein kannst, dass du dein Timing 
schaffst.
Aber die Simulation sollte bei dir nicht richtig funktionieren, weil du 
ein AR verwendest und dieses in deiner Sensitivity Liste fehlt.

Gruß

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Entwickler12345 schrieb:
> Aber die Simulation sollte bei dir nicht richtig funktionieren, weil du
> ein AR verwendest und dieses in deiner Sensitivity Liste fehlt.
Siehe zu diesem Thema den Beitrag "Detailfrage Reset"

Autor: Klaus Falser (kfalser)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
CheckNix schrieb:
> Kann mir jemand erklären ob und wen ja warum das immer funktioniert.

In der Simulation funktioniert das immer richtig, weil die Prozesse alle 
"gleichzeitig" auf rising_edge() reagieren.
Die Prozesse werden natürlich vom Computer hintereinander berechnet, 
aber alle Eingangssignale aller Prozesse bleiben stabil auf dem alten 
Wert, bis alle Prozesse durchgerechnet sind.
Dann erst werden den Signalen die neu berechntet Werte zugewiesen, die 
Signale ändern sich also erst danach.

In der Hardware funktioniert dies ebenfalls immer richtig, weil alle 
FF's mehr oder weniger gleichzeitig schalten, es aber eine gewisse Zeit 
braucht, bis die Ausgangsignale am Ausgang erscheinen.
Der Hersteller des FPGA garantiert, dass die Signale an den Ausgängen 
der FFs "langsam" genug zu den Eingängen der nächsten FFs kommen und 
diese garantiert erst an der nächsten Taktflanke das geänderte Signal 
sehen.

> Gibt es bessere alternativen um von seriell zu parallel zu kommen?
Nicht dass ich wüsste.

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Klaus Falser schrieb:
> aber alle Eingangssignale aller Prozesse bleiben stabil auf dem alten
> Wert, bis alle Prozesse durchgerechnet sind.
Kurz: während dieser Berechnung bleibt die Simulationsuhr stehen. Die 
nacheinander berechneten Ergebnisse sind also alle für den selben 
Simulationszeitpunkt gültig.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net