PS/PL之间的数据交互办法

01 概述
mpsoc是xilinx基于16nm工艺推出的异构计算平台,由于灵活、稳定,在业界得到了广泛的使用。异构计算是一个比较新的领域,需要协调硬件设计、逻辑设计、软件设计,对工程师的要求很高。实际设计过程中,很多工程师对实现ps/pl之间的数据交互感到头疼。
本文将介绍主要的ps/pl之间的数据交互办法。
02 mpsoc ps/pl之间的数据通路
在开始之前,首先简要介绍ps/pl之间的数据通路,请参考 《ug1085 zynq ultrascale+ mpsoc technical reference manual》的figure 1-1: axi interconnect。
ps/pl之间的数据通路主要是通用的axi memory接口,其中ps作为主设备的接口有128-bit位宽的hpm0/hpm1, 64-bit位宽的lpd_pl; pl作为主设备的接口有acp/ace/hpc0/hpc1/hp0/hp1/hp2/hp3。所有axi memory接口的位宽最高都可以支持到128-bit。
ps/pl之间主要通过ps-ddr交互大块数据。从figure 1-1可以看到,ps-ddr控制器有六个axi slave接口,与pl直接相关的是s3、s4、s5。hpc0/hpc1都连接到了cci interconnect。dp和hp0连接到了s3。hp1和hp2连接到了s4。hp3和fp dma连接到了s5。如果需要提高带宽,要充分利用ps-ddr控制器的axi slave接口。如果可能,hp1和hp2最好不要同时用,因为hp1和hp2都连接到了s4,最后会彼此竞争带宽。
ug1085的figure 1-1提供了最详细的信息,也有点复杂。为了简单,也可以参考下面来自于《zynq ultrascale+ mpsoc technical overview》的简化示意图。
在vivado的ip 里,使能相关接口后,接口如下。
03 mpsoc ps/pl之间的简单数据通路和简单外设设计
很多时候,ps/pl之间只需要简单的数据通路。ps只需要下发有限的参数给pl,pl只需要向ps反馈有限的状态数据。串口、spi设备、iic等低速接口,就属于这种设备。这种情况下,pl内部只需要实现axi slave接口和一些寄存器就可以,ps通过axi接口去访问寄存器,既向pl提供参数,也可以读回pl的状态。
客户可以自己设计axi接口和寄存器,也可以使用vivado里的工具create and package ip。
04 使用vivado里的工具create and package ip创建ip
如果使用vivado里的工具create and package ip创建ip,可以参照下列步骤。
1) 调用vivado的create and package ip 模板
2) create and package ip 模板介绍
3)新建ip
这一步选择create a new axi4 peripheral。
4) ip命名和目录
根据自己需要,指定ip的名称和目录。
5) ip接口选择
可以看到,只为新的ip选择了axi lite接口,并实现了16个寄存器。工程师可以根据需要选择寄存器个数,最小4个,最多512个。对于axi lite接口,数据位宽是32-bit。
6) 完成ip创建
选择“add ip to the repository”, 点击finish, 完成ip创建。
7) bd框图
在block design中,选择对应的ip。示例中是myip。添加后,在block design中,得到如下ip。可以看到,myip有一个axi slave接口,及其对应的时钟和复位信号。
8) bd设计
axi lite的外设很简单,只有一个axi slave接口,及其对应的时钟和复位信号。把axi slave接口通过axi interconnect连接到某个ps的axi master接口,示例是m_axi_hpm0_fpd,再提供对应的时钟和复位信号就可以。axi连接两侧的mater和slave必须使用同一个时钟和复位信号。
9) 代码分析
创建ip后,在指定的目录下,得到如下的文件夹和和文件。
myip_1.0 │ component.xml │ ├─bd │ bd.tcl │ ├─example_designs │ ├─bfm_design │ │ design.tcl │ │ myip_v1_0_tb.sv │ │ │ └─debug_hw_design │ design.tcl │ myip_v1_0_hw_test.tcl │ ├─hdl │ myip_v1_0.v │ myip_v1_0_s00_axi.v │ └─xgui myip_v1_0.tcl
myip_v1_0_s00_axi.v里实现了寄存器及其读写逻辑。
实现寄存器的verilog hdl代码:
//---------------------------------------------- //-- signals for user logic register space example //------------------------------------------------ //-- number of slave registers 16 reg [c_s_axi_data_width-1:0]slv_reg0; reg [c_s_axi_data_width-1:0]slv_reg1; reg [c_s_axi_data_width-1:0]slv_reg2; reg [c_s_axi_data_width-1:0]slv_reg3; reg [c_s_axi_data_width-1:0]slv_reg4; reg [c_s_axi_data_width-1:0]slv_reg5; reg [c_s_axi_data_width-1:0]slv_reg6; reg [c_s_axi_data_width-1:0]slv_reg7; reg [c_s_axi_data_width-1:0]slv_reg8; reg [c_s_axi_data_width-1:0]slv_reg9; reg [c_s_axi_data_width-1:0]slv_reg10; reg [c_s_axi_data_width-1:0]slv_reg11; reg [c_s_axi_data_width-1:0]slv_reg12; reg [c_s_axi_data_width-1:0]slv_reg13; reg [c_s_axi_data_width-1:0]slv_reg14; reg [c_s_axi_data_width-1:0]slv_reg15;
寄存器写操作的verilog hdl代码的部分片段:
if (slv_reg_wren) begin case ( axi_awaddr[addr_lsb+opt_mem_addr_bits:addr_lsb] ) 4'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 ... ... default : begin slv_reg0 <= slv_reg0; ... ... slv_reg15 <= slv_reg15; end endcase end
寄存器读操作的verilog hdl代码的部分片段:
// implement memory mapped register select and read logic generation // slave register read enable is asserted when valid address is available // and the slave is ready to accept the read address. 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] ) 4'h0 : reg_data_out <= slv_reg0; 4'h1 : reg_data_out <= slv_reg1; 4'h2 : reg_data_out <= slv_reg2; 4'h3 : reg_data_out <= slv_reg3; 4'h4 : reg_data_out <= slv_reg4; 4'h5 : reg_data_out <= slv_reg5; 4'h6 : reg_data_out <= slv_reg6; 4'h7 : reg_data_out <= slv_reg7; 4'h8 : reg_data_out <= slv_reg8; 4'h9 : reg_data_out <= slv_reg9; 4'ha : reg_data_out <= slv_reg10; 4'hb : reg_data_out <= slv_reg11; 4'hc : reg_data_out <= slv_reg12; 4'hd : reg_data_out <= slv_reg13; 4'he : reg_data_out <= slv_reg14; 4'hf : reg_data_out <= slv_reg15; default : reg_data_out <= 0; endcase end
根据需要,可以将寄存器的某个bit,作为控制信号,连接到应用的逻辑代码。也可以将应用逻辑代码的某些信号,作为状态信号,连接到寄存器的某个bit,做状态信号,供cpu读取。
软件
简单外设只有寄存器,软件靠读写寄存器,就能实现对硬件的控制。
05 dma外设设计
如果外设的数据量大,速率要求高,建议使用dma搬移数据,使ps和pl通过ddr共享数据。
vivado的工具create and package ip同样可以创建支持dma功能的ip。大部分步骤,和前述“简单数据通路”一样。在“axi interfaces”窗口,除了“axi lite”接口以外,还要增加“axi full master”接口。
1) 新建axi接口
在“axi interfaces”窗口,点击“+”按钮,能创建一个新的接口。
2) 添加axi master接口
在弹出的接口中,为“interface type”选择full,为“interface mode”选择master。
后续操作,和简单外设的操作一样。
3)bd框图
在block design中,选择对应的ip。示例中是myip_dma。添加后,在block design中,得到如下ip。可以看到,myip_dma多了一个axi master接口“m00_axi”和对应的时钟和复位信号。值得注意的是,myip_dma还多了输入信号m00_axi_init_axi_txn,输出信号m00_axi_txn_done和m00_axi_error。m00_axi_init_axi_txn用于发起写/读传输;m00_axi_txn_done和m00_axi_error由于指示传输是否完成。
4) 代码分析
带有dma的ip的文件如下。
myip_dma_1.0 │ component.xml │ ├─bd │ bd.tcl │ ├─example_designs │ ├─bfm_design │ │ design.tcl │ │ myip_dma_v1_0_tb.sv │ │ │ └─debug_hw_design │ design.tcl │ myip_dma_v1_0_hw_test.tcl │ ├─hdl │ myip_dma_v1_0.v │ myip_dma_v1_0_m00_axi.v │ myip_dma_v1_0_s00_axi.v │ └─xgui myip_dma_v1_0.tcl
axi master的hdl代码在文件myip_dma_v1_0_m00_axi.v中,它实现了通过axi master端口写数据、读数据的功能。读写的地址由参数c_m_target_slave_base_addr指定。
工程师需要根据自己的需要,修改相关逻辑。上述axi master示例中,只能向固定地址发起成对的写、读操作。在实际工程中,地址通常由软件配置,写、读操作也经常分开。
软件
dma外设通常需要由软件配置dma操作的目标内存。如果是standalone(baremetal,裸核)代码,缺省情况下物理地址和软件地址一样,直接向dma的内存地址寄存器写入软件得到的地址就可以。如果是linux下,需要先把软件地址转换成硬件地址,再写入dma的内存地址寄存器。
06 axi stream外设设计
在自己ip里集成dma,可以根据项目需求定制dma的功能,实现最优的性能,但是也会带来设计和维护的工作量。
为了降低工作量,可以使用现成的dma,并在ip里增加axi stream接口,对接axi dma,实现dma功能。
大部分步骤,仍然和前述“简单数据通路”一样。在“axi interfaces”窗口,除了“axi lite”接口以外,选择要增加“axi stream slave”接口, 和“axi stream mastermaster”接口。
1) 新建axi接口
在“axi interfaces”窗口,点击“+”按钮,能创建一个新的接口。
2) 添加axi streamm口
在弹出的接口中,为“interface type”选择stream,为“interface mode”选择master或者slave。示例中,既添加了axi streamm的master,也添加了axi streamm的master。实际工程中,工程师可以根据需要只添加其中一个,或者添加多个同样的接口。axi streamm的slave,也被称为sink;axi streamm的master,也被称为source。
后续操作,和简单外设的操作一样。
3) bd框图
在block design中,选择对应的ip。示例中是myip_stream。添加后,在block design中,得到如下ip。可以看到,myip_stream多了一个axi stream master接口,也多了一个axi streamm slave,及其对应的时钟和复位信号。
4) axi-dma接口
axi streamm需要和ip axi dma搭配使用。使用axi dma的简单配置就可以,比如如下配置。
axi dma有一个axi lite接口,用于ps配置;有3个 axi master接口,m_axi_sg, m_axi_mm2s, m_axi_s2mm,用于访问ddr等存储器;另外还有两个stream接口,m_axis_mm2s, m_axis_s2mm,用于通过axi streamm接口交换数据。
axi-dma连接
如下图所示,axi dma的axi lite接口,通过axi interconnect 连接到ps axi master接口,比如hpm0_fpd,供ps访问。
axi dma的3个axi master接口,m_axi_sg, m_axi_mm2s, m_axi_s2mm,通过axi interconnect 连接到ps的axi slave接口,比如s_axi_hp0_fpd。axi dma的两个stream接口,m_axis_mm2s连接到用户ip的s00_axis, m_axis_s2mm连接到用户ip的m00_axis。
通过axi dma的驱动,软件可以发起mm2s传输,axi dma先通过m_axi_sg从ps-ddr里读取dma的描述符,得到数据的源地址,再通过m_axis_mm2s从ps-ddr里读取数据。软件也可以发起s2mm传输,axi dma先通过m_axi_sg从ps-ddr里读取dma的描述符,得到数据的目标地址,再通过m_axis_s2mm向ps-ddr里写数据。mm2s传输和s2mm传输既可以分开使用,也可以联合使用。如果联合使用,相当于从ps-ddr到ps-ddr的内存搬移工作。
软件
axi-dma的相关软件设计,请参考 mpsoc逻辑加速模块数据通道快速设计。
07 pl外设其它接口 7.1. 中断接口
用户外设还经常用到中断,用于向ps产生中断,通知某些事件。vivado的工具create and package ip也可以创建支持中断功能的ip。大部分步骤,和前述“简单数据通路”一样。在“axi interfaces”窗口,勾选“enable interrupt support”, 会得到一个s_axi_intr接口和一个中断输出信号irq。
通过axi interconnect,把s00_axi和s_axi_intr接口连接连接到ps axi master接口,比如hpm0_fpd,供ps访问。把中断输出信号irq,通过ip concat连接到ps的输入pl_ps_irq。
emio接口
ps还提供了简单的gpio接口:emio。
在ps的配置界面下的gpio里,使能emio,根据自己的需要选择数量。然后在bd界面下,就能看见emio的信号,包括输出、输入、和三态信号。工程师可以把自己的信号连接到emio信号上,就能使用。
软件通过访问ggpio的bank 3/4/5,可以控制gpio,包括操作输出状态,和读取输入电平。
软件经常需要检查pl是否正常工作。很多时候,软件靠检查pl加载的done信号来确定。但done只能保证pl已经被加载,不能保证pl已经正常工作。比如,如果pl使用外部时钟,在外部时钟故障时,pl即使已经被加载,也没有工作。这时候,ps去访问pl的寄存器,会导致ps死机。更好的办法是,pl通过emio向ps反馈pl是否已经正常工作。比如pl实现计数器,把计数器的输出连接到emio的输入。软件读取emio的输入值,如果在变化,说明pl的计数器已经正常工作,那么就代表pl已经正常工作。
08 axi firewall
在开发过程中,可能有各种异常状况。如果axi传输出现异常,可能导致ps死机,影响调试。为了提高系统可靠性,可以使用xilinx提供的ip -- axi firewall,把它插在正常的axi master和 axi slave接口之间。下图是axi firewall的连接示例。
使用软件使能 axi firewall后,如果axi传输出现异常,axi firewall会正常结束axi传输,保证软件继续运行,工程师可以检查axi传输的错误。axi firewall输出的错误信号和中断信号,都可以连接到ps gpio,或者ila。工程师可以读出具体的错误信息。

SoC设计中嵌入FPGA(eFPGA)内核实用评估方法
安科瑞温度在线监测系统解决方案
华硕灵耀14s规格配置一览
全局变量和成员变量的区别分析
儿童智能手表安全问题分析
PS/PL之间的数据交互办法
半导体业资本支出逆疫情成长,中芯国际增长幅度第一
中国轨道交通装备制动技术取得较大进步
工业互联网在中国的发展与机遇
5G如何赋能智慧轨交
BWS注塑型伺服驱动器在注塑机中的应用
Qorvo QPG6100可提高家庭中各种无线设备之间连接速度
黑客可轻松破解脸部识别
源卓微纳拟A股IPO已进行上市辅导
农行率先推出 ATM 机数字人民币存取现功能,实现数字人民币和现金的无感兑换
通信行业对5G看的有多重
华为徐直军:抛弃幻想,大规模使用***才能推动整个产业进步
视频到视联网是一场华丽的蜕变吗
逆变器的正确使用方法/作用/安装及对环境要求
什么是LVDS连接器,LVDS连接器有什么用处