大三都要结束了,才发现自己太多东西没深入学习。
对于偶分频:(计数到分频数的一半就翻转)
注:
图中只用了一个计数器,当然也可以用多个;
图中只计数到需要分频的一半,当然也可计数到更多;
图中从第一个上升沿有效,当然也可延迟多个周期开始。
例如:
1 //任意偶分频设计
2 modulefrequency_divider_6 (clk, rst, data_out);3 inputclk, rst;4 outputdata_out;5 reg [1:0] counter;6 regdata_out;7 parameter N = 6; //改变N的值变成任意偶分频,同时counter的范围需要相应修改
8
9 always @ (posedge clk or negedgerst)10 begin
11 if (!rst) //复位置零
12 begin
13 counter <= 0;14 data_out <= 0;15 end
16 else //分频
17 begin
18 if (counter == N/2 - 1) //偶分频数一半时反相
19 begin
20 data_out <= ~data_out;21 counter <= 0; //置0,从0计数
22 end
23 else
24 counter <= counter + 1;25 end
26 end
27 endmodule
View Code
从仿真波形看出复位后并没有立刻达到分频效果,复位结束后的2.5个周期无效,之后才达到分频效果。
如果想从第一个上升沿就开始分频,那么就可以像我画的图中那样计数。如下所示:
1 /任意偶分频设计2 modulefrequency_divider_6 (clk, rst, data_out);3 inputclk, rst;4 outputdata_out;5 reg [1:0] counter;6 regdata_out;7 parameter N = 6; //改变N的值变成任意偶分频,同时counter的范围需要相应修改
8
9 always @ (posedge clk or negedgerst)10 begin
11 if (!rst) //复位置零
12 begin
13 data_out <= 0;14 end
15 else //分频,也可用底下注释部分
16 begin
17 if (counter == 0) //偶分频数一半时反相
18 begin
19 data_out <= ~data_out;