Hallo,
ich habe einen uralt Frequenzzähler mit Nixieröhren. Dem möchte ich
gerne einen Vorteiler durch 1000 verpassen. Der Vorteiler würde aus zwei
Teilen bestehen.
Erstens wird durch 512 geteilt.
Dann durch 1,953125.
Das macht zusammen 1000.
Ich habe da einen Schaltplan mit TTL-IC's, möchte das aber lieber in
einem CPLD XC9572 machen.
Wie kann ich das in VHDL programmieren?
Georg Bunter schrieb:> Erstens wird durch 512 geteilt.> Dann durch 1,953125.> Das macht zusammen 1000.
Du must dir einen Teiler durch 1000 aufbauen. Durch 1,953125 teilen geht
nicht.
Georg Bunter schrieb:> Der Vorteiler würde aus zwei Teilen bestehen.> Erstens wird durch 512 geteilt.> Dann durch 1,953125. Das macht zusammen 1000.
Warum teilst du nicht gleich durch 1000?
Denn das geht ja wohl viel einfacher, als durch einskommairgendwas...
:-o
Lothar Miller schrieb:> Warum teilst du nicht gleich durch 1000?> Denn das geht ja wohl viel einfacher, als durch einskommairgendwas...
Mein Vorteiler der durch 512 teilt, kann das auch bei GHz-Frequenzen.
Das CPLD hat 15ns...
Helmut Lenzen schrieb:> Du must dir einen Teiler durch 1000 aufbauen. Durch 1,953125 teilen geht> nicht.
Doch, müsste schon irgendwie gehen:
Da ist ein Zähler der bis 125 zählt.
Da gibt es einen Ausgang wo die Eingangsimpulse durchkommen oder nicht.
Inerhalb dieses Zählerzyklus von 125 Impulsen müssten 64 Impuls
durchkommen und 61 nicht.
Das ist dann 125/64 = 1,953125
Wahrscheinlich macht diese oben gepostete Schaltung genau das, ich
kapier's nur irgendwie gerade nicht...
Ich könnte die jetzt natürlich einfach nachbauen, ohne die zu verstehen.
Ich möchte das aber lieber in VHDL machen, das ich mal was lerne ;-)
Also es geht um einen "binary rate multiplier", so heißt der
Impuls-Verschluck-Zähler üblicherweise. Such mal nach dem Datenblatt zum
Standard-TTL-IC 7497, der macht n/64 Stufen.
Insgesamt soll die Schaltung ergeben: f_aus=f_in/(512*1000/512), die
1000/512 sind dabei die genannten 1,953125.
1000/512 kann man noch kürzen, = 125/64 (oder 5^3/2^6). Der
Impuls-Verschlucker muß also 64 von 125 Impulsen durchlassen, den Rest
ausblenden.
Der 74HC390 enthält zwei Fünfer-Teiler und zwei Zweier-Teiler, mit zwei
Stück geht das schon irgendwie, ich hätte nur Bedenken, dass kurze
Glitches entstehen, wenn man die Verknüpfungen über weitere Gatter
macht.
Sebastian Hepp schrieb:> Die Schaltung mit 74HC soll 13GHz und mehr schaffen? Sind die Bausteine> wirklich so schnell? Und denke an HF-gerechtes Layout. ;)
Georg (TO) schreibt doch:
>Mein Vorteiler der durch 512 teilt, kann das auch bei GHz-Frequenzen.>Das CPLD hat 15ns...
ALSO NOCHMAL 13Ghz / 512 = 25.39 Mhz
ist doch ganz einfach, mann muss halt nur ALLES lesen, wenn mann
dazu keine Lust hat soll mann auch keine vermutungen oder aehnliches
in die Welt setzen, gell?
Wie wärs denn damit: Du schreibst dir Modelle der verwendeten
TTL-Bausteine, verbindest diese nach Schaltplan, schreibst dir eine
Testbench dazu und schaust Dir das mal in der Simulation an. Dann
versteht man vielleicht, was die Schaltung tut, und kann das entweder
direkt verwenden oder ein neues Modell schreiben, das das Gleiche tut.
Grüße,
Harald
Nachtrag: Habe das Vorgeschlagene mal eben in Verilog runtergetippt und
simuliert. Siehda, meine Testbench meldet nach 1000 Clocks:
# rising edges of input clock: 1000
# rising edges of output clock: 512
# ratio: 1.953125
Der geteilte Takt sieht aber echt nach Zahnlücke aus! Da fehlen manchmal
ganze 3 Takte. Und ob das Ganze in Realität funktioniert, müsste man
noch prüfen.
Grüße,
Harald
Und noch ein Nachtrag: Mit synchronem Design hat das alles natürlich
nichts zu tun! In der Schaltung gibt es viele einzelne Clocks und dafür
sind FPGA eigentlich nicht gemacht. Wenn dir längere Zahnlücken nichts
ausmachen, dann bietet sich an, einen 125-er Zähler von 0 bis incl. 124
zu machen, und das "64er"-Bit invertiert als Freigabe für das
Durchreichen des Clocks zu nehmen. Dann kommen 64 von 125 Takten durch,
was einen Teiler von 1,953125 ergibt.
Grüße,
Harald
Harald Flügel schrieb:> Wenn dir längere Zahnlücken nichts> ausmachen, dann bietet sich an, einen 125-er Zähler von 0 bis incl. 124> zu machen, und das "64er"-Bit invertiert als Freigabe für das> Durchreichen des Clocks zu nehmen. Dann kommen 64 von 125 Takten durch,> was einen Teiler von 1,953125 ergibt.
Das mit den "Pulspaketen" lässt sich locker mal so "nebenher"
beschreiben:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entityDivideris
6
Port(cin:inSTD_LOGIC;
7
cout:outSTD_LOGIC);
8
endDivider;
9
10
architectureBehavioralofDivideris
11
signalcnt:integerrange0to124:=0;
12
signalenable:std_logic;
13
begin
14
15
processbegin
16
waituntilfalling_edge(cin);
17
ifcnt<124thencnt<=cnt+1;
18
elsecnt<=0;
19
endif;
20
ifcnt<64thenenable<='1';
21
elseenable<='0';
22
endif;
23
endprocess;
24
25
cout<=cinwhenenable='1'else'0';
26
27
endBehavioral;
Und braucht gerade mal
1
Device Used XC9536XL-5-PC44
2
Macrocells Pterms Registers Pins Function Block Inputs
Aber auch die elegantere Lösung macht sich nicht ohne:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entityDivideris
6
Port(cin:inSTD_LOGIC;
7
cout:outSTD_LOGIC);
8
endDivider;
9
10
architectureBehavioralofDivideris
11
signalcnt:unsigned(6downto0):=(others=>'0');
12
signalenable:std_logic:='0';
13
begin
14
15
processbegin
16
waituntilfalling_edge(cin);
17
ifcnt<124thencnt<=cnt+1;
18
elsecnt<=(others=>'0');
19
endif;
20
enable<=cnt(0)after7ns;
21
ifcnt=0orcnt=60thenenable<='1'after7ns;
22
endif;
23
endprocess;
24
25
cout<=cinafter7nswhenenable='1'else'0'after7ns;
26
27
endBehavioral;
Ich habe hier mal für die Simulation noch ein paar Zeiten eingeführt, um
zu sehen, wie sich das Ganze in etwa verhält.
Lediglich 2 PT für den zweiten Vergleicher werden zusätzlich benötigt:
1
Device Used XC9536XL-5-PC44
2
Macrocells Pterms Registers Pins Function Block Inputs
Lothar Miller schrieb:> Aber auch die elegantere Lösung macht sich nicht ohne:
Ah ja, du gibst bei cnt=0 und bei cnt=60 jeweils noch einen Impuls dazu.
Dann gibt es auf 125 Eingangsimpuls 62 + 2 = 64 Impulse.
Hübsch.
Ich habe mal den Schaltplan, den ich ganz oben gepostete habe
entdröselt:
Da ist ein Zähler (1/2 74HC390), der zählt von 0...4
Das Nor-Gatter lässt nur bei Zählerstand 0, 1, 2, 3 die Eingangsimpuls
durch.
Bei Zählerstand 4 kommen die Eingangsimpulse nicht durch.
Es werden also 4 von 5 Impulsen durchgelassen.
Also ist es ein Teiler durch 1,25
Werden drei solche Teiler hintereinandergeschaltet haben wir einen
Teilerfaktor von 1,953125 QED
Was bedeutet
Belasse doch das Teilerverhältnis bei 512, oder gehe noch auf 1:1024,
und passe im gleichen Verhältnis die Torzeit des Zählers an (verlängern
auf das 1,024-fache) - dann stimmt die Anzeige (bis auf den Faktor 1000)
wieder. Oder mache das umschaltbar, damit der Zähler ohne Vorteiler auch
noch verwendbar bleibt.
Alle Vorschläge die bisher gebracht wurden sind doch für die Katz.
Offenbar liest keiner was der Fragesteller wirklich machen will.
Eine sinnvolle Lösung sieht so aus:
13GHz/8 Teiler
Dann /125
/5 /5 /5
Alle 4 ICs gibts hier: http://www.hittite.com/
Das wird natürlich nicht gerade billig.
Viel preiswerter wäre es die Zeitbasis von 1s Torzeit auf eine passende
Zeit anzupassen damit ein Vorteiler durch 1024 passt.
Helmut S. schrieb:> Offenbar liest keiner was der Fragesteller wirklich machen will.
Er will eine sehr hohe Taktfrequenz mit seinem langsamen Frequenzzähler
messen. Und er kann blitzschnell durch 512 teilen. Und um nicht rechnen
zu müssen oder um den Faktor 1.024 daneben zu liegen, will er die letzte
Teilerstufe durch einen gebrochenen Teiler bewerkstelligen...
df1as schrieb:> Außerdem könnte man einen m:n-Teiler wie folgt dahinschreiben:
Ich möchte aber behaupten, dass ein Teilerverhältnis kleiner 2 so nicht
geht. Denn diese Geschichte kann ja nur durch den Ursprungstakt
weitergeschaltet werden, und daher bestenfalls mit jedem Takt 1 mal
umschalten...
Lothar Miller schrieb:> Und um nicht rechnen> zu müssen oder um den Faktor 1.024 daneben zu leigen, will er die letzte> Teilerstufe durch einen gebrochenen Teiler bewerkstelligen...
Den Zahn hätte man dem Fragesteller gleich ziehen müssen.
Dieser Lösungsweg ist für seine Anwendung einfach nicht möglich.
Helmut S. schrieb:> Dieser Lösungsweg ist für seine Anwendung einfach nicht möglich.
Da wäre ich mir nicht so sicher. Denn wenn der Frequenzzähler während
der Gate-Zeit einfach nur Pulse zählt, und mit der doppelten
Taktfrequenz noch klarkommt, dannn wird das durchaus gehen...
Am einfachsten wäre es den Teiler /1000 in der Zeitbasis auf einen
Teiler /1024 umzuschalten. Dann klappt es auch mit dem 13GHz Teiler
/1024.
Das wäre sicher die einfachste und preiswerteste Lösung.
Natürlich könnte man einen umschaltbaren Zeitbasisteiler auch in ein
CPLD oder FPGA packen.
>> Außerdem könnte man einen m:n-Teiler wie folgt dahinschreiben:> Ich möchte aber behaupten, dass ein Teilerverhältnis kleiner 2 so nicht> geht. Denn diese Geschichte kann ja nur durch den Ursprungstakt> weitergeschaltet werden, und daher bestenfalls mit jedem Takt 1 mal> umschalten...
So ist es.
Aber wenn man wie gehabt aus dem Zähler nur das Clock-Enable gewinnt,
dann geht es:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entityDivideris
6
Port(cin:inSTD_LOGIC;
7
cout:outSTD_LOGIC);
8
endDivider;
9
10
architectureBehavioralofDivideris
11
signalcnt:unsigned(7downto0):=(others=>'0');
12
signalenable:std_logic:='1';
13
begin
14
15
processbegin
16
waituntilfalling_edge(cin);
17
ifcnt>125-64then
18
cnt<=cnt-to_unsigned(125-64,8);
19
enable<='1';
20
else
21
cnt<=cnt+to_unsigned(64,8);
22
enable<='0';
23
endif;
24
endprocess;
25
26
cout<=cinafter7nswhenenable='1'else'0'after7ns;
27
28
endBehavioral;
Mir gefällt hier besonders, dass keine solche "Dreierpakete" mehr
auftauchen. Und vor allem: die ist wunderbar skalierbar. Allerdings hat
diese elegante Lösung einen etwas höheren Ressourcenverbrauch:
1
Device Used XC9536XL-5-PC44
2
Macrocells Pterms Registers Pins Function Block Inputs
Lothar Miller schrieb:> Helmut S. schrieb:>> Offenbar liest keiner was der Fragesteller wirklich machen will.> Er will eine sehr hohe Taktfrequenz mit seinem langsamen Frequenzzähler> messen. Und er kann blitzschnell durch 512 teilen. Und um nicht rechnen> zu müssen oder um den Faktor 1.024 daneben zu liegen, will er die letzte> Teilerstufe durch einen gebrochenen Teiler bewerkstelligen...
Könnte man nicht die Gate-Zeit des Zählers so ändern (ohne die
Nixieröhren dabei rauszuoperieren), daß 1024 als Teilerfaktor passen?
MfG Klaus
Lothar Miller schrieb:> Mir gefällt hier besonders, dass keine solche "Dreierpakete" mehr> auftauchen. Und vor allem: die ist wunderbar skalierbar.
Ganz vielen lieben Dank.
Gefällt mir auch sehr.
Werde es am Wochenende umsetzen.
Was bedeutet
Beitrag #2109124:
> Was bedeutet> to_unsigned (125-64, 8);
to_unsigned it eine Funktion aus der numeric_std, die einen Integer in
einen unsigned Vektor mit einer gewünschten Breite (hier 8) umwandelt.
Siehe dort: http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html