BRAM使用方法

在利用fpga进行数据处理的过程中,对高速数据采集或者传输的过程中,需要对数据尽心缓存,缓存一般有两种不同的方法,一种是FIFO,一种是RAM,FIFO在vivado中提供IP核,FIFO的缓存特性适用于先存先取得过程,没有寻址地址,数据只能按照次序读出,可以用于速率变换,位宽变换的应用中,数据的读写可以分开控制。RAM可以缓存数据,然后按照地址进行读出,这样不受顺序的限制,能够更加灵活的读取数据。在vivado中提供BRAM IP核,Block Memory Generator,使用该IP核可以实现该功能。

以下为使用BRMA的介绍 参考官方文档PG058 - Block Memory Generator v8.4 Product Guide(PG058) 。

直入主题,使用RAM,重点是实现写入和读取的过程,参照官方手册,查看操作模式。

操作模式

1.Write First Mode 写优先模式

在WRITE_FIRST模式下,输入数据同时写入内存,并驱动输出数据,如图3-9所示。这种透明模式提供了在同一端口上进行Write操作期间使用数据输出总线的灵活性。


这种模式适合用于先把数据都传入ram,传完之后再进行读取,在写使能信号有效时,输出的是当前写入地址的数据

测试过程

module test(input clk,input rst_n,input [1:0] data_type,input en,input wr
);wire [9:0] addra;
wire [7:0] dina;
wire [7:0] douta;reg [9:0] addrw,addrr,addr;//读地址和写地址
reg [7:0] din;
reg [7:0] dout;  //读出的有效数据reg [1:0] mode_wr;  //读写模式地址
parameter size = 10'd100;
//在单端口的控制模式下,只有一个地址,
//在写入使能的时候,从写模式的时序中可以看出想当与透传模式,
//先通过有效位进行读写模式判断
always@(posedge clk)beginif(~rst_n)beginmode_wr <= 2'b0;endelse beginif(en==1'b1 & wr==1'b0)beginmode_wr <= 2'b01;    //读模式;endif(en==1'b1 & wr==1'b1)begin mode_wr <= 2'b10;    //写模式endend
end//分别读写地址
assign addra = (mode_wr == 2'b10) ? addrw : addrr;
//写控制 从0地址开始写,
always@(posedge clk)beginif(~rst_n)beginaddrw <= 10'b0;endelse beginif(mode_wr == 2'b10)beginif(addrw >= size)beginaddrw <= 10'b0;endelse beginaddrw <= addrw + 10'b1;endend else beginaddrw <= 10'b0;end end
end
//写数据
always@(posedge clk)beginif(!rst_n)begindin <= 8'b0;endelse beginif(mode_wr == 2'b10)begincase(addrw)10'h1: begin din <= 8'h1a;end10'h2: begin din <= 8'hcf;end10'h3: begin din <= 8'hfc;end10'h4: begin din <= 8'hdc;end10'h5: begin din <= 8'hb6;enddefault: begin din <= 8'h11;endendcaseendend
end
assign dina = din;
//读控制
always@(posedge clk)beginif(~rst_n)beginaddrr <= 10'b0;endelse beginif(mode_wr == 2'b01)beginif(addrr >= size)beginaddrr <= 10'b0;endelse beginaddrr <= addrr + 10'b1;endend else beginaddrr <= 10'b0;end end
end
//读数据
always@(posedge clk)beginif(!rst_n)begindout <= 8'b0;endelse beginif(mode_wr == 2'b01)begindout <= douta;endend
endblk_mem u0 (   //2clk.clka(clk),    // input wire clka.ena(en),      // input wire ena 使能信号.wea(wr),      // input wire [0 : 0] wea.addra(addra),  // input wire [9 : 0] addra.dina(dina),    // input wire [7 : 0] dina.douta(douta)  // output wire [7 : 0] douta
);endmodule

测试结果

2.Read First Mode 读优先模式

在READ_FIRST模式下,以前存储在Write地址的数据出现在数据输出中,而输入数据存储在内存中。这种先读后写的行为如图3-10所示

在这种模式下,写的地址在移动,但是不影响读数据,数据的内容是之前存储的。

3.No Change Mode 保持模式

在NO_CHANGE模式下,Write操作期间输出锁存保持不变。如图3-11所示,输出的数据仍然是原来的Read数据,不受同一个端口写操作的影响。

这种模式和读优先的模式相比,是在写的时候地址在动,但是输出不变,还是最开始的地址。

Xilinx FPGA BRAM使用方法相关推荐

  1. Xilinx FPGA单端时钟设计方法

    1.1 Xilinx FPGA单端时钟设计方法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Xilinx FPGA单端时钟设计方法: 5)结束语. 1.1.2 本节引 ...

  2. Xilinx FPGA PLL输出不能直接连接IO解决方法

    1.1 Xilinx FPGA PLL输出不能直接连接IO解决方法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4) Xilinx FPGA PLL输出不能直接连接IO解 ...

  3. Xilinx FPGA全局介绍

    Xilinx FPGA全局介绍 现场可编程门阵列 (FPGA) 具有诸多特性,无论是单独使用,抑或采用多样化架构,皆可作为宝贵的计算资产:许多设计人员并不熟悉 FPGA,亦不清楚如何将这类器件整合到设 ...

  4. Xilinx FPGA “打一拍”“打两拍”以及IOB含义

    Xilinx FPGA "打一拍""打两拍"以及IOB含义 本次总结主要是参考网上的说法,最近在接触到异步时钟同步的时候了解到利用"非阻塞赋值< ...

  5. Xilinx FPGA 将寄存器放入IOB中

    xilinx FPGA的资源一般指IOB,CLB,BRAM,DCM,DSP五种资源.其中IOB就是input/output block,完成不同电气特性下对输入输出信号的的驱动和匹配要求. IOB的作 ...

  6. 四、在Xilinx FPGA上使用Cortex M1 软核——固化Cortex-M1程序

    在Xilinx FPGA上使用Cortex M1 软核--固化Cortex-M1程序 本文的硬件(FPGA)工程和软件代码.脚本均参考ARM提供的例程. 本文使用的FPGA工程: https://do ...

  7. 简谈 Xilinx FPGA 原理及结构

    FPGA是在PAL.PLA和CPLD等可编程器件的基础上进一步发展起来的一种更复杂的可编程逻辑器件.它是ASIC领域中的一种半定制电路,既解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点. ...

  8. Xilinx FPGA资源解析与使用系列——CLB

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA资源解析与使用系列--CLB 前言 CLB Overview Device Resources Recommen ...

  9. Xilinx FPGA中SRL(移位寄存器)资源

    SRL(移位寄存器)资源,在FPGA中都有,不过是叫不同的名字.Xilinx FPGA内部的LUT有个特殊功能,就是可以配置成可变长度SRL. 5输入的一个LUT可以变成32bit 的SRL 6输入的 ...

最新文章

  1. centos安装emqtt_benchmark
  2. 企业为什么要开通银企直联_企业为什么要把人事外包出去
  3. spyder清除控制台命令
  4. 走进JavaWeb技术世界7:Tomcat中的设计模式
  5. python自学免费课堂-推荐5个Python爬虫免费学习资源(B站高赞!)
  6. jvm性能调优实战 -55RPC调用引发的OOM故障
  7. 文本转换成htmldocument
  8. 如何修改Fiori Launchpad里Tile计数调用的时间间隔
  9. Python 的变量作用域和 LEGB 原则
  10. 基于阿里云ECS+ 宝塔面板(bt) + WordPress 搭建个人主页(以独立博客为例)
  11. 全面提升AR感知能力的新款iPad Pro或将延期发布
  12. 图像傅里叶变换的幅度谱、相位谱以及双谱重构原图像
  13. 柬埔寨程序员的计算机梦想
  14. 蓝桥杯2016年第七届C/C++A组省赛第二题-生日蜡烛
  15. Maven无法下载com.oracle:ojdbc14:jar解决方法
  16. html文字自动轮播代码怎么写,图片轮播HTML代码
  17. Failed to load ‘D:\note\笔记\javaweb\webpack\webpack.config.js‘ config
  18. Java会说情话的女朋友
  19. AEC-Q100和ISO26262 ASIL-B双重认证
  20. mysql 整理磁盘空间_mysql 数据库磁盘满了,进行碎片化整理的相关问题

热门文章

  1. wiki of Vulkan
  2. AE-新知识-关于美女头发,衣服飘动的效果
  3. 记录贴/阴阳师式神培养core loop
  4. 3DSlicer扩展模块如何加入外部扩展包?
  5. hive中标准偏差函数stddev()详细讲解
  6. JAVA---int数组声明与初始化
  7. 【CV】第 3 章:使用 OpenCV 和 CNN 进行面部检测
  8. android controlx1,新款X1最新托文,求反驳~~~~~~~~
  9. cpu架构体系 简单总结
  10. Hololens开发环境配置