OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [branches/] [mp3_stable/] [mp3/] [bench/] [models/] [idt71256sa15.v] - Rev 1765

Compare with Previous | Blame | View Log

 
/*******************************************************************************
 *   Copyright 1991, 1992, 1993 Integrated Device Technology Corp.
 *   All right reserved.
 *
 *   This program is proprietary and confidential information of
 *   IDT Corp. and may be used and disclosed only as authorized 
 *   in a license agreement controlling such use and disclosure.
 *
 *   IDT reserves the right to make any changes to
 *   the product herein to improve function or design.
 *   IDT does not assume any liability arising out of
 *   the application or use of the product herein.
 *
 *   WARNING: The unlicensed shipping, mailing, or carring of this
 *   technical data outside the United States, or the unlicensed
 *   disclosure, by whatever means, through visits abroad, or the
 *   unlicensed disclosure to foreign national in the United States,
 *   may violate the United States criminal law.
 *
 *   File Name                 : idt71256sa15.v
 *   Function                  : 32Kx8-bit Asynchronous Static RAM
 *   Simulation Tool/Version   : Verilog 2.0
 *
 ******************************************************************************/
 
/*+ **************************** Internal Use Only *****************************
 *+   Revision History
 *+   Name              Version dd-mmm-yy   Notes
 *+   William Lam       0.1        Mar-94   Based on IDT71B256SA part
 *+   Martin Mueller    0.2      2-Sep-94   Updated to reflect IDT71256SA15 timing
 *+   Martin Mueller    0.3      6-Sep-94   Changed to 0.1nS time scale
 *+ ***************************************************************************/
 
/*******************************************************************************
 * Module Name: idt71256sa15
 * Description: 32Kx8 15nS Asynchronous Static RAM
 *
 *******************************************************************************/
`timescale 1ns/100ps
//`timescale 10ps/10ps
 
module idt71256sa15(data, addr, we_, oe_, cs_);
inout [7:0] data;
input [14:0] addr;
input we_, oe_, cs_;
 
//Read Cycle Parameters
parameter Taa  = 15; // address access time
parameter Tacs = 15; // cs_     access time
parameter Tclz =  4; // cs_ to output low Z time
parameter Tchz =  7; // cs_ to output high Z time
parameter Toe  =  7; // oe_ to output  time
parameter Tohz =  6; // oe_ to output Z time
parameter Toh  =  4; // data hold from adr change time
 
//Write Cycle Parameters
parameter Taw  = 10; // adr valid to end of write time
parameter Tcw  = 10; // cs_ to end of write time
parameter Tas  =  0; // address set up time
parameter Twp  = 10; // write pulse width min
parameter Tdw  =  7; // data valid to end of writ time
parameter Tow  =  4; // data act from end of writ time
parameter Twhz =  6; // we_ to output in high Z time
 
reg [7:0] mem[0:32767];
 
time adr_chng,da_chng,we_fall,we_rise;
time cs_fall,cs_rise,oe_fall,oe_rise;
 
wire [7:0] data_in;
reg  [7:0] data_out;
reg  [7:0] temp1,temp2,temp3;
reg outen, out_en, in_en;
 
//integer i;
//initial begin
//    for (i=0; i<32768 ; i=i+4) begin
//       mem[i]   = 8'haa;
//       mem[i+1] = 8'hbb;
//       mem[i+2] = 8'hcc;
//       mem[i+3] = 8'hdd;
//     end 
//end
 
initial
  begin
       in_en = 1'b1;
    if (cs_)
       out_en = 1'b0;
  end
 
// input/output control logic
//---------------------------
assign data   = out_en ? data_out : 'hz;
assign data_in = in_en ? data : 'hz;
 
// read access
//------------
always @(addr)
      if (cs_==0 & we_==1)        //read
         #Taa data_out = mem[addr];
 
always @(addr)
  begin
     adr_chng = $time;
 
              outen  = 1'b0;
         #Toh out_en = outen;
 
//---------------------------------------------
      if (cs_==0 & we_==1)        //read
        begin
           if (oe_==0)
             begin
              outen = 1'b1;
              out_en = 1'b1;
             end
        end
//---------------------------------------------
     if (cs_==0 & we_==0)        //write
       begin
         if (oe_==0)
           begin
                outen = 1'b0;
                out_en = 1'b0;
                     temp1 = data_in;
            #Tdw mem[addr] = temp1;
           end
         else
           begin
                 outen = 1'b0;
                 out_en = 1'b0;
                  temp1 = data_in;
            #(Tdw-Toh) mem[addr] = temp1;
           end
 
         data_out = mem[addr];
       end
  end
 
always @(negedge cs_)
  begin
     cs_fall = $time;
 
     if (cs_fall - adr_chng < Tas)
         $display($time, "  Adr setup time is not enough Tas");
 
      if (we_==1 & oe_==0)
               outen  = 1'b1;
         #Tclz out_en = outen;
 
      if (we_==1)
         #(Tacs-Tclz) data_out = mem[addr];
 
      if (we_==0)
       begin
               outen = 1'b0;
               out_en = 1'b0;
                  temp2 = data_in;
         #Tdw mem[addr] = temp2;
       end
 
  end
 
always @(posedge cs_)
  begin
     cs_rise = $time;
 
   if (we_==0)
    begin
     if (cs_rise - adr_chng < Taw)
       begin
         mem[addr] = 8'hxx;
         $display($time, "  Adr valid to end of write is not enough Taw");
       end
 
     if (cs_rise - cs_fall < Tcw)
       begin
         mem[addr] = 8'hxx;
         $display($time, "  cs_ to end of write is not enough Tcw");
       end
 
     if (cs_rise - da_chng < Tdw)
       begin
         mem[addr] = 8'hxx;
         $display($time, "  Data setup is not enough");
       end
    end
 
               outen  = 1'b0;
         #Tchz out_en = outen;
 
  end
 
always @(negedge oe_)
  begin
     oe_fall = $time;
 
         data_out = mem[addr];
 
      if (we_==1 & cs_==0)
              outen  = 1'b1;
         #Toe out_en = outen;
  end
 
always @(posedge oe_)
  begin
     oe_rise = $time;
 
               outen  = 1'b0;
         #Tohz out_en = outen;
  end
 
// write to ram
//-------------
always @(negedge we_)
  begin
     we_fall = $time;
 
     if (we_fall - adr_chng < Tas)
         $display($time, "  Address set-up to WE low is not enough");
 
     if (cs_==0 & oe_==0)
       begin
               outen  = 1'b0;
         #Twhz out_en = outen;
                  temp3 = data_in;
         #Tdw mem[addr] = temp3;
 
              data_out = mem[addr];
       end
 
     if (cs_==0 & oe_==1)
       begin
               outen = 1'b0;
               out_en = 1'b0;
                  temp3 = data_in;
         #Tdw mem[addr] = temp3;
 
              data_out = mem[addr];
       end
  end
 
always @(posedge we_)
  begin
     we_rise = $time;
 
   if (cs_==0)
    begin
     if (we_rise - da_chng < Tdw)
       begin
         mem[addr] = 8'hxx;
         $display($time, "  Data setup is not enough");
       end
     if (we_rise - adr_chng < Taw)
       begin
         mem[addr] = 8'hxx;
         $display($time, "  Addr setup is not enough");
       end
    end
   if (cs_==0 & oe_==0)
    begin
     if (we_rise - we_fall < (Twhz+Tdw) )
       begin
         mem[addr] = 8'hxx;
         $display($time, "  WE pulse width needs to be Twhz+Tdw");
       end
 
               outen  = 1'b1;
         #Tow  out_en = outen;
    end
   if (cs_==0 & oe_==1)
    begin
     if (we_rise - we_fall < Twp)
       begin
         mem[addr] = 8'hxx;
         $display($time, "  WE pulse width needs to be Twp");
       end
    end
  end
 
always @ (data)
  begin
     da_chng = $time;
 
     if (we_==0 & cs_==0)
       begin
            #Tdw mem[addr] = data_in;
 
                  data_out = mem[addr];
       end
  end
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.