// rtl program for i2c_gpio.v
|
// rtl program for i2c_gpio.v
|
|
|
`define P0_P9_OP 4'b1010 //0x0A
|
`define P0_P9_OP 4'b1010 //0x0A
|
//`define P0_P3_OP 4'b1011 //0x0B
|
//`define P0_P3_OP 4'b1011 //0x0B
|
`define P0_P3_OP 4'b0111 //0x07
|
`define P0_P3_OP 4'b0111 //0x07
|
`define P4_P7_OP 4'b1110 //0xE0
|
`define P4_P7_OP 4'b1110 //0xE0
|
//`define P8_P9_OP 4'b1101 //0x0D
|
//`define P8_P9_OP 4'b1101 //0x0D
|
|
|
module i2c_gpio(clk, cs, sr_in, sda_out, sr_out, gpio);
|
module i2c_gpio(clk, cs, sr_in, sda_out, sr_out, gpio);
|
|
|
input clk,cs;
|
input clk,cs;
|
input sr_in;
|
input sr_in;
|
output sda_out;
|
output sda_out;
|
output sr_out;
|
output sr_out;
|
output [7:0] gpio;
|
output [7:0] gpio;
|
|
|
reg [7:0] sr;
|
reg [7:0] sr;
|
reg [7:0] addrreg;
|
reg [7:0] addrreg;
|
reg sda_out;
|
reg sda_out;
|
reg sr_out ;
|
reg sr_out ;
|
reg [7:0] gpio;
|
reg [7:0] gpio;
|
reg [7:0] ram;
|
reg [7:0] ram;
|
wire [3:0] addr;
|
wire [3:0] addr;
|
wire [3:0] data;
|
wire [3:0] data;
|
|
|
assign addr = sr[3:0];
|
assign addr = sr[3:0];
|
assign data = sr[7:4];
|
assign data = sr[7:4];
|
always@(posedge clk)
|
always@(posedge clk)
|
begin
|
begin
|
if (cs == 1'b0)
|
if (cs == 1'b0)
|
begin
|
begin
|
sr_out <= sr[7];
|
sr_out <= sr[7];
|
sr[7:1] <= sr[6:0];
|
sr[7:1] <= sr[6:0];
|
sr[0] <= sr_in;
|
sr[0] <= sr_in;
|
end
|
end
|
begin
|
begin
|
if (addr[0] == 1'b0) // low bit zero - start bit
|
if (addr[0] == 1'b0) // low bit zero - start bit
|
begin
|
begin
|
if(addr[3:0] == 4'h0E) // 0xD is the address of the slave
|
if(addr[3:0] == 4'h0E) // 0xD is the address of the slave
|
begin
|
begin
|
sda_out = 1'b1; // high bit for Acknowledge to master
|
sda_out = 1'b1; // high bit for Acknowledge to master
|
if(addr[3]== 1'b1) // high bit for write
|
if(addr[3]== 1'b1) // high bit for write
|
begin
|
begin
|
case (addr[3:0]) // data[3:0] for data write
|
case (addr[3:0]) // data[3:0] for data write
|
// `P0_P9_OP : gpio[7:4] <= {sr[0], sr[1], sr[2], sr[3], sr[4], sr[5], sr[6], sr[7]};
|
// `P0_P9_OP : gpio[7:4] <= {sr[0], sr[1], sr[2], sr[3], sr[4], sr[5], sr[6], sr[7]};
|
`P0_P3_OP : gpio[3:0] <= {data[0], data[1], data[2], data[3]};
|
`P0_P3_OP : gpio[3:0] <= {data[0], data[1], data[2], data[3]};
|
`P4_P7_OP : gpio[3:0] <= {data[3], data[2], data[1], data[0]};
|
`P4_P7_OP : gpio[3:0] <= {data[3], data[2], data[1], data[0]};
|
// `P8_P9_OP : gpio[9:8] <= {sr[0], sr[0]};
|
// `P8_P9_OP : gpio[9:8] <= {sr[0], sr[0]};
|
// default : gpio[7:0] <= {sr[0], sr[0], sr[0], sr[0],
|
// default : gpio[7:0] <= {sr[0], sr[0], sr[0], sr[0],
|
// sr[0], sr[0], sr[0], sr[0]};
|
// sr[0], sr[0], sr[0], sr[0]};
|
endcase
|
endcase
|
sda_out = 1'b1; // high bit for Acknowledge master
|
sda_out = 1'b1; // high bit for Acknowledge master
|
end
|
end
|
else
|
else
|
begin
|
begin
|
sda_out = 1'bz;
|
sda_out = 1'bz;
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
endmodule
|
endmodule
|
|
|
|
|
|
|