zoukankan      html  css  js  c++  java
  • 2时序逻辑电路计数器

    2.4.1 二进制计数器

    代码如下

    View Code
     1 module counter
    2 #(parameter N=8)
    3 (
    4 input clk,
    5 input rst_n,
    6 output [N-1:0] Q,
    7 output Max_tick
    8 );
    9
    10 reg [N-1:0] r_reg;
    11 wire [N-1:0] r_next;
    12
    13 always @ (posedge clk or negedge rst_n)
    14 if(!rst_n)
    15 r_reg<=0;
    16 else r_reg<=r_next;
    17
    18 assign r_next=r_reg+1'b1;
    19 assign Q=r_reg;
    20 assign Max_tick=(r_reg==2**N-1)?1'b1:1'b0;
    21
    22 endmodule

    2.4.2具有控制位的计数器

    设计相应的控制线,根据设计的真值表编写代码,参考COM缺氧设计的真值表如下,需要说明的是rst_n异步清零主要用在系统的初始化,而syn_ctrl同步清零是在一般操作中使用。

    代码如下

    View Code
     1 module counter
    2 #(parameter N=8)
    3 (
    4 input clk,
    5 input rst_n,
    6 input syn_ctrl,
    7 input load,
    8 input en,
    9 input up,
    10 output [N-1:0] Q,
    11 output Max_tick,
    12 output Min_tick
    13 );
    14
    15 reg [N-1:0] r_reg;
    16 reg [N-1:0] r_next;
    17
    18 always @ (posedge clk or negedge rst_n)
    19 if(!rst_n)
    20 r_reg<=0;
    21 else r_reg<=r_next;
    22
    23 always @(*)
    24 if(syn_ctrl)r_next=0;
    25 else if(load) r_next=Q;
    26 else if(en & up)r_next=r_reg+1'b1;
    27 else if(en & ~up)r_next=r_reg-1'b1;
    28 else r_next=r_reg;
    29
    30 assign Q=r_reg;
    31 assign Max_tick=(r_reg==2**N-1)?1'b1:1'b0;
    32 assign Min_tick=(r_reg==0)?1'b1:1'b0;
    33
    34 endmodule

    将上述代码N值改为3,编写testbench如下

    View Code
     1 `timescale 1ns/10ps
    2 module counter_tb;
    3 reg clk,rst_n,syn_ctrl,load,en,up;
    4 reg [2:0] D;
    5 wire [2:0] Q;
    6 wire Min_tick;
    7 wire Max_tick;
    8
    9 counter counter_inst
    10 (
    11 .clk(clk),
    12 .rst_n(rst_n),
    13 .syn_ctrl(syn_ctrl),
    14 .load(load),
    15 .up(up),
    16 .en(en),
    17 .D(D),
    18 .Q(Q),
    19 .Min_tick(Min_tick),
    20 .Max_tick(Max_tick)
    21 );
    22
    23 //***************************************
    24 //时钟与复位激励
    25 parameter CLK_PERIOD=20,
    26 RESET_TIME=10;
    27 initial clk=0;
    28 initial forever #(CLK_PERIOD/2) clk=~clk;
    29 initial rst_n=0;
    30 initial forever #RESET_TIME rst_n=1;
    31 //***************************************
    32
    33 initial
    34 begin
    35 //initial ctrl_signal input
    36 syn_ctrl=1'b0;
    37 load=1'b0;
    38 en=1'b0;
    39 up=1'b1;
    40 //initial data_signal input
    41 D=3'b000;
    42 //initial ctrl_signal input
    43 @(posedge rst_n);//wait rst_n to deassert
    44 @(negedge clk);//wait for one clk
    45 //test load
    46 load=1'b1;
    47 D=3'b011;
    48 @(negedge clk)
    49 load=1'b0;
    50 repeat(2) @(negedge clk);
    51 //test syn_ctrl
    52 syn_ctrl=1'b1;
    53 @(negedge clk)
    54 syn_ctrl=1'b0;
    55 repeat(2) @(negedge clk);
    56 //test up counter and pause
    57 en=1'b1;
    58 up=1'b1;
    59 repeat(10) @(negedge clk);
    60 en=1'b0;
    61 repeat(2) @(negedge clk);
    62 en=1'b1;
    63 repeat(2) @(negedge clk);
    64 //test down mod
    65 up=1'b0;
    66 repeat(10) @(negedge clk);
    67 //test Max_tick and Min_tick
    68 wait(Q==2);
    69 @(negedge clk);
    70 up=1'b1;
    71 @(negedge clk);
    72 wait(Min_tick);
    73 @(negedge clk);
    74 up=1'b0;
    75 //delay
    76 #(4*CLK_PERIOD);
    77 en=1'b0;
    78 #(4*CLK_PERIOD);
    79 $stop;
    80 end
    81
    82 endmodule

    RTL级仿真波形如下

    验证syn_ctrl波形如下

    验证load信号波形如下

    验证Max_tick,Min_tick波形如下

    2.4.3模m计数器

    将上述二进制计数器判断语句r_reg==2**N-1改为r_reg==M-1;即构成模M计数器。

    /***万好好-科研论文培训,微信号:wanhaohao258。如转载本博客内容请注明,如果存在知识产权问题请主动联系。***/
  • 相关阅读:
    ehcache如何判断缓存数据是否存在--isKeyInCache
    ehcache 缓存监控
    XSS跨站脚本攻击
    java根据文件头判断文件类型
    Spring Security使用Authentication获取当前用户信息
    HttpSessionListener的用法
    ehcache缓存配置与参数说明
    [CERC2017]Buffalo Barricades
    [POI2001]Gra绿色游戏
    移动游戏By HYJ
  • 原文地址:https://www.cnblogs.com/yuesheng/p/2125481.html
Copyright © 2011-2022 走看看