mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-27 08:04:14 +01:00
42 lines
1.1 KiB
Systemverilog
42 lines
1.1 KiB
Systemverilog
|
module cpu_gpio (
|
||
|
if_system.sys system_if,
|
||
|
if_cpu_bus_out cpu_bus_if,
|
||
|
if_cpu_bus_in cpu_gpio_if,
|
||
|
|
||
|
input [7:0] gpio_i,
|
||
|
output reg [7:0] gpio_o,
|
||
|
output reg [7:0] gpio_oe
|
||
|
);
|
||
|
|
||
|
wire request;
|
||
|
wire [31:0] rdata;
|
||
|
|
||
|
cpu_bus_glue #(.ADDRESS(4'hE)) cpu_bus_glue_gpio_inst (
|
||
|
.*,
|
||
|
.cpu_peripheral_if(cpu_gpio_if),
|
||
|
.request(request),
|
||
|
.rdata(rdata)
|
||
|
);
|
||
|
|
||
|
reg [7:0] gpio_i_ff1, gpio_i_ff2;
|
||
|
reg [7:0] gpio_o_value;
|
||
|
reg [7:0] gpio_oe_value;
|
||
|
|
||
|
assign rdata = {8'd0, gpio_oe_value, gpio_i_ff2, gpio_o_value};
|
||
|
|
||
|
always_ff @(posedge system_if.clk) begin
|
||
|
{gpio_i_ff2, gpio_i_ff1} <= {gpio_i_ff1, gpio_i};
|
||
|
gpio_o <= gpio_o_value;
|
||
|
gpio_oe <= gpio_oe_value;
|
||
|
|
||
|
if (system_if.reset) begin
|
||
|
gpio_o_value <= 8'd0;
|
||
|
gpio_oe_value <= 8'd0;
|
||
|
end else if (request) begin
|
||
|
if (cpu_bus_if.wstrb[0]) gpio_o_value <= cpu_bus_if.wdata[7:0];
|
||
|
if (cpu_bus_if.wstrb[2]) gpio_oe_value <= cpu_bus_if.wdata[23:16];
|
||
|
end
|
||
|
end
|
||
|
|
||
|
endmodule
|