前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何利用BRAM实现数据延迟

如何利用BRAM实现数据延迟

作者头像
Lauren的FPGA
发布2019-10-30 19:26:17
1.6K0
发布2019-10-30 19:26:17
举报
文章被收录于专栏:Lauren的FPGA

思考一下:

如何用foreach语句实现对变量赋值,其中所需值来自于一个给定的列表。

实际上,在Tcl 8.5版本以前,大家常利用foreach命令的副作用将列表中的元素分发给独立的变量。例如,将列表xx中的值分别赋给变量x、y和z。这里break命令作为一个失效安全保障,以处理xx中包含了多余3个元素的情况。

在很多设计中都会遇到数据延迟线(Delay Line),尤其是在数字信号处理的相关设计中,例如FIR滤波器就需要延迟线。延迟线有多种实现方式,例如可以通过移位寄存器实现(基于SLICEM中的LUT),也可以通过触发器实现(基于SLICE中的FF),还可以通过BRAM实现。采用BRAM的实现方法如下图所示。

图中将BRAM配置为单端口RAM。其中RAM的工作模式为读优先(Read_First,又称为Read Before Write,即同时对同一地址进行读写操作时,将首先读出该地址空间原有的数据,然后再将新数据写入该地址空间。关于三种模式的具体区别,可阅读这篇文章:write_first/read_first/no_change什么区别),写使能信号WE恒接高。假定计数器模值为4,相应的时序如下图所示。RAM初始值设置为0。在第一帧地址内,从0号地址读出的数据为0,再将数据A写入0号地址,从1号地址读出的数据为0,再将数据B写入1号地址。类似地,数据C和D分别写入2号和3号地址。在第二帧地址内,从0号地址读出的数据即为在第一帧地址内写入的数据A,类似地,从1号、2号和3号地址中读出的数据分别为B、C和D。由于对RAM的输出选择了一级寄存,因此从输入端DIN到输出端DOUT共有5级时钟周期的延迟。

Xilinx FPGA中SLICEM里的LUT可配置为移位寄存器,以UltraScale系列FPGA为例,一个LUT6可配置为深度为32的移位寄存器,实现深度为32的数据延迟(在DCP中看到的SRL16E或SRLC32E,其实就是移位寄存器)。但对于大位宽、深延迟的场合,采用SRL16E或SRLC32E将占用较多的CLB资源,例如,数据位宽为72-bit,延迟深度为1024,则需要消耗的LUT6为2304个(72x1024/32);而采用BRAM,只需要2个36Kb BRAM和少许LUT(实现计数器),且在功耗上有一定的优势。

思考一下:

大位宽的数据延迟或数据缓存,采用LUT实现时会有哪些弊端?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lauren的FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档