数字电路实用篇
第二章 RAM简介
伪双端口 RAM 设计
伪双端口 RAM 有两个读写端口,但是一个端口只能读,一个端口只能写。一般 FIFO 设计中都是使用的伪双端口 RAM。伪双端口 RAM 指的是有两个读写口,就是有两组数据线和地址线,一组是写数据线,一组是读数据线,同一个时刻写和读可以同时访问。
从 Xilinx 伪双端口 RAM 的端口信号我们也可以看出,伪双端口 RAM 读写要控制的主要的端口都是写使能、读使能、写数据、写地址、读地址和读数据
RAM 读延迟,就是 RAM 发起读,然后读数据有效的周期数。这个延迟一般是 1,如果 RAM 输出再因为改善时序寄存一拍,那么 RAM 的读延迟就是 2。如下所示,在读使能为 1 且地址有效的情况下(enb为 1),下一拍 doutb即为读到的数据,一般来说,读使能和读地址不发生变化,doutb不会发生变化
另外 RAM 读数据我们建议只使用 RAM 读有效时的读数据,没有发起读的时候,读数据一般不建议使用,因此此时的读数据依赖于 RAM 模型的特性,有可能是不确定的值。
有一个问题,不知道大家有没有想过,就是读和写有两个端口,两个端口可以同时发起读和写,那么如果读和写同时有效且读和写是同一个地址时,此时读数据是否还是正确的数据呢,这个情况属于RAM 读写冲突,属于逻辑设计中非常重要的一个特性处理。一般设计中发起读写冲突,此时的读数据很可能是无效的读数据,因此一般读写冲突时候,会把最新的写数据直接赋给读数据,此时叫做写穿通到读。如下图所示:
从图中我们可以看出,Cycle 2 读和写地址不同,读可以正常读到数据,但是到 Cycle 3 时,读和写地址相同且读写都有效,此处如果不做特殊处理,那么读数据是无效的。需要我们把写数据寄存一拍同步到读侧。Verilog 一般先产生一个冲突信号,使用时序逻辑产生,读写冲突的下一拍有效,然后用这个信号做判断,如信号有效,则 dout 使用 din_dly1赋值,否则用 q 。