ZYNQ PS及MicroBlaze访问FPGA端BRAM实战

目录

一、背景

二、BRAM是什么?

三、MicroBlaze连接BRAM外设

四、实战代码


一、背景

Xilinx  Zynq和带MicroBlaze的FPGA都存在处理器端和FPGA端的概念, 如果处理器的C代码要和FPGA通讯,则有以下几种方式,我们今天来讲怎么让ZYNQ PS及MicroBlaze对FPGA端BRAM进行访问:

(1)中断

(2)AXI_GPIO

(3)AXI_UART 

(5)AXI_BRAM

(6)AXI_FIFO

(7)AXI_EMIF

(8)AXI DMA

  1. PS通过AXI-lite向AXI DMA发送指令,AXI DMA通过HP通路和DDR交换数据,PL通过AXI-S读写DMA的数据
  2. AXI-DMA:实现从PS内存到PL高速传输高速通道AXI-HP<---->AXI-Stream的转换
  3. AXI-Datamover:实现从PS内存到PL高速传输高速通道AXI-HP<---->AXI-Stream的转换,完全由PL控制的,PS是完全被动的。
  4. AXI-VDMA:实现从PS内存到PL高速传输高速通道AXI-HP<---->AXI-Stream的转换,是专门针对视频、图像等二维数据的。
  5. AXI-CDMA IP: 这个是由PL完成的将数据从内存的一个位置搬移到另一个位置,无需CPU来插手。和Stream没有关系。

(10)其它自定义IP

二、BRAM是什么?

(1)Block RAM:Block RAM是PL部分的存储器阵列,为了与DRAM(分布式RAM)区分开,所以叫块RAM。ZYNQ的每一个BRAM 36KB,7020的BRAM有140个(4.9M),7030有265个(9.3M),7045有545个(19.2M)。每一个BRAM都有两个共享数据的独立端口,当然是可以配置的,可用于片内数据缓存、FIFO缓冲。

(2)AXI BRAM Controller:PS和BRAM之间的事务由AXI BRAM Controller控制,可以是AXI总线形式,也可以是AXILite总线形式,如下:

(3)Block Memory Generator:在Vivado里有一个IP核叫Block Memory Generator,它使用FPGA的Block RAM资源为我们提供可编程的RAM或者ROM,如下:

三、MicroBlaze连接BRAM外设

(1)整理硬件框图

(2)AXI BRAM Controller和BRAM的连接

(3)外设地址分配(分配的地址就是C代码的要访问BRAM的基地址)

四、实战代码

注意:下面的XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR就是上面BRAM的首地址0xC000_0000,可以直接通过Xil_Out和Xil_In系列函数直接进行操作。

/* 技术先生 */
#include <stdio.h>
#include "platform.h"
#include "xil_io.h"
#include "xparameters.h"


int main(void)
{
	int word1,word2,word3,word4;

	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0, 0xAB);//第一个字,4字节
	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 1, 0xFF);
	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 2, 0x34);
	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 3, 0x8C);

	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 4, 0xEF);//第二个字,4字节
	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 5, 0xBE);
	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 6, 0xAD);
	Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 7, 0xDE);

	Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x10, 0x1209);//第三个字,4字节
	Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x12, 0xFE31);

	Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x14, 0x6587);//第四个字,4字节
	Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x16, 0xAAAA);


	Xil_Out32(0xE000A244, 0x0AAA);  //第5个字,4字节


	word1 = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR);
	word2 = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 8);

	word3 = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x10);

	word4 = Xil_In32(0xE000A244);

	printf("Word1 = 0x%08x\n\r", word1);
	printf("Word2 = 0x%08x\n\r", word2);
	printf("Word3 = 0x%08x\n\r", word3);
	printf("Word4 = 0x%08x\n\r", word4);


	return(0);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个早起的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值