草庐IT

计数器—verilog

IC天然居士 2023-04-04 原文

目录

常规带使能计数器

加减计数器

环形计数器

约翰逊(Johnson)计数器(扭环形计数器)

简易秒表

低功耗可恢复计数器


计数器的介绍

计数器是应用最广泛的逻辑部件之一。计数器可以统计输入脉冲的个数,具有计时、计数、分频、定时、产生节拍脉冲等功能。

计数器的种类繁多,根据计数器中触发器时钟端的链接方式,分为同步计数器和异步计数器;

根据计数方式,分为二进制计数器、十进制计数器和任意进制计数器;

根据计数器中的状态变化规律,分为加法计数器、减法计数器和加/减计数器。
 

常规带使能计数器

介绍:带使能端的模100异步清零计数器为例

1. 设计代码

// 以带使能的模100异步清零计数器为例----------

`timescale 1ns/1ps
module cnt #(parameter COUNT=100)(
input clk,
input rst_n,
input cnt_en,
output reg [6:0]out//如果参数化中COUNT比较大,需要更改out的位宽来适配
    );
reg set;   

always@(posedge clk or negedge rst_n) //异步清零
begin 
if(!rst_n)begin 
    out<=7'd0;set<=1'b0;
end
else if(cnt_en)begin
//写法1:
        if(out!=COUNT-1)begin
            out<=out+1'b1;
            set<=1'b0;
        end
        else begin 
            out<=7'd0;
            set<=1'b1;
        end
/*     
//写法2:
     if(out==COUNT-1)begin 
        out<=7'd0;
        set<=1'b1;
    end
    else begin  
        out<=out+1'b1;
        set<=1'b0;   
    end */
end
else begin 
    out<=7'd0;set<=1'b0;
end    //maybe
end 
endmodule

2. 测试代码

module cnt_tst();
 
reg       clk     ;
reg       rst_n   ;
reg       cnt_en  ;
wire [6:0]out     ;
 
cnt U_cnt(
.clk     (clk    ),
.rst_n   (rst_n  ),
.cnt_en  (cnt_en ),
.out     (out    )
);
 
initial
begin
clk=1;
rst_n=0;
cnt_en=0;
#10 rst_n=1;
cnt_en=1;
#100 cnt_en=0;
#200 cnt_en=1;
#2000 cnt_en=0;
end
always #10 clk=~clk;
 
endmodule

3. 仿真波形

 

加减计数器

1. 设计代码

// ----------------------加减计数器-----------------


`timescale 1ns/1ns

module count_module(
	input clk,
	input rst_n,
	input mode,
	output reg [3:0]number,
	output reg zero
	);
    reg [3:0] num_temp;
    always @(posedge clk or negedge rst_n)
        begin
            if(~rst_n) begin
                num_temp <= 4'b0;
                number <= 4'b0;
            end
            else begin
                if (mode == 1'b1) begin
                    if(num_temp == 4'd9) begin
                      num_temp <= 4'd0;
                      number <= num_temp;
                    end
                    else begin
                       num_temp <= num_temp + 4'd1;
                       number <= num_temp;
                    end
                end
                else begin
                     if(num_temp == 4'd0) begin
                        num_temp <= 4'd9;
                        number <= num_temp;
                     end
                     else begin
                        num_temp <= num_temp - 4'd1;
                        number <= num_temp;
                     end
                end 
            end        
        end
    always @(posedge clk or negedge rst_n)
        begin
            if(~rst_n)
                zero <= 4'b0;
            else
                zero <= (num_temp == 4'b0);
        end
endmodule

2.测试代码

module testbench();

reg clk,rst_n;
reg mode;
reg [3:0]number;
reg zero;

count_module counter(
.clk   (clk),
.rst_n (rst_n),
.mode(mode),
.number(number),
.zero (zero)
);  

 initial
 begin
 clk=0;
 rst_n=0;
 mode = 1;
 #20 rst_n=1;
 #500 mode = 1;
 #500 mode = 0;
 #500 mode = 1;
 end
   
always #10 clk=~clk;
     
endmodule

3.仿真波形

 

环形计数器

环形计数器,n个触发器表示n个状态。所谓环形,是指“1”,在每一组数中出现的位置形成的效果图,像一个环一样,依次循环,以4bit环形计数器为例子,“1”的位置依次在第0bit、第1bit,第2bit,第3bit,再回到第0bit,依次类推,就像一个环。如 4bit环形计数器:复位有效时输出0001,复位释放后依次输出0010,0100,1000,0001,0010…。

1. 设计代码

//环形计数器
module ring_counter#(parameter word_size=4)(
input clk,
input rst_n,
input enable,
output reg [word_size-1:0]count
);
always@(posedge clk,negedge rst_n)
if(!rst_n)
    count<={{(word_size-1){1'b0}},1'b1};
else if(enable==1'b1)count<={
   count[word_size-2:0],count[word_size-1]};
endmodule

2. 测试代码

module ring_counter_tst #(parameter word_size=4)();
reg clk;
reg rst_n;
reg enable;
wire [word_size-1:0]count;
ring_counter U_ring_counter(
.clk   (clk),
.rst_n (rst_n),
.enable(enable),
.count (count)
);   
 initial
 begin
 clk=0;
 rst_n=0;
 enable=0;
 #20 rst_n=1;
 #20 enable=1;
 
 end
   
always #10 clk=~clk;
     
endmodule

3. 仿真波形

 

约翰逊(Johnson)计数器(扭环形计数器)

约翰逊(Johnson)计数器又称扭环计数器,是一种用n位触发器来表示2n个状态的计数器。约翰逊(Johnson)计数器有一个非常明显地好处,相邻两组数只有一位不同,具体如下例子所示,因此在计数过程中不会存在竞争冒险问题。

以4bit约翰逊(Johnson)计数器为例,4bit约翰逊(Johnson)计数器,能表示8种状态,相邻两组数之间,仅有1bit不同:

0000 1000 1100 1110 1111 0111 0011

0001 0000 1000

为什么叫扭环形呢?小编的理解:相邻两组数的变化很像是扭了一下,如上图中1000 和1100,将1000的高三位放在1100中的低三位,再将1000中最低位0取反,放到1100中的最高位。

1. 设计代码

module johnson_counter#(parameter WIDTH = 4)(
input clk,
input rst_n,
output reg [WIDTH-1:0] cnt
);
   
  always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
      cnt <= { WIDTH { 1'b0 }};
    else
      cnt <= { ~cnt[0], cnt[WIDTH-1:1] };
  end
endmodule

2. 测试代码

module johnson_counter_tst #(parameter WIDTH = 4)();
reg clk;
reg rst_n;
wire [WIDTH-1:0] cnt;
 
johnson_counter U_johnson_counter(
. clk(clk),
. rst_n(rst_n),
. cnt(cnt)
);
 
initial
begin
clk=0;
rst_n=0;
#20 rst_n=1;
 
end
 
always #10 clk=~clk;
    
endmodule

3. 仿真波形

 

简易秒表

实现简易秒表的功能:具有两个输出,当输出端口second从1-60循环计数,每当second计数到60,输出端口minute加一,一直到minute=60,暂停计数。

1. 设计代码

`timescale 1ns/1ns

module count_module (
    input clk,
    input rst_n,
    output reg [5:0]second,
    output reg [5:0]minute
);

always @(posedge clk or negedge rst_n)
begin
    if(~rst_n) begin
        second <= 6'b0;
        minute <= 6'b0;
    end
    else begin
        if(minute == 6'd60) begin
            second <= second;
            minute <= minute;
        end
        else if(second == 6'd60)begin
            second <= 6'b1;
            minute <= minute + 6'b1;
        end
        else begin
            second <= second + 6'b1;
        end
    end
end
endmodule

2. 测试代码

module testbench();

reg clk,rst_n;
wire [5:0]second;
wire [5:0]minute;

count_module miaobiao_counter(
.clk   (clk),
.rst_n (rst_n),
.second(second),
.minute (minute)
);  

 initial
 begin
 clk=0;
 rst_n=0;
 #20 rst_n=1;
 end
   
always #10 clk=~clk;
     
endmodule

3. 仿真波形

 

 

低功耗可恢复计数器

这个暂时还没有找到资料,望批评指正~~

引用

计数器是非常基本的使用,没有计数器就无法处理时序。我在学习时发现市面上有几种不同的计数器写法,非常有趣,在此记录下来——咸鱼FPGA

【手撕代码】数字IC秋招中常见六种计数器(含源码)——IC媛

Verilog学习之路(9)—计数器和移位寄存器——Willliam_william

有关计数器—verilog的更多相关文章

  1. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  2. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  3. Ruby 计数数组对象,如果对象包含值 - 2

    我有一个数组:array=['Footballs','Baseball','football','Soccer']而且我需要计算看到Football或Baseball的次数,无论大小写和复数形式如何。这是我尝试做的,但没有成功:array.count{|x|x.downcase.include?'football'||x.downcase.include?'baseball'}编写这段代码的正确或更好的方法是什么?我正在寻找3作为答案。 最佳答案 我会将count与一个block结合使用,该block根据与您正在寻找的约束相匹配的正

  4. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  5. ruby - AWS 上远程机器上的进程计数 - 2

    我正在为在AmazonEC2实例上运行的应用程序设计一个AutoScaling系统。应用程序从SQS读取消息并对其进行处理。AutoScaling系统将监控两件事:SQS中的消息数量,所有EC2机器上运行的进程总数。例如,如果SQS中的消息数量超过3000,我希望系统自动缩放,创建一个新的EC2实例,在其上部署代码,当消息数量低于2000时,我希望系统终止EC2实例.我正在用Ruby和Capistrano做这件事。我的问题是:我无法找到一种方法来确定在所有EC2机器上运行的进程数并将该数字保存在变量中。你能帮帮我吗? 最佳答案 您可

  6. ruby-on-rails - FactoryGirl工厂特征内的序列不使用主序列计数器 - 2

    我有以下工厂:FactoryGirl.definedofactory:foodosequence(:name){|n|"Foo#{n}"}trait:ydosequence(:name){|n|"Fooy#{n}"}endendend如果我跑create:foocreate:foocreate:foo,:y我得到Foo1,Foo2,Fooy1。但我想要Foo1,Foo2,Fooy3。我怎样才能做到这一点? 最佳答案 经过smile2day'sanswer的一些提示后和thisanswer,我得出以下解决方案:FactoryGirl.

  7. ruby - 续集:如何使用分组和计数 - 2

    简单地说,我如何使用Sequel执行此查询?selecta.id,count(t.id)fromalbumsarightjointrackstont.album_id=a.idgroupbya.id 最佳答案 DB[:albums___a].right_join(:tracks___t,:album_id=>:id).select_group(:a__id).select_more{count(:t__id)} 关于ruby-续集:如何使用分组和计数,我们在StackOverflow上找

  8. ruby-on-rails - RSpec 检查数组的计数 - 2

    我正在测试我的ControllerAction以供练习。在我的Controller中,我只想从我的数据库中按名称获取所有不同的产品:defshop@products=Product.select('distincton(name)*').sort_by&:orderend我已经手动检查过了,它工作正常。现在我正在使用我的RSpec设置我的测试,我想测试@products是一个大于0的数组:RSpec.describePagesController,type::controllerdodescribe'GET#shop'doit'shouldgetallproudcts'doget:sh

  9. arrays - ruby 中的最佳排列计数算法 - 2

    我正在尝试计算由二进制形式的1和0的P数表示的数字的数量。如果P=2,则表示的数字为0011、1100、0110、0101、1001、1010,所以计数为6。我试过:[0,0,1,1].permutation.to_a.uniq但这不是大数的最佳解决方案(P可以什么可能是最好的排列技术,或者我们是否有任何直接的数学来做到这一点? 最佳答案 Numberofpermutationcanbecalculatedusingfactorial.a=[0,0,1,1](1..a.size).inject(:*)#=>4!=>24要计算重复项,

  10. ruby-on-rails - Rails 计数器缓存及其实现 - 2

    我正在尝试掌握Rails计数器缓存功能,但无法完全掌握它。假设我们有3个模型ABCA属于B或C,取决于字段key_type和key_id。key_type表示A属于B还是C,因此如果key_type="B"则记录属于B,否则属于C。在我的模型a.rb中,我定义了以下关联:belongs_to:b,:counter_cache=>true,:foreign_key=>"key_id"belongs_to:c,:counter_cache=>true,:foreign_key=>"key_id"和在b和c模型文件中has_many:as,:conditions=>{:key_type=>"

随机推荐