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

Subversion Repositories mcs-4

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 rrpollack
`timescale 1ns / 1ps
2
`default_nettype none
3
////////////////////////////////////////////////////////////////////////
4
//
5
// MCS-4 i4002 RAM storage
6
//
7
// This module defines the RAM allocated to a single i4002 register,
8
// containing 16x4-bit "main" memory array and a 4x4-bit "status"
9
// array. An i4002 RAM chip contains four of these RAM register modules.
10
//
11
// This implementation allocates a single 20x4-bit dual-port
12
// RAM: ram_array. The "main" memory array is represented by the
13
// elements [0:15] of ram_array, while the "status" array is
14
// represented by elements [16:19].
15
//
16
// This module defines a dual-port array to allow the VFD driver access
17
// to the "Working Register", WR, which is stored in RAM0 register 1.
18
// The synthesis tools should recognize theinstantiations that do not
19
// need to be dual-port and trim the unneeded logic and storage.
20
//
21
// This file is part of the MCS-4 project hosted at OpenCores:
22
//      http://www.opencores.org/cores/mcs-4/
23
//
24
// Copyright © 2021 by Reece Pollack <rrpollack@opencores.org>
25
//
26
// These materials are provided under the Creative Commons
27
// "Attribution-NonCommercial-ShareAlike" (CC BY-NC-SA) Public License.
28
// They are NOT "public domain", and are protected by copyright.
29
//
30
// This work based on materials provided by Intel Corporation and
31
// others under the same license. See the file doc/License for
32
// details of this license.
33
//
34
////////////////////////////////////////////////////////////////////////
35
 
36
module i4002_ram #(
37
    parameter   RAM_ARRAY_SIZE = 32 // Size of the RAM array
38
    ) (
39
    input  wire         sysclk,
40
    input  wire [4:0]   addr,       // Address
41
    input  wire         write,      // Write Enable
42
    input  wire [3:0]   data_in,    // Data input to write
43
    output wire [3:0]   data_out,   // Data output (unregistered)
44
 
45
    input  wire [4:0]   addr2,      // 2nd port address
46
    output wire [3:0]   data2_out   // 2nd port data output (unregisted)
47
    );
48
 
49
    //
50
    // Infer a 32x4 distributed dual-port RAM
51
    //
52
    // The "status" characters are stored in [16:19]
53
    //
54
    (* ram_style="distributed" *)
55
    reg  [3:0]  ram_array [0:(RAM_ARRAY_SIZE-1)];
56
    always @(posedge sysclk) begin
57
        if (write) begin
58
            ram_array[addr] <= data_in;
59
        end
60
    end
61
    assign data_out  = ram_array[addr];
62
    assign data2_out = ram_array[addr2];
63
 
64
`ifdef XILINX_ISIM
65
    // Pre-initialize the RAM
66
    genvar i;
67
    generate
68
        for (i = 0; i < RAM_ARRAY_SIZE; i = i + 1) begin : initial_ram
69
            initial ram_array[i] = 4'bxxxx;
70
        end
71
    endgenerate
72
`endif
73
 
74
endmodule

powered by: WebSVN 2.1.0

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