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?
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
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?!?
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
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!
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....
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.