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

Subversion Repositories k68

[/] [k68/] [trunk/] [rtl/] [verilog/] [k68_regbank.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sybreon
//                              -*- Mode: Verilog -*-
2
// Filename        : k68_regbank.v
3
// Description     : RISC Async RegBank
4
// Author          : Shawn Tan
5
// Created On      : Sat Feb  8 16:47:06 2003
6
// Last Modified By: .
7
// Last Modified On: .
8
// Update Count    : 0
9
// Status          : Unknown, Use with caution!
10
/////////////////////////////////////////////////////////////////////
11
////                                                             ////
12
//// Copyright (C) 2002 to Shawn Tan Ser Ngiap.                  ////
13
////                       shawn.tan@aeste.net                   ////
14
////                                                             ////
15
//// This source file may be used and distributed without        ////
16
//// restriction provided that this copyright statement is not   ////
17
//// removed from the file and that any derivative work contains ////
18
//// the original copyright notice and the associated disclaimer.////
19
////                                                             ////
20
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
21
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
22
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
23
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
24
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
25
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
26
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
27
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
28
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
29
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
30
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
31
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
32
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
33
////                                                             ////
34
/////////////////////////////////////////////////////////////////////
35
 
36
`include "k68_defines.v"
37
 
38
module k68_regbank (/*AUTOARG*/
39
   // Outputs
40
   rs_dat_o, rt_dat_o,
41
   // Inputs
42
   rs_add_i, rt_add_i, rd_add_i, clk_i, rst_i, we_i, rd_dat_i
43
   ) ;
44
 
45
   parameter dw = `k68_DATA_W;
46
   parameter gw = `k68_GPR_W;
47
 
48
   input [gw-1:0] rs_add_i, rt_add_i, rd_add_i;
49
   input          clk_i, rst_i, we_i;
50
 
51
   output [dw-1:0] rs_dat_o, rt_dat_o;
52
   input [dw-1:0]  rd_dat_i;
53
 
54
   reg [dw-1:0]    w_dat;
55
   reg [gw-1:0]    w_add;
56
   reg             we;
57
 
58
 
59
   k68_dpmem #(gw,dw) bank0(
60
                   .clk_i(clk_i), .rst_i(rst_i), .we_i(we),
61
                   .add_r_i(rs_add_i), .dat_r_o(rs_dat_o),
62
                   .add_w_i(w_add), .dat_w_i(w_dat)
63
                   );
64
 
65
   k68_dpmem #(gw,dw) bank1(
66
                   .clk_i(clk_i), .rst_i(rst_i), .we_i(we),
67
                   .add_r_i(rt_add_i), .dat_r_o(rt_dat_o),
68
                   .add_w_i(w_add), .dat_w_i(w_dat)
69
                   );
70
 
71
   always @(posedge clk_i) begin
72
      w_add <= rd_add_i;
73
      w_dat <= rd_dat_i;
74
      we <= we_i;
75
   end
76
 
77
endmodule // k68_regbank
78
 
79
 
80
//
81
// Dual Port Memory Submodule
82
//
83
 
84
module k68_dpmem(/*AUTOARG*/
85
   // Outputs
86
   dat_r_o,
87
   // Inputs
88
   add_r_i, add_w_i, dat_w_i, clk_i, rst_i, we_i
89
   );
90
   parameter gw = `k68_GPR_W;
91
   parameter dw = `k68_DATA_W;
92
 
93
   input [gw-1:0] add_r_i, add_w_i;
94
   input [dw-1:0] dat_w_i;
95
   output [dw-1:0] dat_r_o;
96
   input           clk_i, rst_i, we_i;
97
 
98
   wire [7:0]       r_add,w_add;
99
 
100
   assign          r_add = 8'hFF & add_r_i;
101
   assign          w_add = 8'hFF & add_w_i;
102
 
103
   reg [dw-1:0]    mem [(1<<gw)-1:0];
104
 
105
   // Synchronous Writes
106
   always @ (posedge clk_i)
107
     if (we_i) mem[add_w_i] <= dat_w_i;
108
 
109
   assign          dat_r_o = mem[add_r_i];
110
 
111
 
112
endmodule // dpmem

powered by: WebSVN 2.1.0

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