使用verilog实现计数器

用Verilog实现计数器

本实验使用了quartus和modelsim

  • 六进制简单计数器
  • 复杂计数器

六进制计数器

  • 手绘版RTL图
    visio画的RTL图

  • quartus自动生成的RTL图
    自动生成的RTL图

  • modelsim仿真波形图
    仿真波形图

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

代码

counter_6.v代码:

module counter_6(
        input CLK,
        input RST,
        output reg [2:0] CNT
        );
        parameter MAX=3'b101;
        always @(posedge RST,posedge CLK)
        begin
            if(RST)
            begin
                CNT<=3'b000;
            end
            else
            begin
                if(CNT==MAX)
                begin
                    CNT<=3'b000;
                end
                else
                begin
                    CNT<=CNT+3'b001;
                end
            end
        end

endmodule

counter_6_tb.v代码:

module counter_6_tb();
    reg RST;
    reg CLK;
    wire [2:0] CNT;
    counter_6 counter(
    .CLK(CLK),
    .RST(RST),
    .CNT(CNT));
    initial
    begin
        CLK=1'b0;
        RST=1'b1;
        #4 RST=1'b0;
    end
    always #1 CLK<=~CLK;
endmodule

复杂计数器

  • 手绘版RTL图
    这里写图片描述
  • quartus自动生成的RTL图
    自动生成RTL
  • modelsim仿真波形图
    这里写图片描述

counter_4.v代码:

        input RST,
        output reg [1:0] CNT);
        parameter MAX=2'b11;
        always @(posedge RST,posedge CLK)
        begin
            if(RST)
            begin
                CNT<=0;
            end
            else
            begin
                if(CNT==MAX)
                begin
                    CNT<=0;
                end
                else
                begin
                    CNT<=CNT+2'b01;
                end
            end
        end

endmodule


counter.v代码:

        input RST,
        input CLK,
        output reg [3:0] CNT);
        parameter MAX_0=4'b0110;
        parameter MAX_1=4'b0111;
        parameter MAX_2=4'b1000;
        parameter MAX_3=4'b1001;
        reg clk_in;
        wire [1:0] cnt_out; 
        counter_4 i_counter_4(
                    .RST(RST),
                    .CLK(clk_in),
                    .CNT(cnt_out));
        initial
        begin
            clk_in<=0;
        end
        always @(posedge RST,posedge CLK)
        begin
            if(RST)
            begin
                CNT<=4'b0000;
            end
            else
            begin
                case(cnt_out)
                    2'b00:
                        begin
                            if(CNT==MAX_0)
                            begin
                                CNT<=4'b0000;
                                clk_in<=1;
                            end
                            else
                            begin
                                CNT<=CNT+1;
                                clk_in<=0;
                            end
                        end
                    2'b01:
                        begin
                            if(CNT==MAX_1)
                            begin
                                CNT<=4'b0000;
                                clk_in<=1;
                            end
                            else
                            begin
                                CNT<=CNT+1;
                                clk_in<=0;
                            end
                        end
                    2'b10:
                        begin
                            if(CNT==MAX_2)
                            begin
                                CNT<=4'b0000;
                                clk_in<=1;
                            end
                            else
                            begin
                                CNT<=CNT+1;
                                clk_in<=0;
                            end
                        end
                    2'b11:
                        begin
                            if(CNT==MAX_3)
                            begin
                                CNT<=4'b0000;
                                clk_in<=1;
                            end
                            else
                            begin
                                CNT<=CNT+1;
                                clk_in<=0;
                            end
                        end
                endcase
            end
        end
endmodule


counter_tb.v代码:

    reg CLK;
    reg RST;
    wire [3:0] CNT;
    counter i_counter(
                .CLK(CLK),
                .RST(RST),
                .CNT(CNT));
    initial
    begin
        CLK<=0;
        RST<=1;
        #2 RST<=0;
    end
    always
    begin
        #1 CLK<=~CLK;
    end
endmodule

  • 22
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值