riffa架构的IP制作

zynq系列FPGA的riffa架构搭建及IP的创建

开发环境:windows10,软件:vivado2018.2,开发板:zc706

  1. 创建riffa工程
    如下图所示:
    riffa架构的IP制作_第1张图片
    创建工程后下载用于创建riffa架构的源代码,下载网址为:https://github.com/KastnerRG/riffa。下载后的文件如下图所示:
    riffa架构的IP制作_第2张图片
    其中C/C++文件里为所使用的上位机代码;driver文件里面是riffa架构的驱动程序;fpga文件夹里面为后续搭建riffa架构所需要的verilog代码。
    建立好vivado工程后,点击打开IP Catalog 打开IP库,搜索并选择7 Series integrated Block for PCI Express,双击打开进行配置。配置如下图所示:
    riffa架构的IP制作_第3张图片
    根据zc706的原理图,可知pcie最大支持X4模式,Core Capabilities一栏中勾选Buffering Optimized for
    Bus Mastering Application。riffa架构的IP制作_第4张图片
    Shared Logic一栏中取消勾选如下所示,其他设置保持不变即可。点击ok完成该IP的配置。
    riffa架构的IP制作_第5张图片
    下面需要复制上述fpga文件夹中的verilog代码。打开fpga文件夹,选择xilinx文件夹,打开zc706文件夹,内容如图所示:
    riffa架构的IP制作_第6张图片
    将riffa_wrapper_zc706.v文件加入建立的project中。点击打开ZC706_Gen1x4If64文件夹,打开hdl文件夹,将ZC706_Gen1x4If64.v文件加入project中。然后返回到fpga文件夹目录下打开riffa_hdl文件夹里面所有的文件加入project中。riffa架构的IP制作_第7张图片
    加入project后如下图所示:
    riffa架构的IP制作_第8张图片
    其中有个问号,我们需要先处理一下。打开顶层ZC706_Gen1x4lf64.v文件,修改例化名称如下图所示:
    riffa架构的IP制作_第9张图片
    删除多余的translation_altera(translation_altera.v)文件,选中Verilog Header中的所有文件右击选择set global include,此时会有个文件schedules.vh报错,右击选择clear global include 。此处即完成riffa架构的rtl设计。需要修改参数可以打开顶层文件在parameters中修改。
    riffa架构的IP制作_第10张图片
    riffa架构搭建完成后 可点击Run Synthesis来进行验证。

  2. riffa架构的IP核心创建。首先了解riffa架构的整体结构如下所示:
    riffa架构的IP制作_第11张图片
    其最多可支持16通道的扩展。图中左侧为PCIE接口,右边为需要扩展的数据通道接口,以供后续的block design 设计使用。
    管脚的定义和说明如下图所示:
    riffa架构的IP制作_第12张图片
    这里的管脚说明可用于后面设计建立对应的AXI4 IP核心用于riffa架构的扩展设计。
    这里在原工程目录中新建ip_define文件夹,将上述使用的文件全部复制粘贴进去。
    在原工程中选择Tools 并点击打开Creat and Package New IP。进入ip的设计界面。选择Package a specified directroy选项。选择刚才新建的文件夹 点击next到finish。
    如有错误发生,则删除多余的translation_altera(translation_altera.v)文件,选中Verilog Header中的所有文件右击选择set global include,此时会有个文件schedules.vh报错,右击选择clear global include 即可。
    打开顶层文件,查看第368行至398行,这部分是riffa架构自带的测试通道,此处只需要将该通道的对应管教接到外部即可。
    只需要在顶层文件中讲riffa架构的相应代码引出即可。添加代码如下:
    第一部分:
    //rx channel
    output [C_NUM_CHNL-1:0] CHNL_RX_CLK,
    input [C_NUM_CHNL-1:0] CHNL_RX,
    output [C_NUM_CHNL-1:0] CHNL_RX_ACK,
    input [C_NUM_CHNL-1:0] CHNL_RX_LAST,
    input [(C_NUM_CHNL*SIG_CHNL_LENGTH_W)-1:0] CHNL_RX_LEN, input [(C_NUM_CHNL*SIG_CHNL_OFFSET_W)-1:0] CHNL_RX_OFF,
    input [(C_NUM_CHNLC_PCI_DATA_WIDTH)-1:0] CHNL_RX_DATA,
    input [C_NUM_CHNL-1:0] CHNL_RX_DATA_VALID,
    output [C_NUM_CHNL-1:0] CHNL_RX_DATA_REN,
    //tx channel
    output [C_NUM_CHNL-1:0] CHNL_TX_CLK,
    output [C_NUM_CHNL-1:0] CHNL_TX,
    input [C_NUM_CHNL-1:0] CHNL_TX_ACK,
    output [C_NUM_CHNL-1:0] CHNL_TX_LAST,
    output [(C_NUM_CHNL
    SIG_CHNL_LENGTH_W)-1:0] CHNL_TX_LEN, output [(C_NUM_CHNL*SIG_CHNL_OFFSET_W)-1:0] CHNL_TX_OFF,
    output [(C_NUM_CHNLC_PCI_DATA_WIDTH)-1:0] CHNL_TX_DATA,
    output [C_NUM_CHNL-1:0] CHNL_TX_DATA_VALID,
    input [C_NUM_CHNL-1:0] CHNL_TX_DATA_REN
    第二部分:
    wire rst_out;
    wire [C_NUM_CHNL-1:0] chnl_rx_clk;
    wire [C_NUM_CHNL-1:0] chnl_rx;
    wire [C_NUM_CHNL-1:0] chnl_rx_ack;
    wire [C_NUM_CHNL-1:0] chnl_rx_last;
    wire [(C_NUM_CHNL
    SIG_CHNL_LENGTH_W)-1:0] chnl_rx_len; wire [(C_NUM_CHNL*SIG_CHNL_OFFSET_W)-1:0] chnl_rx_off;
    wire [(C_NUM_CHNL*C_PCI_DATA_WIDTH)-1:0] chnl_rx_data;
    wire [C_NUM_CHNL-1:0] chnl_rx_data_valid;
    wire [C_NUM_CHNL-1:0] chnl_rx_data_ren;

    wire [C_NUM_CHNL-1:0] chnl_tx_clk;
    wire [C_NUM_CHNL-1:0] chnl_tx;
    wire [C_NUM_CHNL-1:0] chnl_tx_ack;
    wire [C_NUM_CHNL-1:0] chnl_tx_last;
    wire [(C_NUM_CHNL*SIG_CHNL_LENGTH_W)-1:0] chnl_tx_len; wire [(C_NUM_CHNL*SIG_CHNL_OFFSET_W)-1:0] chnl_tx_off;
    wire [(C_NUM_CHNL*C_PCI_DATA_WIDTH)-1:0] chnl_tx_data;
    wire [C_NUM_CHNL-1:0] chnl_tx_data_valid;
    wire [C_NUM_CHNL-1:0] chnl_tx_data_ren;
    第三部分:
    //rx channel
    assign CHNL_RX_CLK = chnl_rx_clk;
    assign CHNL_RX = chnl_rx;
    assign CHNL_RX_ACK = chnl_rx_ack;
    assign CHNL_RX_LAST = chnl_rx_last;
    assign CHNL_RX_LEN = chnl_rx_len;
    assign CHNL_RX_OFF = chnl_rx_off;
    assign CHNL_RX_DATA = chnl_rx_data;
    assign CHNL_RX_DATA_VALID = chnl_rx_data_valid;
    assign CHNL_RX_DATA_REN = chnl_rx_data_ren;
    //tx channel
    assign CHNL_TX_CLK = chnl_tx_clk;
    assign CHNL_TX = chnl_tx;
    assign CHNL_TX_ACK = chnl_tx_ack;
    assign CHNL_TX_LAST = chnl_tx_last;
    assign CHNL_TX_LEN = chnl_tx_len;
    assign CHNL_TX_OFF = chnl_tx_off;
    assign CHNL_TX_DATA = chnl_tx_data;
    assign CHNL_TX_DATA_VALID = chnl_tx_data_valid;
    assign CHNL_TX_DATA_REN = chnl_tx_data_ren;
    相关工程我会上传至主页中:
    然后封装成IP 即可。封装后的riffa ip如下所示:
    riffa架构的IP制作_第13张图片
    实际运用过程中如果出现unable to resolve ‘clog2s’这个问题,请参考如下所示的操作
    https://forums.xilinx.com/t5/Memory-Interfaces-and-NoC/MIG-Synthesis-critical-warnings-Netlist-29-160/m-p/698085:
    riffa架构的IP制作_第14张图片
    友情提示:此处的source type 就是值得file type。操作完后就可以通过编译了。
    riffa架构的IP制作_第15张图片
    看到这里了,给个点赞鼓励一下呗。

你可能感兴趣的:(fpga)