首页 > 其他分享 >ZYNQ & AXI总线 & PS与PL内部通信(用户自定义IP)

ZYNQ & AXI总线 & PS与PL内部通信(用户自定义IP)

时间:2022-11-05 18:44:29浏览次数:89  
标签:PS AXI 自定义 s00 IP slv wire byte axi

    ZYNQ 、AXI协议、PS与PL内部通信 
三种AXI总线分别为: AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输; AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。 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的信号。

  1. input wire  s00_axi_aclk,
  2. input wire  s00_axi_aresetn,
  3. input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,
  4. input wire [2 : 0] s00_axi_awprot,
  5. input wire  s00_axi_awvalid,
  6. output wire  s00_axi_awready,
  7. input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,
  8. input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,
  9. input wire  s00_axi_wvalid,
  10. output wire  s00_axi_wready,
  11. output wire [1 : 0] s00_axi_bresp,
  12. output wire  s00_axi_bvalid,
  13. input wire  s00_axi_bready,
  14. input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,
  15. input wire [2 : 0] s00_axi_arprot,
  16. input wire  s00_axi_arvalid,
  17. output wire  s00_axi_arready,
  18. output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,
  19. output wire [1 : 0] s00_axi_rresp,
  20. output wire  s00_axi_rvalid,
  21. input wire  s00_axi_rready</font>
复制代码 PS向PL写数据(PS作为Master,PL作为Slave) 先来看一段WDATA相关的代码:
  1. always @( posedge S_AXI_ACLK )
  2. begin
  3.   if ( S_AXI_ARESETN == 1'b0 )
  4.     begin
  5.       slv_reg0 <= 0;
  6.       slv_reg1 <= 0;
  7.       slv_reg2 <= 0;
  8.       slv_reg3 <= 0;
  9.     end
  10.   else begin
  11.     if (slv_reg_wren)
  12.       begin
  13.         case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
  14.           2'h0:
  15.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
  16.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin
  17.                 // Respective byte enables are asserted as per write strobes
  18.                 // Slave register 0
  19.                 slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
  20.               end  
  21.           2'h1:
  22.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
  23.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin
  24.                 // Respective byte enables are asserted as per write strobes
  25.                 // Slave register 1
  26.                 slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
  27.               end  
  28.           2'h2:
  29.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
  30.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin
  31.                 // Respective byte enables are asserted as per write strobes
  32.                 // Slave register 2
  33.                 slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
  34.               end  
  35.           2'h3:
  36.             for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
  37.               if ( S_AXI_WSTRB[byte_index] == 1 ) begin
  38.                 // Respective byte enables are asserted as per write strobes
  39.                 // Slave register 3
  40.                 slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
  41.               end  
  42.           default : begin
  43.                       slv_reg0 <= slv_reg0;
  44.                       slv_reg1 <= slv_reg1;
  45.                       slv_reg2 <= slv_reg2;
  46.                       slv_reg3 <= slv_reg3;
  47.                     end
  48.         endcase
  49.       end
  50.   end
  51. 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读数据代码:
  1. // Output register or memory read data
  2. always @( posedge S_AXI_ACLK )
  3. begin
  4.   if ( S_AXI_ARESETN == 1'b0 )
  5.     begin
  6.       axi_rdata  <= 0;
  7.     end
  8.   else
  9.     begin    
  10.       // When there is a valid read address (S_AXI_ARVALID) with
  11.       // acceptance of read address by the slave (axi_arready),
  12.       // output the read dada
  13.       if (slv_reg_rden)
  14.         begin
  15.           axi_rdata <= reg_data_out;     // register read data
  16.         end   
  17.     end
  18. end
  19. //当PS读取数据时,程序会把reg_data_out复制给axi_rdata(RADTA读数据)。
  20. always @(*)
  21. begin
  22.       // Address decoding for reading registers
  23.       case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
  24.         2'h0   : reg_data_out <= slv_reg0;
  25.         2'h1   : reg_data_out <= slv_reg1;
  26.         2'h2   : reg_data_out <= slv_reg2;
  27.         2'h3   : reg_data_out <= slv_reg3;
  28.         default : reg_data_out <= 0;
  29.       endcase
  30. end</font>
复制代码     ZYNQ嵌入式设计时,用户在PL中自定义的IP相当于PS(ARM的外设),他们之间是通过AXI总线进行数据传输。创建好哦IP后,文件自动的生成,用户只需要做简单的修改,寄存器赋值就可以。   

标签:PS,AXI,自定义,s00,IP,slv,wire,byte,axi
From: https://www.cnblogs.com/amxiang/p/16860828.html

相关文章

  • ZYNQ7000系列 PS、PL、AXI 、启动流程基本概念篇
    FPGA系统性学习笔记连载_Day4XilinxZYNQ7000系列PS、PL、AXI、启动流程基本概念篇本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群......
  • ipv4和ipv6与int互转通用处理方式
    记录一下ipv4和ipv6与int互转通用处理方式,由于ipv6转的int比较大,因此需要使用big.Int来保存packagemainimport( "fmt" "math/big" "net/netip")funcInetNt......
  • React使用Antd自定义主题报错
    安装包"customize-cra":"^1.0.0","customize-cra-less-loader":"^2.0.0","less":"^4.1.3","less-loader":"^11.1.0",修改config-overrides.jsconst{override......
  • 2022NOIPA层联测21
    B.学数学打表只发现了连续的$(2,8)(8,30)(30,112)$似乎比较有规律的样子,通过他们算出来的$a=xy+1,b=x^2+y^2$恰好是$2^2$倍数,如果是“以3为起点的链表”就是$3^2$.但......
  • pip和 conda本地安装
    #pip把wheel下载到本地cd/home/saai/wheelspython3.7-mpipdownloadh5py-d"/home/saai/wheels"-ihttps://pypi.tuna.tsinghua.edu.cn/simplepython3.7-mpip......
  • ZYNQ 中PS与PL交互的硬件接口
    一、ZYNQ整体框图二、细节图三、PL与PS交互接口1、接口介绍在ZYNQ芯片内部用硬件实现了AXI总线协议,包括12个物理接口,分别为S_AXI_HP{0:3}_FPD------->(PL为......
  • golang-gin-gorm-viper实现数据简单的增删改查
    目录结构:配置文件:app:addr:127.0.0.1:8888mysql:host:172.xx.xx.xxport:3306user:rootpassword:rootdatabase:ginenable:truegorm:......
  • Thinkphp6笔记十九:加载自定义配置
    适用场景:加载自己的某些配置1.创建配置文件app/config/test.php或者app/admin/test.php<?phpreturn['rule'=>['alibaba'=>[],'ebay'=>[],......
  • [Public NOIP Round #3]图同构
    点权和颜色的操作不对称,尝试转化为同类操作。对于颜色的操作可以看作:交换两点颜色,然后反色那么可以将颜色和点权绑在一起交换,最终颜色是否反色取决于路径长度的奇偶性。......
  • sandom AK IMO & IOI & IBO & IChO & IPhO
    sandom肽聚辣!!!摸摸摸摸摸摸摸摸摸摸%%%%%%%%%%%%%%......