【Verilog基础】7.计数器

4位计数器

module count4(out,reset,clk);
    output[3:0] out;
    input reset,clk;
    reg[3:0] out;
always @(posedge clk)
    begin
        if (reset) out<=0; 
        else out<=out+1; 
    end
endmodule

如果是电平触发的话,只需要把posedge clk 换成reset or clk 就可以了;

4位计数器--带清零端、置数端和使能端

module cnt16(co,q,clk,r,s,en,d);
    output[3:0] q; //计数输出端
    output co; //进位信号
    input clk,r,s,en; //时钟信号、清零端、置数端和使能端
    input[3:0] d; //预置数数据端
    reg [3:0] q;
    reg co;
always @(posedge clk)
     if(r)
         begin q=0; end
     else
         begin 
             if(s)
                 begin q=d; end
             else
                 if(en)
                     begin 
                         q=q+1;
                     if(q==4'b1111)
                         begin co=1; end
                      else
                         begin co=0; end
                      end
                 else
                     begin q=q; end
                 end
endmodule

同步置数和同步清零的计数器

module count(out,data,load,reset,clk);
    output[7:0] out;
    input[7:0] data;
    input load,clk,reset;
    reg[7:0] out;
always @(posedge clk) //clk 上升沿触发
    begin
        if (!reset) out = 8'h00; //同步清 0,低电平有效
            else if (load) out = data; //同步预置
        else out = out + 1; //计数
    end
endmodule

4 Johnson 计数器(异步复位)

Johnson 计数器是一种数字电路, 具有以反馈方式连接的一系列触发器。 如果位数为N,则Verilog Johnson计数器是对2N个状态进行计数的计数器。
该电路是一种特殊类型的移位寄存器, 中最后一个触发 器的补码输出反馈到第一个触发器的输入。 类似于环形计数器。

module johnson(clk,clr,out);
    input clk,clr;
    output[3:0] out;
    reg[3:0] out;
always @(posedge clk or posedge clr)
    begin
        if (clr) out<= 4'h0;
        else
        begin out<= out<< 1;
              out[0]<= ~out[3];
        end
    end
endmodule

十进制模 24 计数器

module cnt24(ten,one,co,clk,clr);
    output[3:0] ten,one;
    output co;
    input clk,clr;
    reg[3:0] ten,one;
    reg co;
always @(posedge clk)
    begin
         if(clr) 
             begin ten<=0;one<=0; end
         else
             begin
                 if({ten,one}==8'b00100011)
                 begin ten<=0;one<=0;co<=1; end
             else if(one==4'b1001)
                  begin one<=0;ten<=ten+1;co<=0; end
              else
                  begin one=one+1;co<=0; end
                 end
     end
endmodule

模为 60 BCD 码加法计数器

module count60(qout,cout,data,load,cin,reset,clk);
    output[7:0] qout;
    output cout;
    input[7:0] data;
    input load,cin,clk,reset;
    reg[7:0] qout;
always @(posedge clk) //clk 上升沿时刻计数
    begin
        if (reset) qout<=0; //同步复位
        else if(load) qout<=data; //同步置数
        else if(cin)
            begin
                if(qout[3:0]==9) //低位是否为 9,是则
                begin
                qout[3:0]<=0; //回 0,并判断高位是否为 5
                if (qout[7:4]==5) qout[7:4]<=0;
                else
                qout[7:4]<=qout[7:4]+1; //高位不为 5,则加 1
                end
                else //低位不为 9,则加 1
                qout[3:0]<=qout[3:0]+1;
           end
       end

assign cout=((qout==8'h59)&cin)?1:0; //产生进位输出信号
endmodule

减法计数器

module jian_cnt10(q,clk,rst);
    output[3:0] q; //计数器输出端
    input clk,rst; //时钟、复位
    reg[3:0] q;
always @(posedge clk)
    begin
        if(rst) 
             begin q<=0; end
         else if(q==4'b0000)
         begin q<=4'b1001; end
         else 
         begin q<=q-1; end
    end
endmodule
  • 5
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值