www.pudn.com > noc.rar > bregisterfile16.h


/*
 *  TU Eindhoven
 *  Eindhoven, The Netherlands
 *
 *  Name            :   bregisterfile16.h
 *
 *  Author          :   A.S.Slusarczyk@tue.nl
 *
 *  Date            :   
 *
 *  Function        :   Xilinx-Block-RAM-based register file
 *
 *
 */
  
#ifndef BREGISTERFILE16_H_INCLUDED
#define BREGISTERFILE16_H_INCLUDED

#include "mips.h"
#include "xlxram.h"

SC_MODULE(BRAM512x32_CONV) {
  
	sc_in< 	sc_bv	>	r_addr;
	sc_out< sc_bv 	>	r_data;
	
	sc_in< 	sc_bv	>	w_addr;
	sc_in< 	sc_bv 	>	w_data;
	sc_in<  sc_bv<1>  >         w;
	sc_in<	bool		    >   clk;

	sc_in > DOA;
	sc_in > DOPA;
	sc_out > ADDRA;
	sc_out > DIA;
	sc_out > DIPA;
	sc_out ENA;
	sc_out CLKA;
	sc_out WEA;
	sc_out SSRA;

	sc_in > DOB;
	sc_in > DOPB;
	sc_out > ADDRB;
	sc_out > DIB;
	sc_out > DIPB;
	sc_out ENB;
	sc_out CLKB;
	sc_out WEB;
	sc_out SSRB;

	void clock();
	void out();
	void in();
	
	SC_CTOR(BRAM512x32_CONV) {
	  SC_METHOD(in);
	  sensitive << r_addr << w_addr << w_data << w ;
	  
	  SC_METHOD(clock);
	  sensitive << clk;
		
	  SC_METHOD(out);
	  sensitive << DOA << DOB << DOPA << DOPB; 

	};
	
};

// 512x32 memory with separate read/write ports
SC_MODULE(BRAM512x32)
{
	sc_in< 	sc_bv	>	r_addr;
	sc_out< sc_bv 	>	r_data;
	
	sc_in< 	sc_bv	>	w_addr;
	sc_in< 	sc_bv 	>	w_data;
	sc_in<  sc_bv<1>  >         w;
	sc_in<	bool		    >   clk;

	RAMB16_S36_S36 *bram;
	BRAM512x32_CONV *conv;
	
	sc_signal > DOA;
	sc_signal > ADDRA;
	sc_signal > DIA;
	sc_signal ENA;
	sc_signal CLKA;
	sc_signal WEA;
	sc_signal SSRA;
	sc_signal > DOPA, DIPA;

	sc_signal > DOB;
	sc_signal > ADDRB;
	sc_signal > DIB;
	sc_signal ENB;
	sc_signal CLKB;
	sc_signal WEB;
	sc_signal SSRB;
	sc_signal > DOPB, DIPB;
	
	SC_CTOR(BRAM512x32) {
	  bram = new RAMB16_S36_S36("bramh");
	  conv = new BRAM512x32_CONV("conv");
	  
	  bram->ADDRA(ADDRA);
	  conv->ADDRA(ADDRA);
	  bram->ADDRB(ADDRB);
	  conv->ADDRB(ADDRB);
	  
	  bram->DIA(DIA);
	  conv->DIA(DIA);
	  bram->DIB(DIB);
	  conv->DIB(DIB);
	  
	  bram->DOA(DOA);
	  conv->DOA(DOA);
	  bram->DOB(DOB);
	  conv->DOB(DOB);

	  bram->DOPA(DOPA);
	  conv->DOPA(DOPA);
	  bram->DOPB(DOPB);
	  conv->DOPB(DOPB);
	  bram->DIPA(DIPA);
	  conv->DIPA(DIPA);
	  bram->DIPB(DIPB);
	  conv->DIPB(DIPB);

	  bram->CLKA(CLKA);
	  conv->CLKA(CLKA);
	  bram->CLKB(CLKB);
	  conv->CLKB(CLKB);
	  
	  bram->ENA(ENA);
	  conv->ENA(ENA);
	  bram->ENB(ENB);
	  conv->ENB(ENB);
	  
	  bram->WEA(WEA);
	  conv->WEA(WEA);
	  bram->WEB(WEB);
	  conv->WEB(WEB);
	  
	  bram->SSRA(SSRA);
	  conv->SSRA(SSRA);
	  bram->SSRB(SSRB);
	  conv->SSRB(SSRB);
	  
	  
	  conv->r_addr(r_addr);
	  conv->r_data(r_data);
	  conv->w_data(w_data);
	  conv->w_addr(w_addr);
	  conv->w(w);
	  conv->clk(clk);
	  
	};
  
};

	 

// register file module with original interface
SC_MODULE(REGFILE16) {
	sc_in< 	sc_bv	>	r_addr_reg1;
	sc_out< sc_bv 	>	r_data_reg1;

	sc_in< 	sc_bv	>	r_addr_reg2;
	sc_out< sc_bv 	>	r_data_reg2;
	
	sc_in< 	sc_bv	>	w_addr_reg;
	sc_in< 	sc_bv 	>	w_data_reg;
	sc_in< 	sc_bv<1>	 	>	w;
	
	
	sc_in< 	bool > clk;
	//	sc_in< 	bool > rst;
	
	BRAM512x32 *regs1, *regs2;
		
	SC_CTOR(REGFILE16) {
	  regs1 = new BRAM512x32("regs1");
	  regs2 = new BRAM512x32("regs2");
	  
	  regs1->r_addr(r_addr_reg1);
	  regs1->r_data(r_data_reg1);
	  regs1->w_data(w_data_reg);
	  regs1->w_addr(w_addr_reg);
	  regs1->w(w);
	  regs1->clk(clk);

	  regs2->r_addr(r_addr_reg2);
	  regs2->r_data(r_data_reg2);
	  regs2->w_data(w_data_reg);
	  regs2->w_addr(w_addr_reg);
	  regs2->w(w);
	  regs2->clk(clk);
	  
	};
};


#endif