Menu Close

SOC系列教程 SOC编程和AXI总线的应用

AXI总线的基本知识:

1)AXI总线的分类

(1)AXI4- Lite

AXI4-Lite 是一个简单地吞吐量地址数据通信总线;主要面向简单的应用,接口简单,使用的资源少,使

用方便 。主要用于少量寄存器空间的操作。

(2)AXI4- stream

面向高速流数据传输;在与PL结合的应用中,主要用于FIFO的读写,或基于FIFO类型的应用

(3)AXI4

主要面向高性能地址映射通信的需求;功能强大,使用的资源多,学习和使用的周期较长

2)AXI总线的基本协议

(1) axi总线分为六个通道:

(a)读地址通道,包含ARVALID, ARADDR, ARREADY信号;

(b)写地址通道,包含AWVALID,AWADDR, AWREADY信号;

(c)读数据通道,包含RVALID, RDATA, RREADY, RRESP信号;

(d)写数据通道,包含WVALID, WDATA,WSTRB, WREADY信号;

(e)写应答通道,包含BVALID, BRESP, BREADY信号;

(f)系统通道,包含:ACLK,ARESETN信号;

其中ACLK为axi总线时钟,ARESETN是axi总线复位信号,低电平有效;读写数据与读写地址类信号宽度都为32bit;READY与VALID是对应的通道握手信号;WSTRB信号为1的bit对应WDATA有效数据字节,WSTRB宽度是32bit/8=4bit;BRESP与RRESP分别为写回应信号,读回应信号,宽度都为2bit,‘h0代表成功,其他为错误。

%title插图%num

时钟

由高到低

瞬间变化值

由低到高

稳定总线

总线到高阻

总线变换

由高阻态到总线稳定状态

总线复位

在复位期间,以下接口必须遵循:

(1)主机接口必须将ARVALID、AWVALID、WVALID信号置低。

(2)设备接口必须将RVALID、BVALID信号置低。

(3)所有其它信号可以为任意值。

主机接口必须开始将ARVALID、AWVLAID或WVALID置高仅仅在ARESETn信号变高后的ACLK的第一个上升沿。具体情况如下图:

%title插图%num

AXI4总线和AXI4-Lite总线的信号也有他的命名特点:

读地址信号都是以AR开头(A:address;R:read)

写地址信号都是以AW开头(A:address;W:write)

读数据信号都是以R开头(R:read)

写数据信号都是以W开头(W:write)

应答型号都是以B开头(B:back(answer back))

全部5个通道使用相同的VALID/READY握手机制传输数据及控制信息。传输源产生VLAID信号来指明何时数据或控制信息有效。而目地源产生READY信号来指明已经准备好接受数据或控制信息。传输发生在VALID和READY信号同时为高的时候。VALID和READY信号的出现有三种关系

  1. VALID先变高READY后变高,在箭头处信息传输数据:

%title插图%num

  1. READY先变高VALID后变高,在箭头处信息传输数据:

%title插图%num

(3) VALID和READY信号同时变高,在这种情况下,数据立马传输

%title插图%num

写地址通道信号

AWID[3:0]: 写地址ID,这个信号是写地址信号组的ID tag。

AWADDR[31:0]: 写地址。

AWLEN[3:0]: 突发式写的长度。此长度决定突发式写所传输的数据的个数。

AWSIZE[2:0]: 突发式写的大小。

AWBURST[1:0]: 突发式写的类型。

AWLOCK[1:0]: 锁类型。

AWCACHE[3:0]: Cache类型。这信号指明事务的bufferable、cacheable、write-through、write-back、allocate attributes信息。

AWPROT[2:0]: 保护类型。

AWVALID: 写地址有效,1 = 地址和控制信息有效,0 = 地址和控制信息无效,这个信号会一直保持,直到AWREADY变为高。

AWREADY :设备写地址准备好。这个信号用来指明设备已经准备好接受地址和控制信息了。1 = 设备准备好,0 = 设备没准备好

写数据通道信号

WID[3:0]: 写ID tag,WID的值必须与AWID的值匹配, MASTER

WDATA[31:0]:写的数据。 MASTER

WSTRB[3:0]:写阀门,WSTRB[n]标示的区间为WDATA[(8n)+7:(8n)], MASTER

WLAST: 写的最后一个数据。 MASTER

WVALID: 写有效, 1 = 写数据和阀门有效,0 = 写数据和阀门无效 MASTER

WREADY: 写就绪。1 = 设备就绪,0 = 设备未就绪 SLAVE

写响应通道信号

BID[3:0]: 响应ID,这个数值必须与AWID的数值匹配。

BRESP[1:0] 写响应。这个信号指明写事务的状态。可能有的响应:

OKAY、EXOKAY、SLVERR、DECERR。

BVALID: 写响应有效,1 = 写响应有效,0 = 写响应无效

BREADY 主机接受响应就绪。该信号表示主机已经能够接受响应信息,1 = 主机就绪,0 = 主机未就绪

低功耗接口信号

CSYSREQ:系统低功耗请求。此信号来自系统时钟控制器,使外围设备进入低功耗状态。

CSYSACK:低功耗请求应答。

CACTIVE:Clock active ,1 = 外围设备时钟请求,0 = 外围设备时钟无请求

读地址通道信号

ARID[3:0]: 读地址ID。

ARADDR[31:0]: 读地址。

ARLEN[3:0]: 突发式读长度。

ARSIZE[2:0]: 突发式读大小。

ARBURST[1:0]: 突发式读类型。

ARLOCK[1:0]: 锁类型。

ARCACHE[3:0]: Cache类型。

ARPROT[2:0]: 保护类型。

ARVALID: 读地址有效。信号一直保持,直到ARREADY为高,1 = 地址和控制信息有效,0 = 地址和控制信息无效

ARREADY:设备读地址就绪。指明设备已经准备好接受数据了,1 = 设备就绪,0 = 设备未就绪

读数据通道信号

RID[3:0]: 读ID tag。RID的数值必须与ARID的数值匹配。

RDATA[31:0]:读数据。

RRESP[1:0]:读响应。这个信号指明读传输的状态:OKAY、EXOKAY、SLVERR、DECERR。

RLAST: 读事务传送的最后一个数据。

RVALID: 读数据有效。1 = 读数据有效。0 = 读数据无效。

RREADY 主机读数据就绪。1 = 主机就绪,0 = 主机未就绪

突发式读的时序图如下:

%title插图%num

当地址出现在地址总线后,传输的数据将出现在读数据通道上。设备保持VALID为高直到读数据有效。为了表明一次突发式读写的完成,设备用RLAST信号来表示最后一个被传输的数据。

重叠突发式读时序图如下

%title插图%num

设备会在第一次突发式读完成后处理第二次突发式读数据。也就意味着,主机一开始传送了两个地址给设备。设备在完全处理完第一个地址的数据之后才开始处理第二个地址的数据。

突发式写时序图如下:

%title插图%num

这一过程的开始时,主机发送地址和控制信息到写地址通道中,然后主机发送每一个写数据到写数据通道中。当主机发送最后一个数据时,WLAST信号就变为高。当设备接收完所有数据之后他将一个写响应发送回主机来表明写事务完成。

  1. AXI协议的传输顺序

AXI协议支持乱序传输。他给每一个通过接口的事务一个IDtag。协议要求相同ID tag的事务必须有序完成,而不同ID tag可以乱序完成。

  1. 通道之间的关系

地址、读、写和写响应通道之间的关系是灵活的。

例如,写数据可以出现在接口上早于与其相关联的写地址。也有可能写数据与写地址在一个周期中出现。

两种关系必须被保持:

(1)读数据必须总是跟在与其数据相关联的地址之后。

(2)写响应必须总是跟在与其相关联的写事务的最后出现。

  1. 读通道握手信号之间的依赖性——读事务握手依赖关系如图:

(1)设备可以在ARVALID出现的时候在给出ARREADY信号,也可以先给出ARREADY信号,再等待ARVALID信号。

(2)但是设备必须等待ARVALID和ARREADY信号都有效才能给出RVALID信号,开始数据传输。

%title插图%num

写事务握手依赖关系如图:

(1)主机不一定得等待设备先给出AWREADY或WREADY信号信号后再给出信号AWVALID或WVLAID。

(2)设备可以等待信号AWVALID或WVALID信号有效或者两个都有效之后再给出AWREADY信号。

(3)设备可以等待AWVALID或WVALID信号有效或者两个信号都有效之后再给出WREADY信号。

%title插图%num

注意:上图的双箭头表示绝对的依赖关系,如BVALID必须等待WVALID 和WREADY 都为高之后,才能为高。

突发式读写的地址必须以4KB对齐,信号AWLEN或信号ARLEN指定每一次突发式读写所传输的数据的个数, ARSIZE信号或AWSIZE信号指定每一个时钟节拍所传输的数据的最大位数。需要注意的是任何传输的SIZE都不能超过数据总线的宽度

%title插图%num %title插图%num

注意:

(1)任何传输的SIZE都不能超过数据总线的宽度

(2)AXI4协议中 ARLEN与AWLEN可以最多为8位,ARLEN[7:0] ,AWLEN[7:0] ,因此最多可以传输256位。

AXI协议定义了三种突发式读写的类型:固定式的突发读写、增值式突发读写、回卷式突发读写。用信号ARBURST或AWBURST来选择突发式读写的类型。

(1)固定式突发读写是指地址是固定的,每一次传输的地址都不变。这样的突发式读写是重复的对一个相同的位置进行存取。例如FIFO。

(2)增值式突发读写是指每一次读写的地址都比上一次的地址增加一个固定的值。

(3)回卷式突发读写跟增值式突发读写类似。回卷式突发读写的地址是包数据的低地址当到达一个包边界。

回卷式突发读写有两个限制:

◇起始地址必须以传输的size对齐。

◇突发式读写的长度必须是2、4、8或者16。

%title插图%num

2、AXI4 LITE的使用:

1) 设计要求:

a、在最小系统基础上,添加AXI总线控制

b、仍然以最简单的开关和LED的驱动为例子介绍,当概念和操作过程都掌握了以后逐步引入更复杂的应用。

2)步骤:

a、打开上一章介绍的最小系统,执行Tools–>Create and Package New IP

b、图4-12 –> Next

%title插图%num %title插图%num

在图4-13 中

(1)选择Create a new AXI4 peripheral –> Next,见下图

%title插图%num

修改图 4-14 中的 Name, version等,如图所示,点击 Next

%title插图%num

在图4-15 中:

(1) 修改 Name 输入框为 SW_LED_AXI

(2) Interface Type 选择 Lite

(3)Interface Mode 为Slave

(4)Number of Register 为8

(5)选择中断使能支持,如右图,虽然本次设计中不用中断,但下章内容会用到。

%title插图%num

在图4-16中点击 Finish,在Diagram中添加刚生成的AXI模块,右键–ADD IP

%title插图%num %title插图%num

在图4-18 中,鼠标点击右键,在弹出的对话框中选择 axi4_test_V1.0,这是刚刚通过添加AXI总线module 生成IP。

%title插图%num

图 4-19 中 点击Run Connection Automation

%title插图%num

在图4-20 中,选择ALL

(1) S_AXI_INTR: 中断控制器AXI总线

(2)SW_LED_AXI: sw和led寄存器总线

生成的Diagram 如图4-21所示:

这里只生成了AXI接口SLAVE 端的中断,主机端的中断并没有实现,下一章将会专题讲述SOC中断问题。

%title插图%num

点击右键Regenerate Layout:

%title插图%num

下面的步骤和第一章介绍的几乎相同,

(1)Create HDL Wrapper

(2)修改顶层文件

(3)项目的层次文件如图4-22

%title插图%num

选中AXI_test_0模块,右键单击,选中Edit in IP Packager,如图4-23。在图4-24中选择OK

%title插图%num %title插图%num

修改图4-25 Identification , Version 从1.0–1.1….; 展开左边Design Sources 中 AXI4_test_V1_0

%title插图%num

IP核一共包含三个文件:1)axi4_test_v1_0.v顶层程序 2) axi4_test_v1_0_SW_LED_AXI.v是AXI传输协议程序。3)axi4_test_v1_0_s_AXI_INTR.v是AXI中断协议程序。

%title插图%num

1、仔细阅读axi4_test_v1_0_SW_LED_AXI.v程序,

(1)根据总线协议确定axi_wready , S_AXI_WVALID , S_AXI_AWVALID等之间的关系,理解 AXI_Lite总线的特点

(2)研究读写总线及时序关系

2、修改程序如下:

(1)输出及方向寄存器 // I/O Connections assignments

assign out_led =slv_reg0[7:0];

assign out_t =~slv_reg1[7:0]; //out_t方向寄存器,0为输出,1为输入。这样规定是为了与EMIO的控制方式和结果一致

(2)输入部分:

3’h7 : reg_data_out <= in_key; //将3’h7对应的地址,作为外部输入的地址,其它为寄存器回读地址,

(3)在使用中注意地址的换算关系,由于这里地址译码的最低位是2(localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1;),因此地址都是4对齐的。如3‘h0表示的偏移量为0,3’h1表示的偏移量为4

assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;

always @(*)

begin

// Address decoding for reading registers

case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )

3’h0 : reg_data_out <= slv_reg0;

3’h1 : reg_data_out <= slv_reg1;

3’h2 : reg_data_out <= slv_reg2;

修改axi4_test_v1V_0.v文件

// Users to add ports here //顶层文件添加:

input [7:0] in_key, //输入端口in_key,

output[7:0] out_led, //输出端口out_led,

output[7:0] out_t, //方向控制端口out_t

// updated

// User ports ends

axi4_test_v1_0_SW_LED_AXI # (

.C_S_AXI_DATA_WIDTH(C_SW_LED_AXI_DATA_WIDTH),

.C_S_AXI_ADDR_WIDTH(C_SW_LED_AXI_ADDR_WIDTH)

) axi4_test_v1_0_SW_LED_AXI_inst ( //对应子AXI子模块添加:

.in_key (in_key), //输入端口in_key,

.out_led (out_led), //输出端口out_led,

.out_t (out_t), //方向控制端口out_t

//updated

.S_AXI_ACLK(sw_led_axi_aclk),

修改 axi4_test_v1_0_SW_LED_AXI.v文件:

// Users to add ports here //模块增加端口:

input [7:0] in_key, //输入端口in_key,

output[7:0] out_led, //输出端口out_led,

output[7:0] out_t, //方向控制端口out_t

//updated

// User ports ends

// I/O Connections assignments

assign out_led=slv_reg0[7:0]; //赋值:输出端口out_led

assign out_t =~slv_reg1[7:0]; //赋值:控制端口out_t

修改代码,8位SW输入按键数据读取:

assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;

always @(*)

begin

// Address decoding for reading registers

case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )

3’h0 : reg_data_out <= slv_reg0;

3’h1 : reg_data_out <= slv_reg1;

3’h2 : reg_data_out <= slv_reg2;

3’h3 : reg_data_out <= slv_reg3;

3’h4 : reg_data_out <= slv_reg4;

3’h5 : reg_data_out <= slv_reg5;

3’h6 : reg_data_out <= slv_reg6;

//3’h7 : reg_data_out <= slv_reg7;

3’h7 : reg_data_out <= in_key; // updated

default : reg_data_out <= 0;

endcase

end

如下图(1)Sources栏选中AXI4_test_V1_0项目;

(2)在右边选项对话框中,选中Package IP-axi4_test对话框。可以看到Packaging Steps 栏里,有许多项显示等待编辑和同步,

(3)选中File Groups ,在右边点击Merge changes from File Groups Wizard,依次处理其它待编辑项

%title插图%num

Package IP:

(1)选中 Review and Package栏,

(2)点击 Edit packaging Setting 进入模块打包参数化设置界面,可以什么都不改,只用缺省值

(3)点击 Package IP,将会重新打包刚才编辑过的内容。同时会关闭刚刚开启的临时项目。并退回到主项目界面

(4)在主项目的 Block design–>

Diagram 界面上就会有Refresh IP Catalog的提示,点击Refresh IP Catalog

%title插图%num

%title插图%num 下图显示了操作过程的几个界面

(1)Refresh IP Catalog

(2)在IP Status 的界面中点击Upgrade selected

%title插图%num (3)更新后的结果如图右上角所示:

1)AXI总线部分系统以自动连接

2)更新之后可以看到in_key ,out_led,out_t端口

3)添加端口:

input [7:0] in_key ,

output [7:0] out_key,

output [7:0] out_t,

%title插图%num

打开Block Design,右键点击in_key,out_led和out_t,选择Make External,使得IO口对外接口。空白处右键Regenerate Layout,形成最终block design类似下图(接口一样,布局不一定相同)。

%title插图%num

自动生成的wrapper文件变动如下,红色为自动增加的3个端口以及内部wire连接。

1、 Create HDL Wrapper,

修改wrapper 文件:

module arm_soc_wrapper

(DDR_addr,

DDR_ba,

DDR_cas_n,

GPIO_T,

.

.

.

in_key_0,

out_led_0,

out_t_0 );

 

.

.

.

input [7:0] in_key_0;

output [7:0] out_led_0;

output [7:0] out_t_0;

 

wire [7:0] in_key_0;

wire [7:0] out_led_0;

wire [7:0] out_t_0;

arm_soc arm_soc_i

(.DDR_addr(DDR_addr),

.DDR_ba(DDR_ba),

.DDR_cas_n(DDR_cas_n),

.DDR_ck_n(DDR_ck_n),

.DDR_ck_p(DDR_ck_p),

.DDR_cke(DDR_cke),

.DDR_cs_n(DDR_cs_n),

.DDR_dm(DDR_dm),

.DDR_dq(DDR_dq),

.DDR_dqs_n(DDR_dqs_n),

.DDR_dqs_p(DDR_dqs_p),

.DDR_odt(DDR_odt),

.DDR_ras_n(DDR_ras_n),

.DDR_reset_n(DDR_reset_n),

.DDR_we_n(DDR_we_n),

.FCLK_RSTn(FCLK_RSTn),

.FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),

.FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),

.FIXED_IO_mio(FIXED_IO_mio),

.FIXED_IO_ps_clk(FIXED_IO_ps_clk),

.FIXED_IO_ps_porb(FIXED_IO_ps_porb),

.FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),

 

.GPIO_I_0(GPIO_I_0),

.GPIO_O_0(GPIO_O_0),

.GPIO_T_0(GPIO_T_0),

.in_key_0(in_key_0),

.out_led_0(out_led_0),

.out_t_0(out_t_0));

);

module arm_soc_top

(

inout [14:0]DDR_addr,

.

inout DDR_we_n,

// user added

//inout [21:0]EGPIO_INOUT;

inout [7:0] AXI_inout, //取消上一章22个EGPIO管脚,增加AXI_inout管脚8位

// user added

inout FIXED_IO_ddr_vrn,

.

);

给AXI_inout赋值:

1. out_t如果为低,则输出模式,AXI_inout输出并控制LED灯

2.如果out_t为高, AXI_inout等于输入按键值

(*mark_debug=”true”*) wire [7:0] out_led;

(*mark_debug=”true”*) wire [7:0] in_key;

(*mark_debug=”true”*) wire [7:0] out_t;

genvar i;

generate

for (i=0;i<8;i=i+1) begin

assign AXI_inout=out_t?1’bZ:out_led;

assign in_key= AXI_inout;

end

endgenerate

增加Top层Wrapper模块的3个端口,参考arm_soc_wrapper.v文件

arm_soc_wrapper arm_soc_wrapper_inst

( .

// user added

.in_key_0 (in_key),

.out_led_0 (out_led),

.out_t_0 (out_t),

// user added

.

);

修改约束文件如下,文件如下。

set_property PACKAGE_PIN A17 [get_ports AXI_inout[0]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[0]]

set_property PACKAGE_PIN E8 [get_ports AXI_inout[1]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[1]]

set_property PACKAGE_PIN C6 [get_ports AXI_inout[2]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[2]]

set_property PACKAGE_PIN B9 [get_ports AXI_inout[3]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[3]]

set_property PACKAGE_PIN B6 [get_ports AXI_inout[4]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[4]]

set_property PACKAGE_PIN H6 [get_ports AXI_inout[5]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[5]]

set_property PACKAGE_PIN H7 [get_ports AXI_inout[6]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[6]]

set_property PACKAGE_PIN G9 [get_ports AXI_inout[7]]

set_property IOSTANDARD LVCMOS15 [get_ports AXI_inout[7]]

备注:设置debug接口的步骤

1) Run Sythesis

2)Set Up Debug

3)Save Debug Setting

4)Generate Bitstream

5)Export hardware,导入到sdk平台

1、查看地址空间:

如图4-31所示,SW_LED AXI_reg的 地址空间范围 0x43c0_0000到0x43c0_ffff,总共64k 空间

FPGA AXI总线总共定义了8个寄存器,这里用了寄存器0(LED的写入,和回读);寄存器1(方向寄存器的写入和回读),寄存器7用于开关量的 读取。因此在软件设计时要注意地址空间的使用。

2、Bitstream文件生成后,和第二章操作一样, File->Export->Export Hardware; File->Launch SDK

%title插图%num %title插图%num

3、软件设计

1)从Vivado File–>launch SDK
2)在SDK环境下 File-> New->Application Project,在弹出的对话框中设置如下:

(a) Project Name :AXI_SW_LED

(b) 其它如图4-33所示采用默认值

(c) —>Next

3)在图4-34中选择Empty Application

由于新建的项目是空的,在项目中并没有 应用程序文件,需要自己添加

4)添加Zynq_axi_sw_led.c 文件(后缀名.c不能掉)

File NewSource File

%title插图%num

%title插图%num %title插图%num

Zyqn_axi_Sw_led.c 文件:

(1)添加头文件 : stdio.h; xil_io.h;xil_printf.h

(2)xil_SDK 定义了一套驱动函数,专门用于AXI Lite的操作函数,封装在xil_io.h的中,主要有4套输出函数,4套输入函数

static INLINE void Xil_Out64(UINTPTR Addr, u64 Value)

{volatile u64 *LocalAddr = (volatile u64 *)Addr;

*LocalAddr = Value;

}

static INLINE void Xil_Out8(UINTPTR Addr, u8 Value)

{volatile u8 *LocalAddr = (volatile u8 *)Addr;

*LocalAddr = Value;

} //写入8位数值

static INLINE u64 Xil_In64(UINTPTR Addr)

{return *(volatile u64 *) Addr;

}

static INLINE u8 Xil_In8(UINTPTR Addr)

{return *(volatile u8 *) Addr;

} //读取8位数值

在”xparameters.h”文件中有从硬件设计中继承过来的宏定义:

#define XPAR_AXI4_TEST_0_SW_LED_AXI_BASEADDR 0x43C00000

可以直接使用

#include “stdio.h”

#include “xil_io.h”

#include”xil_printf.h”

int main()

{unsigned char x=0x55;

unsigned char y=0;

while(1)

{

//设置IO为输出 //out_t方向寄存器,0为输出,1为输入,请参考fpga代码 Xil_Out8(XPAR_AXI4_TEST_0_SW_LED_AXI_BASEADDR+4*1,0xff);

//输出X(值交替为0x55,0xAA)

Xil_Out8(XPAR_AXI4_TEST_0_SW_LED_AXI_BASEADDR, x);

x=~x;

xil_printf(“x=%x\n\r”,x);

//重新配置out_t,方向寄存器,设置8位输入

Xil_Out8(XPAR_AXI4_TEST_0_SW_LED_AXI_BASEADDR+4*1,0×00);

//读输入值 ,此时LED的fpga端是高阻,LED灯可以由开关控制

y=(u8)Xil_In8(XPAR_AXI4_TEST_0_SW_LED_AXI_BASEADDR+4*7);

xil_printf(“y=%x\n\r”,y);

}

return 0;

}

本文主要讲述了:

(1)AXI4的基本知识,协议规范及分类

(2)以AXI-Lite为例介绍了如何在SOC系统中进行添加与使用

(3)以开关和LED灯为例在硬件开发板FII-PE7030进行了实验与演示

(4)本文的内容主要以介绍概念和基本的使用方法为主,所采用的例程力求简单,能说明问题即可,但AXI总线的应用可不限于此。就基本应用而言目前我们很容易推广到FIFO的接口(AXI Stream)应用,ADC(中低速)接口的应用,双口RAM的接口应用等。

(5)后续实验会结合具体应用会进行扩展讲解。

(6)更复杂的设计将会在后面的文章中介绍。

Posted in SoC, 教材与教案

1 Comment

发表评论

相关链接