奇偶分频使用计数器实现
1、若要进行N倍偶数分频,那么计数器就要从0~N/2-1,到N/2-1时反转。
例子:进行16分频。
module Even_Fre( clk_in,rst,clk_out );
input wire clk_in,rst;
output reg clk_out;
reg [2:0]count;
always@(posedge clk_in) begin
if( rst == 0 ) begin
count <= 0;
clk_out <= 0;
end
else
if( count == 7) begin
count <= 0;
clk_out <= !clk_out;
end
else begin
count <= count + 1;
clk_out <= clk_out;
end
end
endmodule
2、一般使用错位“异或”法来实现奇分频,奇分频的精髓在于为了实现奇分频,那么就必须把一个时钟周期分开,那么就可以使用上升沿和下降沿做到。
module Odd_Fre( clk_in,clk_out,rst );
input wire clk_in;
input wire rst;
output wire clk_out;
reg [1:0]cnt2,cnt1;
reg clk_1to3p,clk_1to3n;
always@(posedge clk_in)begin
if(!rst) begin
cnt1 <= 0;
clk_1to3p <= 0;
end
else
if(cnt1 == 2'b10) begin
clk_1to3p <= clk_1to3p;
cnt1 <= 0;
end
else begin
clk_1to3p <= ~clk_1to3p;
cnt1 <= cnt1 + 1;
end
end
always@(negedge clk_in)begin
if(!rst) begin
cnt2 <= 0;
clk_1to3n <= 0;
end
else
if(cnt2 == 2'b10) begin
clk_1to3n <= clk_1to3n;
cnt2 <= 0;
end
else begin
clk_1to3n <= ~clk_1to3n;
cnt2 <= cnt2 + 1;
end
end
assign clk_out = clk_1to3n | clk_1to3p;
endmodule