时间:2024-08-07 来源:网络搜集 关于我们 0
在上一篇文章中,我利用一些比较容易获取的资源生成了一个适合Xilinx VC709开发板的Vivado工程,并制作出包含bitstream、fs-boot、u-boot、linux、rootfs的FLASH文件,使开发板可以启动并进入Linux命令行。
本文将描述如何将此工程移植到一块国产FPGA开发板上,我们可以认为此国产板上的FPGA芯片和VC709上的芯片完全相同(你懂的),但外围电路有不小的差异。我通过阅读国产板的原理图,并和VC709的文档(https://www.xilinx.com/support/documents/boards_and_kits/vc709/ug887-vc709-eval-board-v7-fpga.pdf)做比较,找出了所有的差异。随后按照差异在原有VC709的工程上做修改,使国产FPGA板也能启动并进入Linux命令行。
接下来的每一步都将先描述一个硬件差异(共六个),然后解释如何修改Vivado工程。
从VC709的文档中,我们可以看到板子上有8个LED。并且都是(FPGA输出)高电平驱动的。
这8个LED分别对应了如下的FPGA芯片管脚。
在工程的约束文件fpga-drive-aximm-pcie\Vivado\src\constraints\vc709.xdc中,有如下几行。
#GPIO LEDsset_property PACKAGE_PIN AM39 [get_ports mmcm_lock]set_property IOSTANDARD LVCMOS18 [get_ports mmcm_lock]set_property PACKAGE_PIN AN39 [get_ports init_calib_complete]set_property IOSTANDARD LVCMOS18 [get_ports init_calib_complete]set_property PACKAGE_PIN AR37 [get_ports user_link_up_0]set_property IOSTANDARD LVCMOS18 [get_ports user_link_up_0]再结合前文中提到的block design的图,如下,注意图右边的一系列外部连接。
我们可以知道:
①VC709工程使用了三个LED灯,分别命名为mmcm_lock、init_calib_complete和user_link_up_0。前两者表示DDR控制器(MIG)的状态,后者表示PCIe的链接状态。
②这三个LED分别使用了FPGA芯片上的三个pin,即AM39、AN39、AR37。对应上表(Table 1-19)中的GPIO_LED_0、GPIO_LED_1和GPIO_LED_2。
以上是Xilinx VC709开发板上LED相关的情况,让我们再看下国产FPGA板上LED是怎么连接的。在国产FPGA板的电路图中,我找到了如下一些片段。
从上面这些片段可以看出:
①驱动LED的FPGA pin为AR42、AT42、AU39和AV39。
②LED变成了(FPGA输出)低电平驱动。
以上两点就是硬件上的主要差异,我们可以据此修改FPGA工程。
首先是修改约束文件(最好拷贝后重新建一个),将vc709.xdc中LED相关的几行修改为下面这样。
#GPIO LEDsset_property PACKAGE_PIN AR42 [get_ports mmcm_lock]set_property IOSTANDARD LVCMOS18 [get_ports mmcm_lock]set_property PACKAGE_PIN AT42 [get_ports init_calib_complete]set_property IOSTANDARD LVCMOS18 [get_ports init_calib_complete]set_property PACKAGE_PIN AU39 [get_ports user_link_up_0]set_property IOSTANDARD LVCMOS18 [get_ports user_link_up_0]然后在BD(block design)中加上三个非门。见下图。
图中在原有设计的基础上新加了三个IP——Utility Vector Logic,并全部做如下配置。
原约束文件中并没有配置FPGA芯片的reset管脚,说明这是个板级配置。
我们到VC709的文档中去查找它的具体情况。见下面这两个地方。
所以我们可以知道:
①FPGA芯片的AV40管脚连接了reset信号。
②reset信号是高电平有效。(平时运行时为低电平。按下reset按键为高电平,起到复位FPGA芯片的作用。松开按键为低电平,FPGA即可重新启动)
类似的,我们再到国产FPGA板卡的电路图中查看相关的连接情况。见下面这两个片段。
从中我们可以得知:
①FPGA芯片的管脚AH31负责接收reset信号。这一点和VC709不同。
②reset信号变成了低电平有效(平时为高电平,按下reset按键后为低电平)。
对第①点,修改起来比较容易,只需要在约束文件中添加如下两行。
#CPU resetset_property PACKAGE_PIN AH31 [get_ports reset]set_property IOSTANDARD LVCMOS18 [get_ports reset]对第②点,原理上也比较容易,在BD中的reset信号后面添加一个非门即可,但实际上却并不生效。只好采用了修改顶层封装的方法,主要是加类似下面这一句:
assign reset_in = ~reset;
工程中使用了一个名为AXI UART 16550的IP负责串口输出。从它的配置(如下)中我们可以知道它使用了板上的固定配置的接口rs232 uart。
从VC709的文档中,可以确认它使用了AU36和AU33两个管脚负责uart信号的TX和RX。
但在国产FPGA的电路图中,我没有找到专门的UART接口(国产仍需努力啊,这对用户很不友好)。所以只好找两个GPIO接口来替代。最终决定使用AN38和AP38两个pin用于UART的输出。
除了硬件上的连接外,我们还要在约束文件中加入下面几行:
#uartset_property PACKAGE_PIN AN38 [get_ports rs232_uart_txd]set_property IOSTANDARD LVCMOS18 [get_ports rs232_uart_txd]set_property PACKAGE_PIN AP38 [get_ports rs232_uart_rxd]set_property IOSTANDARD LVCMOS18 [get_ports rs232_uart_rxd]在VC709文档的Table 1-6中,可以找到FLASH连接所用的所有地址线和数据线对应的pin。
下面展示此表的一部分。
经过和国产FPGA的电路图对照,我发现两个板子大部分的地址和数据线对应的pin相同。除了最高位的两根地址线。国产板使用了BB38和AY38。
修改方法比较简单,只需要在约束文件中添加下面几行:
#FLASH IOset_property PACKAGE_PIN BB38 [get_ports {linear_flash_addr[25]}]set_property IOSTANDARD LVCMOS18 [get_ports {linear_flash_addr[25]}]set_property PACKAGE_PIN AY38 [get_ports {linear_flash_addr[26]}]set_property IOSTANDARD LVCMOS18 [get_ports {linear_flash_addr[26]}]在原有工程的约束文件中,有如下几行:
set_property PACKAGE_PIN AB8 [get_ports {ref_clk_0_clk_p[0]}]set_property PACKAGE_PIN AB7 [get_ports {ref_clk_0_clk_n[0]}]create_clock -period 10.000 -name ref_clk_0_clk_p -waveform {0.000 5.000} [get_ports ref_clk_0_clk_p]从中我们可以知道:
①PCIe的参考时钟从FPGA管脚AB8和AB7引入。
②参考时钟为100M。
不过国产FPGA板卡的时钟为125M,并且从FPGA管脚AD8和AD7引入(见下图)。
所以我们有必要做对应的修改。
首先是修改PCIe桥这个IP的配置,将参考时钟由100M改为125M。
然后修改约束文件:
set_property PACKAGE_PIN AD8 [get_ports {ref_clk_0_clk_p[0]}]set_property PACKAGE_PIN AD7 [get_ports {ref_clk_0_clk_n[0]}]create_clock -period 8.000 -name ref_clk_0_clk_p -waveform {0.000 4.000} [get_ports ref_clk_0_clk_p]两个板子DDR相关的配置差异比较大,首先它们使用的DDR芯片不同,然后地址和数据线对应的pin也不一样。
好在国产FPGA的厂商提供了这个IP的配置工程,引用后就基本可用了。下面简单介绍一下方法。
首先我们到BD中去右键点击MIG这个IP,然后点Customize Block,在出现的窗口中点击Next,出现下面这个界面。选择“Verify Pin Changes and Update Design”。
接下来会让你选择工程文件和XDC文件。
我做了如下配置(图中文件是厂家提供的),继续点next。
接下来会让你确认所有的pin是否正确。经过和电路图作比较,确实完全正确。然后点击下面的validate。继续Next。
根据国产FPGA的电路图(如下),DDR的参考时钟来自AY18和AY17两个管脚。
所以在接下来的界面中需要修改参考时钟引脚。
最后一路Next,最后点generate,即可生成正确的MIG配置。