学海荡舟手机网
导航

主页 > 电子设备技术 > 电器电路基础 > > 详细内容

连接到多个接口的端口实例

下面我们给出一个单端口连接多接口的实例。

本设计描述的是一个管理单元(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的定义如下

  1. template<class T>  
  2. class multi_ram_if: publ ram_if<T>  
  3. {  
  4.    virtual bool reset(unsigned int i)=0;  
  5. }; 

 
      MMU提供给Master的接口仍然是multi_ram_if, 而MMU看到的RAM接口是ram_if。下面我们给出MMU的部分设计代码。

  1. //By chenxi,2003.3.30  
  2. #ifndef _MMU_H  
  3. #define _MMU_H  
  4. #include <syst.h>  
  5. class mmu  
  6. public sc_module,  
  7. public multi_ram_if<int>  
  8. {  
  9. public:  
  10.   #ifdef MAX_IS_3  
  11.  //a maximum of 3 memories  be connected to ram_port  
  12.   sc_port<ram_if<int>,3> ram_port;  
  13.   #else   
  14.   //any number of memories can be connected to ram_port  
  15.   sc_port<ram_if<int>,0> ram_port;  
  16.   #endif  
  17.  
  18.  // interface methods  
  19.   transfer_status read( unsigned address, int& data )  
  20. {  
  21. forint i = 0; i < ram_port.size(); i ++ )  
  22.    if( ( address >= ram_port[i]->start_address() ) &&  
  23.    ( address <= ram_port[i]->end_address() ) )  
  24.      return ram_port[i]->read(address, data);  
  25.   return TRANSFER_ERROR;  
  26. }  
  27. bool reset(){  
  28.  forint i = 0; i < ram_port.size(); i ++ )  
  29.     ram_port[i]->reset();  
  30.   return true;     
  31. }  
  32. bool reset(unsigned int i){  
  33.   if (i<ram_port.size()) {return ram_port[i]->reset();}  
  34.    else {return false;}  
  35. }  
  36. transfer_status write( unsigned address, int& data ){……}  
  37.  
  38. };  
  39. #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);}


相关文章