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
Hat jemand eine bessere Idee als diese, ressourceneffizienter?
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.
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?
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 temp
gleich x-1 ist. Wenn ja, temp
auf 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, count
wird nur einmal alle 512 Takte inkrementiert. Wenn x = 512, count
wird bei jedem Takt inkrementiert. Wenn x = 40, count
wird 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:
temp & 10'h1FF
leistet der Ausdruck eigentlich numerisch?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.
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.
Andi aka
Tony Stewart EE75