paradoxfx

【原创】在Vivado中联合仿真MicroBlaze的外部IP

0
阅读(11250)

MicroBlaze连接了一个外部用HDL书写的IP时,如何验证其功能的正确是非常重要的问题,所以我们来看看在Vivado中是如何对此进行仿真验证的。首先新建一个工程,如图1所示,这里引用的IP是以前自定义的一个(打包方法可以用HDL写然后封装,也可以用system generator生成,请参考http://blog.chinaaet.com/detail/35987),在这里把它做为MicroBlaze的一个外设。

 

1 新建工程

点击图1中的Address Editor,可以看到自定义IP模块的地址分配,如图2所示。

 

2 IP模块的地址分配

         因为我们在IP设计时使用的是16位宽的地址线,所以我们从图2中看到Vivado IPI里已经自动为它分配了64K的地址空间。然后在图76中的设计文件上点击右键,先完成Generate output products,然后选择Export Hardware for SDK,如图3所示,然后我们的设计文件就被导入SDK中了。(注意:一定要保持图1Vivado IPI的打开才能自动打开SDK

 

3 导出到SDK

         接下来我们要把它导入SDK进行功能验证。进入SDK之后,首先新建一个BSP,然后再新建一个简单的应用程序Application Project,如图4所示。

 


4 SDK中建立BSP与用户自定义工程

用户自定义的工程可以是一个外设测试程序(peripheral test),目前我们的设计文件里只有一个外设,即我们自定义的IP。然后我们打开测试程序中的xparameters.h,可以看到其中定义的我们所生成的IP的地址和Vivado IPI中分配的是一致的:

/* Definitions for peripheral GAIN_CONTROL_1 */

#define XPAR_GAIN_CONTROL_1_BASEADDR 0x44A00000

#define XPAR_GAIN_CONTROL_1_HIGHADDR 0x44A0FFFF

         然后我们在生成的测试工程的主程序里加入如下的代码(加粗斜体为修改部分,无修改部分则基本未列出):

#include "xil_io.h"

int main()

{

   Xil_ICacheEnable();

   Xil_DCacheEnable();

   //

   int i;

   for (i=0; i>-1;i++)

   {

       Xil_Out32(XPAR_GAIN_CONTROL_1_BASEADDR,i);

   }

         点击SDK中的保存并退出,此时SDK的可执行ELF文件会被自动生成,然后回到Vivado开发环境。

         在图1中的设计文件上点击右键,首先再执行一遍Generate output products,然后选择Associate ELF Files,选择生成的ELF文件,例如我们的工程名是test,就选择其编译结果test.elf,如图5所示。

 

5 选择elf

然后在Vivado项目管理器中选择顶层文件,再运行行为仿真,如图6所示。

 

6 运行行为仿真

此时Vivado会编译所有的IP(需要等待一些时间),其中包括我们在SDK中写的程序。然后在VivadoTCL console里输入下面的命令(因为不是用测试脚本写的,所以用tcl命令),就可以把复位信号、时钟信号和输入送给仿真程序,运行仿真了:

add_force reset_rtl {1 0ns} {0 100ns}

#Setup Clock

add_force CLK_IN1_D_clk_n {1 0ns} {0 5ns} -repeat_every 10ns

add_force CLK_IN1_D_clk_p {0 0ns} {1 5ns} -repeat_every 10ns

#Set Data In to 1

add_force data_in {0 0ns} {1 100ns}

run 50000 ns

         仿真结果如图7所示。

 

7 仿真结果