超级版主
- 积分
- 4667
- 金钱
- 4667
- 注册时间
- 2019-5-8
- 在线时间
- 1224 小时
|
本帖最后由 正点原子运营 于 2021-10-30 10:08 编辑
1)实验平台:正点原子新起点V2FPGA开发板
2) 章节摘自【正点原子】《新起点之FPGA开发指南 V2.1》
3)购买链接:https://detail.tmall.com/item.htm?id=609758951113
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_xinqidian(V2).html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子FPGA技术交流QQ群:712557122
第十七章 IP核之PLL实验
PLL的英文全称是Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。对于一个简单的设计来说,FPGA整个系统使用一个时钟或者通过编写代码的方式对时钟进行分频是可以完成的,但是对于稍微复杂一点的系统来说,系统中往往需要使用多个时钟和时钟相位的偏移,且通过编写代码输出的时钟无法实现时钟的倍频,因此学习Altera PLL IP核的使用方法是我们学习FPGA的一个重要内容。本章我们将通过一个简单的例程来向大家介绍一下PLL IP核的使用方法。
本章包括以下几个部分:
1717.1简介
17.2实验任务
17.3硬件设计
17.4程序设计
17.5下载验证
17.1简介
锁相环作为一种反馈控制电路,其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
PLL的结构图如图 17.1.1所示。
图 17.1.1 PLL结构图
PLL由以下几部分组成:前置分频计数器(N计数器)、相位-频率检测器(PFD,Phase-Frequency Detector)电路,电荷泵(Charge Pump)、环路滤波器(Loop Filter)、压控振荡器(VCO,Voltage Controlled Oscillator)、反馈乘法器计数器(M计数器)和后置分频计数器(K和V计数器)。
在工作时,PFD检测其参考频率(FREF)和反馈信号(Feedback)之间的相位差和频率差,控制电荷泵和环路滤波器将相位差转换为控制电压;VCO根据不同的控制电压产生不同的震荡频率,从而影响Feedback信号的相位和频率。在FREF和Feedback信号具有相同的相位和频率之后,就认为PLL处于锁相的状态。
在反馈路径中插入M计数器会使VCO的震荡频率是FREF信号频率的M倍,FREF信号等于输入时钟(FIN)除以预缩放计数器(N)。参考频率用以下方程描述:FREF= FIN/N,VCO输出频率为FVCO= FIN*M/N,PLL的输出频率为FOUT=(FIN*M)/(N*K)。
我们开发板上的FPGA芯片型号为EP4CE10,内部含有2个PLL,为设备提供强大的系统时钟管理以及高速I/O通信的能力。外部时钟经过锁相环,产生不同频率和不同相位的时钟信号供系统使用。需要注意的是,PLL的时钟输入可以来自于时钟专用输入引脚,FPGA内部产生的信号不能驱动PLL。
Altera提供了用于实现PLL功能的IP核ALTPLL,在这里我们需要说明的是,有关ALTPLL的工作原理和ALTPLL的组成结构,我们就不在进一步进行讲解了,我们主要讲解的是如何使用ALTPLL IP核,对ALTPLL的工作原理和ALTPLL的组成结构感兴趣的朋友,可以参考 Altera提供的ALTPLL IP核的用户手册。
17.2实验任务
本节实验任务是使用FPGA开发板输出4个不同时钟频率或相位的时钟,并通过Modelsim软件对ALTPLL IP核进行仿真,来向大家详细介绍一下ALTPLL IP核的使用方法。
17.3硬件设计
本章实验将ALTPLL IP核产生的四个时钟输出到FPGA的扩展口IO上,也就是开发板P6扩展口的第5、6、7和第8脚。扩展口原理图如图 17.3.1所示:
图 17.3.1 扩展口原理图
本实验中,各端口信号的管脚分配如下表所示。
表 17.3.1 IP核之PLL实验管脚分配
对应的TCL约束语句如下:
- set_location_assignment PIN_N9 -to clk_100m
- set_location_assignment PIN_P9 -to clk_100m_180deg
- set_location_assignment PIN_L10 -to clk_50m
- set_location_assignment PIN_M9 -to clk_25m
- set_location_assignment PIN_M2 -to sys_clk
- set_location_assignment PIN_M1 -to sys_rst_n
复制代码
17.4程序设计
首先创建一个名为ip_pll的工程,在这里我们就不再给出Quartus II软件创建工程的详细过程,如果大家对Quartus II软件的创建过程还不熟悉的话,可以参考“第四章 Quartus II软件的安装和使用”章节中的Quartus II软件的使用部分。新建后的工程如图 17.4.1所示:
图 17.4.1 工程新建完成页面
创建好了工程以后,接下来我们创建PLL IP核。我们在Quartus II软件的菜单栏中找到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,Tool工具栏打开页面及打开后弹出的页面如图 17.4.2和图 17.4.3所示。
图 17.4.2 工具栏打开IP核页面
图 17.4.3 创建IP核向导页面
在该页面中,可以看到有三个选项,第一个是创建一个新的IP核,第二个是编辑一个已经创建好的IP核,第三个是复制一个已经创建好的IP核。因为我们这里是首次创建IP核,因此直接选择默认的第一个选项,然后点击【Next>】,进入如图 17.4.4所示页面。
图 17.4.4 选择ALTPLL IP核页面
在该页面中,我们可以在I/O下找到ALTPLL IP核,也可以直接在搜索框中输入ALTPLL找到它。我们找到ALTPLL IP核以后,单击选中它,然后我们需要为ALTPLL IP核选择保存的路径及名称,首先大家先在工程所在路径par文件夹下创建一个文件夹ipcore,用于存放工程中用到的IP核(如果之前没有创建ipcore文件夹的话),然后在“What name do you want for the output file”一栏中输入IP存放的路径及名称,这里我们命名为pll_clk并且选择创建的IP核代码为Verilog HDL。完成这些设置以后,我们点击【Next>】,进入如图 17.4.5所示页面。
图 17.4.5 ALTPLL IP核模式配置页面
我们开发板上面的晶振的时钟频率为50Mhz,因此在上图所示页面修改成50Mhz。另外PLL支持以下4种工作模式:
In normal mode(正常模式):PLL反馈路径源是全局或局域时钟网络,可以最小化时钟类型和指定PLL寄存器的时钟延时,还可以指定补偿的PLL输出。
In source-synchronous compensation mode(源同步补偿模式):数据和时钟信号同时到达输入引脚。从引脚到I/O输入寄存器之间的时钟延时与从引脚到I/O输入寄存器之间的数据延时匹配,信号可以确保在任何输入/输出使能寄存器的时钟和数据端口有相同的相位关系。
In zero delay buffer mode(零延时缓存模式):PLL反馈路径限制在专用PLL外部输出引脚上。片外驱动的PLL反馈路径与时钟输入是相位对齐的,且时钟输入和外部时钟输出之间的延时最小。
Witch no compensation(无补偿模式):PLL补偿到PLL的反馈输入,这样可以最小化输入时钟和反馈时钟引脚之间的延时。
通常我们保持默认设置,选择In normal mode(正常模式)即可。然后我们直接点击【Next>】,进入如图 17.4.6所示页面。
图 17.4.6 输入复位信号及LOCK信号设置页面
上图中第一个红框标出的位置是设置是否使用异步复位来复位锁相环,第二个红框标出的位置是是否输出LOCK信号,LOCK信号拉高表示锁相环开始稳定输出时钟信号,在此我们保持默认的设置,直接点击【Next>】,进入如图 17.4.7所示页面。
图 17.4.7 频率带宽设置页面
然后继续点击【Next>】,进入如图 17.4.8所示页面。
图 17.4.8 时钟转换配置页面
时钟转换配置页面是配置另一个时钟输入源,我们开发板上只有一个50Mhz的晶振,且一般也不需要使用两个,所以这里直接点击【Next>】,进入如图 17.4.9所示页面。
图 17.4.9 PLL重配置页面
上图中的页面是选择动态配置PLL输出,实现在线的实时配置,我们使用的时钟输出一般都是固定频率的,所以不需要选择,直接点击【Next>】,进入如图 17.4.10所示页面。
图 17.4.10 第一个输出时钟c0配置页面
接下来就进入到配置输出时钟的页面了,Requested Setting一栏中直接输入我们需要的时钟频率100Mhz;Clock phase shift一栏中输入时钟的相位偏移,这里保持默认为0即可;Clock duty cycle(%)一栏设置时钟的占空比,时钟占空比一般为50%,我们在这里保持默认50即可,然后点击【Next>】,进入如图 17.4.11所示页面。
图 17.4.11 第二个输出时钟c1配置页面
在该页面中,我们使能c1时钟信号,然后将c1时钟设置为100MHz,在这里为了向大家演示设置时钟相位的作用,我们将时钟相位设置成180,然后点击【Next>】,进入如图 17.4.12所示页面。
图 17.4.12 第三个输出时钟c2配置页面
在该页面中,我们使能c2时钟信号,然后将c2时钟设置为50MHz,然后点击【Next>】,进入如图 17.4.13所示页面。
图 17.4.13 第四个输出时钟c3配置页面
在该页面中,我们使能c3时钟信号,然后将c3时钟设置为25MHz。然后点击【Next>】,进入如图 17.4.14所示页面。
图 17.4.14 第五个输出时钟c4配置页面
我们本次实验只需要用到这四个时钟,因此直接点击【Next>】,进入如图 17.4.15所示页面。
图 17.4.15 EDA的配置页面
从该页面中,我们可以看出,如果我们想要仿真PLL IP核,那么我们需要添加altera_mf仿真库。如果我们想要将此PLL IP核用在其他的EDA工具上,我们可以通过选择Generate netlist这个选项来生成IP_syn.v文件,用于其他的EDA工具中。这里需要注意的是,并不是所有的第三方EDA工具都支持。在这里直接点击【Next】,进入如图 17.4.16所示页面。
图 17.4.16 Summary 的配置页面
然后我们点击【Finish】完成整个IP核的创建。接下来Quartus II软件会在ipcore文件夹下创建ALTPLL的IP核文件,然后询问我们是否添加至工程,点击“YES”按钮将生成的IP核添加至工程,如图 17.4.17所示页面。
图 17.4.17 IP核添加至工程确认界面
接下来返回到工程界面,在File界面里,我们可以看到生成的pll_clk.qip和pll_clk.v已经添加到工程中。qip是Quartus IP的缩写,我们打开qip的文件可以看到如图 17.4.18所示的脚本代码。
图 17.4.18 pll_clk.qip文件内容
上图中红色框标注的意思是pll_clk.v文件已经添加至工程里了,如果大家在工程中只找到了pll_clk.qip文件,而没有找到pll_clk.v的话也没有关系,工程中只加入pll_clk.qip文件也是可以的。
PLL IP核添加至工程中的页面如图 17.4.19所示界面。
图 17.4.19 锁相环添加至工程界面
至此,ALTPLL IP核的创建已经全部完成,如果需要修改IP核的话,点击在Quartus II软件的菜单栏中找到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,图 17.4.20为打开后的页面。
图 17.4.20 修改IP核页面
和我们第一次创建IP核不同的是,这一次我们选择第二个选项,修改已经存在的IP核,然后点击【Next>】,进入选择IP核路径页面,双击ipcore文件夹,进入如图 17.4.21所示页面。然后双击pll_clk.v文件或者选中pll_clk.v文件,点击【Next>】开始重新配置ALTPLL IP核。
图 17.4.21 选择需要修改的IP核路径页面
接下来我们设计一个verilog文件来实例化刚才创建的PLL IP核,文件名为ip_pll.v,编写的verilog代码如下。
- 1 module ip_pll(
- 2 input sys_clk , //系统时钟
- 3 input sys_rst_n , //系统复位,低电平有效
- 4 //输出时钟
- 5 output clk_100m , //100Mhz时钟频率
- 6 output clk_100m_180deg, //100Mhz时钟频率,相位偏移180度
- 7 output clk_50m , //50Mhz时钟频率
- 8 output clk_25m //25Mhz时钟频率
- 9 );
- 10
- 11 //wire define
- 12 wire rst_n ; //复位信号
- 13 wire locked ; //locked信号拉高,锁相环开始稳定输出时钟
- 14
- 15 //*****************************************************
- 16 //** main code
- 17 //*****************************************************
- 18
- 19 //系统复位与锁相环locked相与,作为其它模块的复位信号
- 20 assign rst_n = sys_rst_n & locked;
- 21
- 22 //锁相环
- 23 pll_clk u_pll_clk(
- 24 .areset (~sys_rst_n ), //锁相环高电平复位,所以复位信号取反
- 25 .inclk0 (sys_clk ),
- 26 .c0 (clk_100m ),
- 27 .c1 (clk_100m_180deg),
- 28 .c2 (clk_50m ),
- 29 .c3 (clk_25m ),
- 30 .locked (locked )
- 31 );
- 32
- 33 endmodule
复制代码
程序中例化了pll_clk,把FPGA的系统时钟50Mhz连接到pll_clk的inclk0,系统复位信号连接到pll_clk的areset,因为锁相环是高电平复位,而输入的系统复位信号sys_rst_n是低电平复位,所以在代码的第24行,对系统复位信号进行取反。pll_clk输出的四个时钟连接到顶层端口的输出信号。
ip_pll模块添加至工程后,如果工程名字和ip_pll模块名字不一致的话,必须先将ip_pll模块设置为顶层模块,设置方法是右键选择ip_pll.v文件,点击Set as Top-Level Entity。
图 17.4.22 ip_pll设置为顶层文件
接下来点击分析和综合图标编译工程。
图 17.4.23 开始编译工程界面
工程编译成功后,打开Pin Planner配置FPGA的管脚,管脚约束按照本章“13.3节 硬件设计”中表 17.3.1的列表来分配,分配完成后重新编译工程。
接下来我们对PLL IP核进行仿真,来验证锁相环输出的时钟频率是否正确。首先在Modelsim软件中创建一个名为tb_ip_pll的工程,在这里我们就不再给出软件创建工程的详细过程,如果大家对Modelsim软件的创建过程还不熟悉的话,可以参考前面章节 Modelsim软件的安装与使用部分。
tb_ip_pll仿真文件源代码如下:
- 1 `timescale 1ns/1ns
- 2
- 3 module tb_ip_pll ;
- 4
- 5 parameter SYS_PERIOD = 20; //定义系统时钟周期
- 6
- 7 reg clk ;
- 8 reg rst_n ;
- 9
- 10 wire clk_100m ;
- 11 wire clk_100m_180deg ;
- 12 wire clk_50m ;
- 13 wire clk_25m ;
- 14
- 15 always #(SYS_PERIOD/2) clk <= ~clk ;
- 16
- 17 initial begin
- 18 clk <= 1'b0 ;
- 19 rst_n <= 1'b0 ;
- 20 #(20*SYS_PERIOD)
- 21 rst_n <= 1'b1 ;
- 22 end
- 23
- 24 //例化ip_pll模块
- 25 ip_pll u_ip_pll(
- 26 .sys_clk (clk),
- 27 .sys_rst_n (rst_n),
- 28 .clk_100m (clk_100m ),
- 29 .clk_100m_180deg (clk_100m_180deg),
- 30 .clk_50m (clk_50m ),
- 31 .clk_25m (clk_25m )
- 32 );
- 33
- 34 endmodule
复制代码
需要注意的是,对IP核的仿真需要在Modeslim工程中添加altera_mf文件仿真库,仿真库的路径在Quartus II软件的安装路径下,路径为:D:\altera\13.1\quartus\eda\sim_lib\altera_mf.v(如果大家把Quartus安装在其它磁盘,可在对应的安装路径下找到仿真库文件)。建议大家把alerta_mf文件拷贝到工程的sim\tb文件夹下,方便添加至工程。工程创建完成后,把tb_ip_pll.v文件、ip_pll.v文件、pll_clk.v文件和altera_mf文件添加至工程,然后编译各个文件(注意altera_mf文件编译时间较长),编译后的工程界面如图 17.4.24所示:
图 17.4.24 Modelsim工程界面
接下来就可以开始仿真了,仿真过程这里不再赘述,下图为Modelsim仿真的波形图。
图 17.4.25 Modelsim 仿真波形
由上图可知,locked信号拉高之后,锁相环开始输出四个稳定的时钟。clk_100m和clk_100m_180deg周期都为10000ps(10000ps=10ns),即时钟频率都为100Mhz,但两个时钟相位偏移180度,所以这两个时钟刚好是一个反向的时钟;clk_50m周期为20000ps(20000ps=20ns),时钟频率为50Mhz;clk_25m周期为40000ps(40000ps=40ns),时钟频率为25Mhz。也就是说,我们创建的锁相环从仿真结果上来看是正确的。
17.5下载验证
首先将下载器一端连接电脑,另一端与开发板上的JTAG下载口相连,最后连接电源线并打开电源开关。
图 17.5.1 测量频率引脚
接下来我们下载程序,验证IP核之PLL锁相环功能,程序下载完成后,接下来我们使用示波器测量开发板P6扩展口的第5(N9)、6(P9)、7(L10)和8(M9)脚。首先将示波器带夹子的一端连接到开发板的GND位置(可使用杜邦线连接至开发板扩展IO的GND管脚),然后将另一端探针放在其中一个扩展口引脚上,此时在示波器上就可以观察到时钟的波形图。需要注意的是,由于我们输出的四个时钟频率比较高,这对示波器的采集带宽要求是比较高的,对于采集带宽较低的示波器,观察到的时钟频率可能会有点偏差,下图为使用示波器测量扩展口引脚M9所显示的波形。
图 17.5.2 引脚M9输出的波形
由上图可知,示波器测量出的时钟频率为25Mhz,跟仿真结果是一样的,其它三个扩展口输出的时钟大家可以测试一下,这里不再贴出其它扩展口的波形图,本次实验的IP核之PLL锁相环实验验证成功。 |
|