module io
#(
	parameter DW = 16,
	parameter AW = 12 
)(
	input			clk, //时钟
	input 			rst,  //同步复位,高电平有效
	input [DW-1:0]	din, //数据输入
	input [AW-1:0]	addr, //地址输入
	input			we, //高电平写使能
	output reg[DW-1:0] dout, //数据输出
	input wire [DW-1:0]gpio_in,//输入端口
	output wire [DW-1:0]gpio_out//输出端口
);

localparam GPI_A = 12'h000;
localparam GPO_A = 12'h001;
reg [DW-1:0]gpio_in_reg;
reg [DW-1:0]gpio_out_reg;
always @(posedge clk) begin
	gpio_in_reg <= gpio_in;
end
assign gpio_out=gpio_out_reg;

always @(posedge clk) begin
if(rst) begin
	gpio_out_reg <= 16'h0;
	dout <= 16'h0;
end	
else
	if(we)
		case (addr)
			GPO_A: gpio_out_reg <= din;
			default: ;
		endcase
	else
		case (addr)
			GPI_A: dout <= gpio_in_reg;
			default: dout <= 0;
		endcase
end

endmodule