代码如下:
module divide(input rstn, input clk, output reg out);
parameter N = 5; //2.5分频为例,N等于分频倍数的两倍
reg [31:0] count;
reg flag;
always@(posedge clk or negedge rstn) //计数器
if(!rstn)begin
count <= 0;
end
else if(count == N - 1)begin
count <= 0;
end
else begin
count <= count + 1;
end
always@(negedge clk or negedge rstn) //最后的"相与"所用到的区域1
if(!rstn)begin
flag <= 0;
end
else begin
flag <= count == 1 | count == N - 1;
end
assgn temp = count == 2 | count == N - 1; //最后的"相与"所用到的区域2
always@*
out = temp & flag; //相与产生输出时钟
endmodule
优点是不会产生毛刺。在我找到的国内博客的代码中,均使用毛刺的上升/下降沿作为计数器的时钟信号,我认为这是一种不推荐的写法。但我也是数字电路初学者,所以欢迎大家讨论。
缺点是在准备区域1和区域2时引入比较复杂的组合逻辑,如果需要调整占空比,所需的组合逻辑更为复杂。