ZYNQ使用AXI4-HP接口总线读取DDR中的数据

这篇具有很好参考价值的文章主要介绍了ZYNQ使用AXI4-HP接口总线读取DDR中的数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

最近笔者在做项目的时候需要使用zynq中的AXI4-HP总线在PL端读取DDR中的数据这种功能,但是网上很多历程对于这方面只是创建了一个官方提供的IP核用于测试,并且每次写入和读取的长度为4K字节。所以为了满足我自己的项目需求,笔者将官方提供的测试IP核上做修改,主要实现一下功能:

1、上升沿使能读取数据。

2、读使能后,IP核需要从基地址开始,突发读取X次(X数量可控)

3、内置一个同步FIFO将读出的数据暂存在FIFO中。

二、IP核修改过程

第一步:创建一个官方提供的带AXI4的IP核。

可得到两个文件。(创建过程略,网上有很多教程)

ZYNQ使用AXI4-HP接口总线读取DDR中的数据

其中AXI4_v1_0.v是IP核的顶层文件,AXI4读写逻辑主要在AXI4_v1_0_M00_AXI.v文件中。 

创建完成后打开AXI4_v1_0_M00_AXI.v文件,输入的位置增加两个信号分别为

BURST_NUM 突发总次数
RST_FIFO FIFO复位信号

其中BURST_NUM信号为上述的X数量即,读使能后需要突发读的总次数。

第二步:修改读取/写入总长度

官方生成IP核规定了读写最长为4K字节,我们如果需要大数据量的话就需要修改这个读写数据量的总长度。将 C_MASTER_LENGTH 参数修改为22,该参数意为读/写遍历长度的位宽。22bit位宽代表可寻址4194303字节。(在178行)

第三步:修改突发读计数完毕条件

在下图所示的always中修改(718行)

ZYNQ使用AXI4-HP接口总线读取DDR中的数据

 以及最后的reads_done信号的使能条件(892行)

ZYNQ使用AXI4-HP接口总线读取DDR中的数据

第四步:修改控制状态机

找到控制状态机的位置,修改状态机(737行)

1、 在IDLE状态中调整为触发后跳转至INIT_READ状态

2、INIT_READ状态中,将读取完毕后状态跳转为INIT_COMPARE即可

	  //implement master command interface state machine                                                        
	  //状态机-控制接口                                                                                                     
	  always @ ( posedge M_AXI_ACLK)                                                                            
	  begin                                                                                                     
	    if (M_AXI_ARESETN == 1'b0 )                                                                             
	      begin                                                                                                 
	        // reset condition                                                                                  
	        // All the signals are assigned default values under reset condition                                
	        mst_exec_state      <= IDLE;                                                                
	        start_single_burst_write <= 1'b0;                                                                   
	        start_single_burst_read  <= 1'b0;                                                                   
	        compare_done      <= 1'b0;                                                                          
	        ERROR <= 1'b0;   
	      end                                                                                                   
	    else                                                                                                    
	      begin                                                                                                 
	                                                                                                            
	        // state transition                                                                                 
	        case (mst_exec_state)                                                                               
	                                                                                                            
	          IDLE:                                                                                     
	            // This state is responsible to wait for user defined C_M_START_COUNT                           
	            // number of clock cycles.                                                                      
	            if ( init_txn_pulse == 1'b1)            //===========上升沿触发一次事务                                          
	              begin                                                                                         
	                mst_exec_state  <= INIT_READ;      //触发后状态机跳转至读操作                                                        
	                ERROR <= 1'b0;
	                compare_done <= 1'b0;
	              end                                                                                           
	            else                                                                                            
	              begin                                                                                         
	                mst_exec_state  <= IDLE;                                                            
	              end                                                                                           
	                                                                                                            
	          INIT_WRITE:                                                                                       
	            // This state is responsible to issue start_single_write pulse to                               
	            // initiate a write transaction. Write transactions will be                                     
	            // issued until burst_write_active signal is asserted.                                          
	            // write controller                                                                             
	            if (writes_done)                                                                                
	              begin                                                                                         
	                mst_exec_state <= INIT_READ;//                                                              
	              end                                                                                           
	            else                                                                                            
	              begin                                                                                         
	                mst_exec_state  <= INIT_WRITE;                                                              
	                                                                                                            
	                if (~axi_awvalid && ~start_single_burst_write && ~burst_write_active)                       
	                  begin                                                                                     
	                    start_single_burst_write <= 1'b1;                                                       
	                  end                                                                                       
	                else                                                                                        
	                  begin                                                                                     
	                    start_single_burst_write <= 1'b0; //Negate to generate a pulse                          
	                  end                                                                                       
	              end                                                                                           
	                                                                                                            
	          INIT_READ:                                                                                        
	            // This state is responsible to issue start_single_read pulse to                                
	            // initiate a read transaction. Read transactions will be                                       
	            // issued until burst_read_active signal is asserted.                                           
	            // read controller                                                                              
	            if (reads_done)        //==============读操作是否已经完成                                                                         
	              begin                                                                                         
	                mst_exec_state <= INIT_COMPARE;                                                             
	              end                                                                                           
	            else                                                                                            
	              begin                                                                                         
	                mst_exec_state  <= INIT_READ;                                                               
	                                                                                                            
	                if (~axi_arvalid && ~burst_read_active && ~start_single_burst_read)                         
	                  begin                                                                                     
	                    start_single_burst_read <= 1'b1;                                                        
	                  end                                                                                       
	               else                                                                                         
	                 begin                                                                                      
	                   start_single_burst_read <= 1'b0; //Negate to generate a pulse                            
	                 end                                                                                        
	              end                                                                                           
	                                                                                                            
	          INIT_COMPARE:                                                                                     
	            // This state is responsible to issue the state of comparison                                   
	            // of written data with the read data. If no error flags are set,                               
	            // compare_done signal will be asseted to indicate success.                                     
	            //if (~error_reg)                                                                               
	            begin                                                                                           
	              ERROR <= error_reg;
	              mst_exec_state <= IDLE;                                                               
	              compare_done <= ~compare_done;                                                                          
	            end                                                                                             
	          default :                                                                                         
	            begin                                                                                           
	              mst_exec_state  <= IDLE;                                                              
	            end                                                                                             
	        endcase                                                                                             
	      end                                                                                                   
	  end //MASTER_EXECUTION_PROC    

第五步:添加同步FIFO

打开AXI4_V1_0.文件即顶层文件,在文件中添加一个同步FIFO的IP核并使能data_count信号。FIFO核接线如图所示

ZYNQ使用AXI4-HP接口总线读取DDR中的数据

 最后在顶层文件中添加以下接口

信号 介绍
ext_rd_en 输入,外部读FIFO使能
ext_rd_data 输出,FIFO读数据
ext_count 输出,FIFO中数据量
BURST_NUM 输入,AXI4突发次数

最后

该IP核是为了解决笔者在项目中所遇到的问题,笔者水平有限如有错误欢迎指正。源文件以上传0积分下载仅供参考。

https://download.csdn.net/download/qq_24025329/87018990文章来源地址https://www.toymoban.com/news/detail-413706.html

到了这里,关于ZYNQ使用AXI4-HP接口总线读取DDR中的数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA----UltraScale+系列的PS侧与PL侧通过AXI-HP交互(全网唯一最详)附带AXI4协议校验IP使用方法

    1、之前写过一篇关于ZYNQ系列通用的PS侧与PL侧通过AXI-HP通道的文档,下面是链接。 FPGA----ZCU106基于axi-hp通道的pl与ps数据交互(全网唯一最详)_zcu106调试_发光的沙子的博客-CSDN博客 大家好,今天给大家带来的内容是,基于AXI4协议的采用AXI-HP通道完成PL侧数据发送至PS侧(PS侧数

    2024年02月13日
    浏览(50)
  • 带你快速入门AXI4总线--AXI4-Full篇(1)----AXI4-Full总线

    目录 1、什么是AXI4-Full? 2、通道(Channel) 2.1、AXI 读取传输事务 2.2、AXI 写入传输事务

    2024年02月01日
    浏览(51)
  • AXI4总线学习心得(一)

    AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大 256 轮的数据突发传输; AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。 AXI4-Stream:

    2024年02月12日
    浏览(42)
  • FPGA——AXI4总线详解

    目录 AXI4总线 1、什么是AXI 2、AXI4协议的优势 AXI4的工作模式 AXI4读操作: AXI4写操作 AXI4和AXI4-Lite、AXI4-Stream接口信号 握手信号 AXI相关术语     AXI(Advanced eXtensible Interface高级可扩展总线)是一种总线协议     AXI4包含3种类型的接口: 1)AXI4:主要面向高性能地址映射通信的

    2024年02月02日
    浏览(56)
  • DDR3 AXI4 IP核读写仿真实验(2)

    上篇blog中记录了DDR3 AXI4接口的IP配置详情,这一文章则是记录自己在项目工程以及学习中对于DDR3的读写测试。先讲一下大概的工程架构:产生16位的自加数写进写FIFO中,当FIFO中的数达到一次突发长度后将其全部读出写进DDR3中,再检测到DDR3中数达到1024之后全部读出写入到读

    2024年02月13日
    浏览(45)
  • FPGA AXI4总线信号介绍篇

    AXI是一种总线协议,可以挂在多个master和slave:         (1)AXI4:主要面向高性能地址映射通信的需求;(突发数据)(地址映射模式)         (2)AXI4-Lite:是一个轻量级的,适用于吞吐量较小的地址映射通信总线;(无突发)(地址映射模式)         (3)AXI4-

    2024年04月11日
    浏览(59)
  • 【正点原子FPGA连载】第二十章AXI4接口之DDR读写实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html Xilinx从Spartan-6和Virtex-6系列开始使用AXI协议来连接IP核。在ZYNQ MPSOC器件中,Xilinx在IP核中继续使用AXI协议。本章

    2024年02月02日
    浏览(53)
  • 详解AXI4-Stream接口(3)--AXI4 STREAM DATA FIFO IP的使用

    目录 1、AXI4 STREAM DATA FIFO是什么? 2、自己编写的仿真验证 3、官方例程仿真         IP核----AXI4 STREAM DATA FIFO也是一种先入先出形式的数据缓存队列(FIFO),不过输入输出接口

    2024年02月09日
    浏览(50)
  • 【FPGA】AXI4-Lite总线读写BRAM

    AXI协议基础知识 。这篇博客比较详细地介绍了AXI总线,并且罗列了所有的通道和端口,写代码的时候可以方便地进行查表。 AXI总线,AXI_BRAM读写仿真测试 。 这篇文章为代码的书写提供大致的思路,比如状态机和时序的控制问题,可以参考。 双向握手机制的实质是: 数据接

    2024年02月15日
    浏览(75)
  • DDR3 控制器 MIG IP 详解完整版 (AXI4&VIVADO&Verilog)

    DDR系列文章分类地址: (1)DDR3 基础知识分享 (2)DDR3 控制器 MIG IP 详解完整版 (AXI4VivadoVerilog) (3)DDR3 控制器 MIG IP 详解完整版 (nativeVivadoVerilog) (4)基于 DDR3 的串口传图帧缓存系统设计实现 (5)基于 DDR3 的native接口串口局部传图缓存系统设计实现 (6)基于 DDR3 的

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包