MicroBlaze控制LED入门【史上最详细】

码字截图不易,转载请注明标题和作者,谢谢!!!

本教程是写给以Xilinx官方开发板作为平台的初学者

本实例中开发环境:

  • 软件平台:Win10专业版 64bit + Vivado2017.4版
  • 硬件平台:Xilinx-KC705

本实例完整工程下载:请戳此处

下面是两个进阶工程,设计过程和本文要讲的LED几乎一样,这里不在赘述。

MicroBlaze控制1602_LCD下载:请戳此处

MicroBlaze控制1602_LCD+LED+UART下载:请戳此处

注:所有工程用Vivado2017.4完美运行。如果你用的是2017.4以后的版本,打开工程后按照提示升级IP即可;如果你用的是2017.4以前的版本,只能用只读模式打开无法改动。

写在前面的话

  不少同学在学习FPGA之前有接触过单片机,单片机属于ASIC。ASIC比FPGA普及得多得多,但是ASIC的功能相对固定,它是为了专一功能而生,希望对它进行任何的功能和性能的改善往往是无济于事的。打个浅显的比喻,如下图所示,如果说ASIC是布满铅字的印刷品,那么FPGA就是可以自由发挥的白纸一张。(摘自《深入浅出玩转FPGA》作者:特权同学)

  MicroBlaze是Xilinx平台上的软核。如果之前有接触过单片机可以暂时把MicroBlaze当作单片机来看待。只不过我们用单片机开发的时候硬件结构是已经搭建好的,而且是固定的,我们只需编写需要的控制程序即可。就像上面提到的,FPGA白纸一张,现在要通过MicroBlaze实现LED的控制就必须分两步走:第一,在这张“白纸”上搭建硬件电路。第二,编写LED的控制程序。这就会造成一个问题:用FPGA实现一个功能,经历的步骤会更多,中间任何一个环节出错都会影响到最终结果。(大家看完后文步骤就能体会到有多麻烦)

  问题来了,既然在实现相同的功能情况下,用FPGA + MicroBlaze的方式要复杂的多,而且FPGA的成本比单片机高很多,为什么要整这么麻烦,随便找个MCU不就搞定?

  这个问题的答案也是我下决心写这篇博客的原因。FPGA和ASIC各有所长,各有所限。在嵌入式领域市面上常见的有FPGA,AMR,DSP。ARM长处在于控制和管理,DSP专门为数学运算设计,而FPGA则适用于灵活性高,定制化程度高的场合。很多时候它们实现的功能无法直接代替。在科技发展过程中,出现了你中有我,我中有你的共存现象。比如ARM中有DSP;Xilinx的FPGA中有MicroBlaze软核,Zynq系列更是嵌入了ARM的硬核。在比较复杂的设计中不同的任务之间需要调度管理,依靠FPGA逻辑控制很难实现复杂任务的管理,而把任务间的调度管理交给MicroBlaze处理,会使设计变得很简单。因此,在FPGA设计中掌握软核的应用非常重要。接下来我从之前提到设计的两大部分,依次做详细说明。

  本例程作为初学的第一个例子,在这个工程示例中大部分配置参数都采用默认值,这样可以用较少的步骤很快搭建一个完整的工程,先不用理会设计细节,在比较短的时间完整的走完一个工程所有的步骤,尽快看到实验结果。这样有助于增强初学者的自信,才有可能抱着探索的心态继续学下去。后面的学习中再去探索每个参数背后的意义。

第一部分:“白纸”上搭建硬件电路

  1. 打开Vivado如下图所示,点击创建工程
  1. 此时弹出如下窗口,点击Next
  1. 选择工程路径创建工程名,工程名建议尽量短,window路径有256Byte限制,工程名太长会导致深层子文件夹无法读取而综合失败
  1. 建工程时选择不添加源文件
  1. 选择板子型号
  1. 点击Finish
  1. 点击创建Block Design
  1. 命名为Micro_led然后点OK
  1. 在Diagram中点“+”号添加IP核
  1. 添加MicroBlaze IP核
  1. 按下图所示顺序添加时钟 IP核,添加后默认设置为输出1路100MHz时钟
  1. 和上面方法一样添加LED IP核
  1. 点击Run Block Automation,这一步会把MicroBlaze所需的额外IP核自动添加进来并连接
  1. 点击local memory更改为32K,然后点击OK,等待完成连接
  1. 完成连接后会多出三个IP,如下图
  1. 接下来点击Run Connection Automation 接着会把剩下的线连接完毕
  1. 在弹出的窗口中全部勾选然后点OK
  1. 连接完毕后,如下图所示。这里又增加一个IP AXI interconnect 是 MicroBlaze 连接外设的桥梁
  1. 生成输出。按下图所示顺序操作(这一步到22是完成FPGA设计的单个IP核的综合和实现)
  1. 保持默认直接点击Generate
  1. 输出顶层。按下图所示顺序操作,在弹出的中直接点击OK
  1. 在Vivado的右上角看运行状态
  1. 等待完成后Vivdo右上角出现Ready字样,表示综合实现完成
  1. 接下来生成Bitstream文件。Bitstream是最终下载到FPGA芯片的文件。在Flow Navigator栏中找到下图所指示的位置,然后点击 Generate Bitstream
  1. 此时提示没有找到实现的结果,要开始综合和实现,点击Yes。在接下来弹出的窗口中,保持默认直接点击OK。注意此处提示的综合是指整个工程的全局层面的综合,19–32步中的综合是指单个IP的综合
  1. 完成Bitstream文件生成后会有下图所示的弹框,直接关闭即可

至此,第一部分结束




第二部分 编写LED的控制程序

这部分SDK和Vivado这两个软件要来回切换,注意不要搞混

  1. 在Vivado环境下,按下图所示顺序操作
  1. 此时弹出如下窗口,保持默认设置直接点击OK
  1. 在Vivado环境下,按下图所示顺序操作
  1. 此时弹出如下窗口,保持默认设置直接点击OK,等待打开SDK完毕
  1. 在SDK环境下,按下图所示顺序操作,新建SDK工程。这个工程有点类似在51单片机上用Keil建应用工程
  1. 此时弹出如下窗口,按下图所示顺序操作
  1. 此时进入下级窗口,按下图所示顺序操作,完成SDK工程的新建
  1. 按下图所示按照文件层级关系,打开testperiph.c文件然后删除文件里面的内容
  1. 将下面的程序粘贴到打开的testperiph.c文件中并按Ctrl+S保存(这里按Ctrl+S保存后会自动编译)
#include <stdio.h>
#include "xparameters.h"
#include "xil_cache.h"
#include "xgpio.h"
#include "gpio_header.h"
#define LED_CHANNEL 1
XGpio GpioOutput; /* The driver instance for GPIO Device configured as O/P */
XGpio GpioInput;
void delay(u32 ms)
{volatile u32 Delay1=0;volatile u32 Delay2=0;for (Delay1 = 0; Delay1 < ms; Delay1++){for (Delay2 = 0; Delay2 < 8332; Delay2++);}
}
int main ()
{int Status;int cunt=0;Xil_ICacheEnable();Xil_DCacheEnable();Status = XGpio_Initialize(&GpioOutput, XPAR_AXI_GPIO_0_DEVICE_ID);if (Status != XST_SUCCESS)  {return XST_FAILURE;}XGpio_SetDataDirection(&GpioOutput, LED_CHANNEL, 0x0);XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 0x0);
while(1){if(cunt==8)cunt=0;XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL ,0xf0);delay(500);XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL ,0x0f);delay(500);cunt++;}Xil_DCacheDisable();Xil_ICacheDisable();return 0;
}
  1. 切换到Vivado环境,在Flow Navigator栏中找到并双击打开下图所指示的位置
  1. 此时出现如下界面,单击图中所示的位置打开寻找目标器件
  1. 如果找到器件则在localhost下就会有器件信息,(如果未找到器件一般检查板子和电脑是不是已连接好,驱动程序是不是已安装,板子电源开关是不是已打开)然后按下图所示的顺序给板子下载Bitstream文件
  1. 此时弹出如下窗口,保持默认设置直接点击Program,等待下载Bitstream文件完成
  1. 最后切换到SDK环境,先确保当前打开的窗口是testperiph.c,然后按下图所示的顺序操作就可以将编译好的led控制程序运行在MicroBlaze上,此时可以观察到板子上高四位LED和低四位LED交替闪动,周期大约为1秒。

到这里,整个设计流程就结束了,希望这篇博客对初学者有所帮助。如有问题可以一起交流,共同学习。邮箱:lia0yi@qq.com

本实例完整工程下载链接在本文开头

码字截图不易,转载请注明标题和作者,谢谢!!!

MicroBlaze控制LED入门【史上最详细】相关推荐

  1. GitChat·大数据 | 史上最详细的Hadoop环境搭建

    GitChat 作者:鸣宇淳 原文: 史上最详细的Hadoop环境搭建 关注公众号:GitChat 技术杂谈,一本正经的讲技术 [不要错过文末彩蛋] 前言 Hadoop在大数据技术体系中的地位至关重要 ...

  2. 史上最详细全中文 Cisco 3560交换机使用手册

    史上最详细全中文 Cisco 3560交换机使用手册 (末尾送交换机安全技术) 目 录 CISCO Catalyst 3560-E系列交换机的功能应用及安全解决方案 3 一.Cisco? Cataly ...

  3. IPV4与IPV6的区别(史上最详细)

    IPV4与IPV6的区别(史上最详细) 描述 IPv4 IPv6 地址 长度为 32 位(4 个字节).地址由网络和主机部分组成,这取决于地址类.根据地址的前几位,可定义各种地址类:A.B.C.D 或 ...

  4. android qq消息数 拖拽动画,史上最详细仿QQ未读消息拖拽粘性效果的实现

    好久没写文章了,前段时间由于项目代码重构忙了一段时间,现在终于有点时间了就为大家带来一篇关于动画学习的自定义View:类似QQ消息拖拽的效果. 其实QQ当时更新的时候我还没注意到这个小红点是可以拖拽的 ...

  5. 史上最详细网络基础知识

    网络技术的基本原理: 1. 网络层次划分 2. OSI七层网络模型 3. IP地址 4. 子网掩码及网络划分 5. ARP/RARP协议 6. 路由选择协议 7. TCP/IP协议 8. UDP协议 ...

  6. java自行车怎么调档_这也许是史上最详细的自行车变速调节攻略了!

    原标题:这也许是史上最详细的自行车变速调节攻略了! 传动系统是自行车中最重要的一个部分,变速套件更是占据了非常重要的地位,野兽菌觉得重要性仅次于车架.如果变速出现问题,会让很多人头疼.这期我们带大家了 ...

  7. Eclipse安装教程 ——史上最详细安装Java Python教程说明

                                                                Eclipse安装教程 --史上最详细安装Java&Python教程说明 ...

  8. Kafka史上最详细原理总结(一)

    Kafka史上最详细原理总结 一.概念理解 (1)产生背景 (2)Kafka的特性 (3)Kafka场景应用 (4)Kafka一些重要设计思想 二.消息队列通信的模式 (1)点对点模式 (2)发布订阅 ...

  9. python导入同级包_python小课堂15 - 史上最详细的包和模块import讲解篇

    python小课堂15 - 史上最详细的包和模块import讲解篇 前言 在大量的代码设计中,我们不可能将所有代码都写在一个.py文件,所以有了包.模块,而为了代码可以重复利用(复用性),就有了类.函 ...

最新文章

  1. 快速理解VirtualBox的四种网络连接方式
  2. SQLite主键自增需要设置为integer PRIMARY KEY
  3. PHP的SQL注入技术实现以及预防措施
  4. SpringMVC(入门案例)
  5. linux下简易搭建svnserver
  6. 在RedHat Linux系统中安装和配置snmp服务
  7. Android基于ksoap2调用WCF服务(二):Android篇
  8. db9串口(db9串口定义及颜色)
  9. 天猫魔盒1代TMB100E刷机, 以及右声道无声的问题
  10. 成功解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“
  11. 1.3 可移植性和标准
  12. python同一个包下不同文件的函数调用
  13. 6-3 sdust-Java-模拟主板、USB口、TypeC口、PS2口设备 (20 分)
  14. 实用的CAD技巧,你也可以成为大神!
  15. android系统模拟麦克风,在Android模拟器中使用麦克风(Java Android初学者)
  16. 美国商务签证面试经历
  17. SAP ABAP-获取屏幕字段数据
  18. ViewPager写的三字经程序,外加三字经朗读,用了MediaPlayer
  19. vscode中jsx中没有html语法提示,不能自动补全的解决办法
  20. Zerocash:Decentralized Anonymous Payments from Bitcoin

热门文章

  1. 基于springboot的汽车配件管理系统
  2. 用java的swing组件实现简易的图书管理系统
  3. k8s集群管理(一)
  4. mysql主从复制(一):一主多从
  5. java基于ssm框架的企业人事管理系统企业工资考勤系统
  6. Dilated Convolution膨胀卷积感受野详解
  7. Javascript如何阻止事件的默认行为?
  8. 大数据分析 2021年Q3酒店品牌营销网络传播特征
  9. 电信云服务器重装系统,天翼云主机操作(二)
  10. 淘宝图片怎么编辑处理?淘宝图片处理用什么软件?