HDLbits——计数器

计数器

1 4 位二进制计数器

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output [3:0] q);
    always @(posedge clk) begin
        if (reset) 
            q<=4'b0000;
        else 
            q<=q+1'b1;
    end
endmodule

2 十位计数器

0~9

module top_module (
    input clk,
    input reset,        // Synchronous active-high reset
    output [3:0] q);
    always@(posedge clk) begin
        if (reset |(q>=4'h9)) //注意这里应该写大于等于9,如果写a还是包括10
            q<=4'b0;
        else
            q<=q+1'b1;
    end
endmodule

3

1~10

复位到1

module top_module (
    input clk,
    input reset,
    output [3:0] q);
    always@(posedge clk) begin
        if(reset |(q>=4'ha))
            q<=4'h1;
        else
            q<=q+1'b1;
    end
endmodule

4 0~9的计数器,随着一个slowena使能信号来控制增

设计一个0~9的计数器,共10个周期。该计数器采用同步复位且复位为0。但是本题是希望该计数器并不是随着clk的变化而递增,而是随着一个slowena使能信号来控制增加。

module top_module (
    input clk,
    input slowena,
    input reset,
    output [3:0] q);
    always@(posedge clk) begin
        if(reset)
            q<=4'h0;
        else if((slowena==1'h1)&(q<=4'h8))
            q<=q+1'h1;
        else if((slowena==1'h1)&(q==4'h9))
            q<=4'h0;
        else
            q<=q;
    end
endmodule

5 1~12的计数器

有点不好理解题意

其中cout4是一个4bit计数器,可以从0到15,我们需要控制该计数器使其从1到12

module top_module (
    input clk,
    input reset,
    input enable,
    output [3:0] Q,
    output c_enable,
    output c_load,
    output [3:0] c_d
); //  
    assign c_enable=enable;//使能端
    assign c_load=reset|((Q==4'hc)&enable==1'b1);//相当于是否重置
    assign c_d=4'd1;//初始数值
    count4 the_counter (.clk(clk), .enable(c_enable), .load(c_load), .d(c_d),.Q(Q));
endmodule

6 时钟分频器

刚开始没弄明白

从1000Hz中分离出1Hz的信号,叫做OneHertz。这个主要用作与数字时钟中。利用一个模10的BCD计数器和尽量少的逻辑门来建立一个时钟分频器。同时输出每个BCD计算器的使能信号(c_enable[0]为高位,c_enable[2]为低位)。

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); //
    reg [3:0] q1,q2,q0;
    assign c_enable={q1 == 4'd9 && q0 == 4'd9,q0 == 4'd9,1'b1};
    assign OneHertz = {q2 == 4'd9 && q1 == 4'd9 && q0 == 4'd9};
    
    bcdcount counter0 (.clk(clk), .reset(reset), .enable(c_enable[0]),.Q(q0));
    bcdcount counter1 (.clk(clk), .reset(reset), .enable(c_enable[1]),.Q(q1));
    bcdcount counter2 (.clk(clk), .reset(reset),.enable(c_enable[2]),.Q(q2));
endmodule

7 4位BCD(二进制编码十进制)计数器

设计一个4位BCD(二进制编码十进制)计数器。每个十进制数字使用4-bit来表示:q[3:0]是个位,q[7:4]是十位等。对于ena[3:1],该信号用来表示个位、十位和百位的进位。时序图如下图所示

容易写错

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
    assign ena={q[3:0]== 4'd9&& q[11:8] == 4'd9 && q[7:4] == 4'd9,q[3:0] == 4'd9 && q[7:4] == 4'd9,q[3:0]== 4'd9};
    bcd4 bcd4_1(.clk(clk),.reset(reset),.enable(1'b1),.q(q[3:0]));
    bcd4 bcd4_2(.clk(clk),.reset(reset),.enable(ena[1]),.q(q[7:4]));
    bcd4 bcd4_3(.clk(clk),.reset(reset),.enable(ena[2]),.q(q[11:8]));
    bcd4 bcd4_4(.clk(clk),.reset(reset),.enable(ena[3]),.q(q[15:12]));
    
endmodule         
module bcd4(input clk,input reset,input enable,output [3:0]q);
    always@(posedge clk) begin
        if (reset)
            q<=4'h0;
        else if((enable==1'b1)&&(q<=4'h8))
            q<=q+1'h1;
        else if((enable==1'b1)&&(q==4'h9))
            q<=4'h0;
        else
            q<=q;
        end
endmodule

8

module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output [7:0] hh,
    output [7:0] mm,
    output [7:0] ss); 
    
    reg [6:1] enable;
    reg [7:0] hh_r;
    assign enable[1]=(ss[3:0]==4'h9)&ena;
    assign enable[2]=enable[1]&&(ss[7:4]==4'h5);
    assign enable[3]=enable[2]&&(mm[3:0]==4'h9);
    assign enable[4]=enable[3]&&(mm[7:4]==4'h5);
    assign enable[5]=enable[4]&&(hh_r[3:0]==4'hb);
    assign enable[6]=enable[5]&&(hh_r[7:4]==4'h1);
    
    
    //注意加参数后的例化设计
    bcdf #(.start(4'h0),.END(4'h9)) ss9(.clk(clk),.reset(reset),.ena(ena),.q(ss[3:0]));
    bcdf #(.start(4'h0),.END(4'h5)) ss5(.clk(clk),.reset(reset),.ena(enable[1]),.q(ss[7:4]));
    bcdf #(.start(4'h0),.END(4'h9)) mm9(.clk(clk),.reset(reset),.ena(enable[2]),.q(mm[3:0]));
    bcdf #(.start(4'h0),.END(4'h5)) mm5(.clk(clk),.reset(reset),.ena(enable[3]),.q(mm[7:4]));
    bcdf #(.start(4'h0),.END(4'd11)) hh11(.clk(clk),.reset(reset),.ena(enable[4]),.q(hh_r[3:0]));
    bcdf #(.start(4'h0),.END(4'h1)) hh1(.clk(clk),.reset(reset),.ena(enable[5]),.q(hh_r[7:4]));
    
    assign pm=(hh_r[7:4]==4'h1);//表示从上午到下午了
    //小时的变化很麻烦,因为题目说小时没有0,因此,当时为0时,应置为12;
    //由于BCD码,上面写的到b(11),h进位,但是并不行显示11,因此这里要稍微修改,判断时的低位是否大于9,
    //如果小于正常输出,如果大于,低位需要减10
    assign hh=(hh_r[3:0]==4'h0)?8'h12:((hh_r[3:0]>4'h9)?({1'b1,hh_r[3:0]-4'ha}):({1'b0,hh_r[3:0]}));
    
    
    

endmodule

module bcdf(input clk,input reset,input ena,output reg [3:0] q);
    parameter  start=4'h0,END=4'h9;//参数化设计可配置
    always@(posedge clk) 
        begin
            if(reset)
                q<=start;
            else begin
                if(ena) begin
                    if(q<END)
                        q<=q+1'd1;
                    else
                        q<=start;
                end
                else
                    q<=q;
            end
                
        end
endmodule

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NDLilaco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值