发明内容
本专利的目的在于提供一种基于FPGA的四口RAM,解决现有技术问题中存在的器件过多、电路复杂、价格昂贵的技术问题。
建立在FPGA芯片上的四口RAM包括一个双口RAM模块、四个缓存模块和两个控制模块,其中所述的四个缓存模块,每个缓存模块由3个FIFO构成,分别为用于缓存外部处理器读或写信号的命令FIFO、缓存地址的地址FIFO和缓存数据的数据FIFO,所述的四口RAM中双口RAM模块的两个端口和四个缓存模块输出端口的控制通过两个控制模块实现,所述的控制模块由有限状态机实现,一个控制模块控制两个缓存模块的输出端口和其分时复用双口RAM的一个端口。
控制模块中的有限状态机实现步骤如下:
1)FPGA上电启动后,有限状态机启动。若两个缓存模块的命令FIFO同时非空时,为了分时复用目的,将两个缓存模块分级,处于高优先级的需要优先处理,低优先级则需要处理完高优先级的操作后再处理;
此状态下首先检测需要优先处理的缓存模块的命令FIFO是否非空,若非空则进入该缓存模块的读写操作,否则检测另外一个缓存模块的命令FIFO是否非空,若非空则进入该缓存模块的读写操作,否则,若同时空将继续处于空状态;
2)给出缓存模块的命令FIFO读使能,读出缓存的读或写信号,并判断是读信号还是写信号;
3)若步骤2)判断为写信号时,则给出缓存模块的地址FIFO和数据FIFO的读使能,读出地址和数据,并写入双口RAM;
若步骤2)判断为读信号时,则给出缓存模块的地址FIFO的读使能,读出地址,并从双口RAM读出数据;
4)若步骤2)和步骤3)操作的是高优先级的缓存模块,则需要检测低优先级缓存模块的命令FIFO是否非空,若非空则重复步骤2)和步骤3)进行读写操作,否则返回空状态;若步骤2)和步骤3)操作的是低优先级的缓存模块,则直接返回空状态。
本专利具有的优点和显著特点是:
利用FPGA大容量、高速且集成度高、体积小、灵活可重配置、实验风险小等优点,替代了价格昂贵的寄存器、FIFO器件和多口RAM器件,不仅简化了电路,节省了电路板的空间,而且可以很好地解决并行性和速度问题,使得基于FPGA的四口RAM易于修改、测试及***升级,可降低设计成本,缩短开发周期。
附图说明
图1是基于FPGA的四口RAM框图。
图2是基于所设计的四口RAM的多处理器并行***实施例框图。
图3是四口RAM的双口RAM模块设计示意图。
图4是四口RAM缓存模块的命令FIFO设计示意图。
图5是四口RAM缓存模块的地址FIFO设计示意图。
图6是四口RAM缓存模块的数据FIFO设计示意图。
图7是四口RAM控制模块1的有限状态机的状态转移总图。
图8是四口RAM控制模块1的有限状态机的DSP_1读写操作状态转移子图。
图9是四口RAM控制模块1的有限状态机的DSP_2读写操作状态转移子图。
图10是四口RAM控制模块2的有限状态机2的状态转移总图。
图11是四口RAM控制模块2的有限状态机的DSP_3读写操作状态转移子图。
图12是四口RAM控制模块2的有限状态机的DSP_4读写操作状态转移子图。
具体实施方式
下面将结合本专利实施例中的附图,对本专利实施例中的技术方案进行详细说明,显然,所描述的实施例仅仅是本专利的一部分实施例,而不是全部的实施例。
图1是基于FPGA的四口RAM的框图,如图1所示,基于FPGA的四口RAM包括三大模块,分别为一个双口RAM模块、四个缓存模块(缓存模块1、缓存模块2、缓存模块3和缓存模块4)和两个控制模块(控制模块1和控制模块2),其中双口RAM作为四口RAM的存储实体,缓存模块用于缓存外部处理器读写四口RAM的读或写信号、地址和数据,而控制模块用于控制双口RAM模块的两个端口和四个缓存模块的输出端口。
如图1所示,四个缓存模块,其输出端口通过控制模块读取并写入双口RAM的两个端口作为四口RAM的四个端口,缓存模块1作为端口1,缓存模块2作为端口2,缓存模块3作为端口3,缓存模块4作为端口4。将四个缓存模块分为两组,缓存模块1和缓存模块2分时复用双口RAM左边的端口,缓存模块3和缓存模块4分时复用双口RAM右边的端口。
两个控制模块分别由有限状态机实现,控制模块1控制缓存模块1和缓存模块2的输出端口以及双口RAM左边的端口,控制模块2控制缓存模块3和控制模块4的输出端口和双口RAM右边的端口。
如图1所示,基于FPGA的四口RAM两端高度对称,结构简单,易于操作。
图2为基于所设计的四口RAM的多处理器并行***实施例子框图,具体为多处理器由四个DSP(DSP_1、DSP_2、DSP_3、DSP_4)构成,DSP_1~DSP_4分别连接到四口RAM的端口1~端口4,即连接至缓存模块1~缓存模块4的输入端口,其中DSP通过其外部存储器扩展端口EMIF与四口RAM连接。
FPGA芯片采用Xilinx的Spartan6系列XC6SLX100,该芯片的逻辑单元(LogicCells)有101261个,最大的可设计RAM空间高达4824Kb。
DSP芯片采用TI的TMS320C6713,该款芯片是高性能32位浮点DSP。EMIF是外部存储器与片内运算处理单元间的端口,其端口具有32位数据总线,20位地址总线,4个存储空间选通信号和4个字节使能信号。
外部时钟选择MERCURY的50MHz差分晶振HM57ET-50.000R-C1.5,然后通过倍频为200MHz形成内部***时钟。
图3为四口RAM中的双口RAM模块设计的示意图,双口RAM有两路完全独立的数据总线、地址总线和读写控制电路。可以通过Xilinx强大的IP核实现双口RAM。本实例的双口RAM通过Xilinx的集成开发环境ISE14.4软件插件COREGenerator生成,所设计的RAM空间为256KB,地址总线宽度为17bit,数据总线宽度为16bit,故示意图中的地址总线M=17,N=16。
图4~图6为四口RAM中的缓存模块设计示意图,缓存模块是DSP与双口RAM模块的数据传输中介层。如图所示,该模块包括三个FIFO单元,分别为命令FIFO、地址FIFO和数据FIFO,命令FIFO用于缓存DSP的读或写信号,其宽度为1bit;地址FIFO用于缓存DSP的地址,其宽度如前所述为17bit;数据FIFO用于缓存DSP的数据总线数据,其数据宽度如前所述为16bit。
四个缓存模块的FIFO单元分别为命令FIFO_1~命令FIFO_4、地址FIFO_1~地址FIFO_4和数据FIFO_1~数据FIFO_4。
其中数据FIFO_1~数据FIFO_4只用于DSP写入双口RAM时的数据缓冲,而从双口RAM读出数据,是由控制模块从双口RAM读出数据后直接从DSP的数据总线输出。
图7~图9、图10~图12分别是四口RAM两个控制模块的状态转移图,是缓存模块与双口RAM进行实时、高效、稳定通信的关键,也是本专利最核心的部分。其中控制模块2的有限状态机与控制模块1的操作过程完全一致,故本实例以控制模块1为例,详述如下:
1)状态Idle:***上电后,有限状态机准备传输,FPGA首先发送清零控制信号,将有限状态机内的所有功能模块进行清零。为了分时复用的目的,将连接DSP_1的缓存模块确定为高优先级,将连接DSP_2的缓存模块确定为低优先级,若DSP_2与DSP_1同时进行读写操作,则优先处理DSP_1,再处理DSP_2。
该状态内会不断检测两个缓存模块中的命令FIFO_1和命令FIFO_2是否非空。首先检测命令FIFO_1,若非空则进入到状态ST1,进行DSP_1的读写操作,否则检测命令FIFO_2,若非空则进入到状态ST8,进行DSP_2的读写操作。如果同时空,则仍在Idle状态。
2)状态ST1:转到DSP_1的读写操作后,给出命令FIFO_1的读使能信号,读出读或写信号,然后转到状态ST2。
3)状态ST2:对状态ST1读出的信号进行判断,若该信号表示为DSP_1向双口RAM写操作,进入状态ST3,否则表示DSP_1从双口RAM读操作,进入到状态ST5。
4)状态ST3:给出地址FIFO_1和数据FIFO_1的读使能信号,读出地址和数据,然后转到状态ST4。
5)状态ST4:给出双口RAM的写入使能信号,根据状态ST3读出的地址和数据,将数据写入双口RAM相应的地址,然后转到状态ST7,检测命令FIFO_2是否非空。
6)状态ST5:给出地址FIFO_1的读使能信号,并读出其中缓存的地址,然后转到状态ST6。
7)状态ST6:用于控制从双口RAM中读出数据,即,将状态ST5读出的双口RAM的相应地址将数据通过DSP_1数据总线输出。
8)状态ST7:对DSP_1的读写操作完成后,检测命令FIFO_2是否非空,若非空则转到对DSP_2的读写操作,否则返回状态Idle。
9)状态ST8:与状态ST1的功能相同,有限状态机进行DSP_2的读写操作。此状态给出命令FIFO_2的读使能信号,读出读或写信号,然后转到状态ST9。
10)状态ST9:与状态ST2的功能相同。对状态ST8读出的信号进行判断,若表示为DSP_2向双口RAM写操作,进入状态ST10,否则表示DSP_2从双口RAM读操作,进入到状态ST12。
11)状态ST10:与状态ST3的功能相同。给出地址FIFO_2和数据FIFO_2的读使能信号,读出地址和数据,然后转到状态ST11。
12)状态ST11:与状态ST4的功能相同。给出双口RAM的写入使能信号,根据状态ST10读出的地址和数据,将数据写入双口RAM相应的地址,然后直接返回状态Idle。
13)状态ST12:与状态ST5的功能相同。给出地址FIFO_2的读使能信号,读出地址,然后转到状态ST13。
14)状态ST13:与状态ST6的功能相同。用于控制从双口RAM中读出数据,即,将状态ST12读出的双口RAM相应地址将数据通过DSP_2数据总线输出,然后直接返回状态Idle。