zxuno-git/cores/Spectrum/dp_memory.v

147 lines
3.2 KiB
Verilog

`timescale 1ns / 1ps
`default_nettype none
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 01:35:26 02/07/2014
// Design Name:
// Module Name: dp_memory
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module dp_memory (
input wire clk, // 28MHz
input wire [18:0] a1,
input wire [18:0] a2,
input wire oe1_n,
input wire oe2_n,
input wire we1_n,
input wire we2_n,
input wire [7:0] din1,
input wire [7:0] din2,
output wire [7:0] dout1,
output wire [7:0] dout2,
output reg [18:0] a,
inout wire [7:0] d,
output reg ce_n,
output reg oe_n,
output reg we_n
);
parameter
ACCESO_M1 = 1,
READ_M1 = 2,
WRITE_M1 = 3,
ACCESO_M2 = 4,
READ_M2 = 5,
WRITE_M2 = 6;
reg [7:0] data_to_write;
reg enable_input_to_sram;
reg [7:0] doutput1;
reg [7:0] doutput2;
reg write_in_dout1;
reg write_in_dout2;
reg [2:0] state = ACCESO_M1;
reg [2:0] next_state;
always @(posedge clk) begin
state <= next_state;
end
always @* begin
a = 0;
oe_n = 0;
we_n = 1;
ce_n = 0;
enable_input_to_sram = 0;
next_state = ACCESO_M1;
data_to_write = 8'h00;
write_in_dout1 = 0;
write_in_dout2 = 0;
case (state)
ACCESO_M1: begin
a = a1;
if (we1_n == 1) begin
next_state = READ_M1;
end
else begin
oe_n = 1;
next_state = WRITE_M1;
end
end
READ_M1: begin
if (we1_n == 1) begin
a = a1;
write_in_dout1 = 1;
end
next_state = ACCESO_M2;
end
WRITE_M1: begin
if (we1_n == 0) begin
a = a1;
enable_input_to_sram = 1;
data_to_write = din1;
oe_n = 1;
we_n = 0;
end
next_state = ACCESO_M2;
end
ACCESO_M2: begin
a = a2;
if (we2_n == 1) begin
next_state = READ_M2;
end
else begin
oe_n = 1;
next_state = WRITE_M2;
end
end
READ_M2: begin
if (we2_n == 1) begin
a = a2;
write_in_dout2 = 1;
end
next_state = ACCESO_M1;
end
WRITE_M2: begin
if (we2_n == 0) begin
a = a2;
enable_input_to_sram = 1;
data_to_write = din2;
oe_n = 1;
we_n = 0;
end
next_state = ACCESO_M1;
end
endcase
end
assign d = (enable_input_to_sram)? data_to_write : 8'hZZ;
assign dout1 = (oe1_n)? 8'hZZ : doutput1;
assign dout2 = (oe2_n)? 8'hZZ : doutput2;
always @(posedge clk) begin
if (write_in_dout1)
doutput1 <= d;
else if (write_in_dout2)
doutput2 <= d;
end
endmodule