Vivado IP核之RAM Block Memery Generator

Vivado IP核之RAM Block Memery Generator


前言

        本次介绍vivado中RAM(Block Memery Generator)IP核的使用,希望对大家有所帮助。


提示:以下是本篇文章正文内容,均为作者本人原创,写文章实属不易,希望各位在转载时附上本文链接。

一、配置步骤

        在vivado中搜索Block Memery Generator,找到该IP核后即可按照以下操作完成相应的配置。本次配置为单端口模式

        1.首先配置Basic界面,如图1所示。

        

图1 Basic界面的配置

         2.其次配置Port A Options界面,如图2所示。

图2 Port A Options界面的配置

         3.然后配置Other Options界面,如图3所示。这里可以添加初始化文件,即coe文件,用来初始化存储数据。

图3 Other Options界面的配置

         4.最后就是一个Summary界面,如图4所示,不需要我们配置,一个简介页面而已。

图4 Summary界面

         以上4个界面都配置完成后即可点击右下角OK按钮生成IP核。

二、仿真

1.顶层代码

建立一个顶层模块,命名为ram_read,用来例化刚才生成的IP核。

代码如下:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/27 16:43:07
// Design Name: 
// Module Name: ram_read
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//
//虽然是ram,本次将ram当rom使用
module ram_read(
    input clk,                    //输入时钟信号
    input rst_n,                  //输入复位信号
    input start,                  //输入开始读信号
    input  [10 : 0] addr,         //输入读地址
    input [31 : 0] din,           //本次用不到
    output reg over,              //输出读的数据有效信号
    output reg [31 : 0] dout      //输出读到的数据
    );
//reg define
reg en;             //读使能信号
reg we;             //读写选择
reg [1:0] cnt;      //计数器
//wire define
wire [31:0] data;   //读的数据                 

always @(negedge clk or negedge rst_n)
begin
        if(!rst_n)
            cnt<=0;
        else if( (start==1)&(cnt<3))
            cnt<=cnt+1;
       else 
            cnt<=0;
end

always @(negedge clk or negedge rst_n) //下降沿设定使能
begin
        if(!rst_n)
            begin en<=0;we<=0;end
        else if(0<cnt<3)
            begin en<=1;we<=0;end
       else 
            begin en<=0;we<=0;end
end

always @(posedge clk or negedge rst_n)  //上升沿读取稳定数据
begin
        if(!rst_n)
            begin over<=0;dout<=0;end
        else if(cnt==3)
            begin over<=1;dout<=data;end
       else 
            begin over<=0;dout<=0;end
end

ram_sam_re_ip u1_ram_sam_re_ip (  //例化ram
  .clka(clk),        // input wire clka
  .ena(en),          // input wire ena
  .wea(we),          // input wire [0 : 0] wea
  .addra(addr),      // input wire [10 : 0] addra
  .dina(din),        // input wire [31 : 0] dina
  .douta(data)       // output wire [31 : 0] douta
);


endmodule

2.仿真代码

建立一个仿真模块,命名为ram_read_tb,用来仿真刚才顶层模块例化的IP核。

代码如下:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/27 16:52:23
// Design Name: 
// Module Name: ram_read_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//

module ram_read_tb();
reg clk;
reg rst_n;
reg start;
reg [10 : 0] addr;
reg [31 : 0] din;
wire over;
wire [31 : 0] dout;
    
ram_read u1_ram_read(
    .clk(clk),
    .rst_n(rst_n),
    .start(start),
    .over(over),
    .addr(addr),
    .din(din),
    .dout(dout)
    );
always #5 clk=~clk;
    initial begin
        clk=1'b0;rst_n=1'b1;
#5;     rst_n=1'b0;
#15;   rst_n=1'b1;
          start=1'b1;
          addr=11'd0;
#30   start=1'b0;
   end
    
endmodule

三、仿真分析

        部分初始存储数据如图5所示, 仿真结果如图6所示,可见仿真结果正确,成功读出了地址为0的数据,由于输出缓冲,所以会有延迟。

图5 部分初始存储数据
图6 仿真结果

 


总结

本次介绍就到这里,简单介绍了 vivado 中RAM IP 核的使用

  • 16
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

迎风打盹儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值