阶段2-计数器练习8

 

 首先只需一个计数器就可以,设定变量x,用来指示计数器cnt0 结束

  1 module cnt_test(
  2                 clk,
  3                 rst_n,
  4                 en1,
  5                 en2,
  6                 en3,
  7                 dout
  8 );
  9 
 10 input     clk;
 11 input     rst_n;
 12 input      en1;
 13 input      en2;
 14 input      en3;
 15 
 16 output [2:0] dout;
 17 
 18 reg [2:0]    dout;
 19 reg         flag_add;
 20 
 21 reg [3:0] cnt0;
 22 reg [3:0] x;
 23 reg [3:0] y;
 24 reg [3:0] z;
 25 reg [3:0] flag_sel;
 26  
 27 wire add_cnt0;
 28 wire end_cnt0;
 29 
 30 always @(posedge clk or negedge rst_n)begin
 31     if(!rst_n)begin
 32         cnt0 <= 0;
 33     end
 34     else if(add_cnt0)begin
 35         if(end_cnt0)begin
 36             cnt0 <= 0;
 37         end
 38         else begin
 39             cnt0 <= cnt0 + 1;
 40         end
 41     end
 42 end
 43 
 44 assign add_cnt0 = flag_add;
 45 assign end_cnt0 = add_cnt0 && cnt0 == x - 1; 
 46 
 47 always @(posedge clk or negedge rst_n)begin
 48     if(!rst_n)begin
 49         flag_sel <= 0;
 50     end
 51     else if(en1)begin
 52         flag_sel <= 0;
 53     end
 54     else if(en2)begin
 55         flag_sel <= 1;
 56     end
 57     else if(en3)begin
 58         flag_sel <= 2;
 59     end
 60 end
 61 
 62 always @(posedge clk or negedge rst_n)begin
 63     if(!rst_n)begin
 64         flag_add <= 0;
 65     end
 66     else if(en1 || en2 || en3)begin
 67         flag_add <= 1;
 68     end
 69     else if(end_cnt0)begin
 70         flag_add <= 0;
 71     end
 72 end
 73 
 74 always @(posedge clk or negedge rst_n)begin
 75     if(!rst_n)begin
 76         dout <= 0;
 77     end
 78     else if(add_cnt0 && cnt0 == y-1)begin
 79         dout <= z;
 80     end
 81     else if(end_cnt0)begin
 82         dout <= 0;
 83     end
 84 end
 85 
 86 always @(*)begin
 87     if(flag_sel == 0)begin
 88         x = 2;
 89         y = 1;
 90         z = 2;
 91     end
 92     else if (flag_sel == 1)begin
 93         x = 4;
 94         y = 1;
 95         z = 4;
 96     end
 97     else if(flag_sel == 2)begin
 98         x = 7;
 99         y = 5;
100         z = 1;
101     end
102     else begin    //这个else后面的语句虽不会被执行,但却不能省去,避免被综合出锁存器
103         x = 0;
104         y = 0;
105         z = 0;
106     end
107 end
108 
109 endmodule

仿真波形:

 

posted @ 2022-02-17 20:38  MyBooks  阅读(53)  评论(0编辑  收藏  举报