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

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

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


        通过调节延迟链的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

可以从示波器上观测到稳定的8Mhz的方波信号,同时也可观察到PLL锁定指示高电平(有效)。
        总结:当外部晶振无法正常工作时,可以尝试采用通过组合逻辑延迟产生的自激振荡作为时钟。然而要注意的是,某些低端器件,如Cyclone II,输出的信号可能稳定性不高,Skew较大,高端器件性能较为稳定。

=================================
继承事业,薪火相传
返回列表