1
0
mirror of https://github.com/UzixLS/zx-tsid.git synced 2025-07-18 23:01:33 +03:00
Files
zx-tsid/cpld/rev.D/top.v

122 lines
2.6 KiB
Verilog

module top(
input rst_n,
input clkcpu,
input clk32,
input [15:0] a,
inout [7:0] d,
input n_rd,
input n_wr,
input n_iorq,
output n_iorqge,
output reg n_wait = 1'bz,
input cfg,
output reg [4:0] sid_a,
inout [7:0] sid_d,
output sid_clk,
output sid_rst,
output reg sid_cs = 1'b1,
output reg sid_wr = 1'b1
);
assign sid_rst = rst_n;
reg [4:0] sid_clk_cnt = 0;
assign sid_clk = sid_clk_cnt[4];
always @(posedge clk32)
sid_clk_cnt <= sid_clk_cnt + 1'b1;
wire port_cf = a[7:0] == 8'hCF;
reg iowr, iord;
always @(posedge clk32) begin
iowr <= port_cf && n_iorq == 1'b0 && n_wr == 1'b0;
iord <= port_cf && n_iorq == 1'b0 && n_rd == 1'b0;
end
localparam ST_IDLE = 3'd0;
localparam ST_WR0 = 3'd1;
localparam ST_WR1 = 3'd2;
localparam ST_RD0 = 3'd3;
localparam ST_RD1 = 3'd4;
localparam ST_CYCLE_END = 3'd5;
reg [2:0] st;
reg [7:0] sid_d_latch;
always @(posedge clk32 or negedge rst_n) begin
if (!rst_n) begin
sid_cs <= 1'b1;
sid_wr <= 1'b1;
sid_a <= 0;
sid_d_latch <= 0;
n_wait <= 1'bz;
st <= ST_IDLE;
end
else case (st)
ST_IDLE: begin
if (iowr) begin
sid_a <= a[12:8];
sid_d_latch <= d;
sid_wr <= 1'b0;
if (sid_clk_cnt == 20) begin
sid_cs <= 1'b0;
st <= ST_WR1;
end
else begin
st <= ST_WR0;
end
end
else if (iord) begin
sid_a <= a[12:8];
n_wait <= 1'b0;
if (sid_clk_cnt == 20) begin
sid_cs <= 1'b0;
st <= ST_RD1;
end
else begin
st <= ST_RD0;
end
end
end
ST_WR0: begin
if (sid_clk_cnt == 20) begin
sid_cs <= 1'b0;
st <= ST_WR1;
end
end
ST_WR1: begin
if (sid_clk_cnt == 0) begin
sid_cs <= 1'b1;
sid_wr <= 1'b1;
st <= ST_CYCLE_END;
end
end
ST_RD0: begin
if (sid_clk_cnt == 20) begin
sid_cs <= 1'b0;
st <= ST_RD1;
end
end
ST_RD1: begin
if (sid_clk_cnt == 0) begin
sid_cs <= 1'b1;
sid_d_latch <= sid_d;
n_wait <= 1'bz;
st <= ST_CYCLE_END;
end
end
ST_CYCLE_END: begin
if (!iord && !iowr)
st <= ST_IDLE;
end
endcase
end
assign sid_d = (sid_wr == 1'b0)? sid_d_latch : 8'bzzzzzzzz;
assign d = (port_cf && n_iorq == 1'b0 && n_rd == 1'b0 && n_wr == 1'b1)? sid_d_latch : 8'bzzzzzzzz;
assign n_iorqge = 1'bz;
endmodule