SummerCart64/fw/rtl/cpu/cpu_gpio.sv
Polprzewodnikowy 494707a60b ok
2021-08-12 21:07:47 +02:00

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