ZYNQ PS与PL通过AXI-LITE连接,在Linux下直接读写PL的物理地址,实现PS与PL的交互

一、前言

ZYNQ开发,如果PL与PS的交互方式仅为AXI-Lite总线的话,在Linux下可以通过直接访问PL的寄存器物理地址来实现PS-PL的数据交互。
测试代码的PC开发平台为Ubuntu18.04,QT5。
ZYNQ为7020,并移植了Linux系统和Ubuntu16.04的最小系统。

二、PL的设计

将PL的程序封装成IP核,通过AXI-LITE与PS连接,对外是18个寄存器,每个寄存器为32位。
寄存器定义是:寄存器0-7用来接收数据,寄存器8的最高位代表数据到来,寄存器9-16用来发送数据,寄存器17的最高位代表发送使能。程序逻辑比较简单,检测到接收信号后,将数据回传回去。

xPAA
#(
	.PL_GOLBAL_FREQ		(PL_GOLBAL_FREQ)
)u_xPAA
(
	.sys_clk			(S_AXI_ACLK),
	.sys_rst			(S_AXI_ARESETN),
	
	.pl_rx_data1		(slv_reg0),
	.pl_rx_data2		(slv_reg1),
	.pl_rx_data3		(slv_reg2),
	.pl_rx_data4		(slv_reg3),
	.pl_rx_data5		(slv_reg4),
	.pl_rx_data6		(slv_reg5),
	.pl_rx_data7		(slv_reg6),
	.pl_rx_data8		(slv_reg7),
	.pl_rx_en			(slv_reg8[31]),
	.ssr_none			(slv_reg8[30:0]),
	
	.pl_tx_data1		(slv_reg9),
	.pl_tx_data2		(slv_reg10),
	.pl_tx_data3		(slv_reg11),
	.pl_tx_data4		(slv_reg12),
	.pl_tx_data5		(slv_reg13),
	.pl_tx_data6		(slv_reg14),
	.pl_tx_data7		(slv_reg15),
	.pl_tx_data8		(slv_reg16),
	.pl_tx_en			(slv_reg17[31]),
	.sst_none			(slv_reg17[30:0]),
	
	.pl_led				(pl_led)
    );

module xPAA
#(
	parameter		  PL_GOLBAL_FREQ = 120_000000
)
(

	input			  sys_clk,
	input			  sys_rst,
	
	input [31:0] 	  pl_rx_data1,
	input [31:0] 	  pl_rx_data2,
	input [31:0] 	  pl_rx_data3,
	input [31:0]   	  pl_rx_data4,
	input [31:0] 	  pl_rx_data5,
	input [31:0]	  pl_rx_data6,
	input [31:0]	  pl_rx_data7,
	input [31:0] 	  pl_rx_data8,
	input			  pl_rx_en,
	input [30:0]	  ssr_none,
	
	output reg [31:0] pl_tx_data1,
	output reg [31:0] pl_tx_data2,
	output reg [31:0] pl_tx_data3,
	output reg [31:0] pl_tx_data4,
	output reg [31:0] pl_tx_data5,
	output reg [31:0] pl_tx_data6,
	output reg [31:0] pl_tx_data7,
	output reg [31:0] pl_tx_data8,
	output
Zynq 7000系列SoC是一个典型的嵌入式系统-on-chip (System on Chip),它集成了处理系统(PS,Processing System)和现场可编程门阵列(PL,Programmable Logic)。PS负责运行基于微处理器(如ARM Cortex-A9)的操作系统和应用程序,而PL则提供了一组专用硬件资源可以自定义配置。 在Zynq中,PLPS之间的通信通常通过AXI总线进行,这是一种高性能、低延迟的片上互连标准。以下是一个简单的PLPS之间通信的示例程序概览: 1. **设置环境**: - 使用Xilinx SDK(例如Vivado HLS)编写在PS上运行的用户应用,该应用会生成AXI流接口。 -PL上,你可以使用VHDL或Verilog设计IP核,该核将接收从PS发来的数据并执行相应的操作。 2. **API调用**: -PS的C/C++代码中,使用AXI Interconnect API发起数据传输。例如,使用`axi_stream_write()`函数将数据发送到AXI流接口。 ```c #include "axi_stream.h" ... axi_stream_write(stream_out, data); ``` 3. **PL端响应**: -PL的设计中,使用相同的AXI流接口,并在接收到数据时进行处理。这可能是通过触发特定硬件逻辑,比如FPGA内的流水线处理。 4. **数据交互**: - 数据可以在PSPL之间双向流动。PL可以完成一些实时任务,如图像处理,而PS负责控制流程和结果处理。 5. **初始化同步**: - 在启动时,需要初始化AXI连接并保证双方的时钟同步。 ```c // PS 初始化 axi_stream_init(stream_in, stream_out); // PL 初始化 xil_io_init(axi_stream_addr(stream_out), ...); ``` 6. **错误处理**: - 为了保证可靠通信,还需要处理可能出现的数据丢失、冲突或者其他异常情况。 这是一个非常基础的示例,实际项目可能会更复杂,包括数据包解析、错误检测和恢复机制等。如果你对具体的代码实现有疑问,可以询问以下问题:
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值