连接到多个接口的端口实例
点击数:7522 次 录入时间:03-04 11:39:48 整理:http://www.55dianzi.com 电脑-单片机-自动控制
下面我们给出一个单端口连接多接口的实例。
本设计描述的是一个存储器管理单元(MMU)同时管理着3个RAM(RAM0~RAM2),如图3-3所示。主设备Master通过MMU提供的接口来读写RAM。在它看来只有一个能够完成RAM读写的接口,至于具体读写哪个RAM和这个接口如何实现,则由MMU来完成。这里Master和RAM的设计还是与3.4.2节一样,这里不再重复。
图3-3 一个存储器管理实例
由于Master模块可能会单个复位某一个RAM,这里我们将ram_if扩展成为multi_ram_if,让它支持单个RAM的复位,而ram_if的方法reset()被用来复位全部的RAM。 multi_ram_if的定义如下
- template<class T>
- class multi_ram_if: publIC ram_if<T>
- {
- virtual bool reset(unsigned int i)=0;
- };
MMU提供给Master的接口仍然是multi_ram_if, 而MMU看到的RAM接口是ram_if。下面我们给出MMU的部分设计代码。
- //By chenxi,2003.3.30
- #ifndef _MMU_H
- #define _MMU_H
- #include <systEMC.h>
- class mmu
- : public sc_module,
- public multi_ram_if<int>
- {
- public:
- #ifdef MAX_IS_3
- //a maximum of 3 memories CAN be connected to ram_port
- sc_port<ram_if<int>,3> ram_port;
- #else
- //any number of memories can be connected to ram_port
- sc_port<ram_if<int>,0> ram_port;
- #endif
-
- // interface methods
- transfer_status read( unsigned address, int& data )
- {
- for( int i = 0; i < ram_port.size(); i ++ )
- if( ( address >= ram_port[i]->start_address() ) &&
- ( address <= ram_port[i]->end_address() ) )
- return ram_port[i]->read(address, data);
- return TRANSFER_ERROR;
- }
- bool reset(){
- for( int i = 0; i < ram_port.size(); i ++ )
- ram_port[i]->reset();
- return true;
- }
- bool reset(unsigned int i){
- if (i<ram_port.size()) {return ram_port[i]->reset();}
- else {return false;}
- }
- transfer_status write( unsigned address, int& data ){……}
-
- };
- #endif
这里我们只给出了read()函数的设计,当它被调用的时候,它首先通过size()函数获得所实际连接到自己的RAM的数量,然后检查address是在哪一个RAM的地址空间内,最后完成所需操作。
上述代码中使用了条件编译#ifdef…#else…#endif表示了定义sc_port<ram_if<int>,3> ram_port和sc_port<ram_if<int>,0> ram_port对于上面的设计都是允许的。在实际设计中,我们也许并不知道mmu所实际连接的RAM的数目,所以使用sc_port<ram_if<int>,0> ram_port提供了更大的灵活性。
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);}
本文关键字:接口 电脑-单片机-自动控制,电子学习 - 基础知识 - 电脑-单片机-自动控制