• 【Vivado那些事儿】MicroBlaze最小系统搭建及程序固化


    【Vivado那些事儿】MicroBlaze最小系统搭建及程序固化

    MicroBlaze是AMD-Xilinx提供的一个可以在FPGA中运行的嵌入式软核IP,其本质是一个32位RISC处理器软核,可以在150MHz时钟下,提供125 D-MIPS性能,具有运行速度快、占用资源少、可配置性强等优点。

    今天主要是搭建一个通用MicroBlaze最小系统+一个外设,最后固化程序到FPGA

    整体难度★不到

    缩略词索引:

    MB-MicroBlaze

    环境平台

    • win10 vivado 2020

    • Vitis 2020

    • 1b74000fae23a2ccefb8c54e5deb4a9d.png

    FPGA部分搭建

    一个完整的MB系统,包括四个方面:CPU、时钟、 DDR 和外设,其中CPU不用说就是MB,DDR不是必须的,根据硬件选择,如果没有DDR时候选择内部RAM使用需要选择大一点,所以下面分成两种情况建立最小系统。

    不带DDR的MB最小系统-通用系统

    第1步

    搭建Vivado系统,不过多赘述了!

    第2步

    点击 Create Block Design,创建一个 BD 文件,并命名为MB_block。

    b71d1dbfa1d3938dbaa4737f561ad6f1.png

    第3步

    单击添加 IP 图标,然后输入关键字 MicroBlaze。

    92f5fabaa7254b7ff48f5963ebac0430.png

    双击将MB添加到 BD 文件中:

    2a157e89485369efa3f15c4fd9c16f0d.png

    第4步

    添加时钟,在添加IP图标位置输入关键字Clocking Wizard。

    4db399d2e49cb9ffcb2e9d9261f2500d.png

    双击将Clocking Wizard添加到BD文件中。

    第5步-此步可不加

    时钟设置,双击Clocking Wizard对时钟进行配置。

    3868ba7b053c87aa20ce35264400d78f.png

    输入时钟根据硬件进行选择,我的硬件是一个单端50MHz时钟,输出时钟参数如下:

    ada66fd88a1a2b76f13eec94450a13fc.png

    clk_out1作为MB的运行时钟,这里设置为100MHz,而clk_out2的200MHz是作为DDR控制器的运行时钟。

    勾选locked作为后续电路的复位信号。

    其他页面默认即可,点击【OK】完成设置。

    0a0eed08720efcf0b475d44dcf7e2774.png

    第6步

    MB设置,在 BD 文件中,双击 MB 图标,对其进行配置,第一页配置参数如下图所示:

    75895589ca4520c9f1813865a78cf6e2.png

    注意图中圆圈是需要勾选的,允许外部存储 BRAM 作为程序运行缓冲区,方框部分是软核的频率、面积和性能三方面的综合结果(三方不可同时兼得)。

    点击【Next】,进行下一界面进行设置:

    bbd12eafd4b5253d8ead33314132ffd8.png 54247b2ade5f50510701ae1f8b4a8eb4.png

    界面默认,点击【Next】:

    8214244cb61b0beb2a22fab7480e1be2.png

    按照上图设置,点击【Next】:

    b16ad770ff1c966aaaa4236c93b13c0b.png

    界面默认,点击【Next】:

    2af372b370c9816f3a7a0803e8253d9b.png

    按照上图设置,允许 AXI 数据流。修改完成之后点击 【OK】  即可。

    上面主要修改三个部分:第一页允许外部存储 BRAM 作为程序运行缓冲区;第三页设置Cache基地址和长度;第五页是允许AXI数据流,用来访问外部DDR。

    第7步

    让BD自动完成设置,点击Run Block Automation完成剩下的设置。

    70d6565732e118150c5a7723b022d3c3.png

    弹出的界面默认即可,时钟使我们上面第4步Clocking Wizard生成的,Local Memory 选择 32KB,因为没有外部存储器。

    289756f5719d5bcce68414eec3c11d65.png

    第8步

    引出相关引脚。

    组合键 【Ctrl+T】 引出引脚。

    第9步

    验证目前设计的正确性:

    58cca2b1cf530aea0dbd295fc4686408.png

    目前这一步已经完成了最小系统设计。

    第10步

    修改引脚名称。

    f2a0e21b2b129256bc6af05dff74f8fe.png 94fba481f2f248e7d5e6ec99d382f9b3.png 74b3dac940f7951d735c767ccfc2b3f9.png c02439ce40997127f937f861f98553e9.png

    第11步

    导出BD,按照下图位置:

    4115dfaa42b020be30907c42c75aedc3.png

    设置路径,设置BD名称:

    bdc91dadb5e1e593827c33f7b9acf0c6.png

    路径下就生成了一个tcl文件,同理也可以使用下面命令实现相同功能:

    write_bd_tcl [你的路径]/xxx_bd.tcl

    第16步

    上面就完成了整个最小系统搭建,接下来搭建带带DDR的MB最小系统,然后我们以这个最小系统为例说明其为什么具有通用性。

    带DDR的MB最小系统

    第1步

    搭建Vivado系统,不过多赘述了!

    第2步

    点击 Create Block Design,创建一个 BD 文件,并命名为MB_block。

    33f9c34a7033aecb5cc3f7500f1a6b15.png

    第3步

    单击添加 IP 图标,然后输入关键字 MicroBlaze。

    bcc125bc28c04573620cb12506422f18.png

    双击将MB添加到 BD 文件中:

    4e81b2018961dcc4cc25819bce16d0da.png

    第4步

    添加时钟,在添加IP图标位置输入关键字Clocking Wizard。

    0f2ff9b46aab958c42866e21c0b6ac70.png

    双击将Clocking Wizard添加到BD文件中。

    第5步

    时钟设置,双击Clocking Wizard对时钟进行配置。

    ddd8f949a2c0931f5e18c0ec04c9c47b.png

    输入时钟根据硬件进行选择,我的硬件是一个单端50MHz时钟,输出时钟参数如下:

    5e7656e6ef495e255a0d584096875d3a.png

    clk_out1作为MB的运行时钟,这里设置为100MHz,而clk_out2的200MHz是作为DDR控制器的运行时钟。

    勾选locked作为后续电路的复位信号。

    其他页面默认即可,点击【OK】完成设置。

    93c31f3f654d8519ce544734c532c0c2.png

    第6步

    MB设置,在 BD 文件中,双击 MB 图标,对其进行配置,第一页配置参数如下图所示:

    fe06e105f689bce2e646282f57fbe1dc.png

    注意图中圆圈是需要勾选的,允许外部存储 BRAM 作为程序运行缓冲区,方框部分是软核的频率、面积和性能三方面的综合结果(三方不可同时兼得)。

    点击【Next】,进行下一界面进行设置:

    3b775c32f47cccbdfdef152771474d50.png c2538ebd00340da3d4607b29e7305c81.png

    界面默认,点击【Next】:

    4ee57f209ab82e3289c2f9509e21ede3.png

    按照上图设置,点击【Next】:

    159122e689e4985d21ee1ee2173a9916.png

    界面默认,点击【Next】:

    2e5ae74371ada645de29cfd5514d3db1.png

    按照上图设置,允许 AXI 数据流。修改完成之后点击 【OK】  即可。

    上面主要修改三个部分:第一页允许外部存储 BRAM 作为程序运行缓冲区;第三页设置Cache基地址和长度;第五页是允许AXI数据流,用来访问外部DDR。

    第7步

    让BD自动完成设置,点击Run Block Automation完成剩下的设置。

    fd5964f64645c052343897a78fd61475.png

    弹出的界面默认即可,时钟使我们上面第4步Clocking Wizard生成的。

    f0bcf1c45381f87cf77d9d475a144967.png

    第8步

    引出相关引脚。

    b806c6830b145b8bc37a8541e873500c.png上图界面选择clk_in1,组合键 【Ctrl+T】 引出引脚:

    5a89a001f14b072ddb7c12cdcb4f4833.png

    第9步

    验证目前设计的正确性:

    d9089877cbd6242c4e4db1127f801009.png

    目前这一步已经完成了最小系统设计,下面开始DDR设计。

    第10步

    添加DDR控制器:

    添加IP界面,输入关键字memory interface generator

    67fc62fa2cabd22b609d43c372daeb66.png

    双击memory interface generator后再BD中添加MIG:

    17e2c992f4f16c0d9c12356ee1c9d59c.png

    第11步

    设置MIG IP。

    双击 mig_7series_0,进行如下配置:

    276318e3e3710acb8193ecc6eefeeb94.png a9b0dfcca6e665473bf3221d803ac013.png a26767a42d393dfa0656d9512d09263a.png 7d474c9fc22f0200eb2ab5c0ad16ae72.png cf6e6d13ba1b2462047bcbadce2ff100.png 5191a8965159280fd8512e6997bec5b3.png 99afa653480599edef1075135a72f70e.png d9279bd5a5b618841f775ba34bdfdb5c.png

    注:如果system clock的频率在199-201MHz之间,这里会出现一个use system clock 的选项,意思就是用系统时钟作为参考时钟

    5af3905fd77f047637232513b6f3b17e.png c82df534a85252cf4bf6dd4e95a288ed.png 1583b1ef4a9f30c2809bdb257c14a1fd.png a432b72fab6220b02e62f23b4230ac5c.png 01cf2281d249f6c6d104ae973b72b853.png a012c7ed8ddca97614bd2319f86c589f.png

    后面全部默认点击【NEXT】即可。

    将MIG的线按照下图进行连接:

    2af188d437f462d335c7127da7959212.png

    第12步

    添加外设,我们主要添加串口,负责调试。

    c425859584f7572fdfb9510af5a74b5c.png

    双击 UART,将波特率改为 115200:

    e3ea2895c4eb5be081ac11c697d5ec6b.png

    第13步

    再点击 Run connection Automation,再弹出来的窗口中把所有选项勾选上,再点击【OK】 即可。

    ff221c92e689edccf96fdfc7e1f92ada.png

    验证设计:

    3464df9823fafcdcc6f3eb7b055a913a.png

    第14步

    修改引脚名称,因为这部分将作为一个最小系统供后续使用。

    385b3dadd7ab9564ac799795e05751a7.png 1f918a7dd15893add84c4b2fbe6cd3d2.png

    第15步

    导出BD,按照下图位置:

    8f98ecdddbfa1d28c5995873e87d68e2.png

    设置路径,设置BD名称:

    1d922b97fd3fd0d69b075fd89136648a.png

    路径下就生成了一个tcl文件,同理也可以使用下面命令实现相同功能:

    write_bd_tcl [你的路径]/xxx_bd.tcl

    测试及固化程序

    第1步

    建立一个新的Vivado工程。

    第2步

    导入上一节生成的最小系统:

    b44204a30ba21299c8362a31a22c2fe7.png

    选择tcl文件,确定即可

    e063d40018441eaf729b7a3f15a9d9ee.png

    这样就生成了一个最小系统:

    35d286420f7bbdae83630bd10706a7c9.png

    第3步

    添加Clocking Wiard,按照下图进行设置

    000b3c322aa64bd02a03cd3b810731af.png 0e0c06c459b5835c7b5e2bc838d0d79d.png

    第4步

    添加一个AXI-GPIO,按照下图设置:

    fe528abab11cb66b7e13d1308526a6ef.png

    后面控制三个LED等。

    第5步

    点击 Run connection Automation,再弹出来的窗口中把所有选项勾选上,再点击【OK】 即可。

    9de18235d67be34c43ef670790d57788.png

    第6步

    导出硬件

    将 bd 文件导出为 tcl 脚本之后,继续对工程进行完善。

    选中 xxx.bd,右单击然后选择 Generate Output Products。

    4ace9e24ba27645ac7f9c11289227554.png

    第7步

    在弹出来的窗口中,如下图所示,然后单击【OK】。

    8d1802555d387783f1e76c5f85ec0df7.png

    第8步

    选中 XXX.bd,右单击然后选择 Create HDL Wrapper,在弹出来的窗口中直接点击【OK】。

    7b3fb5630e9580907f3496a062f6784a.png 8c02d91896798b282f487d0b5b1977e3.png

    第9步

    添加一个名为 mb_test.xdc 的约束文件,并添加约束(物理约束需要根据自己硬件选择)。

    第12步

    单击下列图标产生 Bit 文件。

    653b9961b546c0991c936a39f2266d04.png

    第13步

    生成 Bit 文件之后,单击 File-Export-Export Platform...

    f82005bd7bc7a75f340243c179265541.png

    第14步

    TOOLs-->Launch Vitis IDE

    3afa90b9aa9fda00d73013dab109836f.png

    选择工作文件夹。

    72197e2949b4756ded1d561b3119f8ff.png

    创建Platform

    0eb9aaa17a55dea86d38e5e16727f158.png

    选择上一步生成的Platform(XSA文件)

    146ac6b2358c3991a223ac7b7f8769ea.png

    右击,build project

    038fac54335ef0dd1d5578491833e7f5.png

    无问题后继续后面步骤。

    第15步

    创建App

    4f0da169e6d30983cb2109bcc26611b4.png

    【NEXT】

    baf594341b37d3aba6bc0ed6cef5c033.png

    【NEXT】

    a80fa08f9e05f31e3bd6da6589cb1d6a.png

    输入App名称:

    18d62ae75c478bb1016994645d396268.png

    【NEXT】

    676611aa10ce32d98366450aa7e0bf26.png

    选择Hello World模板。

    47773f0b3ff4cfecde5206b541581d09.png

    【FINISH】

    7ce310f2f9fa2893b1fdc0b4d524af9f.png

    第16步

    helloworld.c源码我们先不修改。

    右击 HelloWorld-->Debug As-->Debug Configurations

    设置好参数,使用Vitis自带的串口工具,运行后即可看到打印信息。

    a067c3a24cc70880e43fb0e169debd6d.png

    接下来就是添加GPIO驱动,和上面操作一样,这里有个小技巧,在建立完App后,点击下图位置:

    c40510988c92978016a77605d6abb51e.png

    导入官方提供的历程就可以了。

    同样HelloWorld-->Debug As-->Debug Configurations后进行调试即可。

    下面说明固化过程。

    第17步

    固化第一步,生成bit文件,点击XIlinx-->Program Device

    7736c7ce4fd36b2741dfc83f885b9eca.png

    记住箭头部分生成的bit文件,同时选择方框内编译出的elf文件。

    9886d8115687b12133affd4c3e63cffe.png

    固化第二步,下载固化FLASH,点击XIlinx-->Program Flash

    4c2a2da08d9c7f40f7d66be00536c7a9.png

    箭头选择板卡上FLASH的FLASH,方框选择上一步生成的bit文件(默认dowload.bit)。

    d8e8ea92510492b42345edcd91b20f93.png

    点击【Program】,完成后重新上电即可。

    总结

    今天简单演示了一个MB小例子。

  • 相关阅读:
    C++入门1
    太坑了,降低 代码可读性的 12 个技巧
    String 常用方法
    基于ISO13209(OTX)实现EOL下线序列
    dvwa命令执行漏洞分析
    Mac m1 上编译阿里 OSS c++ 供 UE 使用
    Java集合框架
    “华为杯”研究生数学建模竞赛2019年-【华为杯】F题:智能飞行器航迹规划模型(下)(附优秀论文及Pyhton代码实现)
    ENVI为遥感影像设置空间坐标系的方法
    短信登录实现(黑马点评为例)
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/126552914