当前位置:   article > 正文

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据_xilinx bram

xilinx bram

一,Xilinx BRAM介绍

BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zynq中还有一类存储器,称为分布式随机访问存储器(DRAM)。由于BRAM可以在PS和PL之间传递数据,而利用PS,ZYNQ可以从外部接收数据,考虑到未来的实时传输的需求,从BRAM开始学起。

二,BRAM对应的IP核调用和使用

1,BRAM对应的IP核介绍

Vivado软件中包含有三种类型的 IP核,包括数据处理类IP核、驱动类IP核、存储类IP核。与BRAM对应的存储型IP核是Block Memory Generator(BMG),可以在IP Catalog中找到,在建立好工程的基础上寻找并打开BMG核,如下:
在这里插入图片描述
1.1,Basic窗口功能介绍
(1)在component name后的框里输入将要定制的BMG IP核的名称;
(2)在Memory Type选框中有四种选项:单口RAM、单双口RAM、真双口RAM、单口ROM、双口ROM。

在这里插入图片描述
图1 单口 RAM
在这里插入图片描述
图2 简化双口 RAM A 口写入数据,B 口读数据

图3 真双口 RAM A,B 任意一个口都可以读写数据,可从 A 写入,B 读数据
图3 真双口 RAM A,B 任意一个口都可以读写数据,可从 A 写入,B 读数据

这里选择单口RAM即可。
(3)Interface Type表示BMG IP核的接口类型,如果用PL调用BRAM,选择Native。如果用PS通过PL来调用BRAM,则选择AXI4。这里选择Native。
(4)ECC Options表示纠错编码选项,主要调整BMG支持的软错误纠正控制(软ECC)模块的实现和使用,一般不会使用,除非对系统可靠性要求很高的场景中才会考虑使用。这里不进行调整。
(5)写使能和算法选项同样不做任何修改。
1.2,Port A Options窗口介绍
在这里插入图片描述
(1)写宽度和读宽度表示每一个存储地址中存储数据的大小,写深度和读深度表示存储地址的数目。这要根据需要预先存入的数据的大小来设定
(2)操作模式选框要选“读优先”,这是因为打算以.coe文件来初始化BRAM,程序中不再需要对BRAM进行写,只进行读。
(3)使能端口类型选框,其作用是选择是否加入ENA引脚,该引脚可看做是BMG的开关信号的输入引脚。为了方便,选择“总是使能”,这样,BMG就会一直处于工作状态。
1.3,其他选项窗口介绍
在这里插入图片描述
![(https://img-blog.csdnimg.cn/20190521151657631.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTUyNQ==,size_16,color_FFFFFF,t_70)
(1)RAM内存空间的初始化可以通过装载.coe文件,文件的内容如下:
MEMORY_INITIALIZATION_RADIX=16; //表示数据的进制类型
MEMORY_INITIALIZATION_VECTOR= //表示存储的数据
7ADB,BDB2,5646,88D5,74E9,D990,481D,69A9,2DA4,E097,…
由于存储的数据共有3191个,所以Port A Options窗口中的数据深度设为3191。
.coe文件可以借助matlab来得到。部分关键代码如下:

r = dec2hex(x2);
fid = fopen('text.coe','w');
fprintf(fid,'MEMORY_INITIALIZATION_RADIX=16;\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');
for i = 1:3191
    fprintf(fid,r(i,:));
    if i==3191
        fprintf(fid,';');
    else
        fprintf(fid,',');
    end
     
    if mod(i,15)==0
        fprintf(fid,'\n');
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(2)其余部分不需要进行修改。
最后点击OK,完成BMG的设置。接着会出现Generate Output Products对话框:
在这里插入图片描述
**综合选项要选成全局型的。**然后点击“生成”按钮。

2,BMG例化IP核的调用

(1)在IP Sources文件夹中找到.veo文件,打开;
在这里插入图片描述
(2)复制BRAM0的例化verilog代码(下图选中区域);
在这里插入图片描述
(3)在工程中新建仿真文件,即testbench文件;
在这里插入图片描述
(4)读懂BRAM“写优先模式”的时序图,并编写testbench。
在这里插入图片描述
,testbench代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date:
// Design Name: 
// Module Name: 
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
module Bram_test();
//Testbench时钟信号
parameter size = 100;
reg clka = 0;
reg wea = 0;
reg [11:0] addra = 12'h000;
wire [15:0] douta; //输出信号设置为wire垿
always #10 clka <= ~clka;
initial
    begin
		#45 wea = 1;
		repeat(size)
		begin
			#20 addra=addra+1;
		end
		wea = 0;
	end			
	BRAM0 My_Bram (
	  .clka(clka),    // input wire clka
	  .wea(wea),      // input wire [0 : 0] wea
	  .addra(addra),  // input wire [11 : 0] addra
	  .douta(douta),  // output wire [15 : 0] douta
	  .dina()
	);
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

(5)将testbench文件设为顶层文件,并进行行为仿真;
在这里插入图片描述
(6)波形仿真结果如下
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/626199
推荐阅读
相关标签
  

闽ICP备14008679号