嵌入式系统数据共享存储器的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式系统数据共享存储器的实现

Luo Hao (罗昊),Wang Zhihua (王志华)

清华大学电子工程系北京 100084

摘要:使用静态存储器(SRAM)和可编程逻辑器件(PLD)可以模拟共享存储器的行为,实现低成本、高速、大容量共享存储。在实际应用中模拟共享存储器会遇到操作冲突的问题,这需要使用仲裁的办法加以解决。正确选择SRAM和PLD能提高模拟共享存储器的速度。

关键字:共享存储器可编程逻辑嵌入式系统

Implementation of Shared Memories in Embedded Systems Abstract: Use SRAM and PLD can simulate DPRAM to satisfy the need for high volume, high speed data switching. Collisions will arise when operate shared memory, some arbitration will be used to solve the problem. Select the right SRAM and PLD can improve the speed of the shared memory.

Key word: DPRAM PLD EMBEDDED

引言:有的嵌入式系统中需要使用共享存储器进行数据交换,常用的共享存储器有DPRAM (双口内存)、PRAM(多口内存)、FIFO等。传统的DPRAM虽然简单易用,但是容量小,成本高。使用SRAM和PLD可以方便地构成共享存储器。

1. 常见的双口内存

在商用芯片中,常用的双口内存如IDT7133/4[1],容量为2K*16,异步操作,操作延迟时间20~90ns不等。存储阵列通过左右两端的地址线独立寻址。任意一端的接口方式与普通静态存储器完全一样。每端有独立的片选、读出、写入信号,因为7133的数据宽度为16b,为了实现字节操作,还提供了字节读出使能,可以通过字节读出使能对其进行字节操作。在实际的使用过程中,如果两侧同时对同一存储单元进行操作,任一侧为写入,都会使另一侧产生BUSY信号。表示此时的操作无效,或是会出现不正常的结果。在实际应用中这种情况是需要避免的。

2. 如何构造模拟双口内存

如果在实际应用中遇到需要的双口内存容量远大于现有的双口内存的情形,可以使用多片双口内存并联的方案。使用这种方案会使费用急剧增加,并且还需要增大存储控制器的扇出能力,增加的总线缓冲器或总线驱动器还会增加线路上的延时。可以考虑使用一个替代的办法:使用一片或多片大容量静态存储器(SRAM)或动态存储器(DRAM)作为存储单元,使用一些外部逻辑生成两个端口,构成一个模拟双口内存。使用类似操作双口内存的方法来操作这个模拟双口内存。在文献[2]中有一个类似的方案,它使用SRAM实现共享存储。图1中描绘了这种方案的实现方法。存储阵列由SRAM构成,与SRAM操作相关的信号为数据总线,地址总线,读写控制和片选。仲裁器由可编程逻辑实现,仲裁器的输入为两边端口送

来的片选信号,读写控制信号,输出为控制存储阵列的片选及读写信号,送至处理器的等待信号和数据地址开关控制信号。数据开关为双向三态开关,地址开关为单向三态开关。理论上,数据和地址开关也可以集成到可编程器件中。考虑到仲裁器的逻辑并不复杂,而数据和地址开关集成到仲裁器后,需要占用大量的可编程器件的I/O资源,从而需要选用容量较大的可编程器件。这样会使得在实际应用中变得不太经济,所以数据地址开关采用外接的方案。

图1 模拟双口内存方案

为叙述方便起见,现在两个端口分别命名为R端和L端。理论上R端和L端是平等的,不存在任何优先的问题。

3. 基本原理

当处理器需要对双口内存的一端进行读写时,将产生片选信号,仲裁器对这个片选信号进行仲裁,如果当前的状态可以允许对此端进行操作,仲裁器产生SRAM读写时序,并打开此端的数据地址开关。从该端口写入或读出数据,如果条件不允许,仲裁器产生等待,通知处理器等待一段时间。等待完毕后,再进行读写。

4. 如何处理冲突

与双口内存不同的是,当在任一端对这个模拟双口内存进行操作,这个操作不论是读或是写,另一端都无法对这个模拟双口内存进行操作,如果正好在另一端需要对模拟双口内存进行操作,就会产生冲突,导致另一端无法立即写入或读出。解决这个问题的有三个方法。

1、软件避免冲突

保证任何时刻不会有两端同时操作模拟双口内存。这可以再在这个模拟双口内存的基础上再附加一些处理器之间的握手。当一端在进行操作时,另一端不操作。这样做好好处是仲裁逻辑简单。读写速度快。缺点是,不能适用于某些需要实时交换数据的应用。

2、插入等待

当R端需要操作模拟双口内存时,正好L端正在操作,这时可以在R端插入等待,让R 端等待一个或多个时钟周期,直到L端完成操作。这在某些具有准同步总线的处理器上是可行的,如INTEL X86系列。这种方式可优点是速度快,缺点是电路定时需要与处理器仔细匹配。

3、应答方式传输

在任一端进行操作时,由仲裁器产生一个应答信号,告知处理器数据操作完毕。如POWERPC处理器具有这样的传输方式。比如当处理器需要在R端进行操作,而此时L端正在操作,仲裁器使R端的应答信号无效,一直等到L端操作完毕,并且完成R端的操作后,才送出R端操作完毕的应答信号,通知处理器操作完毕。在这个应答的操作方式实际上隐含了等待。能获得方式2的相同结果。这种方法的优点是,可以以异步的方式传输数据。实现的逻辑比较简单。

5. 仲裁机制

如果模拟双口内存两端同时有操作请求,这时候会产生一个先后问题,根据不同的应用要求,可以采用固定优先级的仲裁机制,也可以采用轮流优先的仲裁机制。

6. 实现方法

在这里应答方式传输避免冲突,固定仲裁优先级的方法实现模拟双口内存。

模拟双口内存的仲裁器使用两个有限状态机,分别命名为状态机0与状态机1。状态机的时钟分别为各端的总线时钟,也就是说,两个状态机是异步的。状态机之间依靠读取对方的状态进行通信。如图2所示,每个状态机都有三个状态,依次为空闲态,请求态与忙态。当复位时,两个状态机都进入空闲状态,当0端需要数据操作时,0端的片选信号变为有效,状态机0进入请求态,如果此时状态机1不处于忙态,则状态机0的下一状态为忙,否则重新进入闲态等待。状态机在忙状态时对存储阵列进行操作。操作完毕后等待片选信号变为无效重新进入空闲状态。状态机1也以类似的方式运作,只是当状态机1在请求态时,因0端的优先级高,只有在状态机0为闲态时,才能进入忙态。状态机在忙时产生存储器读写时序,并打开相应的数据和地址开关。

状态机0状态机1

相关文档
最新文档