任意分频模板和技巧
(一) 偶数的分频技巧
(1) 任意偶数分频(占空比为50%)的模板
/******************** N dividen clk (1:1) duty Template ***************/
module clk_div(
inputclk_100,
output clk_out
);
/********* 10 dividen clk 1:1 duty success *********/
// 1--2--3--4--5-- ...--9--0--1 10分频就只需要10个状态
parameter N =4'd8; // here replace: 14, 12, 10, 8, 6, 4, 2
reg [3:0] cnt =4'd0;
always@(posedge clk_100)
begin
if(cnt == (N-1) )
cnt <= 4'd0;
else
cnt <= cnt + 1'b1;
end
reg clkout =1'b0;
always@(posedge clk_100)
begin
if(cnt == 4'd0)
clkout <= 1'b1;
else if(cnt == (N/2))
clkout <= 1'b0;
else
clkout <= clkout;
end
assign clk_out =clkout;
/***********************************************************/
上面的仿真图:
(2) 任意偶数分频(占空比为任意)的模板
/********************偶数任意分频 占空比为 (N/2+X):(N/2-X)的 模板 success ***************/
module clk_div(
inputclk_100,
output clk_out
);
// 1--2--3--4--5-- ...--9--0--1 10分频就只需要10个状态
parameter N =4'd8; // 14, 12, 10, 8 ,6 ,4 ,2
parameter X =4'd2;
reg [3:0] cnt =4'd0;
always@(posedge clk_100)
begin
if(cnt == (N-1) )
cnt <= 4'd0;
else
cnt <= cnt + 1'b1;
end
reg clkout =1'b0;
always@(posedge clk_100)
begin
if(cnt == 4'd0)
clkout <= 1'b1;
else if(cnt == (N/2 + X))
clkout <= 1'b0;
else
clkout <= clkout;
end
assign clk_out =clkout;
/***********************************************************************************/
上面的仿真图:
(二) 奇数的分频技巧
(1) 任意奇数分频(占空比为50%)的模板
/******************************* 任意奇数分频 (占空比为50%)************************************/
module clk_div(
inputclk_100,
output clk_out
);
parameter N =9; // Dividend
reg [3:0] cnt_p= 0;
always@(posedge clk_100)
begin
if(cnt_p == N-1)
cnt_p <= 4'd0;
else
cnt_p<= cnt_p + 1'b1;
end
reg clk_p = 0;
always@(posedge clk_100)
begin
if(cnt_p == (N-1)/2)
clk_p <= ~clk_p;
elseif(cnt_p == (N-1))
clk_p <= ~clk_p;
else
clk_p <= clk_p;
end
reg [3:0] cnt_n= 0;
always@(negedge clk_100)
begin
if(cnt_n == N-1)
cnt_n <= 4'd0;
else
cnt_n <= cnt_n + 1'b1;
end
reg clk_n = 0;
always@(negedge clk_100)
begin
if(cnt_n == (N-1)/2)
clk_n <= ~clk_n;
elseif(cnt_n == (N-1))
clk_n <= ~clk_n;
else
clk_n <= clk_n;
end
assign clk_out =clk_n | clk_p;
/*****************************************************************************/
仿真图如下:
(2) 任意奇数分频(占空比为任意)的模板
/********************************************任意分频要点和注意事项*******************************************************
1. 公式: fi*K = fo*2^32 fi -- 输入频率 fo -- 输出频率 k -- 计数步长
2. 占空比问题: 用这种方式求占空比问题时候,如果是是奇数分频,那么不能求到准确的1:1占空比。 (比如我们求5分频,那么我们只能求1/5的整数倍的占空 比) 在求准确的占空比时候,比如我们在5分频时候,那么可以跟2^32/5 的整数倍(1~4)进行比较,然后输出高低电平,进而输出一定的占空比
3. 弊端: 任意分频只能求一定的占空比,不能求1:1占空比. 这是它的弊端。
/***************************************************************************************************************************/
/******************************* 任意分频 ************************************/
// fout*2^32 = fin*K k = fout*2^32/fin = 20*2^32/100 = 2^32/5
// 2^32 = 4294967296;