ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

AXI Bram Ctrl IP 核是 ZYNQ 系列 SoC 用于 PS 和 PL 数据交互的方式之一,该 IP 核的功能是将 AXI4 或者 AXI4-lite 接口与 BRAM 接口进行连接,完成 AXI 接口至 BRAM 接口的转换。本篇博文将结合官方文档PG078简单介绍 AXI Bram Ctrl IP 核,并通过仿真分析 AXI 接口信号到 BRAM 接口信号的转换。

PS:关于 AXI 协议可以参考文档为 ARM 官网的《AMBA® 4 AXI4™, AXI4-Lite™, and AXI4-Stream™ Protocol Assertions》,本文只关注 Xilinx IP 核中用到的信号和相关时序,对于不常用的信号和细节不研究。

一、AXI Bram Ctrl IP 核介绍

AXI Bram Ctrl IP 核框图结构如下(分为 AXI4-Lite 连接方式和 AXI4 连接方式):

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析
ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

其实,不论是 AXI4 或者 AXI-Lite 协议,其信号都分为五组,分别如下:

  • Write Address Channel
  • Write Data Channel
  • Write Response Channel
  • Read Address Channel
  • Read Data Channel

AXI4-Lite 与 AXI4 最大的区别就是 AXI-Lite 不支持突发操作(burst operation)。

Write Address Channel

写地址通道信号,如下图所示。

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

其中 s_axi_awlock,s_axi_awcache,s_axi_awport 信号暂时不用,不研究。

valide 和 ready 为握手信号,需要重点关注,操作 slave 端,一般将 valide 信号置为有效,再判断 ready 信号是否有效,接着进行读写操作。

此外,与突发操作相关的信号有 s_axi_awlen,s_axi_awsize,s_axi_awburst。s_axi_awlen + 1 为突发传输的次数,s_axi_awsize,2^(s_axi_awsize)为一次传输的数据字节数,即:

Number Byte = 2SIZE

Burst Length = Len + 1

s_axi_awburst 的突发类型有:

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

常用的为 INCR 类型,即地址递增类型,FIXED 为固定地址类型,即每次都填充固定地址对应的空间。

Write Data Channel

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

Write Response Channel

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

Read Address Channel

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

在 Read Address Channel 通道中,也需要配置突发相关的参数,与 Write Address Channel 类似。

Read Data Channel

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

Read Data Channel 的信号只截取了一部分,完整的可参考 PG078 官方文档。

以上为 AXI 接口信号简单介绍。

下面将通过仿真来更直观的分析 AXI 信号到 BRAM 端口信号的转换。

二、AXI Bram Ctrl IP 核的读写仿真

2.1 AXI Bram Ctrl 写数据仿真

创建工程,在 IP catalog 中添加 AXI Bram Ctrl IP 核,配置如下:

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

定义一个 task 来进行写数据操作,其中写数据地址,突发长度,突发数据大小,突发类型,以及写数据初始值为输入信号,task 部分代码如下:

task axi_write_data;
	input [11:0] aw_addr;
	input [7:0] aw_len;
	input [2:0] aw_size;
	input [1:0] aw_burst;
	input[31:0] init_w_data;
	
	begin
		s_axi_awaddr = aw_addr;
		s_axi_awlen = aw_len;
		s_axi_awsize = aw_size;
		s_axi_awburst = aw_burst;
		s_axi_wdata = init_w_data;
		s_axi_awvalid = 1'b1;
		
		wait(s_axi_awready);
		
		@(posedge s_axi_aclk);
			#2 s_axi_awvalid = 1'b0;
			for(i = 0; i <= aw_len; i = i + 1)begin
				wait(s_axi_wready);
				s_axi_wvalid = 1'b1;
				@(posedge s_axi_aclk);
				if(i == aw_len - 1)begin
					s_axi_wlast = 1'b1;
				end
				#2 s_axi_wdata = s_axi_wdata + 1'b1;
			end
			
		//@(posedge s_axi_aclk);
		s_axi_wvalid = 1'b0;
		s_axi_wlast = 1'b0;
	end
endtask

仿真部分代码片段如下,其中写地址初始化为 12’d10,突发长度为 3 + 1 = 4,突发大小为 2,对应的数据字节数为 2^2 = 4 字节,突发类型为 2‘b01,即 INCR 类型,写数据初始值为 32’h12345678。

//deassert reset
s_axi_aresetn = 1'b1;
s_axi_bready = 1'b1;
s_axi_wstrb = 4'hf;
            
//axi data in
axi_write_data(12'd10,8'd3,3'd2,2'b01,32'h12345678

数据写入部分波形如下:

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

BRAM PORT 部分波形如下:

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

可以看到 BRAM PORT 中地址信号是由 0x8 开始的,而写入时,输入的地址为 0xa,查阅文档,发现有一种非对齐写操作,即该 IP 核会自动对齐地址到 0x0,0x4,0x8 等地址。

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

连续两次突发写操作

//1st axi data in
axi_write_data(12'd10,8'd3,3'd2,2'b01,32'h12345678);
#100            
//2nd axi data in
axi_write_data(12'd10,8'd3,3'd2,2'b01,32'h23456789); 

AXI4 接口波形如下:

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

BRAM 端口如下:

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

至此,AXI Bram Ctrl 写入部分的简单操作讨论完毕,接下来看 AXI Bram Ctrl IP 核的读操作。

2.2 AXI Bram Ctrl 读数据仿真

在 2.1 小节的基础上,使用 AXI4 接口向 AXI Bram Ctrl IP 核读取数据。添加一个 Bram IP 核进行数据存储,先通过 AXI Bram Ctrl IP 核 AXI 接口向 Bram 中写数据,然后通过 AXI 接口读取写入到 Bram 中的数据。

仿真文件片段如下,先通过 AXI 接口写入数据到 Bram 中,然后通过 AXI 接口将写入的数据读出。

//axi data in
axi_write_data(12'd10,8'd3,3'd2,2'b01,32'h12345678);
#100   
//axi data out
axi_read_data(12'd10,8'd3,3'd2,2'b01);         

读取地址为 12’d10 的数据,突发长度为 3 + 1 = 4,突发大小为 4 字节,突发类型为 INCR,波形如下:

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

读出的数据为 0x1234567b, 0x12345678, 0x12345679, 0x1234567a,这与 PG078 文档中的时序图是有区别的,0x1234567b 并不是地址 0x08 写入的数据。

观察 Bram Port 接口数据,发现 0x1234567b 是写入数据时出现在 bram_rrdata 端口上的数据,在 rvalid 有效时,写入数据就会出现在 bram_rrdata 端口上,导致通过 AXI 接口读取数据时,会少一个数据。

ZYNQ IP核:AXI_Bram_Ctrl IP核的读写功能仿真分析

按照官方时序图,正常读出的数据应该是:

0x12345678, 0x12345679, 0x1234567a,0x1234567b。这是一个问题,现在还没有找到原因。

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年6月20日
下一篇 2022年6月22日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注