MYIR-ZYNQ7000系列-zturn教程(19):对axi_stream核进行仿真以及axi_stream总线的初步讲解

我这里一共调用了两个自定义的IP都是基于axi_stream的IP核,一个是主机master一个是从机slave,然后

将这两个调用的IP例化到一个新创建的fpga工程,最后写一个仿真脚本让这个master主机对这个从机

slave进行写。

主机:

从机:

将stream接口的master和slave都例化到fpga工程的顶层文件如下图所示

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2018/09/06 16:16:05
// Design Name: 
// Module Name: stream_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module stream_test(
    input   axis_aclk,
    input   axis_aresetn
    );
    
    parameter integer C_M00_AXIS_TDATA_WIDTH	= 32;
    parameter integer C_M00_AXIS_START_COUNT    = 32;
    
    wire    [C_M00_AXIS_TDATA_WIDTH-1 : 0]      axis_tdata;
    wire    [(C_M00_AXIS_TDATA_WIDTH/8)-1 : 0]  axis_tstrb;
    wire                                        axis_tlast;
    wire                                        axis_tvalid;
    wire                                        axis_tready;
  
    
 stream_master_0 u1 (
      .m00_axis_tdata(axis_tdata),      // output wire [31 : 0] m00_axis_tdata
      .m00_axis_tstrb(axis_tstrb),      // output wire [3 : 0] m00_axis_tstrb
      .m00_axis_tlast(axis_tlast),      // output wire m00_axis_tlast
      .m00_axis_tvalid(axis_tvalid),    // output wire m00_axis_tvalid
      .m00_axis_tready(axis_tready),    // input wire m00_axis_tready
      .m00_axis_aclk(axis_aclk),        // input wire m00_axis_aclk
      .m00_axis_aresetn(axis_aresetn)  // input wire m00_axis_aresetn
    );
    
stream_slave_0 u2 (
      .s00_axis_tdata(axis_tdata),      // input wire [31 : 0] s00_axis_tdata
      .s00_axis_tstrb(axis_tstrb),      // input wire [3 : 0] s00_axis_tstrb
      .s00_axis_tlast(axis_tlast),      // input wire s00_axis_tlast
      .s00_axis_tvalid(axis_tvalid),    // input wire s00_axis_tvalid
      .s00_axis_tready(axis_tready),    // output wire s00_axis_tready
      .s00_axis_aclk(axis_aclk),        // input wire s00_axis_aclk
      .s00_axis_aresetn(axis_aresetn)  // input wire s00_axis_aresetn
    );       
    
endmodule

下面这个这个fpga工程的仿真脚本

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2018/09/06 17:25:36
// Design Name: 
// Module Name: test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module test_tb();
    

          reg axi_aclk;    // AXI总线时钟
          reg axi_aresetn;   // 系统复位信号
         

         
        stream_test u1(
              .axis_aclk(axi_aclk),
              .axis_aresetn(axi_aresetn)
              );
         
     
         always begin
            #10;
            axi_aclk = ~axi_aclk;
          end
         
          initial begin
            axi_aclk    = 1'b0;
            axi_aresetn = 1'b1;

         
            #10;
            axi_aresetn = 1'b0;
            #5;
            axi_aresetn = 1'b1;
            #5;
          end    
        

endmodule

这个是运行仿真脚本后的master主机对从机进行写

下面主要对这个stream协议的基本信号的介绍

因这个stream协议去掉了axi_lite的很多的地址项之间的交互所以这个stream传输速度比较快,但因为没有地址所以这个

master主机无法对这个从机进行读,这里讨论的只是stream的主机对从机的写

只有当这个axis_tvalid为高的时候传输的的数据才有效,也就是说这个信号为高时才能进行数据传输

再来看这个axis_tready信号,当这个axis_tready为高时说明从机已经准备好了可以接收数据了

再来看这个axis_tlast信号,这个信号为高时表示这个数据位本次传输的最后一个数据,也就这个00000008为

传输的最后一个数据

这个axis_tstrb为传输的数据位,每一位代表一个字节,这里为f也就是1111,四个位都为1也就是传输4个字节32位数据

这个是主机对从机操作的一个简单示意图,因交互信号比较少所以传输数据比较快,所以操作起来比较简单

大家可以仔细比较一下axi_lite和axi_stream两个传输效率,axi_lite两个32位数据还没有传输完成axi_stream的8个32位

已经传输完成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章