Entwurf eines Zählers, der in jedem Zustand für x Takte bleibt

Angenommen, wir haben einen 8-Bit-Zähler out[7:0]

Es muss in jeder Zählung für die angegebene Anzahl von Takten x bleiben, wobei x eine beliebige ganze Zahl oder ein Bruchfaktor von 512 sein kann.

Mein Ansatz:

Verwenden Sie den 10-Bit-Zähler temp[9:0] , der sich bei jeder gestellten Uhr erhöht

Für x=512 inkrementiere temp in Schritten von 1 und inkrementiere aus, wenn temp[9]==1

Erhöhen Sie für x=256 die Temperatur in 2er-Schritten und erhöhen Sie sie, wenn temp[9]==1 ... und so weiter.

Meine Frage

  1. Hat jemand eine bessere Idee als diese, ressourceneffizienter?

  2. Wie ist mit dem Fall umzugehen, dass x beliebige Werte annehmen kann, die nicht unbedingt durch Faktoren einer bestimmten Zahl zusammenhängen? Wir kennen nur das Maximum, das x sein kann.


Zur Verdeutlichung: x ist nur ein normales 9-Bit-Register. Der Wert in x und die Anzahl der Haltetakte stehen in Beziehung zu 512/x = HoldClocks.

  • 512/1 = 512
  • 512/2 = 256
  • 512/3 = 170,667
  • 512/4 = 128
  • ........
  • 512/512 = 1.

Wie wäre es mit dem allgemeinen Fall? Was ist, wenn Max Hold Clocks keine Potenz von 2 ist? Wie würden Sie den Fall handhaben, in dem max hold clocks (x=1) zB 460 statt 512 ist?

Was für Frage 2 könnte ein Wert von x sein, den Sie für am problematischsten halten?
Sie brauchen also einen Zähler zum Holdoff und einen Zähler zum Teilen. Dieser duale Zähler erlaubt Brüche statt Integratoren. Offensichtlich decodierte Ausgänge mit Gattern, um das Zählen zu ermöglichen. Oder verwenden Sie einen "Fractional-N" -PLL-IC, der auch Zähler im Ausgangs- und Rückweg hat, also fo / fin = x1x2 / y1y2, um in beide Richtungen (Vorwärts- und Rückkopplung) doppelt zu zählen. Wenn die Flosse zu hoch ist, synchronisieren. Integer-Prescaler-Binärzähler werden verwendet, um zu billigeren Zählern zu gelangen

Antworten (3)

Ihre Frage lautet "ein bestimmter Zustand" , aber es hört sich so an, als ob Sie für x Taktzyklen in jedemout[7:0] seiner Zustände bleiben möchten. Wenn ja, dann möchten Sie als "Prescaler" verwenden - für alle x Takte möchten Sie einen Impuls an den Zähler senden. Dies funktioniert für jeden Wert von x.temp[9:0]out

Prüfen Sie für jeden Taktzyklus, ob tempgleich x-1 ist. Wenn ja, tempauf Null setzen und erhöhen out; Andernfalls erhöhen Sie einfach temp.

Im Verlog:

always @(posedge clock) begin
  if (temp >= (x-1)) begin
    temp <= O;
    count <= count + 1;
  end else begin
    temp <= temp + 1;
  end
end

OK, jetzt, wo Sie die Bedeutung von x geklärt haben, wird der folgende DDS-Code direkt implementieren, was Sie wollen.

always @(posedge clock) begin
  temp <= (temp & 10'h1FF) + x;
  if (temp[9]) count <= count + 1;
end

Wenn x = 1, countwird nur einmal alle 512 Takte inkrementiert. Wenn x = 512, countwird bei jedem Takt inkrementiert. Wenn x = 40, countwird im Durchschnitt alle 12,8 Takte inkrementiert.


Im allgemeinen Fall von zwei Zahlen, bei denen die Zählrate x/y ist (x darf nicht größer als y sein), überlegen Sie, was der obige Code tatsächlich in Bezug auf den Wert y = 512 tut:

  • Was temp & 10'h1FFleistet der Ausdruck eigentlich numerisch?
  • Was bedeutet es in ähnlicher Weise numerisch, wenn Bit 9 gesetzt ist?
Richtig, ich möchte, dass der Zähler für x Taktzyklen in jedem seiner Zustände bleibt. Ihre Implementierung funktioniert für eine ganzzahlige Anzahl von Zyklen. Aber wie würden Sie mit Bruch x umgehen? zum Beispiel, um den Zähler im Durchschnitt alle 12,8 Takte zu erhöhen?
Oh, meinst du das mit "Bruchfaktor"? Aus deinen Beispielen ging das nicht wirklich hervor. In diesem Fall können DDS-Techniken angewendet werden, aber Sie müssen viel genauer angeben, welche Art von Werten x annehmen kann und wie Sie x als digitales Signal darstellen.
Ja, dies löst sowohl Ganzzahlen als auch Bruchzahlen. Das aktuelle Design ist jedoch stark daran gebunden, dass die maximalen Haltetakte Potenzen von 2 sind. Wie würden Sie mit dem Fall umgehen, in dem die maximalen Haltetakte (x = 1) beispielsweise 460 statt 512 betragen?
Ernsthaft? Ich habe Ihnen diese Antworten auf einem Silbertablett serviert – können Sie das wirklich nicht verallgemeinern? Ja, die Abkürzung, bei temp[9] nach Überlauf zu suchen, funktioniert nur für Zweierpotenzen, aber es ist einfach, dies auf jede beliebige Zahl zu erweitern. Ich werde nicht ALLE deine Hausaufgaben für dich machen!
@Toolic: Danke. Ich ging nur von der Tatsache aus, dass die SE-Syntaxfärbung es als Schlüsselwort hervorzuheben schien.

Vielleicht würde ich den Hauptzähler mit einem Komparator konditionieren, der x und den Ausgang des 10-Bit-Hilfszählers (mit Taktfrequenz getaktet) als Eingänge nimmt? Mehr kann ich dir nicht sagen, da in deiner Beschreibung einige Details zur Funktionsweise fehlen.

Lassen Sie mich wissen, welche zusätzlichen Informationen Sie benötigen, und ich füge diese der Beschreibung hinzu

Wenn wir von Bruchzahlen sprechen, müssen Sie definieren, welche Auflösung Sie in der Frequenz benötigen, was die Anzahl der benötigten Bits bestimmt. Mehr Bits bedeuten mehr Ressourcenverbrauch, aber Sie können einen genaueren Bruchteil angeben. Sie implementieren dies wie folgt: Bauen Sie einen N + 1-Bit-Akkumulator auf, fügen Sie bei jedem Zyklus Ihren N-Bit-Schritt zum Akkumulator hinzu. Wenn das MSB umschaltet, erhöhen Sie Ihren Ausgangszähler.