1. IP核概述
1.1 IP核是什么
IP 核(Intellectual Property Core):
知识产权核,FPGA/ASIC 设计里的预制、可复用硬件模块,不是软件函数,是已经做好的硬件电路。
ASIC和FPGA中预先设计好的电路模块;
1.2 使用IP核的原因
1. 可靠性高
设计越来越复杂,自己设计功能难以保证;
2. 提高开发效率
规定时间内完成;
3. 加快产品上市
减轻工程师负担;
1.3 IP核的局限性
1. 移植性差
IP不能跨平台使用;
2. 功能调整空间小
黑匣子
3. 部分需付费使用
部分IP核价格昂贵;
1.4 如何使用IP核
PROJECT MANAGER -> IP CATALOG;
2. IP核之PLL实验
时钟的倍频器;
2.1 简介
Xilinx FPGA的时钟管理
CMT(Clock Management Tiles):时钟管理单元,可以对时钟进行管理,具有时钟倍频、分频、相位偏移、可编程占空比和优化抖动等功能。
PLL:phase-locked loop
MMCM:mixed-mode clock manager
CMT结构:
对于7系列来说:
CMT含有一个PLL和一个MMCM;
MMCM中包含PLL和DCM;
即,MMCM在PLL的基础上加上了相位动态调整的功能;
2.2 PLL原理
PLL:
PLL:Phase Locked Loop(锁相环)
PLL是一种时钟反馈控制电路,特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位;
PLL原理:
输出的CLK和参考CLK比较,直到输出的CLK和参考REF相同;
类比示意图:
主要就是OUT和REF;
PLL分频原理:
PLL倍频原理:
使用实际的分频后的频率与REF相比;
此时也就是相当于倍频了;
2.3 实验任务
本节的实验任务是使用开发板输出4路不同频率或相位的时钟,时钟分别为100Mhz,100Mhz(相位偏移180度)、50Mhz和25Mhz。将四路时钟分别输出至扩展口的端口,并通过示波器来测量输出结果是否正确。
2.4 操作过程
点击IP catalog 搜索;
设置PLL,并对其进行设置:
主要是如下:
注意设置首要的时钟频率,根据自己的开发板的时钟进行设置:输出时钟配置:
如下图所示:
按照要求设置输出时钟:本页面设置时钟端口的重命名:
这个页面是得到输出时钟的具体参数设置:
这里是总结页面:
总的来看,主要也就是需要设置板载的时钟频率,以及最终的输出频率;
也就是上面的,第二步和第三步;这里直接点击生成即可;
此时的IP核会出现在IP Sources界面:
对IP核进行例化:
复制对应的例化模板;
代码示例:
moduleip_clk_wiz(input sys_clk,input sys_rst_n,output clk_100m,output clk_100m_180deg,output clk_50m,output clk_25m);wire locked;wire rst_n;assign rst_n=sys_rst_n&locked;clk_wiz_0 u_clk_wiz_0(// Clock out ports.clk_out1(clk_100m),// output clk_out1.clk_out2(clk_100m_180deg),// output clk_out2.clk_out3(clk_50m),// output clk_out3.clk_out4(clk_25m),// output clk_out4// Status and control signals.reset(~sys_rst_n),// input reset.locked(locked),// output locked// Clock in ports.clk_in1(sys_clk)// input clk_in1);endmodule2.5 仿真
有两种仿真的方法:
- 使用Vivado自带的仿真器进行仿真;
- 联合仿真,先产生Vivado仿真库,然后和Modelsim进行联合仿真;
2.5.1 使用Vivado自带的仿真器
- 右击Design Sources 添加源文件:
- 添加源文件与tb代码,在添加tb代码的时候,注意要选择simulation sources;
这部分需要分两次添加: - 点击运行仿真;
- 这里可以设置初始运行时间:
- 此时界面就已经产生了对应的波形
- 此部分设置对应的运行时间;
- 仿真结束后关闭即可;
2.5.2 Vivado+Modelsim联合仿真
生成对应的编译仿真库
按照下图进行设置,注意就是选择对应的系列,选的越多编译越慢;
编译完成以后,点击设置,对第三方的软件进行关联;
并在仿真部分选择modelsim软件与对应的库,并勾选下面的选项;点击开始仿真,此时如果正常,那么就直接打开Modelsim软件了;
就像使用Modelsim软件一样即可;
2.6 上板验证
RTL文件代码:
moduleip_clk_wiz(input sys_clk,input sys_rst_n,output clk_100m,output clk_100m_180deg,output clk_50m,output clk_25m);wire locked;wire rst_n;assign rst_n=sys_rst_n&locked;clk_wiz_0 u_clk_wiz_0(// Clock out ports.clk_out1(clk_100m),// output clk_out1.clk_out2(clk_100m_180deg),// output clk_out2.clk_out3(clk_50m),// output clk_out3.clk_out4(clk_25m),// output clk_out4// Status and control signals.reset(~sys_rst_n),// input reset.locked(locked),// output locked// Clock in ports.clk_in1(sys_clk)// input clk_in1);endmoduletb激励文件代码:
`timescale1ns/1ns moduletb_ip_clk_wiz();parameter clk_period=20;reg sys_clk;reg sys_rst_n;wire clk_100m;wire clk_100m_180deg;wire clk_25m;wire clk_50m;initial begin sys_clk<=1'b0;sys_rst_n<=1'b0;#200sys_rst_n<=1'b1;end always #(clk_period/2)sys_clk=~sys_clk;////ip_clk_wizu_ip_clk_wiz(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.clk_100m(clk_100m),.clk_100m_180deg(clk_100m_180deg),.clk_50m(clk_50m),.clk_25m(clk_25m));endmoduleXDC约束文件:
确定要输出的引脚,对引脚进行约束:
这是一个标准引脚约束的代码:
set_property-dict{PACKAGE_PIN U20 IOSTANDARD LVCMOS33}[get_ports clk_100m]完整版本:
#时序约束 create_clock-period20.000-name sys_clk[get_ports sys_clk]#IO引脚约束 #----------------------系统时钟---------------------------set_property-dict{PACKAGE_PIN U18 IOSTANDARD LVCMOS33}[get_ports sys_clk]#----------------------系统复位---------------------------set_property-dict{PACKAGE_PIN N16 IOSTANDARD LVCMOS33}[get_ports sys_rst_n]set_property-dict{PACKAGE_PIN U20 IOSTANDARD LVCMOS33}[get_ports clk_100m]set_property-dict{PACKAGE_PIN T20 IOSTANDARD LVCMOS33}[get_ports clk_100m_180deg]set_property-dict{PACKAGE_PIN N18 IOSTANDARD LVCMOS33}[get_ports clk_50m]set_property-dict{PACKAGE_PIN P19 IOSTANDARD LVCMOS33}[get_ports clk_25m]