该总结来源于对自己根据HUST_STI的视频教程与《xilinx开发实例教程》一书的实践总结。有机会可以玩玩开源的or1200.
MicroBlaze即xilinx的软核。下面介绍相关的工具及开发流程,以及一些需要注意的点。
下面根据视频流程梳理。
1、xps软件,新建bsp工程。文件后最为xmp。选择AXI的总线架构。可以选着开发套件如ML605也可以自定义,需指定cpu的reset引脚。后面添加IP外设、DDR、串口。生产bsp工程后可以看到总线的连接图,生成了.mhs文件,可以看到个模块的系统图,UCF引脚约束文件
2、可以现在双击修改ddr控制器的ip核设置,修改端口的外设总线连接、时钟分频、可以修改没有用到的引脚。修改microblaze内核的icache与dcache的大小,可以看到各个外设的地址。
需注意;ucf中的端口port及总线连接中的名称一致,clk需修改我们板子上的无源的,修改clk模块中的脚
3、添加gpio,选axi_lite总线,修改gpio的名字与ucf中的一致。添加spi控制器的ip核、在总线图里修改spi控制器的某些脚接地,删掉没用的脚,注意修改对应的端口一致。
编译生成system.bit文件,即为内核文件。可以注意生成过程即是按照mhs文件中的内容分布综合映射的。这时export design/export &launch sdk。打开sdk。最后在sdk_export目录下新建一个sw的目录用来放我们的软件,设置工作区在这。
打开edk界面可以看到xml文件,生成了一个platform工程,有之前的system.bit文件、system.xml文件、bmm文件与xps中的bram中是一致的。新建一个hello world工程(默认是在ddr上跑的),关闭自动编译功能。建好工程会自动编译一遍、生成了2个工程、bsp工程与用户工程。bsp工程中可以看到有lib等c语言函数库等常用的如xgpio.h。里面根据我们的实际外设都有相应的驱动。用户工程中有个ld文件,决定程序在那里跑。可以看到与xps中的地址是符合的,build一下可以看到生成的elf文件大小。program FPGA菜单中,选择loop,这样将根据system.bit与bmm文件即孔的loop文件生成download.bit文件。下进去,但是只是下了内核。后面在工程处,右键,run as/launch on hardware,即将软件程序下进去了,可以在终端窗口看到串口发过来的hello world证明ok
再新建一个外设测试工程。工程类型是外设测试,可以看到生成了相应的外设测试的c文件。直接编译进fpga,串口可以看到测试通过了。
4、建一个在bram上跑的ram工程。新建的工程默认在ddr上跑,需修改ld文件。generate a linker script,修改后就变了。修改hello world.c文件,实现流水灯,需要用到bsp提供的驱动函数。可以研究下
若想固化到flash中,则需生成mcs文件,打开impact,新建spi工程,添加download.bit,填充到spi中,然后初始化chain,添加spi,选择我们的spi的型号、生成了mcs文件再下进去,设置从flash启动,断电后就跑了起来
5、自定义外设(数码管驱动外设):xps中点开建立外设向导,练到axi4_lite总线上,设置需要几个寄存器,好了后即可在ip分类的user下看到自己的SEG7的ip。实际上先关的文件再pcores文件夹下。需进行修改,在mpd文件中的ports部分添加自己的端口,修改userlogic.v中添加自己的端口,input和output。vhd文件中有3出修改,需修改2处ports,map部分中也得修改
6、添加ip后,project-rescan USER Repositions更新后看到自己的ip外设端口出来了设置方向与名称。将自己的逻辑添加到user_logic.v文件中的相应位置
7、修改管脚约束,生成bitstream,导入sdk,更新下xml文件。看到加进来的外设有了。新建hello world工程,看到mss文件。修改ld文件让代码为到ddr中跑。写数码管的c语言程序,需要用到
8、添加spi的控制器,删掉原来的。修改ip核的配置,分频系数等,修改引脚名字和脚的连接。
9、导入sdk,同上,更新xml文件,新建helloworld,将提前写好的c文件加进来。下程序时还是空的loop(只有为在bram上跑的程序才能一起合并,否则都只能是loop)
10、体会用户程序与boot程序:
需2个工程。用户用处与boot工程。用户工程spi_user_app.c,编译生成elf文件,这个是跑在ddr上的,对于的ld文件中得是相应的设置boot工程、spi_bootloader.c。改c文件中用了函数指针调到了用户程序spi_user_app.c中。这个是在bram中跑的。这个一起生成bootload文件下进去,然后再把用户elf文件通过run as方式下进去
11、全部固化到flash中:
需用到一些工具,目的是将上面的由bootloader合并生成的bit文件与用户程序的elf文件生成mcs文件。最后生成了combine.mcs文件。这样每次断电后重启都是这样的
感想:
1、选用ip的时候,连到那个总线上,即会生成一整套的总线接口
2、自定义ip的时候也是,在合适的地方添加自己的逻辑实现即可,软件自动帮你生成了相应的接口,即axi的总线接口标准
3、可以体会一下有了硬件的seg驱动,软件上应该怎么写,与原来我们用单片机实现seg驱动有什么不一样。
4、有机会可以试试开源的OR1200,相应的软件工具和环境都是开源的,linux也支持
2014-4-14