注:
① 本应用笔记的 Demo 基于 QuartusII13.0 版本
② 本应用笔记适用于 28nm 器件,以 Cyclone5 为例来描述,其它系列器件大同小异,详细可以参考附录
中的相关文档
ALTERA 28nm 器件在 Transceiver 的独立例化上和老器件对比,有了很大的变化。 IP 例化工具 MegaWizard Plug-in Manager 中专门有一组 Transceiver PHY IP 用于实现 Transceiver的例化,如下图所示。
重配置 IP(Transceiver Reconfiguration Controller)可以对这些 PHY IP(Custom PHY,Native PHY, Low Latency PHY, Deterministic Latency PHY)实现动态重配。动态重配包含很多方面,本应用笔记专门介绍重配置 IP 的 Streamer 模式,并以 CYCLONE5 为例,演示Streamer 模式实现 Custom PHY IP 的 Channel 和 PLL 动态重配置。
在进入正题之前,先介绍一下重配置 IP 例化时的几个重要参数的设置。第一个就是Interface Bundles,参见下图,包含两个选项: Number of reconfiguration interface 和 Optional
interface grouping。 Number of reconfiguration interface,顾名思义就是这个重配置 IP 一共有多少个重配置接口; Optional interface grouping 是对这些重配置接口进行分组。为什么还要对这些重配置接口进行分组呢?原因很简单, 一个重配置 IP 可以对多个 PHY IP 实现动态重配,要配置多少个 PHY IP,就分多少组,每组的个数就是对应的 PHY IP 所需要的重配置接
口数。分组的格式在 IP 例化界面已经给了说明:用逗号分割,如果只有一组就空缺,啥都不需要填。举个例子,重配置 IP 需要对三个 PHY IP 进行重配,分别需要 2, 4, 2 个重配置接口, 那么 Number of reconfiguration interface 就填 8, Optional interface grouping 就填 2,4,2。做了个简单的测试,发现填 2,4 也没问题,原因是它会把剩下没分组的接口归为默认的一组,
这也就是为啥只有一组时可以啥也不填了。
另外一个重要的参数就是 Reconfiguration Features,也包含两个选项:Enable channel/PLL reconfiguration 和 Enable PLL reconfiguration support block,第一个选项选中时,后一个选项默认会选中。本笔记是介绍重配置 IP 的 Steamer 模式,而该模式就是实现 Channel 和 PLL的动态重配置,所以没啥好说的,赶紧把 Enable channel/PLL reconfiguration 选中。
插个题外话:如何知道例化的 PHY IP 需要多少个重配置接口呢?很简单,在例化 PHY IP时它会告诉你,如下图中红框已经醒目的圈出了。
重配置 IP 和 PHY IP 的连接示意图如下所示,可以清楚的看到重配置 IP 有三个接口:
①重配置管理接口(Reconfiguration Management Interface),② MIF 导入接口(MIF
Reconfiguration Interface),③Transceiver 重配置接口(Transceiver Reconfiguration)。它支持两类配置模式: Register Based 和 Streamer Based。两类模式不完全重叠,意思就是有的配置
功能前者支持,有的配置功能后者支持,有的两者都支持,例如 Pre-CDR 和 Post-CDR 的环回模式只能由前者搞定, PLL 的速率和 Channel 的位宽只能由后者搞定,而 PMA 的设置两者都能搞定。前者操作简单不做过多啰嗦,后者是基于 mif 文件实现重配置,是本应用笔记
讲述的重点。
Streamer Based 在操作上分为两种:一种是通过 MIF 导入接口将 mif 文件自动导入,实现重配置;另一种是将 mif 文件的内容通过重配置管理接口直接写入,也称为 direct write
模式。前者需要在 MIF 导入接口上挂接一个 ROM,该 ROM 存放 Channel 和 PLL 的 mif 文件。通过重配置管理接口操作流模式寄存器组(Streamer Module Registers)触发重配置,MIF 导入接口自动将 ROM 中的 mif 文件导入实现重配置。后者通过重配置管理接口操作流模式寄存器组,将 mif 文件中的寄存器配置内容直接写入到对应地址。
看到这里,估计你已经懵了,脑袋里产生很多疑问:流模式寄存器组是什么?该组有哪些寄存器?寄存器的含义是什么?具体怎么操作? mif 文件是怎么产生的?格式又是怎么样的? direct write 模式要写些什么东西? Very Good,有这些疑问说明你在思考,等这些问题搞清楚了,也就表明你已经明白怎么用 Streamer Based 实现 Channel 和 PLL 的重配置了。
重配置 IP 的流模式寄存器组(Streamer Module Registers)
重配置IP的重配置管理接口(Reconfiguration Management Interface)是一个Avalon-MM
Slave总线接口,该Slave接口的地址位宽是[6..0],寻址空间为128,也就是说该接口可以定义128个寄存器。流模式寄存器组就是该Slave空间中定义的一组寄存器,一共有5个,分别是地址7’h38(logical channel number), 7’h39(physical channel address), 7’h3A(control and
status), 7’h3B(streamer offset), 7’h3C(data),括弧中给对应地址寄存器起了个名字。如果你不知道如何通过Avalon-MM Slave总线接口来操作这五个寄存器,那你可真得去补补Avalon-MM总线协议标准的课了。需要特别强调的是流模式寄存器组不仅包含这五个寄存器, 还在此基础上定义了一组间接寻址寄存器组, 一共有三个, 偏移量(offset)分别是0,1,2。所谓的间接寻址是指通过streamer offset寄存器和data寄存器实现这些间接寻址寄存器的读写操作。间接寻址的操作会繁琐很多,不清楚ALTERA为啥这么整,唯一能想到的理由是寻址空间扩大了,但是有这个必要吗?不解释!
我把手册上的寄存器定义原封不动的搬过来,大家一起看一下,没有翻译成中文,个人觉得英文解释更清楚, 更准确, 没必要再画蛇添足了。嘿嘿, 根本原因还是本人翻译能力差!下面对寄存器中几个重要的地方做一下解释。
首要的是对逻辑通道号(Logical channel number)的理解。这个不理解那就说明你不知道要配哪个通道,剩下的就可以免谈了。举个具体的例子做说明,例化了一个重配置IP有三组重配置接口(2,4,2),第一组的两个重配置接口的逻辑通道号分别是0,1,第二组的逻辑通道号分别是2,3,4,5, 第三组的逻辑通道号是6,7。 例化了一个Custom PHY有两个数据通道(需要多少个重配置接口就不需要我再啰嗦了吧!)。用重配置IP的第二组重配置接口配置这个
Custom PHY,如果要配置Custom PHY的第一个通道,那么对应的逻辑通道就是2。比较疑问的地方是,在例化Custom PHY时如果Number of Lanes设置成N时,需要N个重配置接口分
别对N个Transmit PLLs进行重配。实际上它是共用了一个Transmit PLL(可能是CMU也可能是fPLL), 按我的理解这N个重配置接口都是配置的同一个Transmit PLL, 所以用哪一个都行,这个我没有试验过,因为做demo时N设置成1了。
上文说过了Streamer Based在操作上分为两种,具体是在control and status寄存器的bit[3:2]上做设置, 2’b00表示通过MIF导入接口将mif文件自动导入, 2’b01表示direct write。间接寻
址寄存器组的offset0寄存器用来设置ROM中mif文件的的起始地址,这个很重要,后面会讲到,大家留心! MIF导入接口支持字节寻址,也支持半字(16bits)寻址,具体是在offset1
寄存器的bit[1]设置,这个也很重要,也请多关照!还有就offset1寄存器的bit[0],是用来触发MIF导入接口的导入操作。
在这里我简单介绍一下间接寻址寄存器读写操作的流程,
写流程:
1) logical channel number寄存器中填入要配置的逻辑通道号;
2) streamer offset寄存器中填入间接寻址寄存器的偏移量(offset),例如要设置ROM中mif文件的起始地址,也就是要配置offset0寄存器,则在streamer offset寄存器中填0;
3) data寄存器中填入要写入的数值;
4) control and status寄存器的bit[0]置‘1’,启动间接寻址寄存器的写操作。记住bit[0]是自动
清零的,不需要你重复清零劳动。
读流程:
1) logical channel number寄存器中填入要配置的逻辑通道号;
2) streamer offset寄存器中填入间接寻址寄存器的偏移量;
3) control and status寄存器的bit[1]置‘1’,启动间接寻址寄存器的读操作。同样的, bit[1]也是自动清零的;
4) 查询control and status寄存器的bit[8]是否为‘0’, ‘0’表示读操作已经完成,进行第5步;
5) 读取data寄存器的值,该值就是要读取的间接寻址寄存器的值。
Transceiver PHY IP的Channel和PLL的mif文件
到这里,我已经把一半的疑问解答了,下面介绍Channel和PLL的mif文件是怎么产生的?格式又是怎么样的?
Channel和PLL的mif文件的产生很简单,在QII中点一个按钮就行,那就是全编译 ,因为在编译的Assembler阶段, QII会自动生成PHY IP的Channel和PLL的mif文件(该mif文件中包含Channel和PLL的参数设置)。具体会在工程的根目录下生成一个reconfig_mif文件夹,工程中每一个例化的PHY IP的每一个通道(包括Channel和PLL)都会生成一个对应的mif文件。当然,产生mif文件的前提是例化PHY IP时得把允许PLL和Channel重配的选项使能。
如果你要采用direct write模式实现动态重配,就有必要了解mif文件的格式了。 mif文件以信息记录(records)的形式保存Channel和PLL的参数设置,每一个信息记录是16bits。信息记录分两类:非数据信息记录(non-data records)和数据信息记录(data records)。每一个信息记录的高5位是长度域(length field),长度域为0表示该信息记录是非数据信息记录,长度域不为0,表示该信息记录是数据信息记录。需要强调的是信息记录只是标识符,它不
是实际的寄存器配置值, 也就是说mif文件是由信息记录和实际的寄存器配置值共同组成的,往下看大家就会理解我这句话的含义!
非数据信息记录目前定义了五种操作码,由信息记录的低五位来标识,如下表所示,分别是“00001”(Start of MIF),“00010”(Channel format indicator),“00011”(Reference Clock
switch),“00100”(CGB switch),“11111”(End of MIF)。每一个mif文件都会包含该表中的五种非数据信息记录。数据信息记录的高五位表示紧跟着该记录有多少个寄存器配置值,低
11位表示紧跟着该记录的这些寄存器配置值对应的寄存器起始地址。
估计你看了有点绕,没关系,看一下下面的mif文件结构表就明白了,同时我也附上了
一个实际的mif文件截图,方便对照 。
结构表中第0,1,2和<n>+3行都是非数据信息记录,第三行是数据信息记录,长度是3,所以紧跟着该记录的第4,5,6行是寄存器配置值,数据信息记录的低11位(Offset Address N)表示这些寄存器配置值对应的寄存器起始地址,也即是说第4行寄存器配置值对应的寄存器
地址是Address N,第5行对应的寄存器地址是Address N+1,第6行对应的寄存器地址是Address N + 2。对比于下图中PLL的实际mif文件,可以看出第3行“0010100000001110”的长度域是“00101”,非0,表示是数据信息记录,那么4,5,6,7,8行都是寄存器配置值,对应的寄存器地址分别是“00000001110”, “00000001110 +00 1”, “00000001110 +0 10”,“00000001110 + 011”,“00000001110 + 100”。看到这里相信大家应该明白direct write模式要写些什么东西了吧?!就是把mif文件中的这些寄存器配置值写到对应的寄存器中, 怎么写?当然是通过重配置管理接口, data寄存器填入配置值, streamer offset寄存器填入地址值,然
后触发一下写。不明白我在说什么吗?那一定是前面的内容没有好好看,再回顾一下!顺带提一下,如果mif文件中寄存器配置值很多,那么间接寻址就发挥作用了!
啰嗦了这么多,概括起来重配置IP的Streamer模式实现Transceiver PHY IP的Channel和PLL动态重配置就下面几个步骤(针对MIF导入接口直接导入mif文件的方式):
1) 搭建工程,例化Transceiver PHY IP,例化时别忘了选中相关的重配选项,以Custom PHY为例,需要选中Reconfiguration标签页的Allow PLL/CDR Reconfiguration选项,编译工程后得到所有Channel和PLL的mif文件;
2) 修改Transceiver PHY IP的设置,重新编译后得到新的mif文件;
3) 将两种设置的所有mif文件合并成一个大的mif文件预存入ROM中;
4) 通过重配置管理接口操作流模式寄存器组,想重配置哪个通道,就填写相应的参数(主
要是逻辑通道号和相应mif文件在ROM中的起始地址),操作offset1寄存器的bit[0],发起
重配置,该bit也是自动清零,不需重复清零劳动。
Custom PHY的Channel和PLL动态重配Demo
到这里,我已经把所有的疑问都解答了,还是很糊涂吗?没关系,下面我们来个实际的demo,做一下仿真,相信大家会更清楚一点。简单介绍一下demo的设计思路, demo的顶层框图如下所示,重配置IP挂接ROM,写了一个重配置测试激励驱动重配置IP的重配置管理接口,操作流模式寄存器组,重配置Custom PHY的Channel和PLL,实现Custom PHY工作速率的动态切换。
Custom PHY例化成单Lane,设置了两种速率3.125G和1.25G, Channel的位宽设置没有做更改,编译后得到两组共4个mif文件, 3.125G速率的Channel mif文件和PLL mif文件, 1.25G速率的Channel mif文件和PLL mif文件,手动修改mif文件名:
<project_root_dir>/reconfig_mif/custom_phy_c5_inst_channel-1250.mif</project_root_dir>
<project_root_dir>/reconfig_mif/custom_phy_c5_inst_txpll0-1250.mif</project_root_dir>
<project_root_dir>/reconfig_mif/custom_phy_c5_inst_channel-3125.mif</project_root_dir>
<project_root_dir>/reconfig_mif/custom_phy_c5_inst_txpll0-3125.mif</project_root_dir>
注意:编译时自动生成的mif文件采用默认的文件名,所以生成后及时的手动修改一下文件名,不然重新编译时会被新生成的mif文件覆盖掉。将这些mif文件合并成一个大的mif文件作为ROM的初始化文件。有人会问怎么合并mif文件,很简单,先打开一个mif文件,将
“CONTENT BEGIN”与“END”之间的内容Ctrl+C,然后Ctrl+V到另一个mif文件的最后一个信息记录后面,别忘了修改拷贝进来的mif文件在ROM中的地址,如下面的截图所示custom_phy_c5_inst_txpll0-3125.mif拷贝进来后地址从81开始。最后请记录下每个mif文件的
非数据信息记录(Start of MIF)在ROM中的地址,重配置时需要用到,如下图中custom_phy_c5_inst_channel-1250.mif在ROM中的起始地址是93(0x5d)。
搞定mif文件后,接下来就是搭建仿真环境,先写个tb,提供时钟和复位,并对接CustomPHY收发通道。 28nm器件Transceiver在仿真上也和以往的不同了,生成IP时会对应生成一个“IP name_sim”的文件夹,该文件夹中包含了专门用来对Transceiver进行仿真的模型文件。用Modelsim仿真的话,“Mentor”子文件夹中包含了一个TCL文件msim_setup.tcl,构建了一些建库,编译库文件和编译源文件的宏定义。参照这个TCL文件的格式,把Custom PHY的msim_setup.tcl和Reconfiguration IP的msim_setup.tcl结合起来做适当修改,再写个.do文件调用这些宏定义编译库和仿真模型。这些具体的操作细节超出了本应用笔记的范畴,不做过多啰嗦。
重配置IP的MIF导入接口是AVALON-MM master接口,只包含了读相关信号,手册上没有给出接口波形,所以ROM怎么例化,怎么和MIF导入接口对接,还得自己去摸索。这手册写的,唉,不评论!这一块的设计,我参照了应用笔记AN676的demo,如下图的连接框图。
有三个地方需要注意,第一个是ROM例化时需要去掉输出数据的寄存,如下图所示,不要选中 ‘q’ output port选项;第二个就是MIF导入接口的reconfig_mif_waitrequest信号的连接,
参照上图,使用reconfig_mif_read信号反向并寄存一级后输入。这些做法无非就是时序的配合,没有既定讲究。第三个是reconfig_mif_address和ROM地址的对接,还记得我提醒大家需
要关照的offset1寄存器的bit[1]设置吗? MIF导入接口支持字节寻址,也支持半字寻址,因为mif的信息记录是以16bits为单位的,没理由ROM不设置成16bits位宽, MIF导入接口的寻
址自然也设置为半字。这样地址对接时, reconfig_mif_address[n..1]和ROM的address[n-1..0]
相连, reconfig_mif_address[0]悬空。
到此所有的准备工作都做好了,打开modelsim,定位到仿真文件夹,敲个do run.do,仿
起来吧! 下面我们讨论下仿真结果,整体的仿真波形图如下所示, 1框中是PLL的重配置波
形, 2框中是Channel的重配置波形。
- Custom PHY的初始速率设置为3.125G, Fabric和Transceiver的接口位宽是16位, rx_clk
和tx_clk的时钟是156.25M,周期为6.4ns,如下图所示。 -
下图是1框(PLL重配置)的展开图, 1-1框中是重配置测试激励驱动重配置IP的重配置管理接口时的波形。只强调一个地方:大家是否还记得需要留心的offset0寄存器,因为这里是把PLL的设置从3.125G切换到1.25G,所以需要导入1.25G速率的PLL mif文件,该文件在ROM中放置的起始地址是0xae(具体可以参见仿真工程中初始化ROM的mif文件streamer_cfg.mif,当然这个地址不是固定的,你可以随意调整),在触发配置前得把这个值写入到offset0寄存器中。 1-1框中的操作完成后紧接着1-2框中是MIF导入接口导入1.25G速率的PLL mif文件,实现重配置。从1-3框中可以看到在配置的过程中PLL发生失锁,后面给出了1-3框的放大图,重新锁定后输出时钟的频率已经发生变化,由原来的156.25M变成了62.5M。
-
下图是2框(Channel重配置)的展开图, 2-1框中是重配置测试激励驱动重配置IP的重配置管理接口时的波形, 同样的强调一下, 需要在offset0寄存器中填入1.25G速率的Channel mif文件在ROM中的起始地址,这里是0x5d。 2-2框中是MIF导入接口导入1.25G速率的Channel mif文件,实现重配置。从2-3框中可以看到在配置的过程中rx_ready有一段时间变成了低电平,这个时候CDR在重新Lock-to-data,锁定后恢复出来的时钟频率已经发生变化,由原来的156.25M变成了62.5M,后面给出了2-3框的放大图。PHY IP从3.125G速率切换到1.25G速率的动态重配置已经完成,你也可以随时的把速率再切回去,还是要强调的是切回去时offset0寄存器需要填写对应mif文件在ROM中的起始地址!
到此,这篇应用笔记也该结束了,还是一头雾水吗?那我就郁闷了,只能说我写的太烂了。怎么办?建议阅读附录中ALTERA的IP手册吧,另外我在附录中对本应用笔记的demo做了说明,有需要可以发给大家参考,或许能进一步理解,做的比较粗糙,将就着用用。
附录 A
本应用笔记的参考文档列表:
本应用笔记的参考文档列表:
- ALTEAR 28nm 器件 Transceiver PHY IP 的使用手册:
http://www.altera.com/literature/ug/xcvr_user_guide.pdf - ALTERA 28nm 器件 handbook 的 Transceiver 重配置章节:
Cyclone5 http://www.altera.com/literature/hb/cyclone‐v/cv_53007.pdf
Arria5 http://www.altera.com/literature/hb/arria‐v/av_53007.pdf
Stratix5 http://www.altera.com/literature/hb/stratix‐v/stx5_52008.pdf - 动态重配的应用笔记 AN676: http://www.altera.com/literature/an/an676.pdf
附录 B
Demo 包含两部分内容,一个是实际的工程,另一个是仿真工程,如下图所示,其中 sim文件夹中是仿真工程, custom_phy_C5 中是 Custom PH IP, reconfig_C5 中是重配置 IP。
打开该工程,全编译后就可以生成 Custom PHY 的 Channel 和 PLL 的 mif 文件,编译前记得先打开 PHY IP 做一下参数设置,编译后别忘了改一下 mif 文件名便于保存。sim
文件夹的内容如上图所示,对这些文件做一个简单的说明:mif_rom.v
是 ROM 文件的 IP 文件streamer_cfg.mif
是合并后的 mif 文件,用来初始化 ROMdriver.vhd
是重配置测试激励custom_phy_c5.v
和文件夹 altera_xcvr_custom_phy
是 Custom PHY 的仿真模型reconfig_c5.v
和文件夹 alt_xcvr_reconfig
是重配置 IP 的仿真模型C5_Transceiver_test.v
是测试工程的顶层custom_phy_c5_tb.v
是 Test Bench
在 mentor 文件夹下有两个文件 msim_setup.tcl
和 run.do
, 其中 msim_setup.tcl
中已经构
建好了“建库,编译器件库,编译仿真模型,编译测试代码和启动仿真”等宏,唯一需要修
改的地方是:器件库的路径,如下图所示,改成你的 QII 安装目录。 run.do 文件中调用这些
宏来完成相应的编译工作,并启动仿真。
所以你要拿这个 demo 仿真时很简单,三步走:
第一步修改 msim_setup.tcl 中库文件目录
第二部打开 modelsim,定位到 mentor 文件夹
第三步运行 run.do 文件。
其他的,在此基础上自由发挥吧!
没有回复内容