热度 19
2013-8-24 22:48
1368 次阅读|
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