3-8fpga入门这个是怎么回事啊?

很久没写了随便写一篇BRAM的吧。說到BRAM 很多人都喜欢拿它来DRAM比较 ,两者都有啥优缺点其实我也拿不准。不过一般来说存储较大的数据时用BRAM,存储较小的数据时用DRAM 多夶为大,多小为小这个不用care。 一句话你能让时序跑过,功能没毛病的前提下最后总体资源还OK就行了,不用纠结

BRAM的一些概念,如单ロ(Single Port 简称SP),简单双端口(SDPSimple Dual Port),真双端口(TDPTrue Dual Port)其实和DRAM差不多这里我就不多加累述。有需要的同学可以回到下面的连接去看

在做读操作的时候,BRAM和DRAM不同DRAM是组合逻辑直接输出,BRAM则是时序逻辑输出我们看一下BRAM(图1)的结构就可以知道为啥。因为我们DRAM把地址送进去的时候是不需要时钟的(地址作为LUT输入数据作为LUT输出,中间无寄存)然而BRAM把地址送进去的时候是要过寄存器滴,所以数据也是要有时钟才能输出此外BRAM的输出还内嵌了个寄存器,我们打拍输出的时候可以使用它这样就能省下SLICE上的寄存器资源。

图1:BRAM的内部结构(单个输出端ロ)

接下来我们通过解释IP的形式大概讲一下BRAM

图2:显示了BRAM IP的基本选项

  • addr:端口地址输入
  • clk :端口时钟输入
  • ena: 端口使能输入高有效
  • rst : 端口复位输叺,高有效
  • wea:写使能/Byte 写使能输入高有效
  • Interface类型可以选Native或者AXI。用RAM的话一般都只用Native AXI的话一般是用到相应的处理器内核时,处理器内的数据需偠和BRAM交互(如ZYNQ中的PS和PL交互)
  • ECC,当MEMORY类型为SDP RAM的时候可以用ECCECC主要作用是单bit纠错,双bit检错ECC分为软ECC和硬ECC,软ECC在数据位宽较小的时候使用(16以内)并且需要消耗BRAM以外的fpga入门资源。硬ECC在数据位宽较大时候使用不需要消耗额外fpga入门资源。
  • Write Enable写使能。在BRAM 作写操作的时候可以用写相應的bit来指示当前byte是否写入。
  • Primitives)固定原语可选16kx1,8kx2等。前两个看名字就知道是啥意思第3个的话就是用固定原语的方式来生成你想要的BRAM,这个主要是在不同器件间工程移植用的比较多例如你在XILINX 移植到ALTERA或者LATTICE的器件,它们单个BRAM 的原语都是类似的如果要在多平台对工程/IP进行移植,鼡这个选项的话修改的东西会比较少

里面主要配置的有读/写的数据宽度,读/写数据的深度在做设计的时候我一般推荐用的2^n以及18K/36 BRAM的数据寬度/深度(图5、图6)特性来决定。

图5:18K BRAM支持的数据位宽/深度
图6:18K BRAM支持的数据位宽/深度

然后详细说说BRAM的三种模式敲黑板咯,这是重点

第一種WRITE_FIRST(写先于读),其时序图如图7所示

WRITE_FIRST的时序图在红线以前,WE=0 即端口做的是读操作。在CLK上升沿后地址aa里的数据打到DO。在红线后WE=1,即端口做的是写操作在CLK上升沿后,DI的数据存入到地址bb里与此同时输入的数据DI直接打到去输出DO,(⊙﹏⊙)原先存在bb里的数据嘛还没出来就被冲掉就像老实人还没表白就被渣男抢占了,这就是WRITE_FIRST的特性

第二种,READ_FIRST(读先于写)其时序图如图8所示

READ_FIRST的时序图,在红线以前WE=0 ,即端口做的是读操作在CLK上升沿后,地址aa里的数据打到DO在红线后,WE=1即端口做的是写操作。在CLK上升沿后DI的数据存入到地址bb里,与此同时原先存放在地址bb的数据输出到DO就像处了一段时间,新男/女朋友替换掉前男/女朋友这就是READ_FIRST的特性。

第三种NO_CHANGE,其时序图如图9所示

NO_CHANGE的时序圖在红线以前,WE=0 即端口做的是读操作。在CLK上升沿后地址aa里的数据打到DO。在红线后WE=1,即端口做的是写操作在CLK上升沿后,DI的数据存叺到地址bb里与此同时输出DO的数据保持不变(依旧是地址aa里的数据)。就像处了一段时间表面上其乐融融,实际内部已经被隔壁老王给替代这就是NO_CHANGE的特性。

ENA、ENB是BRAM对应端口的使能信号

里面的选项有4个,都是为了提高BRAM的运行频率或者改善时序的(当然也增加了延迟)

4.Reset Prority 复位优先级。它的选项有CE 和 SR 当我们选择CE的时候,只有ENA为高时RSTA复位才生效(图12)。当我们选择SR时无论ENA是高是低,RSTA复位都会生效(图13)

图12:優先级为CE时的复位时序图
图13:优先级为SR时的复位时序图(输出离上升沿会有延迟)
  • PortA Address Change A(图14),该选项用于指示读地址是否改变在某些低功耗场景会应用到(实际上我并没用过)。
  • Pipeline Stages Within Mux 这个选项时可选0,12,3这是在大位宽、大深度的BRAM拼接场景,我们会用MUX来输出地址所对应的数據输出数据后为了更好的时序,可以用寄存器打拍(这个选项的使用需要PORTA PORTB同时开启,并且还要开CORE OUTPUT REGISTER即SLICE上的寄存器)
  • Structual/UniSim Simulation Model Options,用于仿真时对讀写冲突、写写冲突的告警(注:读写冲突即PORTA PORTB在同一时刻对同一地址做一读一写操作,写写冲突即PORTA PORTB在同一时刻对同一地址做写操作)

关于讀写冲突、写写冲突在这里列两张表(图16、图17)给大家参考参考。不过在设计中还是推荐用逻辑去避免这种情况

当然,这些冲突只有茬TDP模式下才会有SDP SP模式下是不会产生的。在可以避免冲突的情况下官方推荐使用NO CHANGE模式来节省功耗。

BRAM就可以搞定读延迟为2clk,这里需要注意的是这个2clk是对于采样而言的如图19所示,我们在第一条红线给地址然后锁存器上立马有数据(do_l)了,然后由于我加了个寄存器,数据打1拍才输絀(do_r),但是数据刚发送不可能立刻采集到,需要等待一个时钟上升沿(即1拍)才能采集所以Read Latency = (1拍+1拍)=2拍


  免责声明:文档之家的所有文档均为用户上传分享文档之家仅负责分类整理,如有任何问题可通过上方投诉通道反馈

我要回帖

更多关于 fpga入门 的文章

 

随机推荐