每 n 个时钟周期递增 mod 计数器

incrementing mod counter every n clock cycle

这是 mod 64 计数器的 verilog 代码,每个时钟周期递增

module modulus64counter
#(parameter N=64,
parameter WIDTH=5)
(input clk,
input rstn,
output reg[WIDTH-1:0] out);
integer i;
always @(posedge clk) begin
if(!rstn) begin
out<=0;
end
else begin
if(out==N-1)
out<=0;
else 
out<= out+1;
end
end
endmodule

测试台是

module modulus64countertb;

    // Inputs
    reg clk;
    reg rstn;

    // Outputs
    wire [4:0] out;

    // Instantiate the Unit Under Test (UUT)
    modulus64counter uut (
        .clk(clk), 
        .rstn(rstn), 
        .out(out)
    );
    always #10 clk = ~clk;
    initial begin
        // Initialize Inputs
        clk = 1;
        rstn = 0;

        $monitor ("T=%0t rstn=%0b out=0X%h", $time,rstn,out);
repeat(2) @(posedge clk);
rstn <=1;
repeat(50) @(posedge clk);
$finish;
end
endmodule

现在如果我想每“n”个时钟周期而不是连续的时钟周期增加out的值,我如何mod验证程序

请帮忙

更新 20220131

更新了代码以在每 2 个时钟周期后产生输出。同样,如果你想延迟更多的时钟周期,最简单的方法就是不断地翻转它。

为了更好的实现,你可以试试移位寄存器。

module modulus64counter #(
    parameter               N=64,
    parameter               WIDTH=8,
    parameter               DELAY_CYCLE=2
)(
    input                   clk,
    input                   rstn,
    output reg[WIDTH-1:0]   out,
    output reg[WIDTH-1:0]   actual_out
);
    integer                 i;
    reg       [WIDTH-1:0]   cntr;
  
    reg       [WIDTH-1:0]   dly1clk;
    
    always @(posedge clk) begin
        if(!rstn) begin
            out <= 0;
            dly1clk <= 0;
        end else if(out == DELAY_CYCLE-1) begin
            out <= 0;
            dly1clk <= dly1clk + 1;
        end else begin
            out <= out + 1;
        end
    end
  
    always @(posedge clk) begin
        if(!rstn) begin
            actual_out <= 0;
        end else begin
            actual_out <= dly1clk;
        end
    end
endmodule


下面的代码应该适合您。如果您坚持使用 out 作为最终计数变量,您可以随时交换 outactual_out

此外,删除测试平台中 monitor 行上的 out 只会在达到 mod n 时打印该值。我将 outactual_out 都保留在测试台的 monitor 上以简化调试目的。

Verilog 代码

module modulus64counter #(
    parameter               N=64,
    parameter               WIDTH=8
)(
    input                   clk,
    input                   rstn,
    output reg[WIDTH-1:0]   out,
    output reg[WIDTH-1:0]   actual_out
);
    integer                 i;
    reg       [WIDTH-1:0]   cntr;
    
    always @(posedge clk) begin
        if(!rstn) begin
            out <= 0;
            actual_out <= 0;
        end else if(out == N-1) begin
            out <= 0;
            actual_out <= actual_out + 1;
        end else begin
            out <= out + 1;
        end
    end
endmodule

测试平台

module modulus64countertb;

    // Inputs
    reg         clk;
    reg         rstn;

    // Outputs
    wire [7:0]  out;
    wire [7:0]  actual_out;

    // Instantiate the Unit Under Test (UUT)
    modulus64counter uut (
        .clk(clk), 
        .rstn(rstn), 
        .out(out),
        .actual_out(actual_out)
    );
  
    always #10 clk = ~clk;
    initial begin
        // Initialize Inputs
        clk  = 1;
        rstn = 0;

        $monitor ("T=%0t rstn=%0b out=%d actual_out=%d", $time,rstn,out,actual_out);
        repeat(2) @(posedge clk);
        rstn <=1;
        repeat(200) @(posedge clk);
        $finish;
    end
endmodule

使用edaplayground模拟的输出结果: