本视频学习自正点原子ZYNQ领航者FPGA视频 Xilinx-P22
锁相环作为一种反馈控制电路,其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
7系列的FPGA使用了专用的全局(Global)和区域(Regional)时钟资源来管理和设计不同的时钟需求。
全局时钟:整个FPGA内部都可以用,而且延时低。
区域时钟:仅在某个模块内部用。
Clock Management Tiles(CMT)提供了时钟合成(Clock frequency synthesis),倾斜矫正(deskew),过滤抖动(jitter filtering)功能。
Xilinx 7 系列器件中具有时钟管理单元CMT 时钟资源,xc7z020 芯片内部有4 个CMT,xc7z010 芯片内部有2 个CMT,为设备提供强大的系统时钟管理以及高速I/O 通信的能力。时钟管理单元CMT 的总体框图如下图所示。
可以看到1个CMT里有一个MMCM和一个PLL。其中MMCM 的功能是PLL 的超集,其具有比PLL 更强大的相移功能。MMCM 主要用于驱动器件逻辑(CLB、DSP、RAM 等)的时钟。PLL 主要用于为内存接口生成所需的时钟信号,但也具有与器件逻辑的连接,因此如果需要额外的功能,它们可以用作额外的时钟资源。
首先创建一个工程。
接下来我们创建PLL IP 核。在Vivado 软件的左侧“Flow Navigator”栏中单击“IP Catalog”,“IP Catalog”按钮以及单击后弹出的“IP Catalog”窗口如下图所示。
在“IP Catalog”窗口中,在搜索栏中输入“clock”关键字,可以看到Vivado 已经自动查找出了与关键字匹配的IP 核名称,如下图所示。
我们双击最下面的“Clocking Wizard”,弹出“Customize IP”窗口,如下图所示。
“Component Name”一栏用于设置该IP 核的名称,这里保持默认即可。
“Clocking Options”选项卡中
“Clock Monitor”用来监控时钟是否停止、故障和频率变化。一般不用。
“Primitive”选项用于选择是使用MMCM 还是PLL 来完成时钟需求,对于我们的本次实验来说,MMCM 和PLL 都可以完成,这里 我们可以保持默认选择MMCM。
需要修改的是最下面的“Input Clock Information”一栏,把“Primary”时钟的输入频率修改为我们开发板的核心板上的晶振频率50MHz,其他的设
置保持默认即可,如下图所示。
“Output Clocks”选项卡,在“Output Clock”一列中,勾选前4 个时钟,并且将其“Output Freq(MHz)”分别设置为100、100、50、25,注意,第2 个100MHz 时钟的相移“Phase(degrees)”一栏要设置为180。其他设置保持默认即可,如下图所示。
“Port Renaming”选项卡主要是对一些控制信号的的重命名。这里我们只用到了锁定指示locked 信号,其名称保持默认即可,如下图所示。
“MMCM Setting”选项卡展示了对整个MMCM/PLL 的最终配置参数,这些参数都是根据之前用户输入的时钟需求由Vivado 来自动配置的,Vivado 已经对参数进行了最优的配置,在绝大多数情况下都不需要用户对它们进行更改,也不建议更改,所以这一步保持默认即可,如下图所示。
最后的“Summary”选项卡是对前面所有配置的一个总结,在这里我们直接点击“OK”按钮即可,如下图所示。
接着就弹出了“Genarate Output Products”窗口,我们直接点击“Generate”即可,如下图所示。
首先打开IP 核的例化模板,在“Source”窗口中的“IP Sources”选项卡中,依次用鼠标单击展开“IP”-“clk_wiz_0”-“Instantitation Template”,我
们可以看到“clk_wiz.veo”文件,它是由IP 核自动生成的只读的verilog 例化模板文件,双击就可以打开它,如下图所示。
在其Out-of-Context 综合的过程中,我们就可以进行RTL 编码了。首先打开IP 核的例化模板,在“Source”窗口中的“IP Sources”选项卡中,依次用鼠标单击展开“IP”-“clk_wiz_0”-“Instantitation Template”,我们可以看到“clk_wiz.veo”文件,它是由IP 核自动生成的只读的verilog 例化模板文件,双击就可以打开它,如下图所示。
我们创建一个verilog 源文件,其名称为ip_clk_wiz.v,代码如下:
module ip_clk_wiz(
input sys_clk , //系统时钟
input sys_rst_n , //系统复位,低电平有效
//输出时钟
output clk_100m , //100Mhz 时钟频率
output clk_100m_180deg, //100Mhz 时钟频率,相位偏移180 度
output clk_50m , //50Mhz 时钟频率
output clk_25m , //25Mhz 时钟频率
output locked //MMCM/PLL 锁定指示
);
//*****************************************************
//** main code
//*****************************************************
//MMCM/PLL IP 核的例化
clk_wiz_0 clk_wiz_0
(
// Clock out ports
.clk_out1_100m (clk_100m), // output clk_out1_100m
.clk_out2_100m_180 (clk_100m_180deg), // output clk_out2_100m_180
.clk_out3_50m (clk_50m), // output clk_out3_50m
.clk_out4_25m (clk_25m), // output clk_out4_25m
// Status and control signals
.reset (~sys_rst_n), // input reset
.locked (locked), // output locked
// Clock in ports
.clk_in1 (sys_clk) // input clk_in1
);
endmodule
程序中例化了clk_wiz_0,把FPGA 的系统时钟50Mhz 连接到clk_wiz_0 的clk_in1,系统复位信号连接到clk_wiz_0 的reset,因为锁相环是高电平复位,而输入的系统复位信号sys_rst_n 是低电平复位,所以要对系统复位信号进行取反。clk_wiz_0 输出的4 个时钟信号以及锁定指示信号连接到顶层端口的输出信号。我们对代码进行仿真,得到的仿真波形图如下图所示:
由上图可知,locked 信号拉高之后,锁相环开始输出4 个稳定的时钟。clk_100m 和clk_100m_180deg周期都为10ns,即时钟频率都为100Mhz,但两个时钟相位偏移180 度,所以这两个时钟刚好反相;clk_50m周期为20ns,时钟频率为50Mhz;clk_25m 周期为40ns,时钟频率为25Mhz。也就是说,我们创建的锁相环从仿真结果上来看是正确的。