搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
二叉树--C语言实现数据结构_c语言写二叉树
2
Python OS库使用详解_pycharm os
3
二叉树的层序遍历 + 通过层序遍历实现二叉树的操作_按照层数遍历二叉树
4
java面试题(上)_一年java面试
5
GNN 2021(三) Boost then Convolve: Gradient Boosting Meets Graph Neural Networks,ICLR
6
Linux NFS服务_nfs gid uid
7
python数据分析——用jieba和词云做知乎的数据分析_mytext=''.join(jieba.cut(mytext))
8
FAST_LIO_SAM 融入后端优化的FASTLIO SLAM 系统 前端:FAST_LIO2 后端:LIO_SAM_fast lio sam
9
Python——列表(list)推导式_python列表推导式
10
Opencv cuda版本编译
当前位置:
article
> 正文
ZYNQ 、AXI协议、PS与PL内部通信_zynq axi
作者:知新_RL | 2024-07-15 18:09:09
赞
踩
zynq axi
ZYNQ 、AXI协议、PS与PL内部
通信
三种AXI总线分别为:
AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输;
AXI4-Lite:(For simple, low-throughput memory-mapped communica
ti
on )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。
AXI4-Stream:(For high-speed streaming data.)面向高速流数据传输;去掉了地址项,允许无限制的数据突发传输规模。
AXI4总线和AXI4-Lite总线具有相同的组成部分:
(1)读地址通道,包含ARVALID, ARADDR, ARREADY信号;
(2)读数据通道,包含RVALID, RDATA, RREADY, RRESP信号;
(3)写地址通道,包含AWVALID,AWADDR, AWREADY信号;
(4)写数据通道,包含WVALID, WDATA,WSTRB, WREADY信号;
(5)写应答通道,包含BVALID, BRESP, BREADY信号;
(6)系统通道,包含:ACLK,ARESETN信号。
AXI4-Stream总线的组成:
(1)ACLK信号:总线时钟,上升沿有效;
(2)ARESETN信号:总线复位,低电平有效
(3)TREADY信号:从机告诉主机做好传输准备;
(4)TDATA信号:数据,可选宽度32,64,128,256bit
(5)TSTRB信号:每一bit对应TDATA的一个有效字节,宽度为TDATA/8
(6)TLAST信号:主机告诉从机该次传输为突发传输的结尾;
(7)TVALID信号:主机告诉从机数据本次传输有效;
(8)TUSER信号 :用户定义信号,宽度为128bit。
三种AXI接口分别是:
AXI-GP接口(4个):是通用的AXI接口,包括两个32位主设备接口和两个32位从设备接口,用过改接口可以访问PS中的片内外设。
AXI-HP接口(4个):是高性能/带宽的标准的接口,PL模块作为主设备连接(从下图中箭头可以看出)。主要用于PL访问PS上的存储器(DDR和On-Chip RAM)
AXI-ACP接口(1个):是
ARM
多核架构下定义的一种接口,中文翻译为加速器一致性端口,用来管理DMA之类的不带缓存的AXI外设,PS端是Slave接口。
我们可以双击查看ZYNQ的IP核的内部配置,就能发现上述的三种接口,图中已用红色方框标记出来,我们可以清楚的看出接口连接与总线的走向:
AXI
协议之握手协议
AXI4所采用的是一种READY,VALID握手通信机制,简单来说主从双方进行数据通信前,有一个握手的过程。传输源产生VLAID信号来指明何时数据或控制信息有效。而目地源产生READY信号来指明已经准备好接受数据或控制信息。传输发生在VALID和READY信号同时为高的时候。VALID和READY信号的出现有三种关系:VALID先变高READY后变高,READY先变高VALID后变高,VALID和READY信号同时变高。无论什么情况信息传输立马发生在VALID和READY信号同时为高且ACLK上升沿,时序图如下:
需要强调的是,AXI的五个通道,每个通道都有握
手机
制,接下来我们就来分析一下AXI-Lite的源码来更深入的了解AXI机制。
突发式读
当地址出现在地址总线后,传输的数据将出现在读数据通道上。设备保持VALID为低直到读数据有效。为了表明一次突发式读写的完成,设备用RLAST信号来表示最后一个被传输的数据。
突发式写
这一过程的开始时,主机发送地址和控制信息到写地址通道中,然后主机发送每一个写数据到写数据通道中。当主机发送最后一个数据时,WLAST信号就变为高。当设备接收完所有数据之后他将一个写响应发送回主机来表明写事务完成。
PS与PL内部通信(用户自定义IP)
先要自定义一个AXI-Lite的IP,新建工程之后,选择,菜单栏->Tools->Creat and Package IP:
选择Next>>选择Create AXI4 Peripheral>>然后Next默认,选择Next>>注意这里接口类型选择Lite,选择Next>>选择Edit IP,点击Finish:
此后,Vivado会新建一个工程,专门编辑该IP,通过该工程,我们就可以看到Vivado为我们生成的AXI-Lite的操作源码:
AXI-Lite 源码分析
当打开顶层文件的时,是一堆AXI的信号。
input wire s00_axi_aclk,
input wire s00_axi_aresetn,
input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,
input wire [2 : 0] s00_axi_awprot,
input wire s00_axi_awvalid,
output wire s00_axi_awready,
input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,
input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,
input wire s00_axi_wvalid,
output wire s00_axi_wready,
output wire [1 : 0] s00_axi_bresp,
output wire s00_axi_bvalid,
input wire s00_axi_bready,
input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,
input wire [2 : 0] s00_axi_arprot,
input wire s00_axi_arvalid,
output wire s00_axi_arready,
output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,
output wire [1 : 0] s00_axi_rresp,
output wire s00_axi_rvalid,
input wire s00_axi_rready</font>
复制代码
PS向PL写数据(PS作为Master,PL作为Slave)
先来看一段WDATA相关的代码:
always @( posedge S_AXI_ACLK )
begin
if ( S_AXI_ARESETN == 1'b0 )
begin
slv_reg0 <= 0;
slv_reg1 <= 0;
slv_reg2 <= 0;
slv_reg3 <= 0;
end
else begin
if (slv_reg_wren)
begin
case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
2'h0:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 0
slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
2'h1:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 1
slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
2'h2:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 2
slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
2'h3:
for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
if ( S_AXI_WSTRB[byte_index] == 1 ) begin
// Respective byte enables are asserted as per write strobes
// Slave register 3
slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
end
default : begin
slv_reg0 <= slv_reg0;
slv_reg1 <= slv_reg1;
slv_reg2 <= slv_reg2;
slv_reg3 <= slv_reg3;
end
endcase
end
end
end</font>
复制代码
这段程序的作用是,当PS那边向AXI4-Lite总线写数据时,PS这边负责将数据接收到寄存器slv_reg。而slv_reg寄存器有0~3共4个。至于赋值给哪一个由
axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]决定,根据宏定义其实就是由axi_awaddr[3:2] (写地址中不仅包含地址,而且包含了控制位,这里的[3:2]就是控制位)决定赋值给哪个slv_reg。
PS读取PL数据(PS作为Master,PL作为Slave)
我们继续来看有关RADTA读数据代码:
// Output register or memory read data
always @( posedge S_AXI_ACLK )
begin
if ( S_AXI_ARESETN == 1'b0 )
begin
axi_rdata <= 0;
end
else
begin
// When there is a valid read address (S_AXI_ARVALID) with
// acceptance of read address by the slave (axi_arready),
// output the read dada
if (slv_reg_rden)
begin
axi_rdata <= reg_data_out; // register read data
end
end
end
//当PS读取数据时,程序会把reg_data_out复制给axi_rdata(RADTA读数据)。
always @(*)
begin
// Address decoding for reading registers
case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
2'h0 : reg_data_out <= slv_reg0;
2'h1 : reg_data_out <= slv_reg1;
2'h2 : reg_data_out <= slv_reg2;
2'h3 : reg_data_out <= slv_reg3;
default : reg_data_out <= 0;
endcase
end</font>
复制代码
ZYNQ
嵌入式
设计时,用户在PL中自定义的IP相当于PS(ARM的外设),他们之间是通过AXI总线进行数据传输。创建好哦IP后,文件自动的生成,用户只需要做简单的修改,寄存器赋值就可以。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/830527
推荐阅读
article
【
ZYNQ
-7000开发之六】使用PS控制
DDR3
的
读写
_基于
zynq
的
ps
端ddr
读写
...
本编文章
的
目
的
主要用简明
的
方法对
DDR3
进行
读写
,当然这种方式每次
读写
都需要CPU干预,效率是比较低
的
,但是这是学习
的
过...
赞
踩
article
【
ZYNQ
】
Vivado
封装
自定义
IP
_
vivado
添加
自定义
ip...
在 FPGA 开发设计中,
IP
核的使用通常是不可缺少的。FPGA
IP
核是指一些已经过验证的、可重用的模块或者组件,...
赞
踩
article
【zynq】vivado sdk没有自动生成驱动_
the
selected
platform
doe...
在修改vivado工程,添加新的模块后,没有自动生成驱动,xparameters.h和BSP中的libsrc均没有正确生...
赞
踩
article
ZYNQ
简介——
正点
原子
ZYNQ
学习笔记_
正点
原子
zynq
...
正点
原子
启明星开发板
zynq
新版教程笔记,
ZYNQ
简介_
正点
原子
zynq
正点
原子
zynq
...
赞
踩
article
【
ZYNQ
】
Zynq
开发
流程_
zynq
开发
...
Zynq
芯片架构由嵌入式处理器(Processing System, PS)与可编程逻辑(Programmable L...
赞
踩
article
ZYNQ
FPGA
实验
——
AD
/DA测试...
本
实验
是
AD
/DA测试
实验
,DA电路由高速DA芯片
AD
9708、7阶巴特沃斯低通滤波器、幅度调节电路和信号输出接口组成,...
赞
踩
article
Zynq
-7000系列之
linux
开发学习笔记:
PS
和PL
端
的
GPIO
使用(三)_z7
的
pl
端
gpi...
开发板:
Zynq
7030数据采集板PC平台:Ubuntu-18.04 + MobaXterm开发环境:Xilinx Vi...
赞
踩
article
【
ZYNQ
】PS和PL数据交互丨
AXI
总线
(主机模块
RTL
代码
实现)_
ps
axi
访问pl
寄存器
...
AXI
总线
是ARM公司提出的片内高速
总线
协议,具有读写通道分离、高带宽、高可靠性、底延迟等特点。本文尝试分析
AXI
总线
的...
赞
踩
article
ZYNQ
PS
与
PL
通信之
DMA
_
zynq
dma...
在
zynq
开发中,
PS
与
PL
通信是非常关键的内容,掌握了
PS
与
PL
通信方法,就可以搭建各种常用的硬件平台。本文先介绍集中...
赞
踩
article
【
ZYNQ
】基于
BRAM
的
PS
与
PL
数据
交互_
zynq
bram
...
通过
BRAM
可以很方便的实现
PS
与
PL
之间的
数据
交互_
zynq
bram
zynq
bram
...
赞
踩
article
ZYNQ
PS
简介...
ZYNQ
实际上是一个以处理器为核心的系统,PL 只是它的一个外设。Zynq-7000 系列的亮点在于它包含了完整的 A...
赞
踩
article
Zynq
-PS-SDK(6) 之
AXI
GPIO
_sdk怎么
控制
axi
...
目录1、Block Design2、Generate top level3、Add constraints & Bits...
赞
踩
article
Zynq
PS不支持
仿真
_
zynq
ps
仿真
...
通过
仿真
和查询资料,确认
Zynq
PS处理不支持
仿真
。_
zynq
ps
仿真
zynq
ps
仿真
...
赞
踩
article
zynq
-
PS
知识点
(一)修改
PS
IP核、
生成
HDF
和
helloworld
小系统_
zynq
.hd...
zynq
-
PS
知识点
(一):vivado搭建工程、创建最小工程、DDR配置、vivado sdk搭建
helloworld
...
赞
踩
相关标签
ZYNQ
Zedboard
DDR
zynq
fpga开发
SDK
fpga
学习
笔记
BRAM
arm
Zynq AXI GPIO
嵌入式
嵌入式硬件