BRAM的使用

使用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核调用方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y445xUcU-1578552806722)(8.png)]

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、运行仿真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oksmTV4-1578552806725)(9.png)]

附录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

[2] coe文件与mif文件的区别和联系

[3] Matlab生成Xilinx Rom IP CORE的初始化内容coe文件

[4] coe文件使用方法

[5] 单口 RAM、伪双口 RAM、真双口 RAM、单口 ROM、双口 ROM区别

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值