学海荡舟手机网
导航

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

从完整的SystemC实例开始

一个Syst双端口异步读写RAM实例:

 

  1. #ifndef RAM_DP_AR_AW  
  2. #define RAM_DP_AR_AW  
  3. #include "syst.h"  
  4.  
  5. #define DATA_WIDTH        8   
  6. #define ADDR_WIDTH        8   
  7. #define RAM_DEPTH         1 << ADDR_WIDTH  
  8.  
  9. SC_MODULE (ram_dp_ar_aw) {  
  10.   sc_in    <sc_uint<ADDR_WIDTH> > address_0;  
  11.   sc_in    <bool> cs_0 ;  
  12.   sc_in    <bool> we_0 ;  
  13.   sc_in    <bool> oe_0  ;  
  14.   sc_in    <sc_uint<ADDR_WIDTH> > address_1;  
  15.   sc_in    <bool> cs_1 ;  
  16.   sc_in    <bool> we_1 ;  
  17.   sc_in    <bool> oe_1  ;  
  18.   sc_inout_rv <DATA_WIDTH> data_0;  
  19.   sc_inout_rv <DATA_WIDTH> data_1;  
  20.  
  21.   //-----------Internal variables-------------------  
  22.   sc_uint <DATA_WIDTH> mem [RAM_DEPTH];  
  23.  
  24.   //-----------Methods------------------------------  
  25.   void  READ_0 ();  
  26.   void  READ_1 ();  
  27.   void  WRITE_0 ();  
  28.   void  WRITE_1 ();  
  29.  
  30.   //-----------Constructor--------------------------  
  31.   SC_CTOR(ram_dp_ar_aw) {  
  32.     SC_METHOD (READ_0);  
  33.       sensitive << address_0 << cs_0 << we_0 << oe_0;  
  34.     SC_METHOD (READ_1);  
  35.       sensitive << address_1 << cs_1 << we_1 << oe_1;  
  36.     SC_METHOD (WRITE_0);  
  37.       sensitive << address_0 << cs_0 << we_0 << data_0;  
  38.     SC_METHOD (WRITE_1);  
  39.       sensitive << address_1 << cs_1 << we_1 << data_1;  
  40.   }  
  41. };  
  42. #endif  
  43. cpp:  
  44. #include "ram_dp_ar_aw.h"  
  45.  
  46. void  ram_dp_ar_aw::READ_0 () {  
  47.   if (cs_0.read() && oe_0.read() && !we_0.read()) {  
  48.     data_0 = mem[address_0.read()];  
  49.   }  
  50. }  
  51.  
  52. void  ram_dp_ar_aw::READ_1 () {  
  53.   if (cs_1.read() && oe_1.read() && !we_1.read()) {  
  54.     data_1 = mem[address_1.read()];  
  55.   }  
  56. }  
  57.  
  58. void  ram_dp_ar_aw::WRITE_0 () {  
  59.   if (cs_0.read() && we_0.read()) {  
  60.     mem[address_0.read()] = data_0.read();  
  61.   }   
  62. }  
  63.  
  64. void  ram_dp_ar_aw::WRITE_1 () {  
  65.   if (cs_1.read() && we_1.read()) {  
  66.     mem[address_1.read()] = data_1.read();  
  67.   }   

相关文章