www.pudn.com > noc.rar > brom16k.cpp


/*
 *  TU Eindhoven
 *  Eindhoven, The Netherlands
 *
 *  Name            :   brom16k.cpp
 *
 *  Author          :   A.S.Slusarczyk@tue.nl
 *
 *  Date            :   
 *
 *  Function        :   ROM based on VirtexII 16kb BlockRAMs
 *
 *
 */
 
#include "brom16k.h"

void BROM16K_WRAPPER::in()
{  

  sc_bv a = addr.read();
  
  sc_bv<12> a_13_2 = a.range(13,2);
  sc_uint<12> addr12 = a_13_2;
  
  ADDR.write(addr12);
    
  DI00.write(0); 
  DI01.write(0); 
  DI02.write(0); 
  DI03.write(0); 
  DI04.write(0); 
  DI05.write(0); 
  DI06.write(0); 
  DI07.write(0); 
  
  bool e = (en.read()[0]!=0);
  EN.write(e);
  WE.write(0);  
  SSR.write(0);
  CLK.write(clk.read());
}

void BROM16K_WRAPPER::out()
{
  sc_bv<32> data32;
  sc_bv<4>  d0, d1, d2, d3, d4, d5, d6, d7;
 

  // gather bytes of the word from memory blocks
  d0 = DO00.read();
  d1 = DO01.read();
  d2 = DO02.read();
  d3 = DO03.read();
  d4 = DO04.read();
  d5 = DO05.read();
  d6 = DO06.read();
  d7 = DO07.read();
  
  data32 = (d0, d1, d2, d3, d4, d5, d6, d7);
  
  dout.write( data32 );
  memwait.write( false );
}

////////////////////////////////////////////////////////////////////////////////////////////////////

void BROM16K_DBGWRAPPER::in()
{  

  bool clk = CLK.read();
  
  dCLK.write(clk);
  
  // discard two least significant bits of the address
  sc_uint<12> addr = ADDR.read().range(13,2);  
  dADDR.write(addr);
  
  // split the input data between the memory blocks
  sc_int<32> dwr = DI.read();
  sc_int<4> dwr0 = dwr.range(31,28), dwr1 = dwr.range(28,24), dwr2 = dwr.range(23,20), dwr3 = dwr.range(19,16),
    dwr4 = dwr.range(15,12), dwr5 = dwr.range(11,8), dwr6 = dwr.range(7,4), dwr7 = dwr.range(3,0);

  dDI00.write(dwr0); dDI01.write(dwr1); dDI02.write(dwr2); dDI03.write(dwr3); 
  dDI04.write(dwr4); dDI05.write(dwr5); dDI06.write(dwr6); dDI07.write(dwr7); 

  bool en = EN.read(), we = WE.read();
  dEN.write(en);
  dWE.write(we);
  dSSR.write(0);
}

void BROM16K_DBGWRAPPER::out()
{
  sc_int<32> data32;
  sc_int<4>  d0, d1, d2, d3, d4, d5, d6, d7;
 

  // gather bytes of the word from memory blocks
  d0 = dDO00.read();
  d1 = dDO01.read();
  d2 = dDO02.read();
  d3 = dDO03.read();
  d4 = dDO04.read();
  d5 = dDO05.read();
  d6 = dDO06.read();
  d7 = dDO07.read();
  
  data32 = (d0, d1, d2, d3, d4, d5, d6, d7);
  
  DO.write( data32 );
}

#ifndef VERILOG

void BROM16K::mem_init(const char *filename, int size){
  vector* > v;
  v.push_back(bram00->memory);
  v.push_back(bram01->memory);
  v.push_back(bram02->memory);
  v.push_back(bram03->memory);
  v.push_back(bram04->memory);
  v.push_back(bram05->memory);
  v.push_back(bram06->memory);
  v.push_back(bram07->memory);
  init_memory(&v,size,filename);
}
void BROM16K::mem_dump(const char *filename, int size){
  vector* > v;
  v.push_back(bram00->memory);
  v.push_back(bram01->memory);
  v.push_back(bram02->memory);
  v.push_back(bram03->memory);
  v.push_back(bram04->memory);
  v.push_back(bram05->memory);
  v.push_back(bram06->memory);
  v.push_back(bram07->memory);
  dump_memory(&v,size,filename);
}

#endif