OpenCores
URL https://opencores.org/ocsvn/mcs-4/mcs-4/trunk

Subversion Repositories mcs-4

[/] [mcs-4/] [trunk/] [rtl/] [verilog/] [i4004/] [scratchpad.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rrpollack
`timescale 1ns / 1ps
2
`default_nettype none
3
////////////////////////////////////////////////////////////////////////
4 6 rrpollack
//
5 2 rrpollack
// 4004 Scratchpad Register Array
6 6 rrpollack
//
7 2 rrpollack
// This file is part of the MCS-4 project hosted at OpenCores:
8
//      http://www.opencores.org/cores/mcs-4/
9 6 rrpollack
//
10
// Copyright © 2012, 2021 by Reece Pollack <rrpollack@opencores.org>
11
//
12 2 rrpollack
// These materials are provided under the Creative Commons
13 6 rrpollack
// "Attribution-NonCommercial-ShareAlike" (CC BY-NC-SA) Public License.
14
// They are NOT "public domain", and are protected by copyright.
15
//
16 2 rrpollack
// This work based on materials provided by Intel Corporation and
17
// others under the same license. See the file doc/License for
18
// details of this license.
19
//
20
////////////////////////////////////////////////////////////////////////
21
 
22
module scratchpad (
23 6 rrpollack
    input  wire         sysclk,                 // 50 MHz FPGA clock
24 2 rrpollack
 
25 6 rrpollack
    // Inputs from the Timing and I/O board
26
    input  wire         clk1,
27
    input  wire         clk2,
28
    input  wire         a12,
29
    input  wire         a22,
30
    input  wire         a32,
31
    input  wire         m12,
32
    input  wire         m22,
33
    input  wire         x12,
34
    input  wire         x22,
35
    input  wire         x32,
36
    input  wire         poc,                    // Power-On Clear (reset)
37
    input  wire         m12_m22_clk1_m11_m12,   // M12+M22+CLK1~(M11+M12)
38 2 rrpollack
 
39 6 rrpollack
    // Common 4-bit data bus
40
    inout  wire [3:0]   data,
41 2 rrpollack
 
42 6 rrpollack
    // Inputs from the Instruction Decode board
43
    input  wire         n0636,                  // JIN+FIN
44
    input  wire         sc_m22_clk2,            // SC&M22&CLK2
45
    input  wire         fin_fim_src_jin,        // FIN+FIM+SRC+JIN
46
    input  wire         inc_isz_add_sub_xch_ld, // INC+ISZ+ADD+SUB+XCH+LD
47
    input  wire         inc_isz_xch,            // INC+ISZ+XCH
48
    input  wire         opa0_n,                 // ~OPA.0
49
    input  wire         sc,                     // SC (Single Cycle)
50
    input  wire         dc                      // DC (Double Cycle, ~SC)
51
    );
52 2 rrpollack
 
53 6 rrpollack
    reg  [7:0]  dram_array [0:7];
54
    reg  [7:0]  dram_temp;
55
    reg  [3:0]  din_n;
56 2 rrpollack
 
57 6 rrpollack
    // Refresh counter stuff
58
    wire [2:0]  reg_rfsh;               // Row Refresh counter
59
    wire        reg_rfsh_step;          // SC&A12&CLK2
60
    wire        n0571;
61
    wire        n0574;
62
    wire        n0600;
63
    wire        n0610;
64 2 rrpollack
 
65 6 rrpollack
    assign reg_rfsh_step = sc & a12 & clk2;
66 2 rrpollack
 
67 6 rrpollack
    counter reg_rfsh_0 (
68
        .sysclk(sysclk),
69
        .step_a_in(clk1),
70
        .step_b_in(reg_rfsh_step),
71
        .step_a_out(n0571),
72
        .step_b_out(n0574),
73
        .q(reg_rfsh[0]),
74
        .qn()
75
    );
76
    counter reg_rfsh_1 (
77
        .sysclk(sysclk),
78
        .step_a_in(n0571),
79
        .step_b_in(n0574),
80
        .step_a_out(n0600),
81
        .step_b_out(n0610),
82
        .q(reg_rfsh[1]),
83
        .qn()
84
    );
85
    counter reg_rfsh_2 (
86
        .sysclk(sysclk),
87
        .step_a_in(n0600),
88
        .step_b_in(n0610),
89
        .step_a_out(),
90
        .step_b_out(),
91
        .q(reg_rfsh[2]),
92
        .qn()
93
    );
94 2 rrpollack
 
95 6 rrpollack
    // Row selection mux
96
    reg  [2:0]  row;                    // {N0646, N0617, N0582}
97
    always @(posedge sysclk) begin
98
        if (sc & a22)
99
            row <= reg_rfsh;
100
        if (sc_m22_clk2)
101
            row <= data[3:1];
102
    end
103 2 rrpollack
 
104
 
105 6 rrpollack
    // Row Precharge/Read/Write stuff
106
    wire        precharge;              // SC(A22+M22)CLK2
107
    wire        row_read;               // (~POC)&CLK2&SC(A32+X12)
108
    wire        row_write;              // CLK2&SC(A12+M12)
109 2 rrpollack
 
110 6 rrpollack
    assign precharge = sc & (a22 | m22) & clk2;
111
    assign row_read  = ~(poc | ~(clk2 & sc & (a32 | x12)));
112
    assign row_write = sc & (a12 | m12) & clk2;
113 2 rrpollack
 
114
 
115 6 rrpollack
    // Column Read selection stuff
116
    reg n0615;
117
    always @(posedge sysclk) begin
118
        if (clk2)
119
            n0615 <= ~(x12 & (fin_fim_src_jin |
120
                    (opa0_n & inc_isz_add_sub_xch_ld)));
121
    end
122
    wire rrab0 = ~(dc | n0615 | clk2);
123 2 rrpollack
 
124 6 rrpollack
    reg n0592;
125
    always @(posedge sysclk) begin
126
        if (clk2)
127
            n0592 <= ~((x22 & fin_fim_src_jin) |
128
                    (~opa0_n & x12 & inc_isz_add_sub_xch_ld));
129
    end
130
    wire rrab1 = ~(dc | n0592 | clk2);
131 2 rrpollack
 
132
 
133 6 rrpollack
    // Column Write selection stuff
134
    wire n0564 = opa0_n & fin_fim_src_jin & dc;
135
    wire n0568 = inc_isz_xch & x32 & sc;
136
    wire wrab0 = clk2 & ((m12 & n0564) | ( opa0_n & n0568));
137
    wire wrab1 = clk2 & ((m22 & n0564) | (~opa0_n & n0568));
138 4 rrpollack
 
139 2 rrpollack
 
140 6 rrpollack
    // Force row 0 if FIN&X12
141
    wire fin_x12 = (n0636 & opa0_n) & x12;
142 2 rrpollack
 
143 6 rrpollack
    // Manage the row data buffer
144
    wire [7:0] row_data = dram_array[fin_x12 ? 3'b000 : row];
145
    always @(posedge sysclk) begin
146
        if (precharge)
147
            dram_temp <= 8'b0;
148 2 rrpollack
 
149 6 rrpollack
        if (row_read)
150
            dram_temp <= row_data;
151
 
152
        if (wrab0)
153
            dram_temp[ 7:4] <= ~din_n;
154
        if (wrab1)
155
            dram_temp[ 3:0] <= ~din_n;
156
    end
157
 
158
    // Handle row writes
159
    always @(posedge sysclk) begin
160
        if (row_write)
161
            dram_array[row] <= dram_temp;
162
    end
163
 
164
    // Manage the data output mux
165
    reg   [3:0] dout;
166
    always @* begin
167
        (* PARALLEL_CASE *)
168
        case (1'b1)
169
            rrab0:      dout = dram_temp[ 7:4];
170
            rrab1:      dout = dram_temp[ 3:0];
171
            default:    dout = 4'bzzzz;
172
        endcase
173
    end
174
    assign data = dout;
175
 
176
    // Data In latch
177
    always @(posedge sysclk) begin
178
        if (m12_m22_clk1_m11_m12)
179
            din_n <= ~data;
180
    end
181
 
182 2 rrpollack
endmodule

powered by: WebSVN 2.1.0

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