本文档主要针对 Logos2 系列的 PLL 配置,至于 Logos 系列的 PLL,可以参考《PLLIP 的使用(Logos)》的文档。
一、PLL IP 介绍
1、PLL 基本配置模式 Basic Configurations
PLL IP 是紫光同创基于 PLL 及时钟网络资源设计的 IP,通过不同的参数配置,可实现时钟信号的调频、调相、同步、频率综合等功能。
Logos2 系列器件的 PLL 支持 APB 动态重配功能,实现 HDMI 像素时钟频率的调整可通过 APB 接口动态配置 PLL 输出时钟频率(时钟相位和占空比不做调整)。而 Logos 器件是没有这个功能的,除了没有动态配置,基本的使用是一致的,大家注意查看 IP 相关手册。
PLL 的使用可选择 Basic 和 Advanced 两种模式,两种模式均支持 APB 接口动态配置实现时钟频率的动态调整,Advanced 模式下 PLL 的内部参数配置完全开放。Basic 和 Advanced两种模式下均可选择使用 GPLL 或 PPLL,GPLL 支持分数分频可实现更精确的输出频率,GPLL与 PPLL 详细描述请参考《UG040004_Logos2 系列 FPGA 时钟资源(Clock)用户指南_V1.2.pdf》。
下图为常用的 IP 框图以及其基本配置,Basic 配置模式下,用户无需关心 PLL 的内部参数配置,只需输入期望的频 率值、相位值、占空比等,IPC 将自动计算,得到最佳的配置参数。如果没有特殊应用,建议使用 Basic 模式配置 PLL。
(图1)
(图2)
(图3)
图 1、图 2、图 3 所示的配置是最基本的使用方法,Mose Select 模式选择 GPLL,FeedbackClock Mode 反馈时钟选择内部反馈,反馈选择 CLKOUF。具体原理可以参考图 3:
(图4)
即基本结构是配置一路时钟输入,clkoutf 作为 PLL 内部反馈,并输出一路时钟 clkout0。
(图5)
还有一点,当我们勾选 Show Internal Settings of PLL 时,可以看到具体的配置参数。如图 5 所示,这些参数可以为我们后续进行动态配置,亦或是 Advanced 配置都可以提供参考。
2、PLL Advanced Configuration
(图6)
Advanced 模式下,PLL 的内部参数配置完全开放,用户需要根据应用需求自行计算相应配置参数,才能正确配置。
(图7)
如图 6 红框所示,需要自己填写输入分频系数、输出分频系数、占空比、相位、反馈分频系数等,若无特别需求,建议使用 Basic 模式。
二、PLL 的动态配置
勾选如图 x 的地方,可以看到 IP 多出了 APB 接口
(图8)
1、APB 接口时序
PLL 的动态配置是通过 APB 接口来进行控制的,表 1 是其 APB 接口的描述。
(图 9 APB 写时序)
其实,APB接口的读写时序是非常简单的,每次传输均需要两个时钟周期,我们可以将其分为三个状态,在IDLE状态,也就是空闲状态对应图中T1之前时刻,APB_EN和APB_SEL均为0。当我们需要传输数据时,会进入SETUP阶段,也就是准备状态,对应图中T1-T2这一段时间,在这个状态下会给出地址APB_ADDR,并设置APB_WRITE方向,如果是写,则APB_WRITE为高电平,同时拉高APB_SEL,即选择信号。此时会在SETUP状态下等待一个时钟周期后跳转到第三个状态,第三个状态为ENABLE阶段,也就是传输数据阶段,对应图中T2~T3这段时间,这个阶段地址、数据和APB_SEL均保持不变,然后拉高APB_EN,此时开始数据传输,当APB_READY拉高,表示传输完成。如果接下来不传输数据,则在下一个时钟周期跳转回去IDLE状态,如果传输数据则跳转到SETUP状态。
所以可以得出结论,每次发起传输都需要经过SETUP和ENABLE两个状态。即消耗两个时钟周期。
(图10 APB读时序)
读时序和写时序其实长得非常像,差别不大。一样还是分为三个状态,IDLE、SETUP、ENABLE三个。对比写时序,读时序仅是在SETUP阶段和ENABLE阶段把APB_WRITE改成低电平,表示读取数据。需要注意得是,在ENABLE阶段,数据读出,但是由于时序逻辑,别的模块要在T3时刻的上升沿才能采样到输出得D0。
2、APB寄存器列表
通过APB接口修改相关寄存器数值重新配置输出时钟频率,详细寄存器地址及其定义,如表2所示:
3、动态时钟计算公式
(1) 输出频率的计算
PLL 输出时钟频率由输入时钟频率、配置模式及相关配置参数决定,计算公式如下:
FCLKOUTx 为输出时钟频率;
FIN 为输入时钟频率;
MDIV 为反馈分频参数;
FBDIV 的值等于 PLL 反馈时钟的输出分频参数,clkoutf 作为反馈时钟时:FBDIV = ODIVf;
IDIV 为输入分频器分频参数;
ODIVx 的值等于输出时钟的输出分频参数,基于 IP 的配置使能 clkout0,所以 x=0 ,ODIVx = ODIV0;
根据像素时钟频率确定时钟配置参数,每次切换分辨率时 PLL 动态配置通过 APB 接口修改相关参数的寄存器数值实现输出频率调整。
分频参数:
根据 PLL 输出频率计算公式,相关分频参数如下,需根据实际输出频率确定分频参数数值
REG_ODIV0_RATIO<7:0>
REG_FDIV_RATIO<7:0>
REG_IDIV_RATIO<7:0>
REG_MDIV_RATIO<7:0>
具体的参数,在 IP 配置可以看到,如下所示
(图11)
点击 Show Internal Setting of PLL 去查看具体的配置,IP 这里有时会显示小数,而我们知道,FPGA 不能直接写小数,所以要将其定点化,可以简单扩大一个倍数,去除小数位。
(2) 占空比和相位的计算
GPLL 寄存器设置:
占空比计算公式为 duty cycle = (50%/odiv)*duty,若保持占空比为 50%不变,需设置分频参数与占空比参数相同。
其中 odiv 为输出分频系数与 xxx_RATIO 寄存器的值有关,duty 和 xxx_DUTY 寄存器的值有关,请参考表 2 给出的寄存器值。
以下为参考:
REG_ODIV0_DUTY=REG_ODIV0_RATIO
REG_FDIV_DUTY=REG_FDIV_RATIO
输出时钟相位不做调整,正常情况改变寄存器的值即可,具体配置可以查阅手册:
REG_ODIV0_FPHASE=0
REG_ODIV0_CPHASE=0
REG_FDIV_FPHASE=0
REG_FDIV_CPHASE=0
三、动态配置验证
本次不进行
仿真,直接通过上板验证,输出不同分辨率的彩条进行验证,大家可以自备一个屏幕。
本实验主要了解 APB 接口,故只介绍相关代码,由于 apb_cfg_test 模块一共 500 多行,故挑重点部分进行讲解,HDMI 显示等代码将在应用篇介绍,代码如下:
该代码主要完成不同分辨率的分频和占空比系数的配置,key_cnt 默认为 0,每按下按键 1该值加1,例如在key_cnt=0时,通过配置不同的分频系数以及占空比系数将输出的时钟配置为148.5MHZ,占空比 50%,相位默认不调节,以此输出 1080P 所需要的像素时钟;接下来的每个状态都是如此。
该 always 块主要完成状态的跳转,一共有 14 个状态,在 CFG_IDIE 状态下,检测到 cfg_en 的上升沿到达,即 cfg_en_pos 信号,则状态跳转到 ODIV0_CFG1 下,然后开始完成相应寄存器的配置.然后检测到 apb_rdy 信号,就是我们所说的 apb_ready 信号,则表示配置完成,所以检测到该信号拉高就跳转到下一个状态,直到跳转到 CFG_DONE 状态。
这部分代码主要完成对 ODIV、FDIV、MDIV、IDIV 的寄存器进行配置,一共有 14 个状态, 除了 CFG_IDLE(初始状态)和 CFG_DONE(配置完成状态),剩下的 12 个状态均是先配置寄存器, 然后读出数据.例如在 ODIV0_CFG1 状态下,为了配置输出分频系数,根据我们的寄存器地址表, 可以知道其地址为 0,故 addr<=0,高八位是输出分频系数,低八位是占空比系数,所以wdata<={odiv_ratio,odiv_duty}.然后拉高 apb_wr_r 表示进行写.剩下来的每个写数据均是如此, 只需要修改地址和写入的数据即可。
而 ODIV0_CFG1_RD 状态就是当写完之后,把 apb_wr_r 拉低表示读数据,地址不变,写数据情空,读出数据,验证写入是否正确。之后的每个状态操作均一致,知道配置完 ODIV、FDIV、MDIV 、IDIV 的寄存器就跳转到 CFG_DONE 状态,表示配置完成。
ODIV0_CFG2 则是配置相位,相位不改变,所以全部给 0.因此,接下来的操作其实就是配置分频系数和占空比,然后读出,然后配置相位,然后读出.反复操作,直到全部配置完成。
具体讲解,大家可以看视频讲解部分,至于 VESA 时序也将在应用篇讲解,这里只是简单演示动态配置时钟输出不同分辨率的彩条作为演示,效果比较直观。目前读者只需要知道不同的分辨率都会有不同的像素时钟即可。
以下是上板现象图:
(图12)
输出彩条即表示实验成功,默认输出 1080p 60hz,按下 key1 切换分辨率,key2 复位。(图 5 最左边是白色 文字是文档中打上去的,避免以为是空白)。