MicroBlaze软核开发(三):DDR + FLASH

实现功能:使用 MicroBlaze软核,配置 DDR、Flash 接口,并将程序烧写固化到Flash,每次启动 FPGA 时自动运行 Flash 中的程序 。

Vivado版本:2018.3

FPGA:Xilinx Artix-7 系

目录

引言

Vivado部分:

一、配置时钟

二、配置MIG (DDR接口)

三、配置Quad-SPI (FLASH接口)

四、配置MicroBlaze

五、生成HDL文件编译

SDK部分:

一、导出硬件启动SDK

[二、新建 ddr_flash 工程](#二、新建 ddr_flash 工程)

[三、新建 bootloader 工程](#三、新建 bootloader 工程)

四、烧写Flash

五、验证

引言

在" MicroBlaze软核开发(一)和(二)介绍了如何使用 Vivado 和 SDK 进行 MicroBlaze 软核开发,本文将继续介绍如何使用 MicroBlazeMicroBlazeMicroBlaze 软核,配置 DDR 和 Flash 接口(以 DDR2 为例,DDR3 同理),并将软核上编写的应用程序烧写固化到FLASH中,每次启动 FPGA 自动运行 Flash 中的程序。

Vivado部分:

首先新建一个RTL工程,并选择好FPGA芯片的型号.

一、配置时钟

(1)创建设计块,命名后点OK(本例用默认名),进入设计界面后点击添加IP按钮,搜索clk,选择 Clocking Wizard ,双击添加

(2)双击生成的clk,进行时钟配置:首先时钟输入为100MHz,单端时钟输入(根据开发板实际配置情况进行设置)

(3)接着设置3个时钟输出,clk_out1、clk_out2、clk_out3 频率分别设为 324.992 MHz、200MHz、50MHz(分别用于MIG系统时钟、MIG参考时钟、FLASH时钟,后面会解释为什么分别设置这些频率大小)。并将复位信号设为低电平有效。

二、配置MIG (DDR接口)

(1)我所用开发板为Xilinx 7系 FPGA, 支持使用 MlG (Memory interface Generator 存储器接口生成器) 生成 DDR 接口。用户手册中DDR2的介绍如下图,核心参数有:

1.推荐时钟周期为 3077ps (即频率为1/3077ps 约 324.992 MHz 用作MIG的系统时钟)

2.数据宽度为 16位

(2)添加并搜索 MIG,选择 MlG 7 Series (7系 存储器接口管理器)双击添加。

(3)双击MIG模块,开始配置MIG:

(3)-1:可选择兼容以下芯片,不需要兼容就不勾选,直接NEXT

(3)-2:根据DDR选择(我的FPGA是DDR2)

(3)-3:根据FPGA开发板用户手册提供的DDR参数进行配置:(其他保持默认即可)

(3)-4:管脚模式选择,这里选择第二个进行配置;接着点击读取XDC或者UCF文件直接导入管脚配置(我这里已有UCF文件所以直接导入),再点击Valid 检查是否有效,成功后才可NEXT

(3)-5:接着一路NEXT,最后生成得到的MIG模块如图所示:

(4)接下来将连接MIG的时钟输入,如图所示:

系统时钟sys_clk_i 频率为324.992 MHz 对应连接 clk_out1 ;

参考时钟clk_ref_i 频率根据MIG参考手册需要 200MHz,对应连接 clk_out2;

三、配置Quad-SPI (FLASH接口)

Xilinx 的 Quad-SPI(Quad Serial Peripheral Interface 四路串行外设接口)IP是一种用于在Xilinx FPGA 和 Zynq SoC 中实现与外部闪存设备(如SPI闪存)进行数据传输的功能模块。Quad-SPI 接口扩展了传统的SPI接口,同时允许最多四条数据线上进行数据传输,从而提升了数据传输速度和带宽。

(1)点击添加按钮,搜索"SPI"双击 AXL Quad SPI 进行添加

(2)双击添加的 AXL Quad SPI 模块进行配置,我这里模式选择了 Quad 四路传输、设备选择 "Spansion" (根据板子上的Flash的制造厂商进行选择)。根据我的开发板用户手册,勾选 Enable STARTUP Primitive

(3)模块的外部时钟(ext_spi_clk)连接50MHz(clk_out3),同时添加时钟模块的时钟信号和复位信号的输入管脚,如图所示:

四、配置MicroBlaze

(1)添加并搜索 MicroBlaze,选择第一个 MicroBlaze 双击添加。

(2)点击点击"Run Block Automation"进行配置,设置本地存储和缓存大小,因为有DDR2了所以也不用设太大。时钟连接选择 MIG 的 ui_clk 。

(3)再分别添加: UART模块(波特率115200,无校验位) 和 GPIO模块 (两个4位位宽端口) ;再点击"运行自动连接",得到如下电路:

1.再将时钟MIG复位信号线删除,重新连接到时钟模块的复位信号线,共用一个rst

2.把GPIO1、2通道管脚重命名一下(分别给led和switch)

3.选中 MIG 的DDR信号线右键 "Make External " 设一个引脚出来

4.最终得到如下电路,点击"Validate Design"检查电路是否有效,最后检查结果无误

五、生成HDL文件编译

这一部分和 "MicroBlaze软核开发(一):Hello World " 中相同,不再赘述

(1)到src栏右键设计块,生成HDL包装文件

(2)依次进行:Run Synthesis 综合、Run implementation 部署

(3)再配置管脚:根据开发板情况自行配置,其中包括对SPI接口管脚进行配置,需要参考 开发板的用户手册进行配置(前面在配置 Quad-SPI 时勾选 Enable STARTUP Primitive 好像会自动配置管脚)

(4)最后 Generate Bitstream 生成比特流文件

SDK部分:

一、导出硬件启动SDK

这一部分和 "MicroBlaze软核开发(一):Hello World " 中相同,不再赘述

(1)File -> Export -> Export Hardware 导出硬件: 注意勾选"Include bitstream"再导出

(2)File -> Launch SDK 启动SDK:保持默认点击OK。

二、新建 ddr_flash 工程

新建 Application Project 应用程序工程,我这里命名为 "ddr_flash",模板选择的是串口打印 Hello World 的模板工程,这个工程暂时放住,后续再进行编写(可以按照之前的教程 MicroBlaze软核开发(一):Hello World ,串口打印 Hello World 的方法先验证一下软核是否可用)

三、新建 bootloader 工程

(1)打开刚刚新建的 ddr_flash 工程的_bsp文件夹(Board Support Package文件夹,封装了特定硬件平台如开发板、FPGA等所需的软件支持),打开 system.mss 文件,点击" Modify this BSP's Settings 修改 BSP 设置 ",勾选 xilisf (Xilinx系统内和串行闪存库) 添加支持库

(2)点击"xilisf" ,根据说明配置参数(我的是Flash厂家是Spansion,第一个参数填5;Flash 接口在前面Vivado部分是通过 axi_quad_spi 的IP实现,第二个参数添1)

(3)再新建一个应用工程bootloader,该工程用于启动编写的应用程序,选择提供的模板工程 "SREC SPI Bootloader ",Finish 完成:

(4)接下来设置应用工程的地址偏移量:烧写到Flash内容是:FPGA配置文件(Vivado生成的比特流文件)+ 应用程序文件(软核文件),因此需要设置一个地址偏移量,是指软核中的程序或数据的地址偏移量。

根据开发板用户手册,我的 Flash 型号的容量为16MB 。且FPGA 配置文件(VIvado生成的比特流文件)不会超过 4MB ( 4兆字节 = 4*1024*1024 Byte ),因此将 FPGA.bit 文件烧录进去后 Flash 最多占用 4MB 空间,剩下的部分可以用于烧写用户程序或数据,所以地址偏移量至少设置为 4*1024*1024 = 4,194,304 (十进制) = 0x400000 (十六进制) 。

打开 bootloader工程 src 文件夹中的 blconfig.h 文件,在这里设置应用工程的地址偏移量。将原来默认的 0xF8000000 修改为 0x00400000 ,最后需要点击工具栏编译按钮编译一下。

四、烧写Flash

(1)生成合成文件:烧写Flash分成两个部分,一个是bit文件,一个是 bootloader 应用程序文件(bootloader.elf)。需要将两个文件合成为一个文件在进行烧录。点击烧录按钮,.elf 文件需要选择 bootloader.elf ,点击Program后会自动生成合成文件。

(2)上一步自动生成的合成文件SDK环境是存放在硬件平台文件夹下,名为 download.bit 。下点击工具栏 "烧写Flash" 按钮,选择download.bit文件、设置偏移量为0、并且选择自己的Flash型号(选错烧录会报错并提示你当前型号,再修改即可)、勾选选项进行烧录。(Flash烧录过程会有点慢,耐心等待)

(3)接下来烧写应用程序文件:前面烧写的download.bit作用是配置 FPGA 和 bootloader 启动应用程序,而启动的应用程序就是现在需要烧写的 ddr_flash 工程文件。点击 "烧写 Flash" 按钮、选择 ddr_flash.elf 文件、设置偏移量(即之前修改过偏移量)、勾选选项(尤其注意勾选第一个选项:将 elf 文件转化为可 bootloader 的 srec 文件格式)、烧录。

五、验证

到此程序固化流程结束,现在进行验证:将开发板断电重启(或者按板子上的"program"键)同时打开串口,等待结束指示灯亮起("Done"LED灯亮起表示完成)如果串口接收到 " Hello World " (ddr_flash 工程的程序功能),说明板子上电时自动运行程序了,固化成功。

最后提一下,我在最后验证时出现了问题:程序能够上电后读取Flash烧录,但是没有程序运行的现象,我猜测可能是接口配置时存在一些设置问题 ,因为我的开发板在 Vivado BD块设计部分没有可支持的板卡信息,需要自行配置。但是本教程开发流程是正确无误的,不影响学习使用。

相关推荐
ThreeYear_s6 小时前
基于FPGA 的4位密码锁 矩阵键盘 数码管显示 报警仿真
fpga开发·矩阵·计算机外设
Anin蓝天(北京太速科技-陈)12 小时前
252-8路SATAII 6U VPX高速存储模块
fpga开发
如何学会学习?14 小时前
2. FPGA基础了解--全局网络
fpga开发
Anin蓝天(北京太速科技-陈)15 小时前
271-基于XC7V690T的12路光纤PCIe接口卡
嵌入式硬件·fpga开发
碎碎思18 小时前
FPGA新闻速览-WiMi开发基于FPGA的数字量子计算机验证技术
fpga开发·量子计算
hi941 天前
Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核
嵌入式硬件·fpga开发·vivado 远程开发·vmware网络配置
乘风~&2 天前
基于发FPGA 练手智能小车顶层文件
fpga开发
_Hello_Panda_2 天前
高云GW5AT系列FPGA在接口扩展和桥接领域的应用方向探讨分享
fpga开发·高云·gw5at
aningxiaoxixi2 天前
音频接口:PDM TDM128 TDM256
fpga开发·pcm
希言自然也2 天前
赛灵思ZYNQ系列的启动过程分析
嵌入式硬件·fpga开发