Forum: FPGA, VHDL & Co. asynchron / synchron


von Karl (Gast)


Lesenswert?

ich habe einen takt, den ich halbiert habe. diesen halbierten takt
erhalte ich durch einen prozess mit dem eingangstakt in der
sensitivitätsliste.

wenn ich jetzt diesen takt als einen eingangstakt für andere
vhdl-einheiten nutze, diesen auch mit einer höheren systemclock
einlese, stellt sich mir nun die frage, ob das restliche design wieder
synchron arbeitet?

von Ines (Gast)


Lesenswert?

Eine beliebte Frage :-)

Nein, das Design ist dann nicht mehr synchron. Du kannst aber Deinen
halbierten Clock als Clock Enable Signal nutzen, mit dem Du dann
sozusagen den Originalclock maskierst, also:

if(reset = '0') then
  ...
elsif(clk'event and clk = '1') then
  if(clk_en = '1') then
    ...  -- hier arbeitet das Design mit "halbem" Clock
  end if;
end if;

Gruß
Ines

von Karl (Gast)


Lesenswert?

hi ines,

im endeffekt habe ich ähnlich gemeint, vielleicht aber falsch
ausgedrückt ;-)

bei mir sieht es folgendermaßen mit halbierter clock (hc_in) als
eingangstakt der folgenden einheiten und der in diesen einheiten aus
steuernden systemclock (clk):

..
signal hc_tmp1 : std_logic;
signal hc_tmp2 : std_logic;
..

if(reset = '0') then
  ..
  hc_tmp1 <= '0';
  hc_tmp2 <= '0';
  ..

elsif(clk'event and clk = '1') then
  hc_tmp1 <= hc_in;
  hc_tmp2 <= hc_tmp1;
  if (hc_tmp1=1 and hc_tmp2=0) then
    ...
  end if;
end if;

es wird die vorher halbierte clock auf den systemtakt
synchronisiert...oder?!?

von Ines (Gast)


Lesenswert?

Hallo Karl,

jetzt bin ich leicht verwirrt. Grafisch (Timing-Diagramm) dargestellt,
hast Du sowas beschrieben:
               _   _   _   _   
clk       _| |_| |_| |_| |_| |_| |_
            __     ___     __
hc_in     _|   |___|   |___|   |___
               ___     ___     __
hc_tmp1    |___|   |___|   |___|
            __     ___     __
hc_tmp2   _|   |___|   |___|   |___

AKTION:    ^       ^       ^

Du hättest also auch gleich schreiben können (vgl. meinen letzten
Beitrag):

if(reset = '0') then
  ...
elsif(clk'event and clk = '1') then
  if(hc_in = '0') then
    ...  -- hier arbeitet das Design mit "halbem" Clock
  end if;
end if;

Da Du hc_in aus clk abgeleitet hast (so habe ich es wenigstens
verstanden), musst Du das Signal nicht einsynchronisieren.

Gruß
Ines

von Karl (Gast)


Lesenswert?

hi ines,

alles ein wenig verwirrend... ;-)

ich habe die halbierte clock hc aus folgendem code erzeugt:

entity halber_takt is
 port ( clock1 : in std_logic;
        start : in std_logic;
        rst : in std_logic;
        hc : out std_logic);
end halber_takt;

architecture behav of halber_takt is
 signal hc_tmp : std_logic;

begin
 process(rst,clock1)
  variable start : boolean;
 begin
  if rst = '0' then
   hc_tmp <= '0';
  elsif rising_edge(clock1) then
   if start = '1' then
    hc_tmp <= not hc_tmp;
   end if;
   hc <= hc_tmp;
  end if;
 end process;
end behav;

dabei soll die variable start den beginn der halben taktgenerierung
kennzeichnen.

diesen halbierten takt hc möchte ich nun neben datensignalen, die auf
diesen halben takt adaptiert sind (1 bitausgabe => 1 hc periode), einem
weiteren modul als eingangssignal hinzuführen. die weitere
datenverarbeitung geschieht dann mit einem prozess, der neben der hohen
systemclock clk noch den reset rst in der sensitivitätsliste beinhaltet.

die vorher generierte hc wird dann über das folgende konstrukt auf den
systemtakt clk einsynchronisiert:

..
signal hc_tmp1 : std_logic;
signal hc_tmp2 : std_logic;
..

if(reset = '0') then
  ..
  hc_tmp1 <= '0';
  hc_tmp2 <= '0';
  ..

elsif(clk'event and clk = '1') then
  hc_tmp1 <= hc_in;
  hc_tmp2 <= hc_tmp1;
  if (hc_tmp1=1 and hc_tmp2=0) then
    ...
  end if;
end if;

und dann die weitere datenverarbeitung bishin zur Ausgabe vorgenommen.
Diese Ausgabe wird wieder

Meine Frage ist, ob nun das nachfolgende design, das mehrere module
enthält, wo der vorher generierte hc als zusätzliches eingangssignal
dient, synchron ist....

danke für deinen support!

von Karl (Gast)


Lesenswert?

sorry, hat sich ein kleiner tipp- und lesefehler eingeschlichen:

sollte natürlich folgendermaßen lautern:

entity halber_takt is
 port ( clock1 : in std_logic;
        start : in std_logic;
        rst : in std_logic;
        hc : out std_logic);
end halber_takt;

architecture behav of halber_takt is
 signal hc_tmp : std_logic;

begin
 process(rst,clock1)
  variable start_en : boolean;
 begin
  if rst = '0' then
   hc_tmp <= '0';
   start_en := false;
  elsif rising_edge(clock1) then
   if start = '1' then
    start_en := true;
   end if;
   if start_en then
    hc_tmp <= not hc_tmp;
   end if;
   hc <= hc_tmp;
  end if;
 end process;
end behav;

das startsignal ist ein einmaliges erergnis und deshalb als latch
realisiert....

von Ines (Gast)


Lesenswert?

OK, wenn ich es jetzt richtig verstanden habe, dann müsste es soweit
synchron sein!
Ich würde hc_in nur noch einmal öfter eintakten: hc_temp1 ist ja nur
ein einziges Mal eingetaktet - 2 bis 3mal wäre besser.

Gruß
Ines

von Karl (Gast)


Lesenswert?

vielen dank..!!
habe mir schon gedacht, dass es so synchron sein müsste, war mir aber
nicht ganz sicher..

werde mir deinen rat bezüglich des eintaktens mal überlgen. da ich aber
auch daten mit eingetakteten taktsignalen ausgeben muss, wird dadurch
ein weiteres delay resultieren.

danke für deinen support!!

lg
karl

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.