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