计数器练习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 时的波形