OpenCores
URL https://opencores.org/ocsvn/apbi2c/apbi2c/trunk

Subversion Repositories apbi2c

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 19 to Rev 20
    Reverse comparison

Rev 19 → Rev 20

/apbi2c/trunk/rtl/i2c.v
91,6 → 91,8
output INT_TX,
output [31:0] PRDATA,
//I2C OUTPUT
output SDA_ENABLE,
output SCL_ENABLE,
inout SDA,
inout SCL
 
118,9 → 120,12
 
 
wire [13:0] REGISTER_CONFIG;
wire [13:0] TIMEOUT_CONFIG;
 
 
wire error;
 
 
wire tx_empty;
wire rx_empty;
 
176,6 → 181,7
.PSLVERR(PSLVERR),
.READ_DATA_ON_RX(RX_DATA_OUT),
.INTERNAL_I2C_REGISTER_CONFIG(REGISTER_CONFIG),
.INTERNAL_I2C_REGISTER_TIMEOUT(TIMEOUT_CONFIG),
.INT_RX(INT_RX),
.WR_ENA(TX_WRITE_ENA),
.WRITE_DATA_ON_TX(TX_DATA_IN),
188,22 → 194,26
);
 
//I2C CORE BLOCK WITH ALL ANOTHER BLOCKS
module_i2c DUT_I2C_INTERNAL (
module_i2c DUT_I2C_INTERNAL_RX_TX (
.PCLK(PCLK),
.PRESETn(PRESETn),
.fifo_tx_rd_en(TX_RD_EN),
.fifo_tx_f_full(TX_F_FULL),
.fifo_tx_f_empty(TX_F_EMPTY),
.fifo_tx_data_out(TX_DATA_OUT),
.fifo_rx_wr_en(RX_WRITE_ENA),
.fifo_rx_f_empty(RX_F_EMPTY),
.fifo_rx_data_in(RX_DATA_IN),
.fifo_rx_f_full(RX_F_FULL),
.fifo_tx_f_full(TX_F_FULL),
.fifo_tx_f_empty(TX_F_EMPTY),
.fifo_tx_rd_en(TX_RD_EN),
.fifo_tx_data_out(TX_DATA_OUT),
.DATA_CONFIG_REG(REGISTER_CONFIG),
.TX_EMPTY(tx_empty),
.TIMEOUT_TX(TIMEOUT_CONFIG),
.RX_EMPTY(rx_empty),
.TX_EMPTY(tx_empty),
.ERROR(error),
.ENABLE_SDA(SDA_ENABLE),
.ENABLE_SCL(SCL_ENABLE),
.SDA(SDA),
.SCL(SCL)
);
 
endmodule
/apbi2c/trunk/rtl/module_i2c.v
100,12 → 100,15
 
//INTERFACE WITH REGISTER CONFIGURATION
input [AWIDTH-1:0] DATA_CONFIG_REG,
input [AWIDTH-1:0] TIMEOUT_TX,
//INTERFACE TO APB AND READ FOR FIFO TX
//INTERFACE TO APB AND READ FOR FIFO
output reg fifo_tx_rd_en,
output TX_EMPTY,
output RX_EMPTY,
output TX_EMPTY,
output RX_EMPTY,
output ERROR,
output ENABLE_SDA,
output ENABLE_SCL,
 
//I2C BI DIRETIONAL PORTS
inout SDA,
120,71 → 123,77
 
//THIS COUNT IS USED TO CONTROL DATA ACCROSS FSM
reg [1:0] count_tx;
reg [1:0] count_rx;
//CONTROL CLOCK AND COUNTER
reg [11:0] count_send_data;
reg [11:0] count_receive_data;
reg [11:0] count_timeout;
reg BR_CLK_O;
reg SDA_OUT;
 
reg BR_CLK_O_RX;
reg SDA_OUT_RX;
 
//RESPONSE USED TO HOLD SIGNAL TO ACK OR NACK
reg RESPONSE;
 
// TX PARAMETERS USED TO STATE MACHINE
// PARAMETERS USED TO STATE MACHINE
 
localparam [5:0] RX_TX_IDLE = 6'd0, //IDLE
localparam [5:0] IDLE = 6'd0, //IDLE
 
RX_TX_START = 6'd1,//START BIT
START = 6'd1,//START BIT
 
RX_TX_CONTROLIN_1 = 6'd2, //START BYTE
RX_TX_CONTROLIN_2 = 6'd3,
RX_TX_CONTROLIN_3 = 6'd4,
RX_TX_CONTROLIN_4 = 6'd5,
RX_TX_CONTROLIN_5 = 6'd6,
RX_TX_CONTROLIN_6 = 6'd7,
RX_TX_CONTROLIN_7 = 6'd8,
RX_TX_CONTROLIN_8 = 6'd9, //END FIRST BYTE
CONTROLIN_1 = 6'd2, //START BYTE
CONTROLIN_2 = 6'd3,
CONTROLIN_3 = 6'd4,
CONTROLIN_4 = 6'd5,
CONTROLIN_5 = 6'd6,
CONTROLIN_6 = 6'd7,
CONTROLIN_7 = 6'd8,
CONTROLIN_8 = 6'd9, //END FIRST BYTE
 
RX_TX_RESPONSE_CIN =6'd10, //RESPONSE
RESPONSE_CIN =6'd10, //RESPONSE
 
RX_TX_ADRESS_1 = 6'd11,//START BYTE
RX_TX_ADRESS_2 = 6'd12,
RX_TX_ADRESS_3 = 6'd13,
RX_TX_ADRESS_4 = 6'd14,
RX_TX_ADRESS_5 = 6'd15,
RX_TX_ADRESS_6 = 6'd16,
RX_TX_ADRESS_7 = 6'd17,
RX_TX_ADRESS_8 = 6'd18,//END FIRST BYTE
ADDRESS_1 = 6'd11,//START BYTE
ADDRESS_2 = 6'd12,
ADDRESS_3 = 6'd13,
ADDRESS_4 = 6'd14,
ADDRESS_5 = 6'd15,
ADDRESS_6 = 6'd16,
ADDRESS_7 = 6'd17,
ADDRESS_8 = 6'd18,//END FIRST BYTE
 
RX_TX_RESPONSE_ADRESS =6'd19, //RESPONSE
RESPONSE_ADDRESS =6'd19, //RESPONSE
 
RX_TX_DATA0_1 = 6'd20,//START BYTE
RX_TX_DATA0_2 = 6'd21,
RX_TX_DATA0_3 = 6'd22,
RX_TX_DATA0_4 = 6'd23,
RX_TX_DATA0_5 = 6'd24,
RX_TX_DATA0_6 = 6'd25,
RX_TX_DATA0_7 = 6'd26,
RX_TX_DATA0_8 = 6'd27,//END FIRST BYTE
DATA0_1 = 6'd20,//START BYTE
DATA0_2 = 6'd21,
DATA0_3 = 6'd22,
DATA0_4 = 6'd23,
DATA0_5 = 6'd24,
DATA0_6 = 6'd25,
DATA0_7 = 6'd26,
DATA0_8 = 6'd27,//END FIRST BYTE
 
RX_TX_RESPONSE_DATA0_1 = 6'd28, //RESPONSE
RESPONSE_DATA0_1 = 6'd28, //RESPONSE
RX_TX_DATA1_1 = 6'd29,//START BYTE
RX_TX_DATA1_2 = 6'd30,
RX_TX_DATA1_3 = 6'd31,
RX_TX_DATA1_4 = 6'd32,
RX_TX_DATA1_5 = 6'd33,
RX_TX_DATA1_6 = 6'd34,
RX_TX_DATA1_7 = 6'd35,
RX_TX_DATA1_8 = 6'd36,//END FIRST BYTE
DATA1_1 = 6'd29,//START BYTE
DATA1_2 = 6'd30,
DATA1_3 = 6'd31,
DATA1_4 = 6'd32,
DATA1_5 = 6'd33,
DATA1_6 = 6'd34,
DATA1_7 = 6'd35,
DATA1_8 = 6'd36,//END FIRST BYTE
 
RX_TX_RESPONSE_DATA1_1 = 6'd37,//RESPONSE
RESPONSE_DATA1_1 = 6'd37,//RESPONSE
 
RX_TX_DELAY_BYTES = 6'd38,//USED ONLY IN ACK TO DELAY BETWEEN
RX_TX_NACK = 6'd39,//USED ONLY IN ACK TO DELAY BETWEEN BYTES
RX_TX_STOP = 6'd40;//USED TO SEND STOP BIT
DELAY_BYTES = 6'd38,//USED ONLY IN ACK TO DELAY BETWEEN
NACK = 6'd39,//USED ONLY IN ACK TO DELAY BETWEEN BYTES
STOP = 6'd40;//USED TO SEND STOP BIT
 
//STATE CONTROL
reg [5:0] state_tx_rx;
reg [5:0] next_state_tx_rx;
reg [5:0] state_tx;
reg [5:0] next_state_tx;
 
//ASSIGN REGISTERS TO BIDIRETIONAL PORTS
assign SDA = (DATA_CONFIG_REG[0] == 1'b1 & DATA_CONFIG_REG[1] == 1'b0)?SDA_OUT:1'b0;
193,481 → 202,482
//STANDARD ERROR
assign ERROR = (DATA_CONFIG_REG[0] == 1'b1 & DATA_CONFIG_REG[1] == 1'b1)?1'b1:1'b0;
 
//COMBINATIONAL BLOCK TO TX
 
//COMBINATIONAL BLOCK TO
always@(*)
begin
 
//THE FUN START HERE :-)
//COMBINATIONAL UPDATE STATE BE CAREFUL WITH WHAT YOU MAKE HERE
next_state_tx_rx = state_tx_rx;
next_state_tx=state_tx;
 
case(state_tx_rx)//state_tx_rx IS MORE SECURE CHANGE ONLY IF YOU KNOW WHAT ARE YOU DOING
RX_TX_IDLE:
case(state_tx)//state_ IS MORE SECURE CHANGE ONLY IF YOU KNOW WHAT ARE YOU DOING
IDLE:
begin
//OBEYING SPEC
if(DATA_CONFIG_REG[0] == 1'b0 && (fifo_tx_f_full == 1'b1 || fifo_tx_f_empty == 1'b0) && DATA_CONFIG_REG[1] == 1'b0)
begin
next_state_tx_rx = RX_TX_IDLE;
next_state_tx = IDLE;
end
else if(DATA_CONFIG_REG[0] == 1'b1 && (fifo_tx_f_full == 1'b1 || fifo_tx_f_empty == 1'b0) && DATA_CONFIG_REG[1] == 1'b1)
begin
next_state_tx_rx = RX_TX_IDLE;
next_state_tx = IDLE;
end
else if(DATA_CONFIG_REG[0] == 1'b1 && (fifo_tx_f_full == 1'b1 || fifo_tx_f_empty == 1'b0) && DATA_CONFIG_REG[1] == 1'b0)
else if(DATA_CONFIG_REG[0] == 1'b1 && (fifo_tx_f_full == 1'b1 || fifo_tx_f_empty == 1'b0) && DATA_CONFIG_REG[1] == 1'b0 && count_timeout < TIMEOUT_TX)
begin
next_state_tx_rx = RX_TX_START;
next_state_tx = START;
end
 
 
end
RX_TX_START://THIS IS USED TOO ALL STATE MACHINES THE COUNTER_SEND_DATA
START://THIS IS USED TOO ALL STATE MACHINES THE COUNTER_SEND_DATA
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_START;
next_state_tx = START;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_1;
next_state_tx = CONTROLIN_1;
end
end
RX_TX_CONTROLIN_1:
CONTROLIN_1:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_1;
next_state_tx = CONTROLIN_1;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_2;
next_state_tx = CONTROLIN_2;
end
 
end
RX_TX_CONTROLIN_2:
CONTROLIN_2:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_2;
next_state_tx = CONTROLIN_2;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_3;
next_state_tx = CONTROLIN_3;
end
 
end
RX_TX_CONTROLIN_3:
CONTROLIN_3:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_3;
next_state_tx = CONTROLIN_3;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_4;
next_state_tx = CONTROLIN_4;
end
end
RX_TX_CONTROLIN_4:
CONTROLIN_4:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_4;
next_state_tx = CONTROLIN_4;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_5;
next_state_tx = CONTROLIN_5;
end
end
RX_TX_CONTROLIN_5:
CONTROLIN_5:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_5;
next_state_tx = CONTROLIN_5;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_6;
next_state_tx = CONTROLIN_6;
end
end
RX_TX_CONTROLIN_6:
CONTROLIN_6:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_6;
next_state_tx = CONTROLIN_6;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_7;
next_state_tx = CONTROLIN_7;
end
end
RX_TX_CONTROLIN_7:
CONTROLIN_7:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_7;
next_state_tx = CONTROLIN_7;
end
else
begin
next_state_tx_rx = RX_TX_CONTROLIN_8;
next_state_tx = CONTROLIN_8;
end
end
RX_TX_CONTROLIN_8:
CONTROLIN_8:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_CONTROLIN_8;
next_state_tx = CONTROLIN_8;
end
else
begin
next_state_tx_rx = RX_TX_RESPONSE_CIN;
next_state_tx = RESPONSE_CIN;
end
end
RX_TX_RESPONSE_CIN:
RESPONSE_CIN:
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_RESPONSE_CIN;
next_state_tx = RESPONSE_CIN;
end
else if(RESPONSE == 1'b0)//ACK
begin
next_state_tx_rx = RX_TX_DELAY_BYTES;
next_state_tx = DELAY_BYTES;
end
else if(RESPONSE == 1'b1)//NACK
begin
next_state_tx_rx = RX_TX_NACK;
next_state_tx = NACK;
end
end
 
//NOW SENDING ADDRESS
RX_TX_ADRESS_1:
ADDRESS_1:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_1;
next_state_tx = ADDRESS_1;
end
else
begin
next_state_tx_rx = RX_TX_ADRESS_2;
next_state_tx = ADDRESS_2;
end
end
RX_TX_ADRESS_2:
ADDRESS_2:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_2;
next_state_tx = ADDRESS_2;
end
else
begin
next_state_tx_rx = RX_TX_ADRESS_3;
next_state_tx = ADDRESS_3;
end
end
RX_TX_ADRESS_3:
ADDRESS_3:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_3;
next_state_tx = ADDRESS_3;
end
else
begin
next_state_tx_rx = RX_TX_ADRESS_4;
next_state_tx = ADDRESS_4;
end
end
RX_TX_ADRESS_4:
ADDRESS_4:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_4;
next_state_tx = ADDRESS_4;
end
else
begin
next_state_tx_rx = RX_TX_ADRESS_5;
next_state_tx = ADDRESS_5;
end
end
RX_TX_ADRESS_5:
ADDRESS_5:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_5;
next_state_tx = ADDRESS_5;
end
else
begin
next_state_tx_rx = RX_TX_ADRESS_6;
next_state_tx = ADDRESS_6;
end
end
RX_TX_ADRESS_6:
ADDRESS_6:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_6;
next_state_tx = ADDRESS_6;
end
else
begin
next_state_tx_rx = RX_TX_ADRESS_7;
next_state_tx = ADDRESS_7;
end
end
RX_TX_ADRESS_7:
ADDRESS_7:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_7;
next_state_tx = ADDRESS_7;
end
else
begin
next_state_tx_rx = RX_TX_ADRESS_8;
next_state_tx = ADDRESS_8;
end
end
RX_TX_ADRESS_8:
ADDRESS_8:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_ADRESS_8;
next_state_tx = ADDRESS_8;
end
else
begin
next_state_tx_rx = RX_TX_RESPONSE_ADRESS;
next_state_tx = RESPONSE_ADDRESS;
end
end
RX_TX_RESPONSE_ADRESS:
RESPONSE_ADDRESS:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_RESPONSE_ADRESS;
next_state_tx = RESPONSE_ADDRESS;
end
else if(RESPONSE == 1'b0)//ACK
begin
next_state_tx_rx = RX_TX_DELAY_BYTES;
next_state_tx = DELAY_BYTES;
end
else if(RESPONSE == 1'b1)//NACK --> RESTART CONDITION AND BACK TO START BYTE AGAIN
begin
next_state_tx_rx = RX_TX_NACK;
next_state_tx = NACK;
end
end
//data in
RX_TX_DATA0_1:
DATA0_1:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_1;
next_state_tx = DATA0_1;
end
else
begin
next_state_tx_rx = RX_TX_DATA0_2;
next_state_tx = DATA0_2;
end
end
RX_TX_DATA0_2:
DATA0_2:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_2;
next_state_tx = DATA0_2;
end
else
begin
next_state_tx_rx = RX_TX_DATA0_3;
next_state_tx = DATA0_3;
end
end
RX_TX_DATA0_3:
DATA0_3:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_3;
next_state_tx = DATA0_3;
end
else
begin
next_state_tx_rx = RX_TX_DATA0_4;
next_state_tx = DATA0_4;
end
end
RX_TX_DATA0_4:
DATA0_4:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_4;
next_state_tx = DATA0_4;
end
else
begin
next_state_tx_rx = RX_TX_DATA0_5;
next_state_tx = DATA0_5;
end
end
RX_TX_DATA0_5:
DATA0_5:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_5;
next_state_tx = DATA0_5;
end
else
begin
next_state_tx_rx = RX_TX_DATA0_6;
next_state_tx = DATA0_6;
end
end
RX_TX_DATA0_6:
DATA0_6:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_6;
next_state_tx = DATA0_6;
end
else
begin
next_state_tx_rx = RX_TX_DATA0_7;
next_state_tx = DATA0_7;
end
end
RX_TX_DATA0_7:
DATA0_7:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_7;
next_state_tx = DATA0_7;
end
else
begin
next_state_tx_rx = RX_TX_DATA0_8;
next_state_tx = DATA0_8;
end
end
RX_TX_DATA0_8:
DATA0_8:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA0_8;
next_state_tx = DATA0_8;
end
else
begin
next_state_tx_rx = RX_TX_RESPONSE_DATA0_1;
next_state_tx = RESPONSE_DATA0_1;
end
end
RX_TX_RESPONSE_DATA0_1:
RESPONSE_DATA0_1:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_RESPONSE_DATA0_1;
next_state_tx = RESPONSE_DATA0_1;
end
else if(RESPONSE == 1'b0)//ACK
begin
next_state_tx_rx = RX_TX_DELAY_BYTES;
next_state_tx = DELAY_BYTES;
end
else if(RESPONSE == 1'b1)//NACK
begin
next_state_tx_rx = RX_TX_NACK;
next_state_tx = NACK;
end
end
 
//second byte
RX_TX_DATA1_1:
DATA1_1:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_1;
next_state_tx = DATA1_1;
end
else
begin
next_state_tx_rx = RX_TX_DATA1_2;
next_state_tx = DATA1_2;
end
end
RX_TX_DATA1_2:
DATA1_2:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_2;
next_state_tx = DATA1_2;
end
else
begin
next_state_tx_rx = RX_TX_DATA1_3;
next_state_tx = DATA1_3;
end
end
RX_TX_DATA1_3:
DATA1_3:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_3;
next_state_tx = DATA1_3;
end
else
begin
next_state_tx_rx = RX_TX_DATA1_4;
next_state_tx = DATA1_4;
end
end
RX_TX_DATA1_4:
DATA1_4:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_4;
next_state_tx = DATA1_4;
end
else
begin
next_state_tx_rx = RX_TX_DATA1_5;
next_state_tx = DATA1_5;
end
end
RX_TX_DATA1_5:
DATA1_5:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_5;
next_state_tx = DATA1_5;
end
else
begin
next_state_tx_rx = RX_TX_DATA1_6;
next_state_tx = DATA1_6;
end
end
RX_TX_DATA1_6:
DATA1_6:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_6;
next_state_tx = DATA1_6;
end
else
begin
next_state_tx_rx = RX_TX_DATA1_7;
next_state_tx = DATA1_7;
end
end
RX_TX_DATA1_7:
DATA1_7:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_7;
next_state_tx = DATA1_7;
end
else
begin
next_state_tx_rx = RX_TX_DATA1_8;
next_state_tx = DATA1_8;
end
end
RX_TX_DATA1_8:
DATA1_8:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DATA1_8;
next_state_tx = DATA1_8;
end
else
begin
next_state_tx_rx = RX_TX_RESPONSE_DATA1_1;
next_state_tx = RESPONSE_DATA1_1;
end
end
RX_TX_RESPONSE_DATA1_1:
RESPONSE_DATA1_1:
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_RESPONSE_DATA1_1;
next_state_tx = RESPONSE_DATA1_1;
end
else if(RESPONSE == 1'b0)//ACK
begin
next_state_tx_rx = RX_TX_DELAY_BYTES;
next_state_tx = DELAY_BYTES;
end
else if(RESPONSE == 1'b1)//NACK
begin
next_state_tx_rx = RX_TX_NACK;
next_state_tx = NACK;
end
end
RX_TX_DELAY_BYTES://THIS FORM WORKS
DELAY_BYTES://THIS FORM WORKS
begin
 
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_DELAY_BYTES;
next_state_tx = DELAY_BYTES;
end
else
begin
674,64 → 684,64
 
if(count_tx == 2'd0)
begin
next_state_tx_rx = RX_TX_ADRESS_1;
next_state_tx = ADDRESS_1;
end
else if(count_tx == 2'd1)
else if(count_tx == 2'd1)
begin
next_state_tx_rx = RX_TX_DATA0_1;
next_state_tx = DATA0_1;
end
else if(count_tx == 2'd2)
else if(count_tx == 2'd2)
begin
next_state_tx_rx = RX_TX_DATA1_1;
next_state_tx = DATA1_1;
end
else if(count_tx == 2'd3)
else if(count_tx == 2'd3)
begin
next_state_tx_rx = RX_TX_STOP;
next_state_tx = STOP;
end
end
 
end
RX_TX_NACK://NOT TESTED YET !!!!
NACK://NOT TESTED YET !!!!
begin
if(count_send_data != DATA_CONFIG_REG[13:2]*2'd2)
begin
next_state_tx_rx = RX_TX_NACK;
next_state_tx = NACK;
end
else
begin
if(count_tx == 2'd0)
begin
next_state_tx_rx = RX_TX_CONTROLIN_1;
next_state_tx = CONTROLIN_1;
end
else if(count_tx == 2'd1)
begin
next_state_tx_rx = RX_TX_ADRESS_1;
next_state_tx = ADDRESS_1;
end
else if(count_tx == 2'd2)
else if(count_tx == 2'd2)
begin
next_state_tx_rx = RX_TX_DATA0_1;
next_state_tx = DATA0_1;
end
else if(count_tx == 2'd3)
begin
next_state_tx_rx = RX_TX_DATA1_1;
next_state_tx = DATA1_1;
end
end
end
RX_TX_STOP://THIS WORK
STOP://THIS WORK
begin
if(count_send_data != DATA_CONFIG_REG[13:2])
begin
next_state_tx_rx = RX_TX_STOP;
next_state_tx = STOP;
end
else
begin
next_state_tx_rx = RX_TX_IDLE;
next_state_tx = IDLE;
end
end
default:
begin
next_state_tx_rx = RX_TX_IDLE;
next_state_tx = IDLE;
end
endcase
 
740,7 → 750,7
 
 
 
//SEQUENTIAL TX
//SEQUENTIAL
always@(posedge PCLK)
begin
 
749,10 → 759,10
begin
//SIGNALS MUST BE RESETED
count_send_data <= 12'd0;
state_tx_rx <= RX_TX_IDLE;
state_tx <= IDLE;
SDA_OUT<= 1'b1;
fifo_tx_rd_en <= 1'b0;
count_tx <= 2'd0;
count_tx <= 2'd0;
BR_CLK_O <= 1'b1;
RESPONSE<= 1'b0;
end
760,10 → 770,10
begin
// SEQUENTIAL FUN START
state_tx_rx <= next_state_tx_rx;
state_tx <= next_state_tx;
 
case(state_tx_rx)
RX_TX_IDLE:
case(state_tx)
IDLE:
begin
 
fifo_tx_rd_en <= 1'b0;
788,7 → 798,7
end
 
end
RX_TX_START:
START:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
804,11 → 814,11
if(count_send_data == DATA_CONFIG_REG[13:2]- 12'd1)
begin
SDA_OUT<=fifo_tx_data_out[0:0];
count_tx <= 2'd0;
count_tx <= 2'd0;
end
 
end
RX_TX_CONTROLIN_1:
CONTROLIN_1:
begin
 
842,7 → 852,7
end
RX_TX_CONTROLIN_2:
CONTROLIN_2:
begin
 
873,7 → 883,7
end
 
RX_TX_CONTROLIN_3:
CONTROLIN_3:
begin
 
905,7 → 915,7
 
end
RX_TX_CONTROLIN_4:
CONTROLIN_4:
begin
 
915,7 → 925,7
count_send_data <= count_send_data + 12'd1;
SDA_OUT<=fifo_tx_data_out[3:3];
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd4)
if(count_receive_data < DATA_CONFIG_REG[13:2]/12'd4)
begin
BR_CLK_O <= 1'b0;
end
936,7 → 946,7
end
 
RX_TX_CONTROLIN_5:
CONTROLIN_5:
begin
 
946,7 → 956,7
count_send_data <= count_send_data + 12'd1;
SDA_OUT<=fifo_tx_data_out[4:4];
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd4)
if(count_receive_data < DATA_CONFIG_REG[13:2]/12'd4)
begin
BR_CLK_O <= 1'b0;
end
968,7 → 978,7
end
 
 
RX_TX_CONTROLIN_6:
CONTROLIN_6:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
998,7 → 1008,7
end
 
RX_TX_CONTROLIN_7:
CONTROLIN_7:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1027,7 → 1037,7
 
end
RX_TX_CONTROLIN_8:
CONTROLIN_8:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1056,7 → 1066,7
 
end
RX_TX_RESPONSE_CIN:
RESPONSE_CIN:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1066,7 → 1076,7
//LETS TRY USE THIS BUT I DONT THINK IF WORKS
RESPONSE<= SDA;
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd4)
if(count_receive_data < DATA_CONFIG_REG[13:2]/12'd4)
begin
BR_CLK_O <= 1'b0;
end
1086,7 → 1096,7
 
 
end
RX_TX_ADRESS_1:
ADDRESS_1:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1114,7 → 1124,7
end
end
RX_TX_ADRESS_2:
ADDRESS_2:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1122,7 → 1132,7
count_send_data <= count_send_data + 12'd1;
SDA_OUT<=fifo_tx_data_out[9:9];
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd4)
if(count_receive_data < DATA_CONFIG_REG[13:2]/12'd4)
begin
BR_CLK_O <= 1'b0;
end
1142,7 → 1152,7
end
 
end
RX_TX_ADRESS_3:
ADDRESS_3:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1170,7 → 1180,7
end
 
end
RX_TX_ADRESS_4:
ADDRESS_4:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1197,12 → 1207,12
SDA_OUT<=fifo_tx_data_out[12:12];
end
end
RX_TX_ADRESS_5:
ADDRESS_5:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
begin
count_send_data <= count_send_data + 12'd1;
count_send_data <= count_receive_data + 12'd1;
SDA_OUT<=fifo_tx_data_out[12:12];
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd4)
1226,7 → 1236,7
 
end
RX_TX_ADRESS_6:
ADDRESS_6:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1254,7 → 1264,7
end
end
RX_TX_ADRESS_7:
ADDRESS_7:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1283,7 → 1293,7
 
end
RX_TX_ADRESS_8:
ADDRESS_8:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1311,7 → 1321,7
end
end
RX_TX_RESPONSE_ADRESS:
RESPONSE_ADDRESS:
begin
if(count_send_data < DATA_CONFIG_REG[13:2])
begin
1339,7 → 1349,7
end
 
end
RX_TX_DATA0_1:
DATA0_1:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1368,12 → 1378,12
 
end
RX_TX_DATA0_2:
DATA0_2:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
begin
count_send_data <= count_send_data + 12'd1;
count_send_data <= count_receive_data + 12'd1;
SDA_OUT<=fifo_tx_data_out[17:17];
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd4)
1397,7 → 1407,7
 
end
RX_TX_DATA0_3:
DATA0_3:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1425,7 → 1435,7
end
end
RX_TX_DATA0_4:
DATA0_4:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1453,7 → 1463,7
end
end
RX_TX_DATA0_5:
DATA0_5:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1481,7 → 1491,7
end
 
end
RX_TX_DATA0_6:
DATA0_6:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1509,7 → 1519,7
end
end
RX_TX_DATA0_7:
DATA0_7:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1537,7 → 1547,7
end
end
RX_TX_DATA0_8:
DATA0_8:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1566,7 → 1576,7
end
end
RX_TX_RESPONSE_DATA0_1:
RESPONSE_DATA0_1:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1595,7 → 1605,7
end
 
end
RX_TX_DATA1_1:
DATA1_1:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1625,7 → 1635,7
 
end
RX_TX_DATA1_2:
DATA1_2:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1653,7 → 1663,7
end
 
end
RX_TX_DATA1_3:
DATA1_3:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1661,7 → 1671,7
count_send_data <= count_send_data + 12'd1;
SDA_OUT<=fifo_tx_data_out[26:26];
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd4)
if(count_receive_data < DATA_CONFIG_REG[13:2]/12'd4)
begin
BR_CLK_O <= 1'b0;
end
1682,7 → 1692,7
end
end
RX_TX_DATA1_4:
DATA1_4:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1711,7 → 1721,7
end
end
RX_TX_DATA1_5:
DATA1_5:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1740,7 → 1750,7
end
end
RX_TX_DATA1_6:
DATA1_6:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1769,7 → 1779,7
end
end
RX_TX_DATA1_7:
DATA1_7:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1799,7 → 1809,7
 
end
RX_TX_DATA1_8:
DATA1_8:
begin
 
if(count_send_data < DATA_CONFIG_REG[13:2])
1828,9 → 1838,9
end
end
RX_TX_RESPONSE_DATA1_1:
RESPONSE_DATA1_1:
begin
//fifo_tx_rd_en <= 1'b1;
//fifo_ _rd_en <= 1'b1;
 
if(count_send_data < DATA_CONFIG_REG[13:2])
begin
1859,7 → 1869,7
end
 
end
RX_TX_DELAY_BYTES:
DELAY_BYTES:
begin
fifo_tx_rd_en <= 1'b0;
1880,7 → 1890,7
count_tx <= count_tx + 2'd1;
SDA_OUT<=fifo_tx_data_out[8:8];
end
else if(count_tx == 2'd1)
else if(count_tx == 2'd1)
begin
count_tx <= count_tx + 2'd1;
SDA_OUT<=fifo_tx_data_out[16:16];
1901,7 → 1911,7
 
end
//THIS BLOCK MUST BE CHECKED WITH CARE
RX_TX_NACK:// MORE A RESTART
NACK:// MORE A RESTART
begin
fifo_tx_rd_en <= 1'b0;
1909,7 → 1919,7
begin
count_send_data <= count_send_data + 12'd1;
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd2)
if(count_receive_data < DATA_CONFIG_REG[13:2]/12'd2)
begin
SDA_OUT<=1'b0;
end
1964,7 → 1974,7
end
end
RX_TX_STOP:
STOP:
begin
 
BR_CLK_O <= 1'b1;
1971,7 → 1981,7
 
if(count_send_data < DATA_CONFIG_REG[13:2])
begin
count_send_data <= count_send_data + 12'd1;
count_send_data <= count_receive_data + 12'd1;
 
if(count_send_data < DATA_CONFIG_REG[13:2]/12'd2-12'd2)
begin
1999,5 → 2009,1336
 
end
 
 
//STATE CONTROL
reg [5:0] state_rx;
reg [5:0] next_state_rx;
 
assign ENABLE_SDA = (state_rx == RESPONSE_CIN||
state_rx == RESPONSE_ADDRESS||
state_rx == RESPONSE_DATA0_1||
state_rx == RESPONSE_DATA1_1)?1'b1:
(state_tx == RESPONSE_CIN||
state_tx == RESPONSE_ADDRESS||
state_tx == RESPONSE_DATA0_1||
state_tx == RESPONSE_DATA1_1)?1'b0:1'b1;
 
 
assign ENABLE_SCL = (state_rx == RESPONSE_CIN||
state_rx == RESPONSE_ADDRESS||
state_rx == RESPONSE_DATA0_1||
state_rx == RESPONSE_DATA1_1)?1'b1:
(state_tx == RESPONSE_CIN||
state_tx == RESPONSE_ADDRESS||
state_tx == RESPONSE_DATA0_1||
state_tx == RESPONSE_DATA1_1)?1'b1:1'b0;
 
 
//COMBINATIONAL BLOCK TO RX
always@(*)
begin
 
//THE FUN START HERE :-)
//COMBINATIONAL UPDATE STATE BE CAREFUL WITH WHAT YOU MAKE HERE
next_state_rx = state_rx;
 
case(state_rx)//state_rx IS MORE SECURE CHANGE ONLY IF YOU KNOW WHAT ARE YOU DOING
IDLE:
begin
//OBEYING SPEC
if(DATA_CONFIG_REG[0] == 1'b0 && DATA_CONFIG_REG[1] == 1'b0)
begin
next_state_rx = IDLE;
end
else if(DATA_CONFIG_REG[0] == 1'b1 && DATA_CONFIG_REG[1] == 1'b1)
begin
next_state_rx = IDLE;
end
else if(DATA_CONFIG_REG[0] == 1'b0 && DATA_CONFIG_REG[1] == 1'b1 && SDA_OUT_RX == 1'b0 && BR_CLK_O_RX == 1'b0)
begin
next_state_rx = START;
end
 
 
end
START://THIS IS USED TOO ALL STATE MACHINES THE COUNTER_SEND_DATA
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = START;
end
else if(fifo_rx_data_in[0] == 1'b0 && fifo_rx_data_in[1] == 1'b0)
begin
next_state_rx = CONTROLIN_1;
end
else
begin
next_state_rx = IDLE;
end
end
CONTROLIN_1:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_1;
end
else
begin
next_state_rx = CONTROLIN_2;
end
 
end
CONTROLIN_2:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_2;
end
else
begin
next_state_rx = CONTROLIN_3;
end
 
end
CONTROLIN_3:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_3;
end
else
begin
next_state_rx = CONTROLIN_4;
end
end
CONTROLIN_4:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_4;
end
else
begin
next_state_rx = CONTROLIN_5;
end
end
CONTROLIN_5:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_5;
end
else
begin
next_state_rx = CONTROLIN_6;
end
end
CONTROLIN_6:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_6;
end
else
begin
next_state_rx = CONTROLIN_7;
end
end
CONTROLIN_7:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_7;
end
else
begin
next_state_rx = CONTROLIN_8;
end
end
CONTROLIN_8:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = CONTROLIN_8;
end
else
begin
next_state_rx = RESPONSE_CIN;
end
end
RESPONSE_CIN:
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = RESPONSE_CIN;
end
else
begin
next_state_rx = ADDRESS_1;
end
end
//NOW SENDING ADDRESS
ADDRESS_1:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_1;
end
else
begin
next_state_rx = ADDRESS_2;
end
end
ADDRESS_2:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_2;
end
else
begin
next_state_rx = ADDRESS_3;
end
end
ADDRESS_3:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_3;
end
else
begin
next_state_rx = ADDRESS_4;
end
end
ADDRESS_4:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_4;
end
else
begin
next_state_rx = ADDRESS_5;
end
end
ADDRESS_5:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_5;
end
else
begin
next_state_rx = ADDRESS_6;
end
end
ADDRESS_6:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_6;
end
else
begin
next_state_rx = ADDRESS_7;
end
end
ADDRESS_7:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_7;
end
else
begin
next_state_rx = ADDRESS_8;
end
end
ADDRESS_8:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = ADDRESS_8;
end
else
begin
next_state_rx = RESPONSE_ADDRESS;
end
end
RESPONSE_ADDRESS:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = RESPONSE_ADDRESS;
end
else
begin
next_state_rx = DATA0_1;
end
end
//data in
DATA0_1:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_1;
end
else
begin
next_state_rx = DATA0_2;
end
end
DATA0_2:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_2;
end
else
begin
next_state_rx = DATA0_3;
end
end
DATA0_3:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_3;
end
else
begin
next_state_rx = DATA0_4;
end
end
DATA0_4:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_4;
end
else
begin
next_state_rx = DATA0_5;
end
end
DATA0_5:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_5;
end
else
begin
next_state_rx = DATA0_6;
end
end
DATA0_6:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_6;
end
else
begin
next_state_rx = DATA0_7;
end
end
DATA0_7:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_7;
end
else
begin
next_state_rx = DATA0_8;
end
end
DATA0_8:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA0_8;
end
else
begin
next_state_rx = RESPONSE_DATA0_1;
end
end
RESPONSE_DATA0_1:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = RESPONSE_DATA0_1;
end
else
begin
next_state_rx = DATA1_1;
end
end
 
//second byte
DATA1_1:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_1;
end
else
begin
next_state_rx = DATA1_2;
end
end
DATA1_2:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_2;
end
else
begin
next_state_rx = DATA1_3;
end
end
DATA1_3:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_3;
end
else
begin
next_state_rx = DATA1_4;
end
end
DATA1_4:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_4;
end
else
begin
next_state_rx = DATA1_5;
end
end
DATA1_5:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_5;
end
else
begin
next_state_rx = DATA1_6;
end
end
DATA1_6:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_6;
end
else
begin
next_state_rx = DATA1_7;
end
end
DATA1_7:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_7;
end
else
begin
next_state_rx = DATA1_8;
end
end
DATA1_8:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DATA1_8;
end
else
begin
next_state_rx = RESPONSE_DATA1_1;
end
end
RESPONSE_DATA1_1:
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = RESPONSE_DATA1_1;
end
else
begin
next_state_rx = DELAY_BYTES;
end
end
DELAY_BYTES://THIS FORM WORKS
begin
 
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = DELAY_BYTES;
end
else
begin
 
if(count_rx == 2'd0)
begin
next_state_rx = ADDRESS_1;
end
else if(count_rx == 2'd1)
begin
next_state_rx = DATA0_1;
end
else if(count_rx == 2'd2)
begin
next_state_rx = DATA1_1;
end
else if(count_rx == 2'd3)
begin
next_state_rx = STOP;
end
end
 
end
STOP://THIS WORK
begin
if( count_receive_data != DATA_CONFIG_REG[13:2])
begin
next_state_rx = STOP;
end
else
begin
next_state_rx = IDLE;
end
end
default:
begin
next_state_rx = IDLE;
end
endcase
 
 
end
 
 
 
//SEQUENTIAL
always@(posedge PCLK)
begin
 
//RESET SYNC
if(!PRESETn)
begin
//SIGNALS MUST BE RESETED
count_receive_data <= 12'd0;
state_rx <= IDLE;
SDA_OUT_RX<= 1'b0;
fifo_rx_wr_en <= 1'b0;
count_rx <= 2'd0;
BR_CLK_O_RX <= 1'b0;
end
else
begin
// SEQUENTIAL FUN START
state_rx <= next_state_rx;
 
case(state_rx)
IDLE:
begin
 
SDA_OUT_RX<= SDA;
BR_CLK_O_RX<=SCL;
 
if(((fifo_rx_f_full == 1'b0 && fifo_rx_f_empty == 1'b0) || (fifo_rx_f_full == 1'b0 && fifo_rx_f_empty == 1'b1)) && DATA_CONFIG_REG[1] == 1'b1)
begin
 
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= count_receive_data;
end
end
START:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if( count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[0]<= SDA;
fifo_rx_data_in[1]<= SCL;
end
 
end
CONTROLIN_1:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[0]<= SDA;
end
 
end
CONTROLIN_2:
begin
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[1]<= SDA;
end
end
CONTROLIN_3:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[2]<= SDA;
end
 
end
CONTROLIN_4:
begin
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[3]<= SDA;
end
end
CONTROLIN_5:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[4]<= SDA;
end
 
end
CONTROLIN_6:
begin
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[5]<= SDA;
end
end
 
CONTROLIN_7:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[6]<= SDA;
end
end
CONTROLIN_8:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[7]<= SDA;
end
 
end
RESPONSE_CIN:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
end
ADDRESS_1:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[8]<= SDA;
end
end
ADDRESS_2:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[9]<= SDA;
end
 
end
ADDRESS_3:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[10]<= SDA;
end
 
end
ADDRESS_4:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[11]<= SDA;
end
end
ADDRESS_5:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[12]<= SDA;
end
 
end
ADDRESS_6:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[13]<= SDA;
end
end
ADDRESS_7:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[14]<= SDA;
end
end
ADDRESS_8:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[15]<= SDA;
end
 
end
RESPONSE_ADDRESS:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
 
end
DATA0_1:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[16]<= SDA;
end
 
end
DATA0_2:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[17]<= SDA;
end
end
DATA0_3:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[18]<= SDA;
end
end
DATA0_4:
begin
 
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[19]<= SDA;
end
end
DATA0_5:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[20]<= SDA;
end
 
 
end
DATA0_6:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[21]<= SDA;
end
end
DATA0_7:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[22]<= SDA;
end
end
DATA0_8:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[23]<= SDA;
end
end
RESPONSE_DATA0_1:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
end
DATA1_1:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[24]<= SDA;
end
end
DATA1_2:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[25]<= SDA;
end
 
 
end
DATA1_3:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[26]<= SDA;
end
 
end
DATA1_4:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[27]<= SDA;
end
end
DATA1_5:
begin
 
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[28]<= SDA;
end
end
DATA1_6:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[29]<= SDA;
end
 
 
end
DATA1_7:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[30]<= SDA;
end
 
 
end
DATA1_8:
begin
 
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
 
if(SCL == 1'b1 && count_receive_data >= DATA_CONFIG_REG[13:2]/12'd4 && count_receive_data < (DATA_CONFIG_REG[13:2]-(DATA_CONFIG_REG[13:2]/12'd4))-12'd1)
begin
fifo_rx_data_in[31]<= SDA;
end
end
RESPONSE_DATA1_1:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
//fifo_ _rd_en <= 1'b1;
 
end
DELAY_BYTES:
begin
 
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
fifo_rx_wr_en <= 1'b1;
end
 
 
end
STOP:
begin
if( count_receive_data < DATA_CONFIG_REG[13:2])
begin
count_receive_data <= count_receive_data + 12'd1;
end
else
begin
count_receive_data <= 12'd0;
end
fifo_rx_wr_en <= 1'b0;
end
default:
begin
fifo_rx_wr_en <= 1'b0;
count_receive_data <= 12'd4095;
end
endcase
end
 
 
end
 
//USED ONLY TO COUNTER TIME
always@(posedge PCLK)
begin
 
//RESET SYNC
if(!PRESETn)
begin
count_timeout <= 12'd0;
end
else
begin
if(count_timeout <= TIMEOUT_TX)
begin
if(SDA == 1'b0 && SCL == 1'b0)
count_timeout <= count_timeout + 12'd1;
end
else
begin
count_timeout <= 12'd0;
end
 
end
 
end
 
 
endmodule
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.