赞
踩
AXI4(Advancede Xtensible Interface 4)是一种高性能、高带宽的总线接口协议,用于在系统级芯片设计中连接不同的IP核(Intellectual Property)或模块。它是由ARM公司开发的,被广泛应用于各种SoC(System-on-Chip)设计中。
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所示, 在一个读传输过程中,主机首先在读地址通道给出读地址和控制信号,然后从机由读数据通道返回读出的数据。
打开 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 接口的写接口进行封装成简易的用户接口,用户接口包括fifo 端数据接口与若干控制信号。 AXI4 写接口包括写通道的写地址通道,写通道写数据通道,写通道写响应通道这三个接口,其中每组最重要的还是握手信号接口,主机发出 valid 告诉从机本数据有效,从机接收到 valid 发送 ready 告诉主机,准备已经就绪,就这样主机与从机完成了一个握手信号。
AXI4 写主机模块将左边的用户控制接口转换为标准的 AXI4 接口信号,用以控制基于AXI4 的 XILINX 存储器控制的MIG IP 核,完成 DDR3 DRAM 的写数据控制。
- `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(!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。