Professional Documents
Culture Documents
I2C Master Writeread PDF
I2C Master Writeread PDF
module I2C_master(clk, start, reset, write_data, read_data, write, address, ready, error, sda,
scl);
wire sda_in;
reg sda_dir;
reg sda_out;
//cstate block
always@(*) begin
if(reset)
cstate <= idle;
else
cstate <= nstate;
end
end
write_a: begin
sda_dir <= 1;
if(done_address == 0) begin//send address
sda_out <= to_out[counter - 4'd1]; //(address)
counter <= counter - 4'd1;
nstate <= write_b;
if (ack == 1) begin
error <= 1;
nstate <= stop_a;
end else begin
done_address <= 1'b1;
counter <= 4'd8;
if (write == 1) begin
to_out <= write_data;
nstate <= write_a;
end else
nstate <= read_a; // read data
end
end else begin
if(write == 1) begin //receive ack
if(ack == 1) begin
error <= 1 ;
nstate <= stop_a;
end else begin
if (done_address == 1'b1)
nstate <= stop_a;
end
end
else begin //receive data
to_out[counter - 4'd1] <= sda_in;
counter <= counter - 4'd1;
if( counter == 0) begin
read_data <= to_out;
nstate <= write_a;
end
else
nstate <= read_a;
end
end
end
stop_a: begin
sda_dir <= 1;
sda_out <= 0;
nstate <= stop_b;
end
stop_b: begin
scl <= 1;
nstate <= stop_c;
end
stop_c: begin
sda_out <=1;
nstate <= idle;
ready <= 1;
end
default: begin
sda_dir <= 0;
ready <= 0;
error <= 0;
sda_out <= 0;
scl <= 1;
counter <= 0;
ack <= 0;
to_out <= 0;
end
endcase
end
end
endmodule