首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一种FPGA时钟信号自激产生的方法

一种FPGA时钟信号自激产生的方法

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

        产生自激振荡需要满足两个条件,一个是要有足够长的延迟链,另一个是要有反相器逻辑。足够长的延迟链可以通过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与自激振荡频率对应值如下:

LCELLs
TimeQuest估算延迟链延迟
实际延迟
Freq
32
13.727
18.9833
26.34 Mhz
64
26.908
37.147
13.46 Mhz
128
53.498
73.148
6.84 Mhz
256
107.785
144.550
3.34 Mhz
继承事业,薪火相传
返回列表