花生漫画

双口RAM操作

0
阅读(4509)

        拿一个例子来简单的说明一下双口RAM的一个应用场合。比如有一6位的数据输入口,而6位的数据分为高3位和低3位,高3位和低3位分别作为一组独立的数据进行操作,数据的输入速度是系统时钟速率,如果将6位的数据流存入位宽是6的单口RAM或是简单的双口RAM中时,在对数据进行操作时可以先将数据写入位宽为6的寄存器,然后每次操作时只利用高3位或低3位,但是这样操作会比较麻烦,这时,如果引入双口RAM的话,操作就会变得简单。双口RAM是有两个数据输入口,两套独立的地址线,为了避免操作的冲突,在存数据的时候共用一个时钟工作,在读数据的时候可以只利用一组地址线,完成数据的读操作。

       以下是双口RAM的基本结构图:

图1  Dual_ram结构图

       其中addra、addrb是地址线,clka、clkb是系统工作时钟,dina、dinb是数据输入端,wea、web分别是两个写端口的有效始能信号,douta、doutb是两个输出口。值得注意的是,虽然引入两套地址线,但是共用一片存储区域,如在上图中,addra和addrb虽然都是4位宽的,寻址能力是16,但是它们都是共用的一片存储区域,并不是每套地址线都配一存储空间为16的存储区域。

       上图为具体的双口RAM仿真图,RAM的大上为16*3位的,当输入数据达到7个时,即将双口RAM块全部存满,便将所有RAM块中的数据读出来,读出的数据是通过douta口,即读数据只利用addra地址线,而写数据的时候是用addra和addrb同时写,addra控制写偶数地址单元,addrb控制写奇数地址单元。

       值得注意的是,使用双口RAM的时候,每一套地址线即负责写也负责读。每一个输出口douta和doutb在每一时刻都会有值(最近一个时钟沿到来时地址线所指向的内存单元的值),即往RAM写数据的时候同时也读出数据,可以设置RAM块的属性(先读后写/先写后读)来确定写数据与读数据是否有一时钟周期的延迟,但是这时候的输出口的值也许并不是我们想要的,所以,当存储数据达到一定的条件的时候可以再次控制某一地址线(如在本栵中通过控制addra)来完成读数据的操作。