使用MATLAB对VIVADO工程进行simulink仿真

前言:

  • 以前我的FPGA工程都是自己编写TESTBENCH进行仿真,不过有几个缺点:
    1,随着工程的复杂程度,需要编写的TESTBENCH也越来越复杂,工作量太大。
    2,输入信号不好模拟,只能生成一些比较标准的信号。复杂信号的产生也是需要很大的工作量。
    最近发现MATLAB和XILINX官方有合作的simulink,可以很方便地对VIVADO工程进行仿真,就把自己做的一个小工程拿来练习了一下。
  1. 我用的是MATLAB2018,首先打开里面的simulink,如下所示:

在这里插入图片描述

    • 新建一个.SLX文件,并且把VIVADO里面的.V文件复制到同一个目录下,然后在TOOL里面的libiary里面找到xilinx的资源库,使用里面的black box。
      在这里插入图片描述
  1. 会让你选择使用哪一个.V文件,确认后会自动生成端口,并在文件夹里面生成一个.m文件。对了,我是用VERILOG写的,要求里面不能有大写字母和某些关键字,不然会报错。(虽然VIVADO能编译通过)
    在这里插入图片描述
    4.先写了一个很简单的代码实验一下,已经成功输出波形。输入只有一个触发信号,输出了一个计数器和一个固定数,我理解的是黄色的那个IN,OUT端口相当于AD和DA,把输入转换成数字信号送给FPGA,再把输出转换成模拟信号显示在示波器上面。
    在这里插入图片描述
    输出波形如下图:
    在这里插入图片描述

5.专门说一下时钟的问题
simulink的时钟是在system generator里面设置的,导入的balck box没有时钟引脚,但是导入的信号信号必须成对出现才能识别,所以在.V文件里面要加一个时钟的使能引脚,这样在导入的时候就不会把时钟引脚识别成信号引脚了。

在这里插入图片描述
在这里插入图片描述

6.如果在主程序内又调用了其它.v文件,则需要人为修改生成的**_config.m文件。

在这里插入图片描述
7.好像MATLAB里面不能使用下降沿,我的奇分频模块用了上升沿和下降沿分别计数,但是只出来了上升沿的变化,下降沿好像没有生效。

8.每次更改了主程序的.V文件后,好像必须重新生成_config.m文件,不然就会报错?(不需要,是我文件名写错了)

小结:
就目前学习情况来看,个人觉得simulink和testbench的区别主要以下几点:

  1. 输入信号的仿真:
    simulink可以模拟比较复杂的信号,比如各种调制信号,带噪声的信号等。目前我在testbench里面只能写比较标准的正弦波、方波等。但是好像testbench也支持外部数据的直接导入(这个我还没用过,应该也可以直接把MATLAB生成的数据导入进去)。
  2. 输入时钟模拟:
    simulink是系统时钟,也支持多时钟域,不过好像要设置在不同的Subsystem里面。同一个Subsystem里面好像只支持一个系统时钟。testbecnh里面我是自己用initial 生成的不同时钟,感觉要方便一些。
  3. 仿真结果查看:
    simulink是查看的端口输出,如果想在调试过程中看中间的数据,首先必须映射到端口输出,这样好像就必须重新生成black box和.m文件。而testbench是直接在VIVADO里面仿真,任何一个数据都能直接查看,方便太多。

以上都是个人观点,simulink和testbench我都属于新手,有不同看法或者更方便用法的欢迎交流。

2022 02 10:今天才知道原来testbench仿真时对有些输出控制信号不用写逻辑代码,可以通过查看仿真结果,在出错的时间点直接写控制信号。比如我的仿真卡死在5865010ns处,查到原因是spi返回状态不对,可以直接用以下方式给输入信号赋值。

  //----FLASH工作卡死在RFLAG_STA---//       +503650//spi_status[7] == 'b1时跳下一状态
  initial
  begin
   #5865010  io_n25_sdio_reg <= 4'hf;
   #60       io_n25_sdio_reg <= 4'hf;
   #60       io_n25_sdio_reg <= 4'hf;
   #240       io_n25_sdio_reg <= 4'hf;
   #60       io_n25_sdio_reg <= 4'hf;
   end 


不用我用了之后,发现这样做的好处是对有些复杂的模块不需要了解其功能,只需要知道他为什么出错,就可以跳过这一段。但是也存在一些不好的地方:
1.如果有些问题是循环出现的,比如说是状态机卡死在某个状态,有可能会不断出现,就必须重复写很多段这个代码
2.就是主程序代码如果有改动,有可能会导致出错的时间点变了,又必须重新去改时间。
如果是在testbench里面用逻辑代码实现,就不会有这些问题。所以还是看实际情况使用吧。

2022.07.08
今天用simulink仿真时碰到一个问题,在用DDS Compiler 6.0这个IP核时,如果用固定频率仿真就没问题,如果使用里面的可变频率输入时就会出错。

在这里插入图片描述

开始一直以为是IP核有问题,版本不对或者什么的,后来发现是这个频率输入端口的问题,他要求必须是32位定点数,我如果
把这个NCO送其它数据格式就出现如下提示:

Input port 's_axis_config_tdata_pinc' is expected to be UFix_32_32, but is Bool
Error occurred during "Rate and Type Error Checking".

如果我发送定点数,就直接报错什么IP核调用失败。
在这里插入图片描述
报错如下:
ERROR: [USF-XSim-62] 'elaborate' step failed with error(s). Please check the Tcl console output or 'C:/Users/lij2/AppData/Local/Temp/xlsim62c7c60e/hdl_netlist/xelab.sim/sim_1/behav/xsim/elaborate.log' file for more information. Please refer to 'C:/Users/lij2/AppData/Local/Temp/xlsim62c7c60e/vivado.log' for more details.
去log文件里面查出来是,还没找到原因。

ERROR: [VRFC 10-147] xbip_pipe_v3_0_5.xbip_pipe_v3_0_5_viv_comp failed to restore
ERROR: [VRFC 10-213] Registering Dependencies Error: The primary unit 'xbip_pipe_v3_0_5_viv_comp' could not be found during restore

--------------------------------------------------------------分割线------------------------------------------------------------------------------------
1)这个问题在别人电脑上没有出现,应该还是simulink设置的原因。
2)把这个编译成IP核后,在VIVADO上仿真时,也报错了,感觉 和MATLAB报错是一样的。
在这里插入图片描述
不过VIVADO里面有解决办法,这里直接引用别人的文章

https://blog.csdn.net/Reborn_Lee/article/details/95316014

结果按照这个设置后能进仿真界面了,但是仿真是报致命警告

ERROR: [Simulator 45-1] A fatal run-time error was detected. Simulation cannot continue.

--------------------------------------------------------------分割线------------------------------------------------------------------------------------
没办法,没找到原因,把DDS Compiler 6.0这个IP核改成固定频率了,然后生成IP核,能够在VIVADO里面正常运行。又遇到一个新的问题,就是想在一个自定义IP核(IP1)里面使用MATLAB生成的这个IP核(IP2),但是每次重新打开工程时都会找不到这个IP核,在网上查了一个方法,https://blog.csdn.net/weixin_42553916/article/details/121137954,不过照着做了还是没有解决,个人觉得是因为编辑自定义IP1时没有把IP2的目录正确导入。然后解决办法是新建一个工程,把IP1和IP2弄在一起,然后再生成一个新的IP3,这样在其它工 程里面调用IP3,就不然出现IP2找不到的问题了。
PS:在设置IP端口时需要手动设置CLK和RESET端口参数,不然VIVADO不能自动识别,把CLK连接到这个端口上就会报错。
在这里插入图片描述在这里插入图片描述
2023.11.09
Matlab在编译生成IP时,同时会生成一个ZIP的压缩包,在VIVADO里面添加IP核时,直接添加这个ZIP文件就可以了

在这里插入图片描述

  • 4
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pp_0604

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值