Teilen Sie die Taktfrequenz in VHDL durch 5

Ich möchte die Taktfrequenz durch 5 teilen. Kann ich das mit dem Integer-Typ machen oder brauche ich etwas anderes, um die Dezimalzahl auszuführen?

library ieee;
use ieee.std_logic_1164.all;
use IEEE.NUMERIC_STD.ALL;

entity divide_clk is
port( clk: in std_logic;
 clk_out: out std_logic);
end divide_clk;

 architecture behave of divide_clk is
signal count: integer range 0 to 24999999:= 0;
signal temp : std_logic := '0';
begin
process(clk)
begin
if (clk'event and clk='1') then
 if (count = 2.5) then
 temp <= not(temp);
 count <= 0;
 else
 count <= count + 1;
 end if;
end if;
end process;
clk_out <= temp;
end behave; 
Ich nehme an, dass Code nur ein grobes Beispiel dafür ist, was Sie erreichen möchten ? Oder wie willst du countjemals 2,5 werden?
Überlege dir zuerst, wie du das mit Toren und anderen Bausteinen bauen würdest. Finden Sie dann heraus, wie Sie dieses Design in HDL ausdrücken können.
Was beabsichtigen Sie mit dem Taktsignal zu tun? Antriebslogik? Einen Ausgangspin ansteuern?
Ich stimme früheren Kommentaren nicht zu. Sie sollten beim Schreiben von VHDL niemals an Gates denken, Sie werden zeitgenössische Synthesizer einfach nicht schlagen. Beschreiben Sie das gewünschte Verhalten auf der Ebene eines Taktzyklus und lassen Sie die Tools den Rest erledigen.
@DonFusili, Sie sind mit einem anderen Punkt nicht einverstanden als dem, den ThePhoton richtig macht. Auf die letzte Logikschaltung kommt es an. Überlegen Sie also, was tatsächlich getan werden kann, um eine Uhr mit kombinatorischer Logik und Flip-Flops durch 5 zu teilen - denken Sie an digitale Logik. Verstehen, was möglich ist und was nicht. Schreiben Sie nicht einfach Wunschlisten-VHDL. Photon bedeutet nicht "warum es nicht mit Logikgattern entwerfen". Ausgezeichneter Rat: Haben Sie immer eine Vorstellung davon, wie Ihre Schaltung ungefähr aussehen wird. Unverzichtbar für gutes Design, vermeidet versehentlich große Zähler, Muxe usw., die das Timing nach unten ziehen und eine Menge Gates verbrauchen.
@TonyM Ich habe den Punkt verstanden, ich bin immer noch anderer Meinung.
@DonFusili, sicher - ich weiß aber nicht warum oder warum es eine gute Methode ist. Wenn Sie eine Antwort haben, wäre ich angesichts meiner Kommentare daran interessiert, sie zu hören. Fühlen Sie sich frei, einen Chat einzurichten, wenn Sie hier lieber keine Diskussion führen möchten, danke.

Antworten (2)

Wenn Sie in VHDL einen geteilten Takt mit 50 % Arbeitszyklus erzeugen möchten, indem Sie nur die steigende Flanke des Takts verwenden, sollte die Periode des geteilten Takts ein Vielfaches von 2 sein. Da 5 eine ungerade Zahl ist, müssen Sie auch die fallende Flanke des Haupttakts verwenden . Sie müssen zwei 2/5 Tastverhältnistakte erzeugen, die um eine halbe Periode des Haupttakts phasenverschoben sind. Dann können Sie es "ODER" machen, um den erforderlichen Takt zu erhalten, der eine 1/5-Frequenz und einen Arbeitszyklus von 50% hat.

Etwas wie das:

Geben Sie hier die Bildbeschreibung ein

Codebeispiel:

architecture Behavioral of divide_by_5_counter is
signal a,b : STD_LOGIC;
signal count_a, count_b : STD_LOGIC_VECTOR(3 DOWNTO 0);
begin

process(clk_in,reset)
begin
if reset = '1' then
a <= '0';
elsif rising_edge(clk_in) then
if count_a = 5 then
count_a <= "0001";
a <= '1';
elsif count_a >= 2 then
a <= '0';
count_a <= count_a + 1;
else
a <= '1';
count_a <= count_a + 1;
end if;
end if;
end process;

process(clk_in,reset)
begin
if reset = '1' then
b <= '0';
count_b <= "0000";
elsif falling_edge(clk_in) then
if count_b = 5 then
count_b <= "0001";
b <= '1';
elsif count_b >= 2 then
b <= '0';
count_b <= count_b + 1;
else
b <= '1';
count_b <= count_b + 1;
end if;
end if;
end process;

clk_out <= a or b;

end Behavioral;
Wird die Kombination von fallender und steigender Flanke in einem Design gut unterstützt? (Ich diskutiere Ihre Antwort nicht ...) Beim ASIC-Design würden sich unsere Backend-Leute bitter beschweren, aber vielleicht erlauben es einige / die meisten FPGAs. Ich verstehe CTS, Cells & Flops und sehe prinzipiell natürlich nichts dagegen.
@ P2000 Es wird in FPGAs unterstützt, aber kein guter Designer mischt beide Kanten in einem tatsächlichen Design aufgrund der Komplexität des Timings und des Stromverbrauchs (gilt sowohl für FPGAs als auch für ASICs). Der obige Code wäre also nur "akademisch". Wenn Sie wirklich knifflige Taktraten ableiten wollen, verwenden Sie dedizierte IPs, würde ich sagen.

Wenn Sie nur an den steigenden Flanken Ihres ursprünglichen Takts arbeiten, können Sie kein Tastverhältnis von 50 % erzielen. Viele Schaltungen benötigen dies nicht, da die meisten digitalen Logiken nur für steigende oder fallende Flanken ausgelegt sind. In diesem Fall kannst du einfach so vorgehen:

p_main: process(clk, reset_n)
    variable r_count : integer range 0 to 4;
    variable r_clk_out_i : std_logic;
begin

  if reset_n = '0' then
    r_clk_out_i := '0';
    r_count := 0;
  elsif rising_edge(clk) then
    if r_count = 0 or r_count = 2 then
      r_clk_out_i := not r_clk_out_i;
    end if;

    if r_count = 4 then
      r_count = 0;
    else
      r_count = r_count+1;
    end if;

  end if;
  clk_out <= r_clk_out_i;

end process;

Wenn Sie eine Einschaltdauer von 50 % benötigen, müssen Sie entweder Ihren Originaltakt phasenverschoben oder auch an den abfallenden Flanken Ihres Originaltakts arbeiten.

Wenn ein genaues Tastverhältnis von 50 % benötigt wird, ist es besser, die doppelte Frequenz zu verwenden und zuerst durch 5 und dann durch 2 zu teilen. Die Verwendung steigender und fallender Flanken des Originaltakts erfordert ein Tastverhältnis von 50 % des Originaltakts.
@Uwe Einverstanden, aber das setzt voraus, dass Sie Zugriff auf die doppelte Taktfrequenz haben, und dann können Sie genauso gut in einem Schritt durch 10 teilen, was unkompliziert ist und sofort die Einschaltdauer von 50% ergibt.
Nicht alle möglichen Methoden, um einen Takt in einem Schritt durch 10 zu teilen, garantieren ein Tastverhältnis von 50 % am Ausgang.
@Uwe Nein, aber das einfache Zählen der ansteigenden Flanken der Uhr und das Ändern der Polarität Ihrer Ausgangsuhr bei jedem fünften Zyklus tut es. Ich bin noch nicht auf eine Umgebung gestoßen, in der ich keinen 3-Bit-Zähler für diese Strategie einsetzen kann. Ich bin mir sicher, dass Sie das getan haben, also schreiben Sie auf jeden Fall Ihre eigene Antwort, die Ihre eigenen Kommentare berücksichtigt. Ich bin nicht qualifiziert, sie in meine Antwort aufzunehmen, da ich mir die Szenarien nicht vorstellen kann, in denen Ihre Kommentare zutreffen würden.
Wenn ein 4-Bit-Zähler und etwas zusätzliche Logik verwendet werden, um in der Sequenz 0-1-2-3-4-5-6-7-8-9-0-1... zu zählen, hat das MSB dieses Zählers 1 /10 der Taktfrequenz und einem Tastverhältnis von 80 bis 20 %.
@Uwe Klar, und wenn das noch die Steinzeit der ICs wäre, wäre deine Lösung relevant. Mit so ziemlich jeder modernen Technologie können Sie einfach bis 5 zählen und Ihren Ausgangstakt umkehren. Was ich bereits in meiner vorherigen Antwort auf Ihren Kommentar gesagt habe. Da Sie anscheinend darauf bedacht sind, etwas zu finden, das Hacks, die in den 90ern relevant waren, 2018 als wichtig erscheinen lässt, werde ich aufhören zu antworten, es sei denn, Sie sagen tatsächlich etwas Wertvolles, wenn es Ihnen nichts ausmacht.