本文档系列是我在实践将神经网络实现到Xilinx 的zynq的FPGA上遇到的问题和解决方法。
背景:FPGA的片上BRAM空间较少,难以实现大量的存储。DDR的内存空间较多,若作为global memory将能实现很多问题。
目的:PS(片上ARM)通过MIG调用DDR
参阅的文档:DS176:Zynq-7000 AP SoC and 7 Series FPGAs Memory Interface Solutions Data Sheet
UG586: zynq-7000 AP Soc and 7 Series Devices Memory Interface Solutions
Xilinx zynq系列FPGA实现神经网络中相关资源评估
FPGA基础知识(六)UG586 Mermoy Interface Solutions
ARM用MIG调用DDR3的c程序解析
流程中其他步骤:
实践教程(一)用HLS生成IPcore
实践教程(二)连接片上ARM
实践教程(三)系统搭建与烧录
实践教程(四)片上ARM运行程序
实践教程(五)PS用MIG调用DDR
目录
一、创建工程
二、创建与定制MIG IP
三、定制processing system
四、搭建系统
五、SDK
六、用FPGA运行
1.1 打开vivado, 创建工程,RTL project,板子选择xc7z035ffg676-2
1.2 创建block design
2.1 添加MIG,双击MIG IP
2.2 默认一个控制器,AXI4接口
2.3 next,选DDR3 SDRAM(SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。)
2.4 默认设置800MHz时钟,然后修改Memory Part为MT41K256M16XX-125,这个在列表中靠下的位置,看清楚不要选错,Data Width选择32位,其他设置默认
2.5 AXI的Data Width选择64位和PS的HP接口对应,或者32位和GP接口对应。这里的data width表示AXI读与写的通道数
址线读写仲裁选择ROUND_ROBIN( Round Robin:轮询调度, 是一种以轮询的方式依次将一个域名解析到多个IP地址的调度不同服务器的计算方法。),其他默认
2.6 因为刚才选了800MHz和4:1,所以这里的输入时钟选择200MHz,这个时钟是PLL输入的时钟(CLKIN),其他默认
2.7 系统时钟来自于FPGA内部,这里选择No buffer,其他默认
2.8 内部终端电阻选择50欧姆
2.9 开发板是固定的,所以选择fixed pin out
2.10 选择read XDC/UCF,这个是管脚分配的文件,选择开发板默认的DDR管脚分布。
2.11 点击validate之后一直点next,最后accept,generate
3.1 加入ZYNQ7 processing system
3.2 双击IP进行配置,先应用开发板的配置(Zedboard),配置起来更快。
3.3 配置MIO,bank0配置为3.3V,bank1配制为1.8V
3.4 检查各个外设是否与MIZ7035的核心板匹配,MIO configuration中,IO peripherals中SD卡,WP信号没用,去掉
3.5 往下,eMMC需要添加SD1接口,CD和WP信号无用,不用添加
3.6 外设复位,GPIO中,ENET上电复位;USB复位在PL上,而这里只能选PS的MIO引脚,所以忽略;没有I2C,取消掉
3.7 DDR配置,Memory Part选择MT41K256M16RE-125,DQS to Clock Delay全部写0,Board Delay全部写0.25
3.8 Block Design,点击run block automation,建立PS的接口
3.9 创建clocking wizard
外部GCLK的100MHz时钟,因为直接接入了时钟引脚,选择Global Buffer
因为PL DDR3的参考时钟配置的是200MHz,这里让MMCM输出200MHz,并将Reset设置为低有效
4.1 对clock的接口进行连接
4.2 点击Run Connection Automation进行连接,
时钟选择/mig_7series_0/ui_clk(200MHz)
4.3 重新进行连线
4.4 分配地址
4.5 新建IO 约束文件,新建IO约束文件MIZ7035_IO.xdc,内容如下
create_clock -name clk100m_i -period 10.00 [get_ports clk100m_i]
set_property VCCAUX_IO DONTCARE [get_ports clk100m_i]
set_property IOSTANDARD SSTL15 [get_ports clk100m_i]
set_property PACKAGE_PIN C8 [get_ports clk100m_i]
set_property PACKAGE_PIN H7 [get_ports rst_key]
set_property IOSTANDARD SSTL15 [get_ports rst_key]
set_property PACKAGE_PIN K10 [get_ports init_calib_complete]
set_property IOSTANDARD SSTL15 [get_ports init_calib_complete]
这个文件用于对相应的管脚和板子进行约束,具体化相应的管脚。我们一定要让block design和这里的名称要保持一致。文件完成之后在加入add constraints
4.6 add constrians,create HDL wrapper,Generate output products.,generate
bitstream,生成相应的bit文件。
5.1 file-export-export hardware,需要包括相应的比特流
5.2 打开SDK,我的电脑用vivado直接打开SDK总是死机,所以我们直接打开SDK,目录改到之前vivado的目录下面,创建新的applicaiton project (这里非常需要注意,workspace、BSP、application project是很不同的)
FPGA基础知识(九)SDK相关知识
这里注意点击new,添加之前的wrapper进入,wrapper在vivado生成的文件夹的xxx.sdk之中。
5.3 选择memory test(若是加入自己写的testBench就创建空的,然后把c程序拖进去)拖到project文件夹里面
6.1 编译工程
6.2 连接FPGA,注意要用JTAG线来连,并且也要连USB。
6.3 烧写比特流进入FPGA(FPGA每断电一次,就要重新烧写一次)或者在右键HW创建。
6.4 运行及结果
Xilinx zynq系列FPGA实现神经网络中相关资源评估
FPGA基础知识(六)UG586 Mermoy Interface Solutions
ARM用MIG调用DDR3的c程序解析
流程中其他步骤:
实践教程(一)用HLS生成IPcore
实践教程(二)连接片上ARM
实践教程(三)系统搭建与烧录
实践教程(四)片上ARM运行程序
实践教程(五)PS用MIG调用DDR
FPGA基础知识(一)UG998相关硬件知识
FPGA基础知识(二)HLS相关知识
FPGA基础知识(三)UG902 接口综合
FPGA基础知识(四)UG902 RTL simulation and export
FPGA基础知识(五)系统集成知识
FPGA基础知识(六)UG586 Mermoy Interface Solutions
FPGA基础知识(七)片上单片机
FPGA基础知识(八)vivado设计流程中的知识
FPGA基础知识(九)SDK相关知识
FPGA基础知识(十)DMA与AXI4总线
尝试用IPcore调用DDR3及相关知识
vivado HLS硬件化指令(一)HLS针对循环的硬件优化
vivado HLS硬件化指令(二)HLS针对数组的硬件优化
vivado HLS硬件化指令(三)HLS增大运算吞吐量的硬件优化
vivado HLS硬件化指令(四)卷积相关的指令优化
卷积操作的HLS优化
FPGA实践教程(一)用HLS将c程序生成IPcore
FPGA实践教程(二)连接片上ARM
FPGA实践教程(三)系统搭建与烧录
FPGA实践教程(四)片上ARM运行程序
FPGA实践教程(五)PS用MIG调用DDR
FPGA实践教程(六)AXI-Lite实现PS与PL通信
FPGA实践教程(八)PS与PL共享DDR
FPGA vivado系统集成操作
DMA在linux下PS端c语言相关内容
数据流输入输出IPcore时c语言相关内容
调通DMA系统集成中遇到的问题
ARM用MIG调用DDR3的c程序解析
MIZ7035上的AXI接口的MIG测试
MIZ7035交叉编译单片机程序运行