当前位置:   article > 正文

计数器—verilog_verilog计数器

verilog计数器

目录

常规带使能计数器

加减计数器

环形计数器

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

简易秒表

低功耗可恢复计数器


计数器的介绍

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

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

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

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

常规带使能计数器

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

1. 设计代码

  1. // 以带使能的模100异步清零计数器为例----------
  2. `timescale 1ns/1ps
  3. module cnt #(parameter COUNT=100)(
  4. input clk,
  5. input rst_n,
  6. input cnt_en,
  7. output reg [6:0]out//如果参数化中COUNT比较大,需要更改out的位宽来适配
  8. );
  9. reg set;
  10. always@(posedge clk or negedge rst_n) //异步清零
  11. begin
  12. if(!rst_n)begin
  13. out<=7'd0;set<=1'b0;
  14. end
  15. else if(cnt_en)begin
  16. //写法1:
  17. if(out!=COUNT-1)begin
  18. out<=out+1'b1;
  19. set<=1'b0;
  20. end
  21. else begin
  22. out<=7'd0;
  23. set<=1'b1;
  24. end
  25. /*
  26. //写法2:
  27. if(out==COUNT-1)begin
  28. out<=7'd0;
  29. set<=1'b1;
  30. end
  31. else begin
  32. out<=out+1'b1;
  33. set<=1'b0;
  34. end */
  35. end
  36. else begin
  37. out<=7'd0;set<=1'b0;
  38. end //maybe
  39. end
  40. endmodule

2. 测试代码

  1. module cnt_tst();
  2. reg clk ;
  3. reg rst_n ;
  4. reg cnt_en ;
  5. wire [6:0]out ;
  6. cnt U_cnt(
  7. .clk (clk ),
  8. .rst_n (rst_n ),
  9. .cnt_en (cnt_en ),
  10. .out (out )
  11. );
  12. initial
  13. begin
  14. clk=1;
  15. rst_n=0;
  16. cnt_en=0;
  17. #10 rst_n=1;
  18. cnt_en=1;
  19. #100 cnt_en=0;
  20. #200 cnt_en=1;
  21. #2000 cnt_en=0;
  22. end
  23. always #10 clk=~clk;
  24. endmodule

3. 仿真波形

 

加减计数器

1. 设计代码

  1. // ----------------------加减计数器-----------------
  2. `timescale 1ns/1ns
  3. module count_module(
  4. input clk,
  5. input rst_n,
  6. input mode,
  7. output reg [3:0]number,
  8. output reg zero
  9. );
  10. reg [3:0] num_temp;
  11. always @(posedge clk or negedge rst_n)
  12. begin
  13. if(~rst_n) begin
  14. num_temp <= 4'b0;
  15. number <= 4'b0;
  16. end
  17. else begin
  18. if (mode == 1'b1) begin
  19. if(num_temp == 4'd9) begin
  20. num_temp <= 4'd0;
  21. number <= num_temp;
  22. end
  23. else begin
  24. num_temp <= num_temp + 4'd1;
  25. number <= num_temp;
  26. end
  27. end
  28. else begin
  29. if(num_temp == 4'd0) begin
  30. num_temp <= 4'd9;
  31. number <= num_temp;
  32. end
  33. else begin
  34. num_temp <= num_temp - 4'd1;
  35. number <= num_temp;
  36. end
  37. end
  38. end
  39. end
  40. always @(posedge clk or negedge rst_n)
  41. begin
  42. if(~rst_n)
  43. zero <= 4'b0;
  44. else
  45. zero <= (num_temp == 4'b0);
  46. end
  47. endmodule

2.测试代码

  1. module testbench();
  2. reg clk,rst_n;
  3. reg mode;
  4. reg [3:0]number;
  5. reg zero;
  6. count_module counter(
  7. .clk (clk),
  8. .rst_n (rst_n),
  9. .mode(mode),
  10. .number(number),
  11. .zero (zero)
  12. );
  13. initial
  14. begin
  15. clk=0;
  16. rst_n=0;
  17. mode = 1;
  18. #20 rst_n=1;
  19. #500 mode = 1;
  20. #500 mode = 0;
  21. #500 mode = 1;
  22. end
  23. always #10 clk=~clk;
  24. endmodule

3.仿真波形

 

环形计数器

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

1. 设计代码

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

2. 测试代码

  1. module ring_counter_tst #(parameter word_size=4)();
  2. reg clk;
  3. reg rst_n;
  4. reg enable;
  5. wire [word_size-1:0]count;
  6. ring_counter U_ring_counter(
  7. .clk (clk),
  8. .rst_n (rst_n),
  9. .enable(enable),
  10. .count (count)
  11. );
  12. initial
  13. begin
  14. clk=0;
  15. rst_n=0;
  16. enable=0;
  17. #20 rst_n=1;
  18. #20 enable=1;
  19. end
  20. always #10 clk=~clk;
  21. 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. 设计代码

  1. module johnson_counter#(parameter WIDTH = 4)(
  2. input clk,
  3. input rst_n,
  4. output reg [WIDTH-1:0] cnt
  5. );
  6. always@(posedge clk or negedge rst_n) begin
  7. if(!rst_n)
  8. cnt <= { WIDTH { 1'b0 }};
  9. else
  10. cnt <= { ~cnt[0], cnt[WIDTH-1:1] };
  11. end
  12. endmodule

2. 测试代码

  1. module johnson_counter_tst #(parameter WIDTH = 4)();
  2. reg clk;
  3. reg rst_n;
  4. wire [WIDTH-1:0] cnt;
  5. johnson_counter U_johnson_counter(
  6. . clk(clk),
  7. . rst_n(rst_n),
  8. . cnt(cnt)
  9. );
  10. initial
  11. begin
  12. clk=0;
  13. rst_n=0;
  14. #20 rst_n=1;
  15. end
  16. always #10 clk=~clk;
  17. endmodule

3. 仿真波形

 

简易秒表

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

1. 设计代码

  1. `timescale 1ns/1ns
  2. module count_module (
  3. input clk,
  4. input rst_n,
  5. output reg [5:0]second,
  6. output reg [5:0]minute
  7. );
  8. always @(posedge clk or negedge rst_n)
  9. begin
  10. if(~rst_n) begin
  11. second <= 6'b0;
  12. minute <= 6'b0;
  13. end
  14. else begin
  15. if(minute == 6'd60) begin
  16. second <= second;
  17. minute <= minute;
  18. end
  19. else if(second == 6'd60)begin
  20. second <= 6'b1;
  21. minute <= minute + 6'b1;
  22. end
  23. else begin
  24. second <= second + 6'b1;
  25. end
  26. end
  27. end
  28. endmodule

2. 测试代码

  1. module testbench();
  2. reg clk,rst_n;
  3. wire [5:0]second;
  4. wire [5:0]minute;
  5. count_module miaobiao_counter(
  6. .clk (clk),
  7. .rst_n (rst_n),
  8. .second(second),
  9. .minute (minute)
  10. );
  11. initial
  12. begin
  13. clk=0;
  14. rst_n=0;
  15. #20 rst_n=1;
  16. end
  17. always #10 clk=~clk;
  18. endmodule

3. 仿真波形

 

 

低功耗可恢复计数器

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

引用

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/529101
推荐阅读
相关标签
  

闽ICP备14008679号