首页 > 其他分享 >3-1-02AXI4-FULL-uiFDMA IP仿真验证

3-1-02AXI4-FULL-uiFDMA IP仿真验证

时间:2023-12-30 11:22:18浏览次数:35  
标签:begin FULL end burst fdma IP FDMA uiFDMA data

软件版本:vitis2021.1(vivado2021.1)

操作系统:WIN10 64bit

硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA

登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!

2.1概述

本文试验中对前面编写的FDMA IP进行仿真验证。

2.2saxi_full_mem IP介绍

这个IP的源码可以基于XILINX提供的axi-full-slave的模板简单修改就可以实现,如果读者想要更加详细的学习AXI总线想内容,可以阅读或者观看米联客"米联客2022版AXI4总线专题篇"相关课程内容。本文实验使用我们已经修改好的代码来完成验证。

这个IP后面可以用于AXI4总线的仿真验证

2.3创建FPGA逻辑工程

设置IP路径

添加已经创建好的IP

输入关键词fdma,在最后可以看到,双击添加Ip

可以看到本文的FDMA版本升级到3.2版

完成连线

继续添加剩余IP

 

 

 

 

 

 

 

设置IP参数

完成连线

设置地址分配:

2.4添加FDMA接口控制代码

 

添加完成后如下图:

fdma_axi_slave_test.v源码如下

/*******************************MILIANKE*******************************

*Company : MiLianKe Electronic Technology Co., Ltd.

*WebSite:https://www.milianke.com

*TechWeb:https://www.uisrc.com

*tmall-shop:https://milianke.tmall.com

*jd-shop:https://milianke.jd.com

*taobao-shop1: https://milianke.taobao.com

*Create Date: 2021/04/25

*Module Name:fdma_axi_slave_test

*File Name:fdma_axi_slave_test.v

*Description:

*The reference demo provided by Milianke is only used for learning.

*We cannot ensure that the demo itself is free of bugs, so users

*should be responsible for the technical problems and consequences

*caused by the use of their own products.

*Copyright: Copyright (c) MiLianKe

*All rights reserved.

*Revision: 1.0

*Signal description

*1) I_ input

*2) O_ output

*3) IO_ input output

*4) S_ system internal signal

*5) _n activ low

*6) _dg debug signal

*7) _r delay or register

*8) _s state mechine

*********************************************************************/

`timescale 1ns / 1ps

module fdma_axi_slave_test(

  input sysclk

);

 

wire [31:0]   fdma_raddr;

reg           fdma_rareq;

wire          fdma_rbusy;

wire [31:0]   fdma_rdata;

wire [15:0]   fdma_rsize;

wire          fdma_rvalid;

wire [31:0]   fdma_waddr;

reg           fdma_wareq;

wire          fdma_wbusy;

wire [31:0]   fdma_wdata;

wire [15:0]   fdma_wsize;

wire          fdma_wvalid;

wire          ui_clk;

 

parameter TEST_MEM_SIZE   = 32'd20000; //测试内存的地址范围

parameter FDMA_BURST_LEN  = 16'd500; //测试一次的长度

parameter ADDR_MEM_OFFSET = 0; //地址偏移量

parameter ADDR_INC = FDMA_BURST_LEN*4; //下一次FDMA burst的地址增加

   

parameter WRITE1 = 0;

parameter WRITE2 = 1;

parameter WAIT   = 2;

parameter READ1  = 3;

parameter READ2  = 4;

 

reg [31: 0] t_data;

reg [31: 0] fdma_waddr_r;

reg [2  :0] T_S = 0;

 

assign fdma_waddr = fdma_waddr_r + ADDR_MEM_OFFSET; //设置偏移地址

assign fdma_raddr = fdma_waddr; //读写地址相同

 

assign fdma_wsize = FDMA_BURST_LEN; //设置FDMA控制器一次写burst的数据长度

assign fdma_rsize = FDMA_BURST_LEN; //设置FDMA控制器一次读burst的数据长度

assign fdma_wdata ={t_data,t_data,t_data,t_data};

   

   

////延迟复位

reg [8:0] rst_cnt = 0;

always @(posedge ui_clk)

    if(rst_cnt[8] == 1'b0)

         rst_cnt <= rst_cnt + 1'b1;

     else

         rst_cnt <= rst_cnt;

 

//FDMA 读写控制器,每次先写后读,读出后对比数据正确性

always @(posedge ui_clk)begin

    if(rst_cnt[8] == 1'b0)begin

        T_S <=0;  

        fdma_wareq  <= 1'b0;

        fdma_rareq  <= 1'b0;

        t_data<=0;

        fdma_waddr_r <=0;      

    end

    else begin

        case(T_S)      

        WRITE1:begin

            if(fdma_waddr_r==TEST_MEM_SIZE) fdma_waddr_r<=0; //超出测试内存范围,重新测试

                if(!fdma_wbusy)begin//当fdma进入空闲,fdma_wbusy=0,请求写

                    fdma_wareq  <= 1'b1; //设置写请求

                    t_data  <= 0; //设置初值

                end

                if(fdma_wareq&&fdma_wbusy)begin//当fdma响应请求后,fdma_wbusy=1,进入下一个状态

                    fdma_wareq  <= 1'b0;

                    T_S         <= WRITE2;

                end

        end

        WRITE2:begin

            if(!fdma_wbusy) begin//当fdma完成请求后,fdma_wbusy=0,进入下一个状态

                 T_S <= WAIT;

                 t_data  <= 32'd0;

            end

            else if(fdma_wvalid) begin//当fdma_wvalid有效期间必须写入有效数据

                t_data <= t_data + 1'b1;

            end

        end

        WAIT:begin//not needed

            T_S <= READ1;

        end

        READ1:begin

            if(!fdma_rbusy)begin//当fdma进入空闲,fdma_rbusy=0,请求读

                fdma_rareq  <= 1'b1; //设置读请求

                t_data   <= 0; //设置初值

            end

            if(fdma_rareq&&fdma_rbusy)begin//当fdma响应请求后,fdma_rbusy=1,进入下一个状态

                 fdma_rareq  <= 1'b0; //清除读请求

                 T_S         <= READ2;

            end

        end

        READ2:begin

            if(!fdma_rbusy) begin//当fdma完成请求后,fdma_rbusy=0,进入下一个状态

                 T_S <= WRITE1;

                 t_data  <= 32'd0;

                 fdma_waddr_r  <= fdma_waddr_r + ADDR_INC; //当本次读写周期完成增加地址,地址以BYTE计算

            end

            else if(fdma_rvalid) begin//当fdma_rvalid有效期间读出的数据有效

                t_data <= t_data + 1'b1;

            end

        end  

        default:

            T_S <= WRITE1;    

        endcase

    end

  end

 //对比是否有错误数据

wire test_error = (fdma_rvalid && (t_data[15:0] != fdma_rdata[15:0]));

 

//ila_0 ila_dbg (

//  .clk(ui_clk),

//  .probe0({fdma_wdata[15:0],fdma_wareq,fdma_wvalid,fdma_wbusy}),

//  .probe1({fdma_rdata[15:0],t_data[15:0],fdma_rvalid,fdma_rbusy,T_S,test_error})

//);

 

  system system_i

       (.FDMA_S_0_fdma_raddr(fdma_raddr),

        .FDMA_S_0_fdma_rareq(fdma_rareq),

        .FDMA_S_0_fdma_rbusy(fdma_rbusy),

        .FDMA_S_0_fdma_rdata(fdma_rdata),

        .FDMA_S_0_fdma_rready(1'b1),

        .FDMA_S_0_fdma_rsize(fdma_rsize),

        .FDMA_S_0_fdma_rvalid(fdma_rvalid),

        .FDMA_S_0_fdma_waddr(fdma_waddr),

        .FDMA_S_0_fdma_wareq(fdma_wareq),

        .FDMA_S_0_fdma_wbusy(fdma_wbusy),

        .FDMA_S_0_fdma_wdata(fdma_wdata),

        .FDMA_S_0_fdma_wready(1'b1),

        .FDMA_S_0_fdma_wsize(fdma_wsize),

        .FDMA_S_0_fdma_wvalid(fdma_wvalid),

        .sysclk(sysclk),

        .ui_clk(ui_clk)

        );        

 

endmodule

以上代码中调用的system.bd的图形代码接口。在状态机中,每次写500个长度32bit的数据,再读出来判断数据是否正确,因此传输20000字节的数据需要传输10次,每次FDMA传输的地址递增2000。

2.5仿真文件

添加仿真文件

以下文件路径以实际工程的路径为准

添加完成后:

仿真文件非常简单,只要提供时钟激励就可以。

`timescale 1ns / 1ps

module fdma_axi_slave_test_tb();

 reg sysclk;

 fdma_axi_slave_test fdma_axi_slave_test_inst

(

    .sysclk(sysclk)

 );

initial begin

     sysclk  = 0;

     #100;

end

    always #10 sysclk = ~sysclk;  

endmodule

2.6实验结果

下图中红色框内分别代表了FDMA一次burst的写操作和一次burst的读操作。FDMA 控制器会根据用户代码设置的fdma_wsize和fdma_rsize以及设置的FDMA IP参数中,AXI4总线支持的最大burst 长度,来决定进行多少次的AXI4 burst。

本次写传输中,wburst_len_req自动发起计算AXI4总线需要发起的传输长度,本次传输中,FDMA的用户代码每次发起传输长度为500,因此FDMA部分会自动控制AXI部分的传输长度,第一次axi burst长度为256,第二次axi burst长度为244。

一次FDMA写传输的起始时序

连续burst,自动管理burst长度,以及一次FDMA写传输结束时序

本次读传输中,rburst_len_req自动发起计算AXI4总线需要发起的传输长度,本次传输中,FDMA的用户代码每次发起传输长度为500,因此FDMA部分会自动控制AXI部分的传输长度,第一次axi burst长度为256,第二次axi burst长度为244。

一次FDMA读传输的起始时序

连续burst,自动管理burst长度,以及一次FDMA读传输结束时序

另外放大后可以看到rvalid不是连续的,这个读者也可以自己去优化saxi_ful_mem ip让这IP支持连续的rvalid

标签:begin,FULL,end,burst,fdma,IP,FDMA,uiFDMA,data
From: https://www.cnblogs.com/milianke/p/17936170.html

相关文章

  • 3-1-01 AXI4-FULL-MASTER IP FDMA介绍
    件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!1.1概述    FDMA是米联客的基于AXI4总线协议定制的一个DMA控制器。本文对AXI4-FULL总线接口进行了封装,同时定义了简......
  • IP: dns-lookup : 查询域名的公网IP地址 解决 DNS域名解析绑架的问题例如访问 raw.git
    示例:https://github.com/orgs/community/discussions/42655https://github.com/mwaskom/seaborn-data/blob/2b29313169bf8dfa77d8dc930f7bd3eba559a906/dataset_names.txthttps://www.ip-lookup.org/dns-lookup/raw.githubusercontent.comIPDetailsDomain:Raw.githubuser......
  • IPTV SQM的项目总结
    本文于2015年底完成,发布在个人博客网站上,标题为《项目总结--纪念我参与过的IPTVSQM项目》。考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来。时间很快,离开SQM团队已接近10个月,对于参与了5年的项目,很早就想写些什么来纪念;现在终于找到了时间,用自己......
  • JavaScript的apply、call、bind方法
    JavaScript的apply、call、bind方法概述简述这三个方法存在一定的迷惑性,而且对于刚看ES6的人来说,十分难理解,这里为了以后我可能会复习到这个知识点,做出详解。总的来说,这三个方法都是将某某某(某01)绑定在某某某(某02)上,然后执行这个被绑定的某某某(某01),或者单纯就是绑定不执行。详......
  • Apipost一键压测参数化功能详解
    最近更新中Apipost对UI页面进行了一些调整,另外一键压测功能支持参数化!本篇文章将详细介绍这些改动!API调试页面的细节改动在请求区填入请求参数或脚本时会有相应的标识如在Query中填入多个参数时上方会展示数量在预、后执行脚本中写入脚本上方会有绿色小点标识一键压测参数化一键压......
  • Juniper日常维护命令
    关闭1、日常show操作#show查看所有配置#show|displayset查看set格式的所有配置#showsystem|displayset查看set格式的system层级配置#showsystemlogin|displayset查看set格式的system层级下的login层级配置#runshowversion#runshowroute......
  • 35 VIVADO用户IP软件总线接口封装
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述使用VIVADO基于图形化创新编程FPGA的方式可以大大提高FPGA编程效率,但是前提是把代码打包成图形化的IP......
  • Apipost一键压测参数化功能详解
    最近更新中Apipost对UI页面进行了一些调整,另外一键压测功能支持参数化!本篇文章将详细介绍这些改动!API调试页面的细节改动在请求区填入请求参数或脚本时会有相应的标识如在Query中填入多个参数时上方会展示数量在预、后执行脚本中写入脚本上方会有绿色小点标识 一键压测参......
  • 34 VIVADO自定义IP简单封装方法
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述XILINX作为FPGA全球老大,不仅仅是硬件技术实力,而且EDA软件也是非常优秀,XILINXVIVADO是业内最先进的开......
  • 使用Pipenv进行Python虚拟环境管理--conda平替
    Pipenv使用教程Anaconda是一个开箱即用的Python开发环境,同时也包含虚拟环境管理工具conda。但是Anaconda的缺点包括:大型安装包:Anaconda的安装包相对较大,需要消耗较多的磁盘空间。依赖冲突:在使用Anaconda时,若安装包过多可能会出现依赖冲突的情况,需要手动解决。此时则......