Verilog 计数器的代码实现

本文介绍了使用Verilog编写的计数器模块,包括模块定义、参数设置以及测试代码,展示了如何通过时钟信号控制三个独立计数器的递增过程。测试部分包含波形输出,用于验证计数器功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、计数器代码:

module counter (
        input clk,
        input rstn,
        output [5:0] cn1,
        output [5:0] cn2,
	    output [5:0] cn3
    );

    parameter CLK_CNT = 5;
    parameter CLK_END = CLK_CNT-1;
	
    reg [5:0] ida = 6'b0;
    reg [5:0] idc = 6'b0;
    reg [5:0] idd = 6'b0;

    assign cn1 = ida;
    assign cn2 = idc;
    assign cn3 = idd;

    always @(posedge clk or negedge rstn) begin
        if (!rstn)
            ida <= 1'b0;
        else if (ida == CLK_END)
	        ida <= 1'b0;
        else
	        ida <= ida + 1'b1;
    end
	
    always @(posedge clk or negedge rstn) begin
        if (!rstn)
            idc <= 1'b0;
        else if (idc == CLK_END)
	        idc <= 1'b0;
	    else if (ida == CLK_END)
            idc <= idc + 1'b1;
        else 
            idc <= idc;
    end

    always @(posedge clk or negedge rstn) begin
        if (!rstn)
            idd <= 1'b0;
        else if (idd == 11)
	        idd <= 1'b0;
	    else if (idc == CLK_END)
            idd <= idd + 1'b1;
        else 
            idd <= idd;
    end

endmodule

二、测试代码:

`timescale 1ns/1ns

module counter_tb ();

reg clk, rstn;
wire [5:0] cn1, cn2, cn3;

counter #(.CLK_CNT(5))
    u_counter(
        .clk(clk),
        .rstn(rstn),
        .cn1(cn1),
        .cn2(cn2),
        .cn3(cn3)
    );

initial clk = 1'b0;
always #5 clk = ~clk;

initial begin
    $dumpfile("counter_tb.vcd");
    $dumpvars;
	rstn = 0;
    #10
    rstn = 1;
    #10_000_000
    $stop;
end

endmodule

三、波形输出
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值