原创 奇数分频,实现50%的占空比

2011-3-22 20:37 1850 5 5 分类: 工程师职场
对于偶数分频,实现任意整数的分频比较容易,但对于奇数分频,实现50%的占空比却是比较困难的。以前也曾思考过这个问题,但都没有结果,昨天看到这个http://www.edacn.net/bbs/viewthread.php?tid=103921&page=1#pid923044帖子,仔细琢磨后,觉得整个方法很好,也很好理解,可以推广到任意奇数的50%分频,于是就用VHDL改写。以下就以3分频为例,作以介绍。源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fdiv3 is
port( clk,reset  : in   std_logic;
    clkout     : out  std_logic);
end fdiv3;
architecture behave of fdiv3 is
signal s1,s2 : std_logic;
signal cnt  : integer range 0 to 2;
begin
P1: process(clk,reset)                                          --计数器
  begin
   if reset='1' then
    cnt<=0;
   elsif clk'event and clk='1' then
    if cnt=2 then
     cnt<=0;
    else
     cnt<=cnt+1;
    end if;
   end if;
  end process;
  
P2: process(clk,reset)                                        --信号1
  begin
   if reset='1' then
    s1<='1';
   elsif clk'event and clk='1' then
    if cnt=0 then
     s1<=not s1;
    else
     s1<=s1;
    end if;
   end if;
  end process;
  
P3: process(clk,reset)                                        --信号2
  begin
   if reset='1' then
    s2<='1';
   elsif clk'event and clk='0' then
    if cnt=2 then
     s2<=not s2;
    else
     s2<=s2;
    end if;
   end if;
  end process;
  
clkout<= s1 xor s2;                                         -- 异或输出
end behave;
  
   
Quartus下的仿真波形图如下:

<img style="LINE-HEIGHT: 22px; BORDER-RIGHT-WIDTH: 0px; MAX-WIDTH: 100%; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 src="http://www.edacn.net/bbs/attachments/month_0712/20071215_5f2a200c64fd2544c92aVN3yBTkQ8hPq.jpg.thumb.jpg" event)?="" 0,="" 1)?="" ?attach_36967?,="" 20071215_5f2a200c64fd2544c92avn3ybtkq8hpq.jpg?)?="" month_0712="" ?attachments="" alt="" />


       计数器是为了控制信号1和信号2,使两信号保持恒定的时间差,此处是1.5个周期。信号1是上升沿触发,cnt=0时跳变,信号2是下降沿触发,cnt=2时跳变,然后将信号1和信号2异或输出,信号1和信号2都是50% 占空比的6分频,这样就在6个时钟周期内,clkout为两个周期实现了50%占空比的3分频。

      由3分频可以推得任意奇数分频。对于任意奇数(2n-1)的50%占空比分频,则计数器cnt的模值为(2n-1),假设信号1为上升沿触发,在cnt=0时跳变,则信号2为下降沿触发,在cnt=n 时跳变。这样就保持信号1和信号2间间隔(2n-1)/2 的周期,在(2n-1)×2 的周期内clkout为两个周期,实现了(2n-1)的50%占空比分频比如要7分频,则计数器的模值为7,信号S2在cnt=4时跳变即可

module fdiv ( clk, reset_n, clkout );
input      clk;
input      reset_n;
output     clkout;

reg [1:0]  count;
reg        div1;
reg        div2;

always @(posedge clk)
begin
    if (  reset_n )
        count <= 2'b00;
    else
        case ( count )
            2'b00 : count <= 2'b01; 
            2'b01 : count <= 2'b10; 
            2'b10 : count <= 2'b00; 
            default : 
                    count <= 2'b00; 
        endcase
end
always @( posedge reset_n or posedge clk )
begin
    if (  reset_n )
        div1 <= 1'b1;
    else if ( count == 2'b00 )
        div1 <= ~ div1;
end
always @( posedge reset_n or  negedge clk )
begin
    if (   reset_n )
        div2 <= 1'b1;
    else if ( count == 2'b10 )
        div2 <= ~ div2;
end

assign clkout = div1 ^ div2;
endmodule
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条