大致的原理
设置一个计数器i,让i的初值等于0。每当一个时钟上升沿到来时,让i=i+1,如果i>5的话,就让 i等于1,即重新开始计数。如果i<=2那么让输出为1,如果i>2的话让输出为0。这也是它为什么只能实现偶数倍分频的原因。(或者说可以实现奇数倍,我还没get到???)
ModelSim仿真代码
功能代码
module Fre_Div(clk,out);
input wire clk;
output reg out;
integer i;
initial
i=0;
always@(posedge clk)
begin
i=i+1;
if(i>4)
i=1;
else;
if(i<=2)
out=1'b1;
else
out=1'b0;
end
endmodule
测试代码
module Fre_Div_Test;
reg clk;
wire out;
Fre_Div U_Fre(.clk(clk),.out(out));
initial
clk=1'b1;
always #100 clk=~clk;
endmodule
仿真波形图
从上面的代码中,也可以看出initial和always引导过程块时的区别。initial只被执行一次,而always只要后面()中的敏感事件列表被触发就会被执行。