Verilog Mod-N Counter Design: Parameterisiertes Modul & Testbench
Design
Ein Mod-N-Zähler zählt von 0 bis N-1 und springt dann wieder auf 0. Die Parameter N (Modulo) und WIDTH (Bitbreite) machen das Modul flexibel für beliebige Zählbereiche.
module modN_ctr #(
parameter int N = 10,
parameter int WIDTH = 4
) (
input logic clk,
input logic rstn,
output logic [WIDTH-1:0] out
);
always_ff @(posedge clk) begin
if (!rstn) begin
out <= '0;
end else if (out == N-1) begin
out <= '0;
end else begin
out <= out + 1;
end
end
endmodule
Testbench
Der Test prüft zwei vollständige Zählzyklen (20 Takte) nach Freigabe des Resets.
module tb;
parameter int N = 10;
parameter int WIDTH = 4;
logic clk, rstn;
logic [WIDTH-1:0] out;
modN_ctr #(.N(N), .WIDTH(WIDTH)) u0 (
.clk (clk),
.rstn (rstn),
.out (out)
);
always #10 clk = ~clk;
initial begin
clk = 0;
rstn = 0;
$monitor("T=%0t rstn=%0b out=0x%0h", $time, rstn, out);
repeat (2) @(posedge clk);
rstn = 1;
repeat (20) @(posedge clk);
$finish;
end
endmodule
Simulationsergebnis
Der Zähler zählt hexadezimal von 0x0 bis 0x9 und springt dann auf 0x0 zurück.
ncsim> run T=0 rstn=0 out=0xx T=10 rstn=0 out=0x0 T=30 rstn=1 out=0x0 T=50 rstn=1 out=0x1 ... T=210 rstn=1 out=0x9 T=230 rstn=1 out=0x0 T=250 rstn=1 out=0x1 ... Simulation complete via $finish(1) at time 430 NS
Verilog
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog Math Functions meistern für effizientes Hardware-Design
- Verilog $timeformat meistern: Präzision und Anzeigesteuerung
- Verilog T-Flipflop designen: RTL-Implementierung & Testbench