FPGA深入浅出IP核学习系列文章主要是自己关于学习FGPA IP核的学习笔记,供大家参考学习指正。
目录
前言
本文主要参考B站野火FGPA相关学习视频、正点原子达芬奇FPGA开发指南和赛灵思官方用户手册。
原理部分详见赛灵思7系列FPGA时钟资源用户指南(
XILINX 7 series FPGAs Clocking Resource User Guide)
一、MMCM-IP核简介
在7系列fpga中,时钟管理模块(Clock Management Tile,简称CMT)包括一个混合模式时钟管理器(Mixed-Mode Clock Manager,简称MMCM)和一个锁相环(Phase-Locked Loop,简称PLL)。 MMCM(Mixed-Mode Clock Manager)和 PLL(Phase-Locked Loop)作为频率合成器,它们不仅可以广泛应用于频率范围的调节,还可用作外部或内部时钟的抖动滤波器,以及桌面时钟的控制器。
这两种时钟管理器模块能够灵活地对输入到 FPGA 中的时钟信号进行任意分频、倍频、相位调整和占空比调整,从而输出所需的时钟信号。用于实现复杂的时序控制和时钟同步功能。相较于 PLL,MMCM 在配置上更加灵活,提供了更多功能选项,例如,MMCM 可以用于差分信号的生成,具有更高的适用性和通用性。
MMCM 可以接收输入时钟,并根据需求生成一个或多个输出时钟,并支持相位调节和频率合成等功能,是一种灵活且可重配置的时钟管理器,广泛应用于数字系统中。此外,MMCM 还能够支持更复杂的时钟控制需求,如动态时钟切换、时钟域交叉等特性,为工程师提供了更强大的时钟管理工具。
详细的MMCM框图如下图所示,可以看出一个MMCM包括2个时钟输入端口CLKIN1和CLKIN2,使用过程中选择1路就可以,输入的时钟信号经过鉴频鉴相器(PFD)比较参考时钟和反馈回来的对比时钟之间的差异,在经过电荷泵(CP)和环路滤波器(LF)后产生一定幅度的电压到压控振荡器(VCO),压控振荡器会产生一个与输入电压幅度成比例的时钟信号进行输出到M(Fractional Divide),信号值除以M倍后会反馈到鉴频鉴相器(PFD)。MMCM可以从右侧7个端口输出7个不同倍数的时钟信号(倍频、分频),此外,第0-3路可以输出差分的时钟信号。
二、MMCM-IP核使用
1.IP核配置
如下图所示,首先,我们打开“IP Catalog”窗口,搜索“clock”,双击“FPGA Features and Design”→“Clocking”下的“Clocking Wizard”进入IP核配置界面。
如下图所示,为MMCM IP核配置界面(点击Documentation下的Product Guide可以调用官方文档,通过IP核的产品指南学习具体的配置参数含义):
1.Clocking Options
(1)“Clock Monitor”用来监测时钟是否停止、故障和频率变化,一般保持默认不做勾选。
(2)Primitive(原语)---底层逻辑功能单元,选择MMCM(Mixed-Mode Clock Manager)时钟管理器模块;
(3)“Clocking Featurs”用来设置时钟的特征,包括Frequency Synthesis(频率合成)、Minimize Power(最小化功率)、Phase Alignment(相位校准)、Dynamic Reconfig(动态重配置)、Safe Clock Startup (安全时钟启动)等,其中Spread Spectrum(扩频)和Dynamic Phase Shift(动态相移)是使用MMCM时才能够设置的特征,保持默认设置。
(4)“Jitter Optimization”用于抖动优化,可选 Balanced(平衡)、 Minimize Output Jitter(最小化输 出抖动)或Maximize Input Jitter filtering(最大化输入抖动滤波)等优化方式,保持默认平衡优化方式。
(5)“Jitter Optimization”用于抖动优化,可选 Balanced(平衡)、 Minimize Output Jitter(最小化输 出抖动)或Maximize Input Jitter filtering(最大化输入抖动滤波)等优化方式,保持默认平衡优化方式。
(6)“Input Clock Information”下的表格用于设置输入时钟的信息,第一列“Input Clock(输入时钟)”中Primary(主要,即主时钟)是必要的,Secondary(次要,即副时钟)是可选是否使用的,这里我们只需要用到一个输入时钟,所以保持默认不启用副时钟,其他列保持默认。
如下图所示,接下来,切换至“Output Clocks”配置输出时钟,具体配置如下:
2.Output Clocks
(1)The phase is calculated relative to the active input clockbiaoge 下方表格从第1-7列分别设置输出时钟路数和时钟的名字、频率、相位偏移、占空比、驱动器类型、缓冲器的最大频率。
(2)USE CLOCK SEQUENCING(使用时钟排序),当在第一个选项卡“Clocking Options”上启用安全时钟启动功能时,Use Clock Sequence表处于活动状态,可用于配置每个已启用时钟的序列号。在此模式下,只允许 BUFGCE作为时钟输出的驱动程序;
(3)Clocking Feedback(时钟反馈),用于设置时钟信号的来源是片上还是片外,是自动控制还是用 户控制,当自动控制片外的时钟时,还需要配置时钟信号的传递方式是单端还是差分,这里我们保持默认选项(自动控制片上)即可;
(4)Enable Optional lnputs/Outputs for MMCM/PLL(启用 MMCM/PLL的可选输入/输出),其中 reset(复位)和power_down(休眠)为输入信号,locked(锁定)、clkfbstopped(指示信号,表示反馈时钟是否丢失)和input_clk_stopped(指示信号,表示所选输入时钟不再切换)为输出信号,因为我们不需 要锁相环进入休眠状态,也不需要看两个指示信号,所以这里我们保持默认启用复位信号和锁定信号即可;
(5)Reset Type(复位类型),用于设置复位信号是高电平有效还是低电平有效,这里我们可以保持 默认的高电平有效。
对“Port Renaming”选项卡进行配置,如下图所示:
对“MMCM Setting”选项卡展示了对整个MMCM的最终配置参数,这些参数都是由Vivado根据之前用户输入的时钟需求来自动配置的,Vivado已经对参数进行了最优的配置,保持默认即可,如下图所示:
如下图所示,“Summary”选项卡是对前面所有配置的一个总结,检查没问题后我们点击“OK”,生成IP核。
2.模块程序设计
(1)输入模块设计
模块的输入端口包含2个输入端口系统时钟sys_clk、复位信号sys_rst_n,输出端口包含100MHz时钟输出信号clk_100M、25MHz时钟输出信号clk_25M、相位偏移90°时钟输出信号clk_s_90、占空比20%时钟输出信号clk_d_20。
(2)波形图绘制
(3)程序设计
关于程序设计, 在新建.v文件后,可以通过下图的方式进行IP核实例化的调用。
完善后的具体代码如下:
//IP核MMCM的使用,倍频、分频、相移、占空比调整 module ip_mmcm( input sys_clk, input sys_rst_n, //输出时钟 output clk_100M,//100Mhz时钟频率 output clk_25M, //25Mhz时钟频率 output clk_s_90,//50Mhz时钟频率,相位偏移90度 output clk_d_20 //50Mhz时钟频率,占空比为20% ); wire locked; //MMCM IP核的例化 clk_wiz_0 clk_wiz_inst ( // Clock out ports .clk_100M(clk_100M), // output clk_100M .clk_25M(clk_25M), // output clk_25M .clk_s_90(clk_s_90), // output clk_s_90 .clk_d_20(clk_d_20), // output clk_d_20 // 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
(4)仿真代码
仿真代码如下:
`timescale 1ns / 1ns module tb_ip_mmcm(); reg sys_clk ; reg sys_rst_n; wire clk_100M; wire clk_25M ; wire clk_s_90; wire clk_d_20; //信号初始化 initial begin sys_clk = 1'b1; sys_rst_n = 1'b0; #201 sys_rst_n = 1'b1; end //产生时钟 always #10 sys_clk = ~sys_clk; ip_mmcm ip_mmcminst( .sys_clk (sys_clk ), .sys_rst_n(sys_rst_n), .clk_100M (clk_100M ), .clk_25M (clk_25M ), .clk_s_90 (clk_s_90 ), .clk_d_20 (clk_d_20 ) ); endmodule
(5)仿真结果
锁定信号初始是低电平,后来拉高;在锁定信号是低电平时,可以看到,输出的时钟信号不稳定,锁定信号的作用就是指示输出时钟信号是否稳定。当锁定信号是低电平时,表示输出的信号是不稳定的,当前的时钟信号不能正常使用;当锁定信号是高电平时,表示输出的信号是稳定的,当前的时钟信号可以正常使用。
四路输出时钟在“locked”信号为高电平时才会稳定输出,观察locked为高电平后的4路输出信号,如下图所示,locked信号拉高之后,锁相环开始输出4个稳定的时钟。
从图中可以看出,clk_100M输出时钟信号周期为10ns,是20ns周期的1/2,所以频率是系统时钟信号的2倍,也就是100MHz;clk_25M输出时钟信号周期为40ns,是20ns周期的2倍,所以频率是系统时钟信号的1/2,也就是25MHz;clk_s_90输出时钟信号相对系统时钟信号延迟了5ns,5ns/20ns = 90°/360°,即相位偏移了90°;clk_d_20输出时钟信号高电平占比4ns,4ns/20ns = 20%,即输出为占空比为20%的时钟信号。
总结
本文简单介绍了MMCM IP核的调用,通过 MMCM IP 核输出四路不同频率、相位或者占空比的时钟。