原创 一种奇偶通用占空50%分频电路

2013-8-24 22:48 1368 19 19 分类: FPGA/CPLD 文集: Verilog

一种奇偶通用占空50%分频电路

         Iyoyoo @ 2013/8/24

 

         在数字逻辑电路中,分频器是一种基本电路,通常对给定频率进行分频,得到所需频率。

 

  1. 偶数占空50%分频电路

偶数分频是一种最简单的分频电路,完全可以通过计数器来实现分频。如果要进行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;

 

  1. 奇数占空50%分频电路

奇数分频电路实现方法也很多,下面采用常用的错位异或法。要进行奇数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. 奇偶通用占空50%分频电路

对比以上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条评论)

登录后参与讨论
我要评论
0
19
关闭 站长推荐上一条 /2 下一条