基于FPGA和PLL的倍分频时钟的实现

HDL语言及源代码

6人已加入

描述

  现今的FPGA设计大多采用时序逻辑,需要时钟网络才能工作,通常情况下,时钟通过外部晶体振荡器产生。虽然大多数情况下使用外部晶振是最好的选择。然而,石英晶振对温度漂移敏感、且易碎,对于一些恶劣场合,如导引头制导电路、温度骤变和高速振荡使得应尽量避免使用晶体振荡器。本文主要研究如何通过FPGA内部延迟单元构建闭合组合逻辑链产生自激振荡,从而产生时钟信号,并通过内部PLL锁相环获得倍分频时钟的方法。该方法可用于应避免使用时钟的场合下代替外部晶体振荡器使用。

  实现方法

  构建一个带有长延迟的闭合反相器可以获得一个自激振荡的输出信号。如图1所示。

  pll

  产生自激振荡需要满足两个条件,一个是要有足够长的延迟链,另一个是要有反相器逻辑。足够长的延迟链可以通过FPGA的内建延迟逻辑或者非门链条组成,对于Altera公司的FPGA而言,内部延迟单元为LCELL,将若干LCELL串联即可组成延迟链。其Verilog HDL描述为;

  wire [WIDTH:0] gcBufChain /*synthesis syn_keep=1*/;

  assign gcBufChain[0] = ~gcBufChain[WIDTH];

  assign dout = gcBufChain[0];

  genvar j;

  generate

  for (j = 0; j < WIDTH; j = j + 1)

  begin: dc_loop

  LCELL AlteraBuf (.in(gcBufChain[j]), .out(gcBufChain[j+1]));

  end

  endgenerate

  注意,为了防止编译器对延迟链的优化,必须在定义处注明synthesis syn_keep=1, 否则编译器会按照逻辑将其优化为直连线,无法起到延迟的效果。链的长度WIDTH需要指明,WIDTH设置过大,会导致延迟链过长,输出信号可能不稳定(Skew大),过小则会导致无法起振,根据经验,可以先取一较大值,保证起振。之后减小,获得相应的时钟频率。

  实验采用Altera DE4平台,器件为Stratix IV EP4SGX530KH40C2,WIDTH与自激振荡频率对应值如下:

表 WIDTH与自激振荡频率对应值

  pll

  pll

  通过调节延迟链的LCELL个数可以对输出频率进行调节。虽然可以通过时序逻辑分析软件对延迟进行预估计,但准确度并不高,因此,建议采用实测调整。

  上述时钟产生的方法可以获得较低频率的时钟信号,然而大多数FPGA设计需要更高的时钟,为了获得高频稳定的时钟源,需要借助FPGA内部的PLL对时钟信号进行琐相跟踪。通过MegaCore向导可以订制一个ALTPLL锁相环,在输入时钟信号频率上填写实测的自激振荡频率,在输出频率上可以自行计算。本实验对128LCELLs产生的6.84Mhz信号进行倍分频,获得512Mhz的时钟。由于高频时钟不容易测量,因此将此时钟用来更新计数器,计数器实现64分频。由于PLL需要从外部时钟输入PIN直接引入,因此需要将原先的输出dout与时钟输入端dclk在硬件上连接。从而将其作为输入时钟。

  // Quartus II Verilog Template

  // Unsigned Adder

  module delay

  #(parameter WIDTH = 128)

  (

  output dout,

  input dclk,

  output dpllout,

  output dplldiv,

  output lock

  );

  wire [WIDTH:0] gcBufChain /*synthesis syn_keep=1*/;

  reg [5:0] counter;

  assign gcBufChain[0] = ~gcBufChain[WIDTH];

  assign dout = gcBufChain[0];

  genvar j;

  generate

  for (j = 0; j < WIDTH; j = j + 1)

  begin: dc_loop

  LCELL AlteraBuf (.in(gcBufChain[j]), .out(gcBufChain[j+1]));

  end

  endgenerate

  always @(posedge dpllout)

  begin

  counter<= counter + 1;

  end

  PLL pllclk(.inclk0(dclk), .c0(dpllout), .locked(lock));

  assign dplldiv = counter[5];

  endmodule

  pll

  可以从示波器上观测到稳定的8Mhz的方波信号,同时也可观察到PLL锁定指示高电平(有效)。

  总结:当外部晶振无法正常工作时,可以尝试采用通过组合逻辑延迟产生的自激振荡作为时钟。然而要注意的是,某些低端器件,如Cyclone II,输出的信号可能稳定性不高,Skew较大,高端器件性能较为稳定。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
秋叶歆 2014-09-05
0 回复 举报
actel libero PLL使用方法 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分