VIVADO下的Microblaze系统搭建:永远的Hello World - 没落骑士 - 博客园
https://www.cnblogs.com/moluoqishi/p/8177496.html
本教程是写给以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》作者:特权同学)
![](https://i-blog.csdnimg.cn/blog_migrate/f9f3bcb2622463f23aa92ad1b7a890a6.jpeg)
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设计中掌握软核的应用非常重要。接下来我从之前提到设计的两大部分,依次做详细说明。
本例程作为初学的第一个例子,在这个工程示例中大部分配置参数都采用默认值,这样可以用较少的步骤很快搭建一个完整的工程,先不用理会设计细节,在比较短的时间完整的走完一个工程所有的步骤,尽快看到实验结果。这样有助于增强初学者的自信,才有可能抱着探索的心态继续学下去。后面的学习中再去探索每个参数背后的意义。
第一部分:“白纸”上搭建硬件电路
![](https://i-blog.csdnimg.cn/blog_migrate/96ed9b68f08c0ca451acb929fb0ed31f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cd3b2eb98e4b1d45f21ccf564e8f5b5f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5c692de0837ac8d95b36459ecf2b5a03.png)
![](https://i-blog.csdnimg.cn/blog_migrate/734d398dbc9f95216b5b77366e942e45.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b9925faf9107bd311de707b1a8ebaa2a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bc524e6e50fa78a3080cc7e651aca018.png)
![](https://i-blog.csdnimg.cn/blog_migrate/747a0f7a082bd9c21e6515c4f7fd0899.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4bdaa3cfc585f3db5a0913f3a4048171.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b69b7c5783152523b14353e2b05e5223.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9b46995cca0953b596791312138bb5eb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c73c8b7da1801103a6ea7164858e2f61.png)
![](https://i-blog.csdnimg.cn/blog_migrate/83bbf379b76116648f7d105263cab66c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3ce631166d61c7e41212f55414da80cf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a4de1a56a518f9c4a2abfb2fb62304b6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3afc86a9fc21397043ff510f6d70da98.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e304e64bebd3f5cedd7936993f5cc096.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9dc41f9324923231ae8267b831457acf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ef681eb5e2a26e533a8daf227fb51941.png)
![](https://i-blog.csdnimg.cn/blog_migrate/717c799ecc5d11dffd25b25ff9a35904.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e8e2bcc21229874e0b8b445030116e69.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9dda70f10b24f53b06703339fa5a3476.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8943c392fb7d806faac811580174d055.png)
![](https://i-blog.csdnimg.cn/blog_migrate/39e67a55f7409ed8f4a889734376f443.png)
![](https://i-blog.csdnimg.cn/blog_migrate/27f30b70e2e9a6d6ddd7404005a5a38f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fc7798f0c54a9cd281de11cbe601d603.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3a4b53c1abc5bc0679763347d6ec0252.png)
![](https://i-blog.csdnimg.cn/blog_migrate/35f8ce08ccfc72c0c75c15f5db109de6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6cd1085c05cf99fc2054e3582e4aac2f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/98660460042181bb11e2d7f4c31170cc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0635c6303faaaed108550d918296d242.png)
至此,第一部分结束
第二部分 编写LED的控制程序
这部分SDK和Vivado这两个软件要来回切换,注意不要搞混
![](https://i-blog.csdnimg.cn/blog_migrate/7a5ec80785d67c542e729959b48e24c8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3a45404e4d82f31908d79268dcba90ed.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4de47453c6ab1d0ed2bc9d9fe5e520e7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ee55cd487b5496131d07fa52480f4af.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4239805d41711ded93bb054e72822a5c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3a5924a1f8f457e431000e9caa88e743.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5bea8218142446802b6bdecba4225c49.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e0111e2edef40d31785d124e1a27352f.png)
#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;
<span class="token keyword">for</span> <span class="token punctuation">(</span>Delay1 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> Delay1 <span class="token operator"><</span> ms<span class="token punctuation">;</span> Delay1<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">for</span> <span class="token punctuation">(</span>Delay2 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> Delay2 <span class="token operator"><</span> <span class="token number">8332</span><span class="token punctuation">;</span> Delay2<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/75e1990fce9a04c44c819c9d82f6c6ee.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fb8cbb52d7a04297b33099b6d9843adf.png)
-
如果找到器件则在localhost下就会有器件信息,(如果未找到器件一般检查板子和电脑是不是已连接好,驱动程序是不是已安装,板子电源开关是不是已打开)然后按下图所示的顺序给板子下载Bitstream文件
![](https://i-blog.csdnimg.cn/blog_migrate/c938eaaaf927a8153a2714827cc76cab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/de2de8c1ad4027d82f8fd3c3b9faf149.png)
-
最后切换到SDK环境,先确保当前打开的窗口是testperiph.c,然后按下图所示的顺序操作就可以将编译好的led控制程序运行在MicroBlaze上,此时可以观察到板子上高四位LED和低四位LED交替闪动,周期大约为1秒。
![](https://i-blog.csdnimg.cn/blog_migrate/1c07e773adf1bac3d77739645bf48b4f.png)
转自:
https://blog.csdn.net/cuifuxiang/article/details/86551813