Forum: FPGA, VHDL & Co. Frequenzteiler mit CPLD


von Full W. (realjey)


Lesenswert?

Hallo Zusammen,

noch eine Anfängerfrage:

Ich möchte einen CPLD-Baustein dazu bringen, ein 32Mhz-Signal (Vss 5V) 
welches durch einen Quarz-Oszi "eingespeisst" wird, soweit runter zu 
teilen, das sich z.B. ein 4MHz-Signal (Vss 5V) als Ausgang eines von mir 
bestimmten Pins ergibt. Könnte mir hier jemand einen Ansatz nennen. Ich 
erwarte nicht die Lösung in Form eines VHDL-Codes, sondern nur 
gedankliche Ansatzpunkte ;) Ich bin bereits soweit, das ich dies 
theoretisch mit den vom CPLD zur Verfügung gestellten T-FlipFlops 
realisieren könnte...dafür benötige ich 3 T-FF, ist das richtig (da ein 
T-FF meine Frequenz jeweils durch 2 teilt)?

THX
J

von dave (Gast)


Lesenswert?

frequenz tut man am besten mit ffs teilen. ja, ein ff kann die frequenz 
durch 2 teilen

von John-eric K. (mockup)


Lesenswert?

Na einen Zähler von 0-7, binär also 3 Bit
und das Höchste Bit ist dein Signal für den Pin.
Damit ist du 50% high und 50%Low

Pseudocode
==========
count std_logic_vector(2 downto 0);

if count ="111" then
   count <= "000";
else
   count <= count + 1;
end if;

Signal_Out <= count(2);

John

von Robert S. (razer) Benutzerseite


Lesenswert?

John-eric K. schrieb:
> if count ="111" then
>
>    count <= "000";
>
> else

Nicht nötig, da ein std_logic_vector den Überlauf von selbst macht.

von John-eric K. (mockup)


Lesenswert?

Stimmt vergessen ;-)

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


Lesenswert?

>> Nicht nötig, da ein std_logic_vector den Überlauf von selbst macht.
Diese Erklärung ist zu simpel und stimmt so unbesehen nicht. Die 
korrekte Aussage wäre:
Der in den Bibliotheken
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
überladene Operator + macht den Überlauf.

Aber allgemein gilt: mit std_logic_vector sollte man nicht rechnen, denn 
abhängig von der eingebunden Library (signed/unsigned) kommen u.U. 
andere Ergebnisse heraus...

Besser ist die Verwendung der
use ieee.numeric_std.all;
und der darin enthaltenen (Vektor-)Datentypen signed und unsigend:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
:
5
count unsigned(2 downto 0) := "000";
6
:
7
  if count ="111" then
8
    count <= "000";
9
  else
10
    count <= count + 1;
11
  end if;
12
:

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.