设为首页 加入收藏

TOP

利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator(一)
2019-08-24 00:07:01 】 浏览:192
Tags:利用 ZYNQ SOC 快速 打开 算法 验证 通路 system generator 导入 integrator

一、前言

  利用FPGA设计算法一直以来都是热点,同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen(system generator)工具扩展了MATLAB的simulink,提供很多IP Catalog中没有的基础模块和针对DSP应用的硬件模型。工程师利用丰富的模块和MATLAB强大的数据处理及可视化能力能够更快速完成设计与仿真验证工作。

二、sysGen算法系统设计

  本文以个最简单的例子讲述利用sysGen搭建算法IP核,并集成到IP Integrator中作为ZYNQ PS端CPU的“定制外设”。仅用于测试目的。设计需求:在sysGen中搭建系统,将输入定点整数数据*2后输出,输入位宽为8bit。

   在System Generator token中设定仿真步长为1sec。点击需要观测的信号连线,右击选择Xilinx add to viewer。启动仿真并启动Xilinx waveform viewer:

  本质上就是调用Vivado的XSim工具进行行为仿真。仿真结果可见完成预期目标,现双击System Generator token ,选择Compiliation类型为IP Catalog并勾选Create  testbench,按下Generate生成IP核。

三、仿真测试

  根据User Guide介绍sysGen是“周期和比特精准的”,我们还是在Vivado环境下再次验证下。netlist文件夹内子文件夹ip_catalog中为IP核示例工程,由于自动生成了testbench,打开后直接进行行为仿真。sysGen在创建testbench时会将经过gatein和gateout的数据储存到文件中,testbench进行的工作为:将gatein数据作为测试激励送入到相应设计输入端口,之后把设计输出得到结果与gateout文件数据进行逐一比较从而验证设计是否与sysGen环境下仿真结果一致。

  发现个比较有意思的现象,自动生成的testbench中clock生成并约束的50MHz,而是认为进行了拓展。

  仿真波形如图:

  将clock处改动为50MHz后,经过测试发现如果系统一开始就输入数据,前几个数据没有被真正处理,输出错误。可能是软件BUG吧,不过这种情况也非常少见,实际系统中输入数据大多情况会启动一段时间后才输入。这里等待100ns后再启动clock翻转:

  改动后仿真波形:

四、AXI-Stream总线形式IP

  到此算法IP的设计与验证结束。如果想将这个IP核导入到IP Integrator中作为CPU的外设,其接口必须满足AXI总线标准,因此回到sysGen中更改端口名称和位宽。端口要符合AXI-Stream标准信号名称,位宽为8bit整数倍。

   生成IP核后,打开新的工程,导入该IP核到repository。

五、Block Design系统搭建

 系统结构与上一篇该系列博文类似,均是以AXI DMA为核心的Loop系统,只是将AXI-Stream Data FIFO改成了自定义IP核。由于IP核slave和master接口只包含tdata和tvalid信号,因此需要添加接口衔接的一些简单逻辑。tready信号和tkeep信号直接连接constant使用常数驱动,DMA的s_axis_s2mm接口的tlast由wrapper内计数器逻辑驱动,将system中FCLK_CLK0 peripheral_aresetn m_axis_tvalid和s_axis_s2mm_tlast信号引出到wrapper中。

 

  有一点比较坑:自定义IP通过AXI总线与DMA互联时,总线下相应的接口不一定会正确对应,所以需要分别将两端的每个接口相连。可以通过打开综合后的设计来确认连线无误。

  自动生成wrapper后改动添加代码如下:

  1 `timescale 1 ps / 1 ps
  2 
  3 module user_wrapper
  4    (DC,
  5     DDR_addr,
  6     DDR_ba,
  7     DDR_cas_n,
  8     DDR_ck_n,
  9     DDR_ck_p,
 10     DDR_cke,
 11     DDR_cs_n,
 12     DDR_dm,
 13     DDR_dq,
 14     DDR_dqs_n,
 15     DDR_dqs_p,
 16     DDR_odt,
 17     DDR_ras_n,
 18     DDR_reset_n,
 19     DDR_we_n,
 20     //FCLK_CLK0,
 21     FIXED_IO_ddr_vrn,
 22     FIXED_IO_ddr_vrp,
 23     FIXED_IO_mio,
 24     FIXED_IO_ps_clk,
 25     FIXED_IO_ps_porb,
 26     FIXED_IO_ps_srstb,
 27     RES,
 28     SCLK,
 29     SDIN,
 30     VBAT,
 31     VDD
 32     //m_axis_tvalid,
 33     //peripheral_aresetn,
 34     //s_axis_s2mm_tlast
 35 );
 36   output DC;
 37   inout [14:0]DDR_addr;
 38   inout [2:0]DDR_ba;
 39   inout DDR_cas_n;
 40   inout DDR_ck_n;
 41   inout DDR_ck_p;
 42   inout DDR_cke;
 43   inout DDR_cs_n;
 44   inout [3:0]DDR_dm;
 45   inout [31:0]DDR_dq;
 46   inout [3:0]DDR_dqs_n;
 47   inout [3:0]DDR_dqs_p;
 48   inout DDR_odt;
 49   inout DDR_ras_n;
 50   inout DDR_reset_n;
 51   inout DDR_we_n;
 52   //output FCLK_CLK0;
 53   inout FIXED_IO_ddr_vrn;
 54   inout FIXED_IO_ddr_vrp;
 55   inout [53:0]FIXED_IO_mio;
 56   inout FIXED_IO_ps_clk;
 57   inout FIXED_IO_ps_porb;
 58   inout FIXED_IO_ps_srstb;
 59   output RES;
 60   output SCLK;
 61   output SDIN;
 62   output VBAT;
 63   output VDD;
 64   //output [0:0]m_axis_tvalid;
 65   //output [0:0]peripheral_aresetn;
 66   //input s_axis_s2mm_tlast;
 67 
 68 
 69   localparam DATA_NUM = 256;
 70 
 71   wire DC;
 72   wire [14:0]DDR_addr;
 73   wire [2:0]DDR_ba;
 74   wire DDR_cas_n;
 75   wire DDR_ck_n;
 76   wire DDR_ck_p;
 77   wire DDR_cke;
 78   wire DDR_cs_n;
 79   wire [3:0]DDR_dm;
 80
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇剑指Offer - 九度1506 - 求1+2+3+.. 下一篇目标反射回波检测算法及其FPGA实..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目