A4092-dev/RTL/rom_access.v
2025-07-13 00:20:30 -07:00

52 lines
1.3 KiB
Verilog

`timescale 1ns / 1ps
module rom_access (
input wire CLK,
input wire RESET_n,
input wire rom_region,
input wire READ,
input wire FCS_n,
input wire shutup,
output reg rom_dtack,
output wire ROM_CE_n,
output wire ROM_OE_n,
output wire ROM_WE_n
);
// Match ROM space (0x000000 - 0x7FFFFF)
assign rom_selected = rom_region;
// Control ROM chip selects
assign ROM_CE_n = !(rom_selected && !shutup);
assign ROM_OE_n = !(rom_selected && READ && !FCS_n && !shutup);
assign ROM_WE_n = !(rom_selected && !READ && !FCS_n && !shutup);
// NACK timing FSM (3 state delay like U207)
reg [1:0] rom_state;
always @(posedge CLK or negedge RESET_n) begin
if (!RESET_n) begin
rom_state <= 2'd0;
rom_dtack <= 1'b0;
end else begin
case (rom_state)
2'd0: begin
rom_dtack <= 0;
if (rom_selected && !FCS_n)
rom_state <= 2'd1;
end
2'd1: rom_state <= 2'd2;
2'd2: begin
rom_dtack <= 1;
if (FCS_n)
rom_state <= 2'd0;
end
default: rom_state <= 2'd0;
endcase
end
end
endmodule