基于verilog的奇偶分频
(1)**偶分频:**进行占空比为50%的分频比较容易。比如进行2N分频,可以计算时钟上升沿或下降沿的个数,如果计数到(2N/2)-1次,则时钟输出进行反转,并且计数清零,再重新计数,重复上述过程。
(2)**奇分频:**进行占空比为50%的分频比较麻烦,我采用的方法是分别对时钟的上升沿和下降沿进行计数。比如进行(2N+1)分频,该过程分为两大步:第一步是对时钟的上升沿计数,首先任选一个次数去进行计数,若达到该数时,则时钟输出进行反转,之后再计数((2N+1)-1)/2次,进行第二次反转,再计数到(2N)次,计数清零,重复上述步骤;第二步是对时钟的下降沿计数,工作原理和上升沿方式一致(注:和上升沿任选的参考数的一样)。最后上升沿获得的时钟输出和下降沿获得的时钟输出进行或运算。
实例:
module fre(
Clk,
Rst_n,
Clk_out_even,//二分频 N=2
Clk_out_odd//五分频 N=5
);
input Clk;
input Rst_n;
output Clk_out_odd;
output reg Clk_out_even;
//偶计数器 (N/2)-1次反转
//reg cnt_even;
always @(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
// cnt_even<=0;
Clk_out_even<=0;
end
// else if(cnt_even==1)begin
// cnt_even<=0;
// Clk_out_even<=~Clk_out_even;
// end
else begin
Clk_out_even<=~Clk_out_even;
// cnt_even<=cnt_even+1'b1;
end
//奇上升沿计数器 N=5 模N计数 //两次反转;先选定一个计数进行反转,之后再进行(N-1)/2次计数后,进行第二次反转
reg [2:0]cnt0_odd;
reg Clk_out0_odd;
always @(posedge Clk or negedge Rst_n)
if(!Rst_n)begin
cnt0_odd<=0;
Clk_out0_odd<=0;
end
else if(cnt0_odd==1)begin
cnt0_odd<=cnt0_odd+1'b1;
Clk_out0_odd<=~Clk_out0_odd;
end
else if(cnt0_odd==3)begin
cnt0_odd<=cnt0_odd+1'b1;
Clk_out0_odd<=~Clk_out0_odd;
end
else if(cnt0_odd==4)begin
cnt0_odd<=0;
// Clk_out0_odd<=~Clk_out0_odd;
end
else begin
cnt0_odd<=cnt0_odd+1'b1;
end
//奇下降沿计数器
reg [2:0]cnt1_odd;
reg Clk_out1_odd;
always @(negedge Clk or negedge Rst_n)
if(!Rst_n)begin
cnt1_odd<=0;
Clk_out1_odd<=0;
end
else if(cnt1_odd==1)begin
cnt1_odd<=cnt0_odd+1'b1;
Clk_out1_odd<=~Clk_out0_odd;
end
else if(cnt1_odd==3)begin
cnt1_odd<=cnt0_odd+1'b1;
Clk_out1_odd<=~Clk_out1_odd;
end
else if(cnt1_odd==4)begin
cnt1_odd<=0;
end
else begin
cnt1_odd<=cnt1_odd+1'b1;
end
assign Clk_out_odd=Clk_out0_odd | Clk_out1_odd; //最后进行或运算
endmodule