使用Block Memory Generator IP核,PL读取BRAM数据
软件环境:Vivado 2018.3
IP核:Block Memory Generator 8.4(Rev.2)
1、点击IP Catalog
2、搜索”Block Memory Generator“双击选择RAMs & ROMs & BRAM下的IP核
3、配置IP核为Simple Dual Port RAM,Width为8,Depth为9,load数据文件init.coe,点击OK
init.coe
memory_initialization_radix=16;
memory_initialization_vector=00 01 02 03 04 05 06 07 08;
4、点击Genrate
5、blk_mem_gen_0.veo中即IP核调用方法
6、新建ram_top.v
module ram_top(
input clk,
input ena,
input wea,
input [3:0] addra,
input [7:0] dina,
input enb,
input [3:0] addrb,
output [7:0] doutb
);
blk_mem_gen_0 my_ram(
.clka(clk), // input wire clka
.ena(ena), // input wire ena
.wea(wea), // input wire [0 : 0] wea
.addra(addra), // input wire [3 : 0] addra
.dina(dina), // input wire [7 : 0] dina
.clkb(clk), // input wire clkb
.enb(enb), // input wire enb
.addrb(addrb), // input wire [3 : 0] addrb
.doutb(doutb) // output wire [7 : 0] doutb
);
endmodule
7、新建仿真文件tb_ram_top.v
`timescale 1ns / 1ps
module tb_ram_top;
// ram_top Parameters
parameter PERIOD = 10;
// ram_top Inputs
reg clk = 0 ;
reg ena = 0 ;
reg wea = 0 ;
reg [3:0] addra = 0 ;
reg [7:0] dina = 0 ;
reg enb = 0 ;
reg [3:0] addrb = 0 ;
// ram_top Outputs
wire [7:0] doutb ;
initial
begin
forever #(PERIOD/2) clk=~clk;
end
initial
begin
#(PERIOD*2) ena = 1; enb = 1;
end
ram_top u_ram_top (
.clk ( clk ),
.ena ( ena ),
.wea ( wea ),
.addra ( addra [3:0] ),
.dina ( dina [7:0] ),
.enb ( enb ),
.addrb ( addrb [3:0] ),
.doutb ( doutb [7:0] )
);
initial
begin
#20 addrb = 4'd00;
#20 addrb = 4'd01;
#20 addrb = 4'd02;
#20 addrb = 4'd03;
#20 addrb = 4'd04;
#20 addrb = 4'd05;
#20 addrb = 4'd06;
#20 addrb = 4'd07;
#20 addrb = 4'd08;
end
endmodule
8、运行仿真
附录1 coe文件
在某些IP核的配置中,需要使用COE(Coefficient)文件来传递参数, COE文件是一种ASCII文本文件,文件头部定义数据基数(Radix),可以是2、10或16。数据以向量的形式给出,每个向量以分号结尾。Vivado会解析COE文件格式,并在生成IP核时导出相关的MIF格式文件,用于行为级仿真。
block memory coe文件格式
memory_initialization_radix=10; -->文件存储数据的进制,10即为10进制
memory_initialization_vector = -->数据向量
65534,65533,……,65532,65528; -->所存储的10进制数据,每个数据使用逗号隔开,最后分号结束
利用Matlab生成coe文件
clc
width=16; %rom的位宽
depth=1024; %rom的深度
x=linspace(0,2*pi,depth); %在一个周期内产生1024个采样点
y_cos=cos(x); %生成余弦数据
y_cos=round(y_cos*(2^(width-1)-1))+2^(width-1)-1; %将余弦数据全部转换为整数
fid=fopen('C:/Users/dell/Desktop/cos_coe.coe','w'); %创建coe文件
fprintf(fid,'%d,\n',y_cos); %向coe文件中写入数据
fclose(fid); %关闭.coe文件
利用记事本编辑生成的coe文件,在前两行添加下面的内容并将最后的逗号改为分号。
memory_initialization_radix=10;
memory_initialization_vector =
最终coe文件为
memory_initialization_radix=10;
memory_initialization_vector =
65534,
65533,
.....,
65334,
65287;
参考
[1] Xilinx Block Memory Generator v8.4 LogiCORE IP Product Guide
[3] Matlab生成Xilinx Rom IP CORE的初始化内容coe文件
[4] coe文件使用方法