19 / 37 · Konzept
parameter, localparam, $clog2 und Grenzkonfigurationen
Trennen Sie Laufzeiteingänge von Konfigurationen und entwerfen Sie Breite und Abschluss für N=1 und andere Werte als Zweierpotenzen.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Parameter werden bei der Elaboration festgelegt
Ein Port ändert sich im Betrieb; parameter konfiguriert die Struktur vorher; localparam benennt eine abgeleitete Konstante, die die Instanz nicht überschreibt. Beides sind keine Variablen je Takt. Ein Modulo-N-Zähler nutzt 0..N−1. Für N≥2 reicht $clog2(N); bei N=1 ergibt dies Null, also reservieren Sie mindestens ein Bit. N=0 liegt außerhalb des Vertrags.
Abschluss an einer freigegebenen Flanke
Beim Übergang des alten count von N−1 auf Null wird pulse registriert. Eine gesperrte Flanke hält count und löscht pulse. Synchroner Reset löscht beide und gewinnt gegen enable. N ist eine positive Ganzzahl im unterstützten Bereich.
module modulo_tick #(
parameter integer N = 5,
parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
input logic clk, rst, enable,
output logic [CW-1:0] count,
output logic pulse
);
localparam logic [CW-1:0] LAST = CW'(N-1);
always_ff @(posedge clk) begin
if (rst) begin
count <= '0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (enable) begin
if (count >= LAST) begin
count <= '0;
pulse <= 1'b1;
end else count <= count + 1'b1;
end
end
end
endmoduleCW steht in Ports und ist deshalb ein offener Parameter. Behalten Sie den Standard oder ≥max(1,$clog2(N)). Ein kleinerer Wert kürzt LAST; ein größerer erzeugt ungenutzte Codes, die >= an einer freigegebenen Flanke auf Null zurückführt. CW'(N-1) legt die Größe fest und repariert keine ungültigen Parameter. Validieren Sie vor der Elaboration; eine Laufzeitassertion repariert keine falsche Deklaration.
Konfigurationsmatrix
| N | Standard-CW | count nach freigegebenen Flanken seit Reset | pulse danach |
|---|---|---|---|
| 1 | 1 | 0,0,0 | 1,1,1 |
| 2 | 1 | 1,0,1 | 0,1,0 |
| 5 | 3 | 1,2,3,4,0 | 0,0,0,0,1 |
| 8 | 3 | 1,2,3,4,5,6,7,0 | 0,0,0,0,0,0,0,1 |
Ein Speicherbit erlaubt bei N=1 trotzdem nur den gültigen Zustand 0. N=5 besucht 5,6,7 normalerweise nicht. Nur Zweierpotenzen aufzunehmen würde den fehlenden ausdrücklichen Rücksetzvergleich verdecken.
Übung: Verhalten und Ablehnung
Instanziieren Sie N=1,2,5,8, prüfen Sie mindestens zwei Perioden, pausieren Sie am Endwert und aktivieren Sie Reset gleichzeitig mit enable. Vergleichen Sie jedes count/pulse. Die ganzzahlige Referenz löscht bei Reset, setzt pulse zunächst Null und erhöht bei enable modulo N mit Überlauferkennung; sie verwendet weder CW noch internen DUT-Zustand. Prüfen Sie die Ablehnung von N=0 und zu kleinem CW. Wiederverwendung gilt für den angegebenen und geprüften Bereich, nicht aufgrund eines bestandenen Standardfalls.