tag 标签: 奇偶

相关博文
  • 热度 19
    2013-8-24 22:48
    1374 次阅读|
    0 个评论
    一种奇偶通用占空50%分频电路          Iyoyoo @ 2013/8/24            在数字逻辑电路中,分频器是一种基本电路,通常对给定频率进行分频,得到所需频率。   偶数占空50%分频电路 偶数分频是一种最简单的分频电路,完全可以通过计数器来实现分频。如果要进行N倍偶数分频,可由待分频的时钟触发计数器,当计数器从0计数到N/2-1(也可以是从1计数到N/2)时,输出时钟进行翻转,同时复位计数器(也可以不复位,一直计数到N,再复位计数器),以此循环下去,即可实现任意偶数占空50%分频。          如下8分频为例,仅供参考: parameter            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_CNT1'b1) | count ==DIV_CNT)                    clk_div = !clk_div;          else                    clk_div = clk_div;   奇数占空50%分频电路 奇数分频电路实现方法也很多,下面采用常用的错位异或法。要进行奇数N分频,用待分频时钟的上升沿和下降沿分别触发计数器,当计数器计数到(N + 1)/2时,输出时钟进行翻转;计数到N输出时钟再次翻转。得到两个占空比非50%的分频时钟,再将这两个占空比非50%分频时钟进行相或,即可得到奇数N占空50%的分频电路。 如下9分频为例,仅供参考: parameter            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 ;     奇偶通用占空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            DIV_CNT;   /***************************************************/ //Define internal Register Here reg                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    
相关资源