萌新的SOC学习之基于BRAM的PS和PL数据交互实验
基于BRAM的PS和PL的数据交互实验
先介绍 AXI BRAM IP核控制器的简介
AXI BRAM ip核 是xilinx提供的一个软核 这个ip核被设计成 AXI的一个从机接口 用于AXI互联的集成
系统的主设备和本地的RAM进行通信 (我们可以通过这个IP核 和本地的RAM进行通信)
这个IP核支持单次或是突发的传输
概述部分 :
AXI BRAM的ip核 可以配置成单端口或是双端口 和 BRAM进行通信 通过的是AXI4或是AXI4_Lite 接口
AXI BRAM 也支持 ECC 数据纠错功能 这个功能我们平时很少会去用
我们来看系统框图
也可以将左边配置成AXI4接口 这样它读写的传输速度会快于 AXI4_lite
实验任务 : 本章的实验任务是 PS 将串口接收到的数据写入 BRAM,然后从 BRAM 中读出数据,并通过串口打印出来;与此同时,PL 从 BRAM 中同样读出数据,并通过 ILA 来观察读出的数据与串口打印的数据是否一致。
系统框图
我们看的PS端的UART这就是 我们利用串口来进行打印的部分
我们需要在PL端添加一个BRAM的ip核
我们还需要添加一个AXI BRAM Controller (AXI BRAM控制器 这个控制器完成对BRAM的读写操作
这个控制器是 PS端添加的 PS端正是 通过了这样的一个控制器才完成了对BRAM的读写操作的
而我们的PL是怎么从BRAM读出数据呢 我们需要添加一个自定义的IP核 pl_bram_rd这个IP核的目的就是从BRAM中读出数据
究竟是哪个地址读数据 读多少 都是根据我们AXI4 接口来控制的
开始搭建
搭建完成的框图
我们观察系统框图以及自己创建的IP核我们会发现
对于这个自定义的IP核 我们添加了一个与BRAM交互的RAM端口
我们的这个RAM端口,可以传输单字节或者多字节的数据
因为RAM端写数据是32位的( 31_24 , 23_16 , 15_8 , 7_0 )
我们的写控制信号是4bit 正好控制 这32位的四个数据
output wire ram_clk , //RAM时钟
input wire [31:0] ram_rd_data, //RAM中读出的数据
output wire ram_en , //RAM使能信号
output wire [31:0] ram_addr , //RAM地址
output wire [3:0] ram_we , //RAM读写控制信号
output wire [31:0] ram_wr_data, //RAM写数据
output wire ram_rst , //RAM复位信号,高电平有效
自定义IP之后封装 再添加 进行连接
接下来我们来编写c代码
c代码目的是先来接收串口的数据, 接收到数据后 把数据写进BRAM内, 写完之后再把它读出来
我们可以通过串口,来比较写入的和打印的值是否一致
同时我们也要对自定义的ip核进行操作 确定什么时候读 读什么
我们接下来就用的这两个对BRAM进行读写
第一个数据是basedaaress 基地址 第二个数据是相对于base address 的偏移量 第三个是data 也就是我们真正需要写入的数据了
对于我们自定义的ip核 有两个代码 -两个功能
朝自定义IP核 写数据 朝自定义IP核中 去读数据