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


von CheckNix (Gast)


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

von voodoofrei (Gast)


Lesenswert?

CheckNix schrieb:
> Kann mir jemand erklären ob und wen ja warum das immer funktioniert.

deshalb:
1
if rising_edge(clk) then

ohne den Takt hättest du recht.

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

von Entwickler12345 (Gast)


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ß

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


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"

von Klaus F. (kfalser)


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.

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


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.

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.