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

ZYNQAXI总线PS与PL内部通信(⽤户⾃定义IP)
ZYNQ 、AXI协议、PS与PL内部
三种AXI总线分别为:
AXI4:(For high-performance memory-mapped requirements.)主要⾯向⾼性能地址映射通信的需求,是⾯向地址映射的接⼝,允许最⼤256轮的数据突发传输
AXI4-Lite:(For simple, low-throughput memory-mapped communicaon )是⼀个轻量级的地址映射单次传输接⼝,占⽤很少的逻辑单元。
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个):是多核架构下定义的⼀种接⼝,中⽂翻译为加速器⼀致性端⼝,⽤来管理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.
3. input wire  s00_axi_aresetn,
4.
5. input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,
6.
7. input wire [2 : 0] s00_axi_awprot,
8.
9. input wire  s00_axi_awvalid,
10.
11. output wire  s00_axi_awready,
甲胺基苯丙酮12.
13. input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,
14.
15. input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,
16.
17. input wire  s00_axi_wvalid,
18.
19. output wire  s00_axi_wready,
20.
21. output wire [1 : 0] s00_axi_bresp,
22.
23. output wire  s00_axi_bvalid,在线日程
24.
25. input wire  s00_axi_bready,
26.
27. input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,
28.
29. input wire [2 : 0] s00_axi_arprot,
30.
31. input wire  s00_axi_arvalid,
32.
33. output wire  s00_axi_arready,
34.
35. output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,
36.
37. output wire [1 : 0] s00_axi_rresp,
38.
39. output wire  s00_axi_rvalid,
40.
41. input wire  s00_axi_rready</font>
复制代码
PS向PL写数据(PS作为Master,PL作为Slave)
先来看⼀段WDATA相关的代码:
1. always @( posedge S_AXI_ACLK )
2.
3. begin
4.
5.  if ( S_AXI_ARESETN == 1'b0 )
6.
7.    begin
8.
9.      slv_reg0 <= 0;
10.
11.      slv_reg1 <= 0;
12.
13.      slv_reg2 <= 0;
14.
15.      slv_reg3 <= 0;
16.
17.    end
18.
19.  else begin
20.
21.    if (slv_reg_wren)
22.
23.      begin
24.
25.        case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
26.
27.          2'h0:
28.
29.            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
30.
31.              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
32.
33.                // Respective byte enables are asserted as per write strobes
34.
35.                // Slave register 0
36.
37.                slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
38.
39.              end
40.
41.          2'h1:
42.
43.            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
44.
45.              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
46.
47.                // Respective byte enables are asserted as per write strobes
48.
49.                // Slave register 1
50.
51.                slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
52.
53.              end
54.
55.          2'h2:
56.
57.            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
58.
59.              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
60.
61.                // Respective byte enables are asserted as per write strobes
62.
63.                // Slave register 2
64.
65.                slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
66.
67.              end
68.
69.          2'h3:
70.
71.            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
72.
73.              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
74.
75.                // Respective byte enables are asserted as per write strobes
76.
77.                // Slave register 3
78.
79.                slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
80.
81.              end
82.
83.          default : begin
84.
85.                      slv_reg0 <= slv_reg0;
86.
87.                      slv_reg1 <= slv_reg1;
eoa88.
89.                      slv_reg2 <= slv_reg2;
90.
91.                      slv_reg3 <= slv_reg3;
92.
93.                    end
94.
95.        endcase
96.
97.      end
98.
99.  end
100.
101. 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.
3. always @( posedge S_AXI_ACLK )
4.
5. begin
6.
7.  if ( S_AXI_ARESETN == 1'b0 )
8.
9.    begin
10.
11.      axi_rdata  <= 0;
12.
13.    end
14.
15.  else
16.

本文发布于:2024-09-22 07:14:23,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/246092.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   传输   信号   地址   设备   总线   选择
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议