www.pudn.com > noc.rar > brom8k.cpp
/*
* TU Eindhoven
* Eindhoven, The Netherlands
*
* Name : brom8k.cpp
*
* Author : A.S.Slusarczyk@tue.nl
*
* Date :
*
* Function : ROM based on VirtexII 16kb BlockRAMs
*
*
*/
#include "brom8k.h"
void BROM8KCONV::in()
{
sc_bv a = addr.read();
sc_bv<11> a_12_2 = a.range(12,2);
sc_uint<11> addr11 = a_12_2;
ADDR1.write(addr11); ADDR0.write(addr11); ADDR2.write(addr11); ADDR3.write(addr11);
DI0.write(0);
DI1.write(0);
DI2.write(0);
DI3.write(0);
DIP0.write(0); DIP1.write(0); DIP2.write(0); DIP3.write(0);
bool e = (en.read()[0]!=0);
EN0.write(e); EN1.write(e); EN2.write(e); EN3.write(e);
WE0.write(0);
WE1.write(0);
WE2.write(0);
WE3.write(0);
SSR0.write(0); SSR1.write(0); SSR2.write(0); SSR3.write(0);
CLK0.write(clk.read()); CLK1.write(clk.read()); CLK2.write(clk.read()); CLK3.write(clk.read());
}
void BROM8KCONV::out()
{
sc_bv<32> data32;
sc_bv<8> d0, d1, d2, d3;
// gather bytes of the word from memory blocks
d0 = DO0.read();
d1 = DO1.read();
d2 = DO2.read();
d3 = DO3.read();
// 3 LS bytes go straight to the output, regardless of mode
#ifdef MIPS_BIG_ENDIAN
data32 = (d0, d1, d2, d3);
#else
data32 = (d3, d2, d1, d0);
#endif
dout.write( data32 );
memwait.write( false );
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void DBGBROM8KCONV::in()
{
bool clk = CLK.read();
CLK0.write(clk); CLK1.write(clk); CLK2.write(clk); CLK3.write(clk);
// discard two least significant bits of the address
sc_uint<11> addr = ADDR.read().range(12,2);
ADDR1.write(addr); ADDR0.write(addr); ADDR2.write(addr); ADDR3.write(addr);
// split the input data between the memory blocks
sc_int<32> dwr = DI.read();
#ifdef MIPS_BIG_ENDIAN
sc_int<8> dwr0 = dwr.range(31,24), dwr1 = dwr.range(23,16), dwr2 = dwr.range(15,8), dwr3 = dwr.range(7,0);
#else
sc_int<8> dwr3 = dwr.range(31,24), dwr2 = dwr.range(23,16), dwr1 = dwr.range(15,8), dwr0 = dwr.range(7,0);
#endif
DI0.write(dwr0); DI1.write(dwr1); DI2.write(dwr2); DI3.write(dwr3);
bool en = EN.read(), we = WE.read();
EN0.write(en); EN1.write(en); EN2.write(en); EN3.write(en);
WE0.write(we); WE1.write(we); WE2.write(we); WE3.write(we);
SSR0.write(0); SSR1.write(0); SSR2.write(0); SSR3.write(0);
DIP0.write(1); DIP1.write(1); DIP2.write(1); DIP3.write(1);
}
void DBGBROM8KCONV::out()
{
sc_int<32> data;
sc_int<8> d0, d1, d2, d3;
// gather bytes of the word from memory blocks
d0 = DO0.read();
d1 = DO1.read();
d2 = DO2.read();
d3 = DO3.read();
#ifdef MIPS_BIG_ENDIAN
data = (d0, d1, d2, d3);
#else
data = (d3, d2, d1, d0);
#endif
DO.write( data );
}
#ifndef VERILOG
void ROM8K::mem_init(const char *filename, int size){
vector* > v;
v.push_back(bram0->memory);
v.push_back(bram1->memory);
v.push_back(bram2->memory);
v.push_back(bram3->memory);
init_memory(&v,size,filename);
}
void ROM8K::mem_dump(const char *filename, int size){
vector* > v;
v.push_back(bram0->memory);
v.push_back(bram1->memory);
v.push_back(bram2->memory);
v.push_back(bram3->memory);
dump_memory(&v,size,filename);
}
#endif