Zedboard--AXI三部曲(二)---AXI协议学习及原生态USER IP搭建
Posted on 2013-08-20 10:32 sheldon_COD 阅读(2417) 评论(0) 编辑 收藏 举报参考《AXI Refrence》&&《AXI_V2.0_Protocol》,演示摆脱IPIF core参与的USER IP搭建
- 第一部分为翻译ARM的AXI SPEC,如果没兴趣,请直接跳到第二部分
- 第二部分仍然利用Xilinx建立USER ip, 但是没有采用利用IPIF,而是采用纯VERILOG HDL代码书写
- 避开了复杂的更改文档的步骤,修改VHDL和MPD
- 便于建立大于32个寄存器的axi_lite外设
- 瞻仰下三大总线最具完备性的总线的魅力
AXI4 接口类型
Interface |
Features |
Appilication |
AXI4 | Memory Maped 接口,支持突发传输256个数据 | 适合高性能的外设,如存储器等 |
AXI4_lite | Memory Maped接口,单周期单数据传输,接口信号较少 | 适合简单的控制外设,如串口等 |
AXI4_stream | 单向高速突发传输,无突发长度限制,无地址周期 | 适合点对点的高速数据传输 |
1.AXI基础知识
注:关注AXI4及AXI4LITE特性
AXI主机和从机通过interconnect进行互连和数据交换;
Xilinx提供的AXI Interconnect IP包含兼容性的master port和slave port,有效的路由主机和从机间的传输
1.1 基本结构
Key Feature
- 地址周期优先于数据周期
- 支持多个未完成的传输
- 支持乱序传输
(Transaction 是事务的含义,此处,翻译为传输也挺形象,包含地址,数据和响应所有的完整的传送;包含一个或者多个Transfer
Transfer本文翻译为传送,指单个Clock周期通过VALID描述的有效的信息沟通)
1.1.1传输通道---理解为物理连接和逻辑时序的结合
AXI协议是基于突发传输的;每次传输都在地址通道传输描述数据特性的地址和控制信息;通过写数据通道主机将数据传递给从机,通过读数据通道从机将数据传给主机
AXI用于独立的读写通道,因此读写行为可以同时进行
- 读地址通道 :包含了读传输的地址信息和控制信息
- 写地址通道 :包含了写传输的地址信息和控制信息
- 读数据通道 :包含了读出的数据和相关的控制信息
- 写数据通道 :
- 写响应通道 :
- ---由于读数据操作,数据到来意味着数据的成功的读取,因此不需要响应
读操作的通道如下
写操作的通道如下: 包含写地址,写数据和写响应
每个通道都包含双向握手信号VALID 和READY
- VALID : 消息发出者用来表示数据或者控制信息有效
- READY: 消息接受者表示其可以接受数据
1.1.2 接口与内部互连
AXI提供了单一的描述接口的方式:(针对下面三种情况)
- 主机和互连之间
- 互连和从机之间
- 主机和从机之间
AXI常用的Interconnect实现方式:(多样化)
- 共享地址和数据总线
- 共享地址总线和多数据总线
- 多层结构,包含多个地址和数据总线
1.1.3 基本传输
- 突发读传输
- 突发写传输
1.1.4 握手介绍
AXI总线的5个通道都有VALID和READY信号,从而允许主机和从机拥有控制传输速率的权力。
1基本流程:
- 发起端产生VALID表征数据或者控制信息有效
- 接收端产生READY表征数据或者控制信息已经接受
- 数据或者控制信息必须有效,直到READY为有效---此时传输真正发生
2.标准规定:
了解学习一下三种状况,选择有效的应答方式,实现效能和稳定性的结合
- VALID before READY 传输:READY有效依据VALID判断
- READY before READY 传输:单周期完成传输
- READY 和VALID同时传输: 通过约定的时序,二者同时有效,完美的配合!!!
3.补充:
- 针对数据通道:突发传输中,仅仅当数据有效时,VALID才可以有效;当VALID为低时,WRSTB可以为任何值
- 针对地址通道:AWREADY或者ARREADY通常为高,实现单周期传输
- 针对写相应通道:BVALID可以一直为高;当有效后,必须等待BREADY才可以拉低
4.推荐的应答顺序
--- 突发介绍及后续内容: 第三部分深入研究主机,进一步分析
2.AXI-LITE基本接口演示
---未使用IPIF,纯verilog hdl 版本
Notice: SIGIS
2.1建立外设的步骤:
step1: 选择导入已存在外设
step2: 选择IP有效路径--哪个都可以,随意
step3: IP的名字必须为小写,且为Verilog HDL Top Module的名字(软件的规定)
step4: IP包含文件的类型,至少选择HDL,如果完备的话,添加自己的说明文档;如果verilog HDL调用XLINX的IP,也需要添加相应的网表
step5: 注意选择最下端的选项!!!
step6: 添加verilog HDL文件,至少包含顶层文件(注意点NEXT时,修改相应的错误;支持文件同步,即采用外部的编辑器修改HDL)
step7: 选择自己的接口类型;可以复选,意味着IP可以同时包含多个接口
step8: 针对接口类型,对应自己的PORT和接口标准的port进行对应;左侧为AXI接口port,右侧为HDL module的port
step9:选择HDL moduel 内parameter的设置,主要是BASEADDR和HIGHADDR,因此Verilog HDL
内部必须定义此两个参数,便于后期实例化IP时,图形化界面里设置及自动分配地址(如有错误,请更正)
step10: 设置参数,优先级强于Verilog HDL内部的定义,模块化的设计(Perfect!)
step11: 设置端口的参数;CLOCK 和 RESET信号,必须在高级设置里,设定其属性,否则互连时,XPS无法识别
step12: OVER---
-------------------------------------------------------------------------------
NOTICE:
- 从HDL文件导入后,一系列的GUI步骤,实际都是为了建立MPD文件;因此,当设置错误时,可以直接从MPD里修改,而不用再运行一遍GUI的流程
- 建议大家有空看看psf_rm.pdf,了解下MPD的基本内容,后续很有用
- 注意:由于14.5软件的问题,尽管STEP11选择属性,但生成的MPD文件里没有添加,后续应用会报错.其他版本需要大家自己探讨,希望其他版本有改善!下面奉上最根本的办法
-------------------------------------------------------------------------------
2.2 Verilog HDL源代码分析:
2.2.1端口声明
端口声明
module axi_io
#(parameter
C_ADDR_WIDTH = 4,
C_DATA_WIDTH = 32,
C_BASEADDR = 0,
C_HIGHADDR = 1
)(
// axi slave signals---lite
// "_" is useful when using CIP to create ip
input wire ACLK,
input wire ARESETN,
input wire [C_ADDR_WIDTH-1:0] AWADDR,
input wire AWVALID,
output wire AWREADY,
input wire [C_DATA_WIDTH-1:0] WDATA,
input wire [C_DATA_WIDTH/8-1:0] WSTRB,
input wire WVALID,
output wire WREADY,
output wire [1:0] BRESP,
output wire BVALID,
input wire BREADY,
input wire [C_ADDR_WIDTH-1:0] ARADDR,
input wire ARVALID,
output wire ARREADY,
output wire [C_DATA_WIDTH-1:0] RDATA,
output wire [1:0] RRESP,
output wire RVALID,
input wire RREADY,
// user signals
output wire [1:0] led_a,
output wire [1:0] led_b
);
- 参数在module声明时建立
- 因为Verilog HDL作为顶层,方便添加用户自己的引脚
2.2.2 写逻辑
写逻辑
//------------------------AXI LITE WRITE--------------------
//---Handshake
assign AWREADY = (wCState == PWIDLE);
assign WREADY = (wCState == PWDATA);
assign BRESP = 2'b00; // OKAY
assign BVALID = (wCState == PWRESP);
// wCState
always @(posedge ACLK or negedge ARESETN) begin
if (~ARESETN)
wCState<= PWIDLE;
else
wCState <= wNState;
end
// wNState
always @(*) begin
case (wCState)
PWIDLE:
if (AWVALID)
wNState = PWDATA;
else
wNState = PWIDLE;
PWDATA:
if (WVALID)
wNState = PWRESP;
else
wNState = PWDATA;
PWRESP:
if (BREADY)
wNState = PWIDLE;
else
wNState = PWRESP;
default:
wNState = PWIDLE;
endcase
end
// latch internal addrese
always @(posedge ACLK)
begin
if(AWVALID & AWREADY)
waddr <= AWADDR;
end
// latch internal data
always @(posedge ACLK )
begin
if (WVALID & WREADY)
begin
case(waddr)
ADDR_LED_A_DATA :
regA <= WDATA[31:0];
ADDR_LED_B_DATA :
regB <= WDATA[31:0];
endcase
end
end
- 写逻辑包含:握手信号的逻辑,写通道3个步骤的状态机实现,内部寄存器写操作的实现三部分
2.2.3 读逻辑
读逻辑
//------------------------AXI LITE READ----------------------
assign ARREADY = (rCState == PRIDLE);
assign RDATA = rdata; // output connect
assign RRESP = 2'b00; // OKAY
assign RVALID = (rCState == PRDATA);
assign raddr = ARADDR;
// rCState
always @(posedge ACLK or negedge ARESETN) begin
if (~ARESETN)
rCState <= PRIDLE;
else
rCState <= rNState;
end
// rNState
always @(*) begin
case (rCState)
PRIDLE:
if (ARVALID)
rNState = PRDATA;
else
rNState = PRIDLE;
PRDATA:
if (RREADY)
rNState = PRIDLE;
else
rNState = PRDATA;
default:
rNState = PRIDLE;
endcase
end
// RDATA
always @(posedge ACLK) begin
if (ARVALID & ARREADY) begin
case (raddr)
ADDR_LED_A_DATA: begin
rdata <= regA;
end
ADDR_LED_B_DATA: begin
rdata <= regB;
end
endcase
end
end
读逻辑包含:握手信号的逻辑,读通道2个步骤的状态机实现,内部寄存器读操作的实现三部分
--- 突发介绍及后续内容: 第三部分深入研究主机,进一步分析
三部曲第二部到此结束,测试工程---https://files.cnblogs.com/sheldon-COD/axi_lite_user.zip: 往baseaddress+0x00和baseaddress+0x04可以进行读写,并且映射低两位,采用LED等显示
感谢老部长BW的支持