一、AXI4简介
AXI4(Advancede Xtensible Interface 4)是一种高性能、高带宽的总线接口协议,用于在系统级芯片设计中连接不同的IP核(Intellectual Property)或模块。它是由ARM公司开发的,被广泛应用于各种SoC(System-on-Chip)设计中。
AXI4接口协议定义了一组规范,用于描述数据传输、地址传输、控制信号和时序等方面的要求。它提供了一种灵活的、可扩展的接口,支持高性能和低功耗的系统设计。以下是AXI4接口的一些关键特性:
- 高性能:AXI4接口支持并行数据传输和乱序传输,可以实现高带宽和低延迟的数据传输。它使用独立的读写通道,可以同时进行读写操作,提高了系统的吞吐量。
-
灵活性:AXI4接口支持多种传输模式,包括单个传输、突发传输和流传输。它还支持不同的传输宽度和字节顺序,可以适应不同的应用需求。
-
可扩展性:AXI4接口支持多个主设备和多个从设备的连接,可以构建复杂的系统结构。它使用ID信号来标识不同的传输,支持乱序传输和乱序应答,提高了系统的并行性能。
-
低功耗: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个数据。从机在接收数据之后,在写响应通道给出响应信号。
读传输过程如图3所示, 在一个读传输过程中,主机首先在读地址通道给出读地址和控制信号,然后从机由读数据通道返回读出的数据。
二、 建立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 告诉主机,准备已经就绪,就这样主机与从机完成了一个握手信号。
文章来源:https://www.toymoban.com/news/detail-851942.html
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模板网!