【Vivado】ram ip核的使用

这篇具有很好参考价值的文章主要介绍了【Vivado】ram ip核的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、简介

​ ram 的英文全称是 Random Access Memory,即随机存取存储器, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据, 其读写速度是由时钟频率决定的。 ram 主要用来存放程序及程序执行过程中产生的中间数据、 运算结果等。

​ rom为只读存储器,只能读取数据而不能向里面写入数据。

​ 本次讲解的ram ip核ram指的是bram,即block ram ,通过对这些bram存储器模块进行配置,可以实现ram、移位寄存器、rom以及fifo缓冲器等各种存储器的功能。

​ bram可以配置成3种ram:

  • 单端口ram:只有一个端口,读/写只能通过这一个端口来进行 。
  • 伪双端口ram:有两个端口,但是其中一个只能读,另一个只能写 。
  • 真双端口ram: 有两个端口,都能进行读和写。

2、单端口ram结构

​ 以单端口ram为例进行讲解,双端口ram的创建大同小异。

​ ip核配置的ram的框图如下所示:

vivado ram ip核,vivado ip核,嵌入式硬件,fpga开发

各个端口的功能描述如下:

dina:ram端口a的写数据信号。

addra:ram端口a的读写地址信号,在单端口ram当中,读地址与写地址公用该地址线。

wea:ram端口a写使能信号,高电平为写,低电平为读。

ena:端口a的使能信号,高电平表示使能端口 a,低电平表示端口 a 被禁止,禁止后端口 a上的读
写操作都会变成无效。另外 ENA 信号是可选的,当取消该使能信号后, RAM 会一直处于有效状态。

rsta:ram端口a的复位信号,可配置成高电平或者电平复位,为可选信号。

regcea: ram 端口 a 输出寄存器使能信号,当 regcea为高电平时, douta 保持最后一次输出
的数据, regcea 同样是一个可选信号。

clka: ram 端口 a的时钟信号。

douta: ram 端口 a 读出的数据。

3、程序设计

​ 先建立一个ip_ram的工程,然后创建ram ip核,在 Vivado 软件的左侧“Flow Navigator”栏中单击“IP Catalog”,然后在下图中搜索“block memory”,如下图所示,双击“ Block Memory Generator”后弹出 IP 核的配置界面。
vivado ram ip核,vivado ip核,嵌入式硬件,fpga开发


​ 接下来对 BMG IP 核进行配置,“ Basic”选项页配置界面如下图所示 。按图中配置即可。

vivado ram ip核,vivado ip核,嵌入式硬件,fpga开发


​ 接下来切换至“Port A”选项页,设置端口 A 的参数,该页面配置如下:

vivado ram ip核,vivado ip核,嵌入式硬件,fpga开发


设置完直接点击ok即可生成ip 核。

查看ram ip核的veo文件,有例化ram ip核的模板,如下所示:

blk_mem_gen_0 your_instance_name (
  .clka(clka),            // input wire clka
  .rsta(rsta),            // input wire rsta
  .ena(ena),              // input wire ena
  .wea(wea),              // input wire [0 : 0] wea
  .addra(addra),          // input wire [4 : 0] addra
  .dina(dina),            // input wire [7 : 0] dina
  .douta(douta),          // output wire [7 : 0] douta
  .rsta_busy(rsta_busy)  // output wire rsta_busy
);

接下来创建一个新的设计文件,命名为 ram_rw.v,代码如下:

module ram_rw(
 input            clk      ,
 input            rst_n    ,
 input   [7:0]    r_data   ,  //ram读数据

 output reg [7:0] w_data   ,  //ram写数据
 output           ram_we   ,  //ram读写选择
 output reg [4:0] ram_addr ,  //ram读写地址
 output           ram_en   ); //ram使能信号

//读写计数器
reg [5:0] wr_cnt;

assign ram_en = rst_n;//ram使能
//读写计数器在0-31为写,32到63为读
assign ram_we = (wr_cnt<=6'd31 && ram_en==1)? 1'b1 : 1'b0;

//读写计数器,计数范围为0-63
always @(posedge clk or negedge rst_n) begin 
    if(!rst_n)
        wr_cnt <= 0;
    else if(wr_cnt==6'd63)
        wr_cnt <= 0;
    else
        wr_cnt <= wr_cnt + 1;
end

//读写地址信号,范围0-31
always @(posedge clk or negedge rst_n) begin 
    if(!rst_n)
        ram_addr <= 0;
    else if(ram_addr==5'd31)
        ram_addr <= 0;
    else 
        ram_addr <= ram_addr + 1;
end

//产生ram读写数据
always @(posedge clk or negedge rst_n) begin 
    if(!rst_n)
        w_data <= 0;
    else if(wr_cnt <= 6'd31)
        w_data <= w_data + 1;
    else 
        w_data <= 0;
end

endmodule

​ 程序中定义了一个读写计数器(wr_cnt),在0-31为向ram中写数据,32-63在ram中读数据,接下来编写一个 ip_ram.v 文件,来实例化创建的 RAM IP 核以及 ram_rw 模块,代码如下:

module ip_ram(
   input sys_clk,
   input sys_rst);

    wire [7:0] r_data;
    wire [7:0] w_data;
    wire       ram_en;
    wire       ram_we;
    wire [4:0] ram_addr;

   ram_rw ram_rw_inst(
    .clk     (sys_clk),
    .rst_n   (sys_rst),
    .r_data  (r_data),
    .w_data  (w_data),
    .ram_we  (ram_we),
    .ram_addr(ram_addr),
    .ram_en  (ram_en)  );

  blk_mem_gen_0 blk_mem_gen_1 (
  .clka(sys_clk),            // input wire clka
  .ena(ram_en),              // input wire ena
  .wea(ram_we),              // input wire [0 : 0] wea
  .addra(ram_addr),          // input wire [4 : 0] addra
  .dina(w_data),             // input wire [7 : 0] dina
  .douta(r_data)             // output wire [7 : 0] douta
  //.rsta_busy(rsta_busy)    // output wire rsta_busy
);
endmodule

​ 程序中例化了 ram_rw 模块和 ram IP 核 blk_mem_gen_0,其中 ram_rw 模块负责产生对 ram IP 核读/写所需的所有数据、地址以和读写使能信号,同时从 ram ip 读出的数据也连接至 ram_rw 模块 。接下来对 RAM IP 核进行仿真,来验证对 RAM 的读写操作是否正确。 tb_ram_ip 仿真文件源代码如下:

`timescale 1ns / 1ps

module tb_ram_ip();

reg sys_clk;
reg sys_rst;

ip_ram ip_ram_inst(
    .sys_clk(sys_clk),
    .sys_rst(sys_rst)
);
initial begin 
    sys_clk = 0;
    sys_rst = 0;
    #10
    sys_rst = 1;
    #256
    $stop;
end
always #5 sys_clk = ~sys_clk;

endmodule

​ 接下来开始仿真,仿真结果如下:

vivado ram ip核,vivado ip核,嵌入式硬件,fpga开发文章来源地址https://www.toymoban.com/news/detail-786730.html

到了这里,关于【Vivado】ram ip核的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vivado PLL锁相环 IP核的使用

    本文纯属学习笔记,使用的FPGA是Xilinx的XC7A35TFGG484-1,使用Vivado调用PLL IP核来实现倍频效果,使50Mhz的晶振时钟源倍频到100Mhz、200Mhz和400Mhz。 Clocking Options 1.MMCM与PLL相比,PLL的时钟质量更高,所以对时钟质量要求较高的时候需要选择PLL,但是一般可以不用纠结。 2.修改Input Fre

    2024年02月08日
    浏览(40)
  • vivado DDS IP核的使用及仿真

    参考:https://blog.csdn.net/weixin_45303812/article/details/123704440 新人第一次写文档,有错误的地方请大佬指点。 文档:Xilinx官网搜DDS Configuration 可配置参数 : 1.Configuration Options,有如下三种模式 Phase Generator and SIN/COS LUT (DDS): 相位和sin和cos的数据都是IP核自己产生 Phase Generator only:

    2023年04月15日
    浏览(47)
  • 如何使用Synplify综合vivado带IP核的工程

    下面的说法来自网上: 综合时间更好,综合出来所使用的逻辑更少 综合的时序更好 在IC设计中,使用Synplify综合+Vivado组合比较多。synplify 用于生成网表,然后将网表倒入FPGA中,进行布局布线等操作。 Libero集成开发环境中Synplify应用与提高-Microsemi(Actel) FPGA开发工具——周

    2024年02月11日
    浏览(51)
  • 【嵌入式】MDK使用sct文件将代码段放入RAM中执行

    sct文件即分散加载文件,是ARMCC编译器使用的链接脚本文件,等同于GCC编译器的ld链接脚本。MDK IDE使用的是ARMCC。 支持NorFlash中运行代码(XIP)的MCU例如STM32,一般将所有代码(text段)都放在FLash中,但是Flash的访问速度低于和CPU、RAM,如下图(STM32F103): 当CPU主频为72Mhz的时

    2023年04月09日
    浏览(38)
  • vivado中时钟ip核的调用

    时钟ip核(MMCM PPL),MMCM(混合模式时钟管理)和PPL(锁相环)是FPGA内部的时钟资源。 作用:对时钟网络进行一个系统级的时钟管理和偏斜控制,具有时钟倍频、分频、相位偏移等功能 一、7系列FPGA高层次时钟结构视图     Clock Region :区域时钟。 Clock Backbone :全局时钟线

    2024年01月19日
    浏览(46)
  • 手把手教你在Vivado创建一个RAM的IP核并使用ILA工具验证

    RAM的英文全称是Random Access Memory,即随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的。RAM主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。 单端口:只有一个端口,

    2024年01月25日
    浏览(57)
  • vivado IP核:ILA、时钟、RAM、FIFO

    vivado工具集成了逻辑分析仪,ILA IP核用于替换外部的逻辑分析仪,添加探针来监控内部信号波形变化。 1)IP Catalog 2)搜索栏可搜索IP核,如创建FIFO、RAM等。 3)搜索并选择。 4)设置ILA各项参数。    5) 设置好IP核参数后点ok。 6)打开ila_0.evo。 7) 复制ila例化模板。 8)在

    2023年04月21日
    浏览(44)
  • 基于vivado DDS ip核的DDS信号发生器(可调频调相)

    基于Vivado DDS ip核的DDS信号发生器: 在Vivado软件中调出DDS ip核进行设置,很多参数可以参考xilinx官方手册,比较重要的是System Clock系统时钟和Phase Widh相位宽度的设置,这是最终得到波形的频率和相位所需要的基础参数,在这里我分别设置为50Mhz和16bit。 在implementation页面设置频

    2024年02月12日
    浏览(38)
  • FPGA中FIFO的应用(三)——Vivado FIFO IP核的调用

    ⭐️作者简介: 小瑞同学 ,一个努力精进的 FPGA 和通信学习者。 🍎个人主页:小瑞同学的博客主页 🌻个人信条:越努力,越幸运! ⏰日期:2023.12.6 🔍来源:自学经历 📖文章内容概述:简单介绍了 FIFO IP核 常用参数的配置,通过仿真分析了异步IP的 读写数据 过程。 连载

    2024年01月18日
    浏览(42)
  • FPGA vivado IP核学习笔记——单端口RAM

    1. 新建IP 在IP Catalog中找到Block Memory Generator 2. 基本配置 ①在 Component Name 位置可以修改IP名字 ② Interface Type 选择接口类型,有Native(常规)和AXI4两种,AXI4常用于软核控制FPGA或ZYNQ中PS端控制FPGA时使用 ③ Generate address interface with 31 bits ,将地址深度固定在32bit ④ Memory Type : 有一

    2024年04月29日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包