原创 奇数分频

2011-4-13 19:05 2046 7 7 分类: FPGA/CPLD

 用sf现成的板子自己在做dds的缘故,晶震的频率25mhz 需要25分频 到1mhz。


这就遇到了奇数分频的问题。


先采用传统的分频思想。


分别在时钟上升沿和下降沿用计数器在计数的一个值进行翻转,在经过(n-2)/2 计数后在进行翻转,


最后将2个输出进行异或处理就得到需要的奇数n分频信号。


代码部分:


module clk25to1 (clk,rst_n,
                clk_1m);



input clk;                 //25mhz
input rst_n;              //复位信号低电平有效


output clk_1m;             //25分频后时钟



reg [4:0] cnt1;
reg [4:0] cnt2;


module clk25to1 (clk,rst_n,
                clk_1m);



input clk;                 //25mhz
input rst_n;              //复位信号低电平有效


output clk_1m;             //25分频后时钟



reg [4:0] cnt1;   
reg [4:0] cnt2;


reg clk_1to25p, clk_1to25n;
//上升沿计数,记到12翻转,在经过(n-1)/2 =12时,在经过翻转
//占空比13:12
always @(posedge clk or negedge rst_n)begin
      if(!rst_n) begin
       cnt1 <= 5'd0;
       clk_1to25p <= 1'b0;
         end
      else begin
          if(cnt1 == 5'd24)begin
             cnt1 <= 5'd0;
             clk_1to25p <= !clk_1to25p;
             end
          else begin
             cnt1 <= cnt1 + 1'b1;
             if(cnt1 == 5'd12)
                clk_1to25p <= !clk_1to25p;
               end
           end
       end
        
//下降沿计数,记到12翻转,在经过(n-1)/2 =12时,在经过翻转
//占空比13:12    
always @(negedge clk or negedge rst_n)begin
      if(!rst_n) begin
       cnt2 <= 5'd0;
       clk_1to25n <= 1'b0;
          end
      else begin
          if(cnt2 == 5'd24)begin
             cnt2 <= 5'd0;
             clk_1to25n <= !clk_1to25n;
             end
          else begin
             cnt2 <= cnt2 + 1'b1;
             if(cnt2 == 5'd12)
                clk_1to25n <= !clk_1to25n;
               end
           end
       end      
       
//错位相或,得到25分频时钟
assign clk_1m = clk_1to25p | clk_1to25n;


endmodule


仿真波形。


18bbd290-a029-4e42-ad98-7e501fa5d9d5.JPG


 


考虑到逻辑资源和fpga内部pll的时钟稳定性。


我在dds中用pll进行倍频,然后进行50分频,同样得到1mhz信号。


 

PARTNER CONTENT

文章评论0条评论)

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