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 工程

三、新建 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块设计部分没有可支持的板卡信息,需要自行配置。但是本教程开发流程是正确无误的,不影响学习使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11.23[大数据]

PRO1:LSTM模型预测输出都是同一个值? 画出来的图像就是一条横线 这个搜了搜,原因可能有很多,但感觉最主要的原因极可能是激活函数选择不当,以及层的搭建不合适 原模型是 REF https://zhuanlan.zhihu.com/p/654325094 https:/…

基于SpringBoot+Vue的新闻管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展,信息传播速度不断加快,新闻媒体行业面临着巨大的机遇与挑战。传统的新闻媒体正在逐渐向数字化转型,而新闻管理系统作为数字化新闻媒体的核心组成部分,其…

【C语言】完成程序设计填空

文章目录 1、请阅读下面的程序,在空白处填写正确的代码,要求各在一行从头开始输出m和n的值。2、求100~599之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。3、以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序 拆分并输出。请填空…

MySQL-DDL之数据表操作

文章目录 一. 表的创建1. 表的创建2. 栗子 二. 查看表1. 查看数据库中的所有表2. 查看表结构 三. 删除表1. 删除表 四. 修改表结构1. 添加字段2. 修改字段3. 删除字段4. 修改表名 数据定义语言:简称DDL(Data Definition Language) 一. 表的创建 1. 表的创建 格式&…

【开源安全保护】如何安装JumpServer堡垒机

【开源安全保护】如何安装JumpServer堡垒机 什么是堡垒机 大家好,我是星哥,今天我以前来认识堡垒机 堡垒机(Bastion Host),也称为跳板机(Jump Server),是指在计算机网络中&#x…

【经典论文阅读】DDPM(Diffusion)

DDPM(Diffusion) denoising diffusion probabilistic models 【生成模型】DDPM概率扩散模型(原理代码)-CSDN博客 【DDPM】一文看懂去噪扩散概率模型,公式讲解、代码实现与最全详解(一)-CSDN博客 【DDPM】…

重拾Java:穿越最具多功能性的编程语言之旅

你知道Java是世界上最广泛使用的编程语言之一吗?无论是用于Web应用、企业系统,还是Android开发,Java始终是各级开发者的可靠选择。 在完成SESI SENAI的系统开发技术培训后,我决定重新学习这门语言。现在,我将其与我正…

MySQL--用户权限

1.使用root用户登录MySQL客户端,创建一个名为userl的用户,初始密码为123456;创建一个名为user2的用户,无初始密码。然后,分别使用uesr1、user2登录MySQL 客户端。 创建两个用户 使用user1登录 使用user2登录 2.使用root用户登录&a…

LabVIEW断路器检测系统

随着电网技术的快速发展,对电力系统的可靠性和安全性要求不断提高,塑壳断路器作为关键的保护设备,其出厂前的检测非常重要。开发了一种基于LabVIEW软件平台开发的塑壳断路器智能脱扣器检测系统,该系统能够有效提高检测的自动化水平…

Python实现Excel中数据条显示

Python中要实现百分比数据条的显示,可以使用pandas库,pandas图表样式的设置与Excel中的条件格式设置比较类似,比如Excel里常用的数据条的用法,在pandas中使用代码进行高亮显示,用来突出重点数据,下面一起来…

使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)

一. 前言 在众多 ECharts 图表类型中,开发者始终绕不开的有各种各样的地图开发,关于地图开发,可能比其他图表相对繁琐一些,其实说简单也简单,说复杂也复杂,其中不乏有层级地图、3D 地图等,感觉…

【机器学习】——windows下安装anaconda并在vscode上进行配置

一、安装anaconda 1.进入清华的镜像网站,下载自己电脑对应的anaconda版本。网站:https://repo.anaconda.com/archive/ 这里我下载的版本是anaconda3-2024.10-1-Windows-x86-64 2.下载完毕后开始安装anaconda 3.配置anaconda环境变量 在设置中找到编…

总结FastDFS的面试题

目录 一:FastDFS的基础知识 1:定义 2:FastDFS的优点 3:tracker server 4:storage server 二:FastDFS的存储原理 1:小文件存储的问题 2:小文件合并存储 3:文件上…

Leetcode打卡:骑士在棋盘上的概率

执行结果:通过 题目:骑士在棋盘上的概率 在一个 n x n 的国际象棋棋盘上,一个骑士从单元格 (row, column) 开始,并尝试进行 k 次移动。行和列是 从 0 开始 的,所以左上单元格是 (0,0) ,右下单元格是 (n - …

Oceanbase离线集群部署

准备工作 两台服务器 服务器的配置参照官网要求来 服务器名配置服务器IPoceanbase116g8h192.168.10.239oceanbase216g8h192.168.10.239 这里选oceanbase1作为 obd机器 oceanbase安装包 选择社区版本的时候自己系统的安装包 ntp时间同步rpm包 联网机器下载所需的软件包 …

漫画之家Spring Boot:漫画资源的跨设备访问

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

重生之我在21世纪学C++—循环语句

一、while 循环 1、while 语法形式 while ( 表达式 ) { 语句 } while默认只能跟一条语句,如果有多条语句,需要用{ }将语句括起来。 2、执行流程 首先上来先执行判断表达式,如果表达式的值为 0 ,就不进入循环;如…

微信小程序购物车全选反选功能以及合计

微信小程序基于Vant Weapp的购物车功能实现 1、单选 使用微信小程序原生表单组件checkbox和checkbox-group 注意&#xff1a;checkbox原生不支持bind:change事件&#xff0c;checkbox-group支持 <checkbox-group bindchange"handleCheck"><checkbox val…

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集

目录 01背包理论基础&#xff08;一&#xff09; 基本思路 C代码 01背包理论基础&#xff08;二&#xff09; 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础&#xff08;一&#xff09; 题目链接&#xff1a;卡码网46. 携带研究材料 文字…

elasticsearch-如何给文档新增/更新的字段

文章目录 前言elasticsearch-如何给文档新增/更新的字段1. 如何给某些文档新增/更新的字段2. 给所有文档添加/更新一个新的字段3. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且…