Chapter 14:国产FPGA之内部PLL的使用
0赞第十四章
国产FPGA的之内部PLL的使用
前前一节不解的一个问题,必须使用PLL才能为MSS和Fabric提供时钟,明明不用PLL跑的好好的。。。但听人说也许是推介是专用,故没办法,我们开始PLL吧。。。
只用外部晶振,才10M,非常的不爽。据说Astro II能够跑到150M ,没有PLL怎么行呢。。。但是这PLL出了GUI还真Quartus II的配置有点点不一样,因此这一部分单独提取出来作为一个章节,不要见怪哦。。。PLL配置,不仅仅是的可以使用低俗外部晶振来保证稳定,而且接下来使用内部晶振或者无源晶振的时候也会用到,还是蛮重要的。
相信大家肯定会Quartus II或者ISE吧,而不是直接学国产FPGA的,您可以自己对照。接下来且听Bingo一一道来!
一、PLL的介绍
(1)PLL接口
据说支持5~350M的时钟源,而输出能达到10~350M。这应该是针对PLL而言的吧。。
clkout[x]支持动态时钟,这好像Altera Cyclone IV才开始支持的。。。
v Clkin简单的说就是PLL的时钟输入
v Fbclk反馈时钟,用到再说哈
v Clk_cpu是8051内核的时钟吧。。。
v Pll_lock和pll_reset和Quartus II中的一样。。
(2)PLL配置特别的功能
Astro II的PLL非同Altera的PLL ,这个Wozard还包括了全局时钟选择电路,MSS(8051内核)和Fabric(总线架构)的时钟的配置
a) 全局时钟选择
Clk0,clk1,clk2,clk3是IC外部输入的时钟,但是FPGA内部的全局时钟,尤其是CLK[0],CLK[1],确实可以选择的(默认为外部输入clk0,clk).如下:
² CLK[0],是可以选择FPGA外部专用时钟管脚clk0或者内部震荡时钟
² CLK[1],可以选择FPGA外部专用时钟管脚clk1或者外部专用晶体时钟crystal(无源晶振的时钟)
² CLK[2],CLK[3]只能分别使用FPGA外部专用时钟管脚clk2和clk3。
n 其中CLK[0],CLK[1]默认为外部clk0,clk1输入,如下所示。
b) 全局时钟输出配置
这个很特殊,前面我讲述Astro II全局时钟架构的时候分析过,Astro II共有8个全局时钟,而除了CLK[0],CLK[1],CLK[2],CLK[3]这四个全局时钟以外,就是以上Clkcpu,Clkout0,Clkout1,Clkout2这四个全局时钟网络。
v input0可以选择:PLL的输出时钟clkout0,clkout1或者clkout2
v Input1可以为全局时钟CLK[0],CLK[1],CLK[2],CLK[3]
c) Clkcpu,Clkout0,Clkout1,Clkout2配置
如上图所示,默认情况下。
v CLK[0]为clk0
v CLK[1]为clk1
v Clkcpu为input0的pllout[0]
v Clkout0为input0的pllout[0]
v Clkout1为input0的pllout[0]
v Clkout2为input0的pllout[0]
v
根据前面的 介绍,应该清楚什么是用来干什么的了吧。。。。一般在设计中,如果使用了PLL,我们就不会再使用相应PLL的输入的那个时钟,因为时序的原因。因此用Clkout0,Clkout1,Clkout2来作为全局时钟,同样能满足全局时钟。
唯一需要注意的是,如果用了MSS即8051内核,就不许使用PLL来配置了,因为Clkcpu默认输入为PLL的clkout0.
二、PLL的配置
(1)打开ip配置向导,如下图所示
下面是Quartus II, GUI还是挺像的
(2)明显Next,选择PLL,继续Next
(3)这边还是跟Quartus II差不多,且看下图。
(4)首先设置PLL输入10M外部晶振时钟,如下图所示:
(5)火大了,既然手册说最高支持150M ,那就使劲虐待吧!
(6)如下所示,我们的PLL输入输出示意图
(7)设置全局时钟CLK[0] CLK[1]
CLK[0],CLK[1]默认为clk0,clk1,可以根据需要选择内部振荡器,或者外部晶体时钟
(8)设置Clkout全局时钟
如上图所示,我们没有用到MSS,自然Clkcpu可以不管,disable。也没有用到Clkout1,Clkout2,也可以忽略--disable。我们需要注意的是Clkout0,而这刚好是我们默认的inpout0(PLL输出时钟)的pllout[0],因此默认即可。
(9)完成任务
三.PLL的使用
(1)PLL ip配置完成状态
(2)myPLL的例化
注意,正如前面所说的那样,clkcpu是MSS的时钟,我们没用到,clkout0是pllout0,被我配置成了150M ,clkout2,clkout3默认也是pllout0,由于软件默认配制成了全局时钟,用户可以随便选择一个时钟即可,例化如下所示:
(3)其实最好用示波器看看这150M 怎么样,但我“矮戳穷”,没有示波器,所以只能看流水灯了。。。修改water_led delay_05s 延时,如下:
module water_led
(
input clk, //10MHz 外部晶振
output [7:0] led_data //8位LED灯
);
wire clkout0; //50M全局时钟
myPll u_myPll
(
.clkin (clk), // Reference clock input.
.clkout0 (clkout0) // Main clock output.
);
//-----------------------------
//0.5s计数
reg [26:0] cnt;
parameter DELAY_CNT = 27'd25_000000;
always@(posedge clkout0)
begin
if(cnt < DELAY_CNT)
cnt <= cnt + 1'b1;
else
cnt <= 27'd0;
end
wire delay_05s = (cnt == DELAY_CNT) ? 1'b1 : 1'b0;
//------------------------------
//流水灯
reg [7:0] led_datar = 8'd0;
always @(posedge clkout0)
begin
if(delay_05s)
led_datar <= led_datar + 1'b1; //递增
else
led_datar <= led_datar;
end
assign led_data = ~led_datar; //LED 低亮
endmodule
(4)F4--综合,全编译。
NND这样也要多花钱啊。。。LE好贵。。
(5)下载,不用我说了,看看150M效果咋样。。。
-------------------------------------------------无奈的分割线--------------------------------------------------
实践证明,验证结果,Astro II 挂了,流水灯流成SB了。。。这货丫的1/10的LE布局布线都over,伤不起啊~~~~(>_<)~~~~
降速验证
(1)打开向导
(2)Edit an existing Design,如下
(3)修改PLL输出为50MHz,Finish,run project
(4)Download,验证测试。。。
a) 10MHz→活着的
b) 50MHz→活着的
c) 60MHz→活着的
d) 70MHz→活着的
e) 80MHz→活着的
f) 85MHz→活着的
g) 90MHz→蜗牛的速度→跑飞了
h) 100MHz→挂掉了
i) 我还需要继续往上面测试吗???我看我们跑50MHz以内就好了。。。
为什么官方说Astro II可以跑150MHz,请问这是为啥???这样的逻辑还需要约束吗?