一种奇偶通用占空50%分频电路
Iyoyoo @ 2013/8/24
在数字逻辑电路中,分频器是一种基本电路,通常对给定频率进行分频,得到所需频率。
偶数分频是一种最简单的分频电路,完全可以通过计数器来实现分频。如果要进行N倍偶数分频,可由待分频的时钟触发计数器,当计数器从0计数到N/2-1(也可以是从1计数到N/2)时,输出时钟进行翻转,同时复位计数器(也可以不复位,一直计数到N,再复位计数器),以此循环下去,即可实现任意偶数占空50%分频。
如下8分频为例,仅供参考:
parameter [3:0] DIV_CNT = 4’h8;
always @ ( posedge CLK or negedge RST_n )
if( !RST_n )
count <= 4'h1;
else if ( count ==DIV_CNT )
count <= 4'h1;
else
count <= count +1'b1;
always @ ( posedge CLK or negedge RST_n )
if( !RST_n )
clk_div <= 1'h0;
else if( count ==(DIV_CNT>>1'b1) | count ==DIV_CNT)
clk_div <= !clk_div;
else
clk_div <= clk_div;
奇数分频电路实现方法也很多,下面采用常用的错位异或法。要进行奇数N分频,用待分频时钟的上升沿和下降沿分别触发计数器,当计数器计数到(N + 1)/2时,输出时钟进行翻转;计数到N输出时钟再次翻转。得到两个占空比非50%的分频时钟,再将这两个占空比非50%分频时钟进行相或,即可得到奇数N占空50%的分频电路。
如下9分频为例,仅供参考:
parameter [3:0] DIV_CNT = 4’h9;
always @ ( posedge CLK or negedge RST_n )
if( !RST_n )
count <= 4'h1;
else if ( count ==DIV_CNT )
count <= 4'h1;
else
count <= count +1'b1;
always @ ( posedge CLK or negedge RST_n )
if( !RST_n )
clk_div_pos <= 1'h0;
else if( count ==((DIV_CNT + 1'b1)>>1'b1) | count ==DIV_CNT)
clk_div_pos <= !clk_div_pos;
else
clk_div_pos <= clk_div_pos;
always @ ( negedge CLK or negedge RST_n )
if( !RST_n )
clk_div_neg<= 1'h0;
else if( count ==((DIV_CNT + 1'b1)>>1'b1 )| count ==DIV_CNT )
clk_div_neg <= !clk_div_neg;
else
clk_div_neg <= clk_div_neg;
assign CLK_out = clk_div_pos | clk_div_neg ;
对比以上1和2,可以看出,1偶数分频器是2奇数分频器的一种特例,将2奇数分频器做一下变形,即可包含1,得到奇偶通用的占空50%分频电路。偶数加1除以2结果和偶数除以2结果相同,所以偶数分频里的N/2 == (N+1)/2。同时偶数分频只需一个上升沿或者下降沿触发计数进行计数分频,所以在上下沿分频相或时,只取其一即可。进行如下处理:
assign CLK_out = clk_div_pos | (clk_div_neg&(DIV_CNT%2)) ;
进行处理后,奇数分频电路不变,偶数分频以8分频为例,modulesim仿真如下:
综上,由一个简单的电路可以实现任意分频占空50%的分频电路,简单实用,简记以分享,请指点。
附:奇偶占空50%通用分频电路Verilog
////////////////////////////////////////////////////////////////////////////////
// Company: <Company Name>
// Engineer: <Iyoyoo>
//
// Create Date: <date>
// Design Name: < freq_div.v>
// Module Name: < freq_div >
// Target Device: <target device>
// Tool versions: <tool_versions>
// Description:
// <Description here>
// Dependencies:
// <Dependencies here>
// Revision:
// <Code_revision_information>
// Additional Comments:
// <Additional_comments>
////////////////////////////////////////////////////////////////////////////////
module freq_div
(
//-------------------------------
//Add System Signal Here
//-------------------------------
CLK,
RST_n,
//-------------------------------
//Add master port
//-------------------------------
CLK_out
);
/***************************************************/
//Port List Declare Here
//-------------------------------
//Add global signal declare
//-------------------------------
input CLK;
input RST_n;
//-------------------------------
//Add master port
//-------------------------------
//Add Input Signal declare Here
//Add Output Signal declare Here
output CLK_out;
/***************************************************/
//Define parameter Here
parameter [3:0] DIV_CNT;
/***************************************************/
//Define internal Register Here
reg [3:0] count;
reg clk_div_pos;
reg clk_div_neg;
/***************************************************/
//Main RTL
//-------------------------------
//div counter
//-------------------------------
always @ ( posedge CLK or negedge RST_n )
if( !RST_n )
count <= 4'h1;
else if ( count ==DIV_CNT )
count <= 4'h1;
else
count <= count +1'b1;
//-------------------------------
//posedge div
//-------------------------------
always @ ( posedge CLK or negedge RST_n )
if( !RST_n )
clk_div_pos <= 1'h0;
else if( count ==((DIV_CNT + 1'b1)>>1'b1) | (count ==DIV_CNT)
clk_div_pos <= !clk_div_pos;
else
clk_div_pos <= clk_div_pos;
//-------------------------------
//negedge div
//-------------------------------
always @ ( negedge CLK or negedge RST_n )
if( !RST_n )
clk_div_neg<= 1'h0;
else if( count ==((DIV_CNT + 1'b1)>>1'b1 )| (count ==DIV_CNT )
clk_div_neg <= !clk_div_neg;
else
clk_div_neg <= clk_div_neg;
/***************************************************/
//Add Output Singal assign Here
assign CLK_out = clk_div_pos | (clk_div_neg&(DIV_CNT%2)) ;
endmodule //end of freq_div module
文章评论(0条评论)
登录后参与讨论