FPGA-基于AXI4接口的DDR3读写顶层模块

这篇具有很好参考价值的文章主要介绍了FPGA-基于AXI4接口的DDR3读写顶层模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、AXI4简介

AXI4(Advancede Xtensible Interface 4)是一种高性能、高带宽的总线接口协议,用于在系统级芯片设计中连接不同的IP核(Intellectual Property)或模块。它是由ARM公司开发的,被广泛应用于各种SoC(System-on-Chip)设计中。

AXI4接口协议定义了一组规范,用于描述数据传输、地址传输、控制信号和时序等方面的要求。它提供了一种灵活的、可扩展的接口,支持高性能和低功耗的系统设计。以下是AXI4接口的一些关键特性:

  1. 高性能:AXI4接口支持并行数据传输和乱序传输,可以实现高带宽和低延迟的数据传输。它使用独立的读写通道,可以同时进行读写操作,提高了系统的吞吐量。
  2. 灵活性:AXI4接口支持多种传输模式,包括单个传输、突发传输和流传输。它还支持不同的传输宽度和字节顺序,可以适应不同的应用需求。

  3. 可扩展性:AXI4接口支持多个主设备和多个从设备的连接,可以构建复杂的系统结构。它使用ID信号来标识不同的传输,支持乱序传输和乱序应答,提高了系统的并行性能。

  4. 低功耗:AXI4接口使用了一些低功耗技术,如低功耗模式和时钟门控等,可以降低系统的功耗消耗。

AXI4接口广泛应用于各种SoC设计中,包括嵌入式系统、网络设备、图像处理器、数字信号处理器等。它可以连接处理器核、存储器、外设和其他IP核。Xilinx 的 mig ddr Ip 核,无论是 6 系列还是 7 系列还是最新的FPGA,都集成了 AXI4 接口,采用 AXI4 接口进行读写,后续可以兼容 xilinx的其他fpga,可复用性更强。

AXI4 协议支持突发传输,为存储映射接口(如果一个协议是存储映射的,那么主机所发出的会话(无论读或写)就会标明一个地址,这个地址对应于系统存储空间中的一个地址,表明是针对该存储空间的读写操作),主要用于处理器访问存储器等需要指定地址的高速数据传输场景。同样属于存储映射的接口AXI-Lite 为外设提供单个数据传输,主要用于访问一些低速外设中的寄存器。而 AXI-Stream 接口则像 FIFO 一样,数据传输时不需要地址,在主从设备之间直接连续读写数据,主要用于如视频、高速AD、PCIe、DMA接口等需要高速数据传输的场合。

AXI4接口由5个独立通道构成:写地址、写数据、写响应、读地址、读数据

写传输过程如图1所示,主机在写地址通道给出写地址和控制信号,然后在写数据通道连续突发写4个数据。从机在接收数据之后,在写响应通道给出响应信号。

fpga ddr3同时读写,通讯协议,fpga开发
图1 AXI4 写过程示意

 

fpga ddr3同时读写,通讯协议,fpga开发
图2 写数据时序图

读传输过程如图3所示, 在一个读传输过程中,主机首先在读地址通道给出读地址和控制信号,然后从机由读数据通道返回读出的数据。

fpga ddr3同时读写,通讯协议,fpga开发
图3 AXI4读取过程示意

 

fpga ddr3同时读写,通讯协议,fpga开发
图4 读数据时序图

二、 建立MIG的IP核工程

打开 IP Catalog 在搜索栏输入 mig(Memory Interface Generator),双击直接打开。Mig IP
核如名字所示,是一种存储器接口,可简易控制 ddr2,ddr3,ddr4 等存储器,7系列的 mig
ip 核只支持 ddr3,ddr2。

在IP核的Clock Period设置时,选择3125ps,对应320M,它是DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关,这个时钟是 MIGIP 核产生,并输出给 DDR3 物理芯片使用的,它关系到 DDR3 芯片具体的运行带宽,本次实验的开发板板载了 2 颗 DDR3 芯片,单个芯片数据位宽为16位,数据位宽总共 32 位,因为是双沿触发,这里带宽达到了20.48Gb/s(640M*32bit)

IP核的PHY to Controller Clock Ratio设置:DDR3 物理芯片运行时钟和 MIG IP 核的用户端(FPGA)的时钟之比,一般有 4:1 和 2:1 两个选项,高速传输的场合选择 4:1,要求低延时的场合选择 2:1。注意,当DDR3时钟选择选择了350M 到最高的400M时,比例默认只为4:1,低于350M才有4:1和2:1两个选项。由于 DDR 芯片的运行时钟是 320Mhz,因此 MIG IP 核的用户时钟(ui_clk)就是 160Mhz,该时钟是IP核 2:1 生成的时钟160M,而我们采用的 axi4 接口数据位宽设置为 64 位,用户端口带宽为10.48Gb/s(160M*64bit),刚好为 1 半物理带宽, ddr3 存储器物理上不能同时写与读, 而 axi4是可同时读与写的协议,因此我们为用户端口的读与写各自分配物理带宽的 1 半,如果用户端带宽大于物理端,会产生数据错误,本设计为读与写各自分配一半带宽,那么即便读与写同时进行操作,总带宽也只是达到DDR3的物理带宽,不会发生数据错误。
 

 三、AXI4写主机模块

AXI4 写模块将复杂的 AXI4 接口的写接口进行封装成简易的用户接口,用户接口包括fifo 端数据接口与若干控制信号。 AXI4 写接口包括写通道的写地址通道,写通道写数据通道,写通道写响应通道这三个接口,其中每组最重要的还是握手信号接口,主机发出 valid 告诉从机本数据有效,从机接收到 valid 发送 ready 告诉主机,准备已经就绪,就这样主机与从机完成了一个握手信号。
 

fpga ddr3同时读写,通讯协议,fpga开发
图5 写主机模块框图

 AXI4 写主机模块将左边的用户控制接口转换为标准的 AXI4 接口信号,用以控制基于AXI4 的 XILINX 存储器控制的MIG IP 核,完成 DDR3 DRAM 的写数据控制。文章来源地址https://www.toymoban.com/news/detail-851942.html

`timescale 1ns/1ps


module axi_master_write (
input         ARESETN              ,//axi reset
input         ACLK                 ,//axi clock

  //AXI write passageway for addr
output [3:0]  M_AXI_awid        ,//wr addr ID,for mark a group wr_signal
(*mark_debug="true"*)output [31:0] M_AXI_awaddr      ,
(*mark_debug="true"*)output [7:0]  M_AXI_awlen       ,//transmission times
output [2:0]  M_AXI_awsize      ,//byte volume of every transmission 
output [1:0]  M_AXI_awburst     ,//burst type,'01'represent increase,'10' opposite
output        M_AXI_awlock      ,//总线锁信号
output [3:0]  M_AXI_awcache     ,//存储类型
output [2:0]  M_AXI_awprot      ,//保护类型
output [3:0]  M_AXI_awqos       ,//质量服务Qos
(*mark_debug="true"*)output        M_AXI_awvalid     ,//passageway addr ctrl signal valid
(*mark_debug="true"*)input         M_AXI_awready     ,//slave machine allow accept addr and order
  //AXI write passageway for wr_data
(*mark_debug="true"*)output [63:0] M_AXI_wdata       ,
output [7:0]  M_AXI_wstrb       ,//wr_data valid byte line,explain which 8bit is valid
(*mark_debug="true"*)output        M_AXI_wlast       ,
(*mark_debug="true"*)output        M_AXI_wvalid      ,//the write valid
(*mark_debug="true"*)input         M_AXI_wready      ,//slave machine allow accept data
  //AXI write passageway for response
input  [3:0]  M_AXI_bid         ,//wr_resp ID TAG
input  [1:0]  M_AXI_bresp       ,//transmission state
(*mark_debug="true"*)input         M_AXI_bvalid      ,//response valid
output        M_AXI_bready      ,//lead plane can accept response

  //user port signal
input         WR_start             ,//write burst signal
input  [31:0] WR_adrs              ,//addr
input  [9:0]  WR_len               ,
output        WR_ready             ,//write idle,to axi_ctrl module
output        WR_FIFO_re           ,//connect to FIFO read enable
input  [63:0] WR_FIFO_data         ,//connect to FIFO read data
output        WR_done               //finish burst,给读写控制模块
);
    

//****************** Parameter and Internal Signal *******************//
localparam S_WR_IDLE  =  3'd0;
localparam S_WA_WAIT  =  3'd1;
localparam S_WA_START =  3'd2;
localparam S_WD_WAIT  =  3'd3;
localparam S_WD_PROC  =  3'd4;//write data process
localparam S_WR_WAIT  =  3'd5;//write response
localparam S_WR_DONE  =  3'd6;
//reg define
reg [2:0]     wr_state         ;
reg [31:0]    reg_wr_adrs      ;//addr reg
reg           reg_awvalid      ;//addr valid handshaking
reg           reg_wvalid       ;//data valid handshaking
reg           reg_w_last       ;
reg [7:0]     reg_w_len        ;//max of burst len is 256,but 128 is best
reg [7:0]     reg_w_stb        ;

//***************************** Main Code ****************************//
assign   WR_done = (wr_state == S_WR_DONE);
assign   WR_FIFO_re             = (reg_wvalid & M_AXI_wready);
assign   M_AXI_awid             = 4'b1111;//lead plane ID
assign   M_AXI_awaddr[31:0]     = reg_wr_adrs[31:0];
assign   M_AXI_awlen[7:0]       = WR_len - 'd1;
//represent AXI4 bus every data width is 8byte,64bit
assign   M_AXI_awsize[2:0]      = 3'b011; //3'b000为1字节、b001为2字节、b010为4字节
//'01' for increase,'10' opposite
assign   M_AXI_awburst[1:0]     = 2'b01;//地址递增型
assign   M_AXI_awlock           = 1'b0;
assign   M_AXI_awcache[3:0]     = 4'b0010;
assign   M_AXI_awprot[2:0]      = 3'b000;
assign   M_AXI_awqos[3:0]       = 4'b0000;
assign   M_AXI_awvalid          = reg_awvalid;

assign   M_AXI_wdata[63:0]      = WR_FIFO_data[63:0];
assign   M_AXI_wstrb[7:0]       = 8'hFF;
assign   M_AXI_wlast            = reg_w_last;     //(reg_w_len[7:0] == 8'd0)?'b1:'b0;
assign   M_AXI_wvalid           = reg_wvalid;     //data handshaking

assign   M_AXI_bready           = M_AXI_bvalid;   //lead plane accept ack
//axi state machine idle
assign   WR_ready               = (wr_state == S_WR_IDLE)?'b1:'b0;

//axi write process state machine
always @(posedge ACLK or negedge ARESETN)
  if(!ARESETN)
   begin 
    wr_state         

到了这里,关于FPGA-基于AXI4接口的DDR3读写顶层模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 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)
  • 基于紫光同创 FPGA 的 DDR3 读写实验

    此篇为专栏 《紫光同创FPGA开发笔记》 的第二篇,记录我的学习FPGA的一些开发过程和心得感悟,刚接触FPGA的朋友们可以先去此专栏置顶 《FPGA零基础入门学习路线》来做最基础的扫盲。 本篇内容基于笔者实际开发过程和正点原子资料撰写,将会详细讲解此 FPGA 实验的全流程

    2024年01月20日
    浏览(50)
  • 基于fpga的ddr3读写控制,纯verilog实现,能实现多通道图像数据读写控制

    基于fpga的ddr3读写控制,纯verilog实现,能实现多通道图像数据读写控制,模块接口清晰,可移植性高. 基于FPGA的DDR3读写控制是一项重要的技术,它为多通道图像数据的读写提供了高效的解决方案。本文将介绍一种纯Verilog实现的DDR3读写控制模块,旨在实现模块接口清晰、可移

    2024年04月12日
    浏览(56)
  • DDR3(AXI接口例程)知识点笔记

    本文以7035开发板中的DDR3master例程对DDR3中所涉及的知识点梳理下笔记。 ① DDR支持的突发长度是2,4,8 。即如果芯片的数据位宽是16bit的话那么接口数据位宽是32bit,64bit以及128bit。因为 L-Bank一次就存取两倍于芯片位宽的数据,所以芯片至少也要进行两次传输才可以。我认为芯片

    2024年02月13日
    浏览(47)
  • 使用VIVADO中的MIG控制DDR3(AXI接口)一——AXI简介

            最近,因为需要,学习了AXI总线协议和DDR3相关的知识,花了很多的时间去找各种相关的资料,深刻明白查资料的不容易,这里将所学到的东西做一个总结,同时给需要的人提供一些便利,有问题的欢迎一起讨论学习、共同进步。          首先来说一下有关AXI总

    2024年02月08日
    浏览(50)
  • DDR3读写模块

    使用xilinx官方提供的MIG IP核进行设计,接口协议为AXI,关于AXI协议的内容此处不做过多介绍。 关于IP核个参数的介绍可以参考野火教程,以下为目前使用的通用配置。 DDR物理接口的位宽为32bit DDR用户接口的位宽为64bit MIG核的XADC是关闭的,需要外部模块例化XADC模块读取FPGA的内

    2024年02月03日
    浏览(52)
  • ZYNQ使用AXI4-HP接口总线读取DDR中的数据

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

    2023年04月15日
    浏览(46)
  • Xilinx FPGA DDR3设计(三)DDR3 IP核详解及读写测试

    引言 :本文我们介绍下Xilinx DDR3 IP核的重要架构、IP核信号管脚定义、读写操作时序、IP核详细配置以及简单的读写测试。 7系列FPGA DDR接口解决方案如图1所示。 图1、7系列FPGA DDR3解决方案 1.1 用户FPGA逻辑(User FPGA Logic) 如图1中①所示,用户FPGA逻辑块是任何需要连接到外部

    2024年02月06日
    浏览(55)
  • 【FPGA】MIG DDR3读写逻辑测试

            笔者在之前通过microblaze软核的方式实现了DDR3芯片的读写测试,当时对于Xilinx MIG DDR控制器的理解还比较肤浅。还是想通过控制用户接口时序的方式来读写DDR,扩展和加深自己对DDR的理解。 MIG IP核配置请看我的前一篇文章 【FPGA测试】Microblaze测试DDR读写_microblaze

    2024年01月22日
    浏览(43)
  • 【FPGA】AXI4-Lite总线读写BRAM

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

    2024年02月15日
    浏览(75)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包