计数器练习17

当收到en1 = 1时 ,执行以下操作:

a. 间隔2个时钟周期后,dout产生宽度为 5  个时钟周期的高电平脉冲,然后

b. 间隔2个时钟周期后,dout产生宽度为 7 个时钟周期的高电平脉冲,然后

c. 间隔2个时钟周期后,dout产生宽度为 3 个时钟周期的高电平脉冲,然后

d. 间隔2个时钟周期后,dout产生宽度为 6个时钟周期的高电平脉冲,结束。

当收到en2 = 1时 ,执行以下操作:

a. 间隔4个时钟周期后,dout产生宽度为 3  个时钟周期的高电平脉冲,然后

b. 间隔1个时钟周期后,dout产生宽度为 6 个时钟周期的高电平脉冲,然后

c. 间隔6个时钟周期后,dout产生宽度为 3 个时钟周期的高电平脉冲,然后

d. 间隔2个时钟周期后,dout产生宽度为 5个时钟周期的高电平脉冲,结束。

分析要点:

(1)、需要两个计数器,分别是cnt0 和 cnt1 , cnt0 计数到 x 结束,也就是dout一个周期, cnt1 计数到 4 结束,也就是4轮

(2)、因有两个输入en1 和 en2 , 所以需要对两种情况进行标记,引入flag_sel ,当en1==1时, flag_sel  = 1;当en2==1时, flag_sel  = 2;

(3)、 根据flag_sel  和cnt1的数值来确定 x  和 y 的值

(4)、根据 y 的值,来确定dout 间隔多少时钟,产生多少个高电平。

  1 module cnt_test(
  2                 clk,
  3                 rst_n,
  4                 en1,
  5                 en2,
  6                 dout
  7 );
  8 
  9 input     clk;
 10 input     rst_n;
 11 input      en1;
 12 input      en2;
 13 
 14 output    dout;
 15 
 16 reg     dout;
 17 reg     flag_add;
 18 
 19 reg [3:0] cnt0;
 20 reg [3:0] cnt1;
 21 reg [3:0] x;
 22 reg [3:0] y;
 23 reg [3:0] flag_sel;
 24  
 25 wire add_cnt0;
 26 wire end_cnt0;
 27 
 28 wire add_cnt1;
 29 wire end_cnt1;
 30 
 31 always @(posedge clk or negedge rst_n)begin
 32     if(!rst_n)begin
 33         cnt0 <= 0;
 34     end
 35     else if(add_cnt0)begin
 36         if(end_cnt0)begin
 37             cnt0 <= 0;
 38         end
 39         else begin
 40             cnt0 <= cnt0 + 1;
 41         end
 42     end
 43 end
 44 
 45 assign add_cnt0 = flag_add;
 46 assign end_cnt0 = add_cnt0 && cnt0 ==x - 1; 
 47 
 48 always @(posedge clk or negedge rst_n)begin
 49     if(!rst_n)begin
 50         cnt1 <= 0;
 51     end
 52     else if(add_cnt1)begin
 53         if(end_cnt1)begin
 54             cnt1 <= 0;
 55         end
 56         else begin
 57             cnt1 <= cnt1 + 1;
 58         end
 59     end
 60 end
 61 
 62 assign add_cnt1 = end_cnt0;
 63 assign end_cnt1 = add_cnt1 && cnt1 == 4 - 1;
 64 
 65 always @(posedge clk or negedge rst_n)begin
 66     if(!rst_n)begin
 67         flag_add <= 0;
 68     end
 69     else if(en1 == 1 || en2 == 1)begin
 70         flag_add <= 1;
 71     end
 72     else if(end_cnt1)begin
 73         flag_add <= 0;
 74     end
 75 end
 76 
 77 always @(posedge clk or negedge rst_n)begin
 78     if(!rst_n)begin
 79         flag_sel <= 0;
 80     end
 81     else if(en1 == 1)begin
 82             flag_sel <= 1;    
 83     end
 84     else if(en2 == 1)begin
 85             flag_sel <= 2;
 86     end
 87 end
 88 
 89 always @(*)begin
 90     if(flag_sel == 1)begin
 91         if(cnt1 == 0)begin
 92             x = 7;
 93             y = 2;
 94         end
 95         else if(cnt1 == 1)begin
 96             x = 9;
 97             y = 2;
 98         end
 99         else if(cnt1 == 2)begin
100             x = 5;
101             y = 2;
102         end
103         else if(cnt1 == 3)begin
104             x = 8;
105             y = 2;
106         end
107         else begin  //if else 补全 ,以确保在其他状态时,x始终都能确定某一个固定值
108             x = 0; 
109             y = 0;
110         end
111     end
112     else if(flag_sel == 2)begin
113         if(cnt1 == 0)begin
114             x = 7;
115             y = 4;
116         end
117         else if(cnt1 == 1)begin
118             x = 7;
119             y = 1;
120         end
121         else if(cnt1 == 2)begin
122             x = 9;
123             y = 6;
124         end
125 
126         else if(cnt1 == 3)begin
127             x = 7;
128             y = 2;
129         end
130         else begin  //if else 补全 ,以确保在其他状态时,x始终都能确定某一个固定值
131             x = 0; 
132             y = 0;
133         end
134     end
135     else begin
136         x = 0;
137         y = 0;
138     end
139     
140 end
141 
142 always @(posedge clk or negedge rst_n)begin
143     if(!rst_n)begin
144         dout <= 0;
145     end
146     else if(add_cnt0 && cnt0 == y-1)begin //对某个点进行赋值,记得用“-1”写法
147         dout <= 1;
148     end
149     else if(end_cnt0) begin    //对某个点进行赋值
150         dout <= 0;    
151     end
152 end
153 
154 endmodule

仿真波形:

(1)收到en1 =1 时的波形

 

 (2)收到en2 =1 时的波形

 

posted @ 2022-02-13 18:34  MyBooks  阅读(91)  评论(0编辑  收藏  举报