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

Subversion Repositories i2c

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 12 to Rev 13
    Reverse comparison

Rev 12 → Rev 13

/trunk/rtl/verilog/i2c_master_byte_ctrl.v
2,7 → 2,8
// WISHBONE revB2 compiant I2C master core
//
// author: Richard Herveille
// rev. 0.1 August 24th, 2001. Initial Verilog release.
// rev. 0.1 August 24th, 2001. Initial Verilog release.
// rev. 0.2 October 25th, 2001. Fixed some synthesis warnings.
//
 
`include "timescale.v"
136,7 → 137,7
if (!nReset)
begin
core_cmd <= #1 `I2C_CMD_NOP;
core_txd <= #1 sr[7];
core_txd <= #1 1'b0;
shift <= #1 1'b0;
ld <= #1 1'b0;
156,129 → 157,129
c_state <= #1 ST_IDLE;
end
else
begin
// initially reset all signals
core_txd <= #1 sr[7];
begin
// initially reset all signals
core_txd <= #1 sr[7];
shift <= #1 1'b0;
ld <= #1 1'b0;
shift <= #1 1'b0;
ld <= #1 1'b0;
 
cmd_ack <= #1 1'b0;
cmd_ack <= #1 1'b0;
 
case (c_state) // synopsis full_case parallel_case
ST_IDLE:
if (go)
begin
if (start)
begin
c_state <= #1 ST_START;
core_cmd <= #1 `I2C_CMD_START;
end
else if (read)
begin
c_state <= #1 ST_READ;
core_cmd <= #1 `I2C_CMD_READ;
end
else if (write)
begin
c_state <= #1 ST_WRITE;
core_cmd <= #1 `I2C_CMD_WRITE;
end
else // stop
begin
c_state <= #1 ST_STOP;
core_cmd <= #1 `I2C_CMD_STOP;
case (c_state) // synopsis full_case parallel_case
ST_IDLE:
if (go)
begin
if (start)
begin
c_state <= #1 ST_START;
core_cmd <= #1 `I2C_CMD_START;
end
else if (read)
begin
c_state <= #1 ST_READ;
core_cmd <= #1 `I2C_CMD_READ;
end
else if (write)
begin
c_state <= #1 ST_WRITE;
core_cmd <= #1 `I2C_CMD_WRITE;
end
else // stop
begin
c_state <= #1 ST_STOP;
core_cmd <= #1 `I2C_CMD_STOP;
 
// generate command acknowledge signal
cmd_ack <= #1 1'b1;
end
// generate command acknowledge signal
cmd_ack <= #1 1'b1;
end
 
ld <= #1 1'b1;
end
ld <= #1 1'b1;
end
 
ST_START:
if (core_ack)
begin
if (read)
ST_START:
if (core_ack)
begin
if (read)
begin
c_state <= #1 ST_READ;
core_cmd <= #1 `I2C_CMD_READ;
end
else
begin
c_state <= #1 ST_WRITE;
core_cmd <= #1 `I2C_CMD_WRITE;
end
 
ld <= #1 1'b1;
end
 
ST_WRITE:
if (core_ack)
if (cnt_done)
begin
c_state <= #1 ST_READ;
c_state <= #1 ST_ACK;
core_cmd <= #1 `I2C_CMD_READ;
end
else
begin
c_state <= #1 ST_WRITE;
core_cmd <= #1 `I2C_CMD_WRITE;
c_state <= #1 ST_WRITE; // stay in same state
core_cmd <= #1 `I2C_CMD_WRITE; // write next bit
 
shift <= #1 1'b1;
end
 
ld <= #1 1'b1;
end
ST_READ:
if (core_ack)
begin
if (cnt_done)
begin
c_state <= #1 ST_ACK;
core_cmd <= #1 `I2C_CMD_WRITE;
end
else
begin
c_state <= #1 ST_READ; // stay in same state
core_cmd <= #1 `I2C_CMD_READ; // read next bit
end
 
ST_WRITE:
if (core_ack)
if (cnt_done)
begin
c_state <= #1 ST_ACK;
core_cmd <= #1 `I2C_CMD_READ;
end
else
begin
c_state <= #1 ST_WRITE; // stay in same state
core_cmd <= #1 `I2C_CMD_WRITE; // write next bit
shift <= #1 1'b1;
end
 
shift <= #1 1'b1;
end
 
ST_READ:
ST_ACK:
if (core_ack)
begin
if (cnt_done)
if (stop)
begin
c_state <= #1 ST_ACK;
core_cmd <= #1 `I2C_CMD_WRITE;
c_state <= #1 ST_STOP;
core_cmd <= #1 `I2C_CMD_STOP;
end
else
begin
c_state <= #1 ST_READ; // stay in same state
core_cmd <= #1 `I2C_CMD_READ; // read next bit
c_state <= #1 ST_IDLE;
core_cmd <= #1 `I2C_CMD_NOP;
end
 
shift <= #1 1'b1;
end
// assign ack_out output to bit_controller_rxd (contains last received bit)
ack_out = core_rxd;
 
ST_ACK:
if (core_ack)
begin
if (stop)
begin
c_state <= #1 ST_STOP;
core_cmd <= #1 `I2C_CMD_STOP;
end
else
begin
c_state <= #1 ST_IDLE;
core_cmd <= #1 `I2C_CMD_NOP;
end
 
// assign ack_out output to bit_controller_rxd (contains last received bit)
ack_out = core_rxd;
 
// generate command acknowledge signal
cmd_ack <= #1 1'b1;
// generate command acknowledge signal
cmd_ack <= #1 1'b1;
core_txd <= #1 1'b1;
end
else
core_txd <= #1 ack_in;
core_txd <= #1 1'b1;
end
else
core_txd <= #1 ack_in;
 
ST_STOP:
if (core_ack)
begin
c_state <= #1 ST_IDLE;
core_cmd <= #1 `I2C_CMD_NOP;
end
ST_STOP:
if (core_ack)
begin
c_state <= #1 ST_IDLE;
core_cmd <= #1 `I2C_CMD_NOP;
end
 
endcase
end
endcase
end
endmodule
 
 
/trunk/rtl/verilog/i2c_master_top.v
63,6 → 63,7
 
// core enable signal
wire core_en;
wire ien;
 
// status register signals
wire irxack;
146,6 → 147,7
 
// decode control register
assign core_en = ctr[7];
assign ien = ctr[6];
 
// hookup byte controller block
i2c_master_byte_ctrl byte_controller (
201,7 → 203,7
else if (wb_rst_i)
wb_inta_o <= #1 1'b0;
else
wb_inta_o <= #1 irq_flag && ctr[6]; // interrupt signal is only generated when IEN (interrupt enable bit is set)
wb_inta_o <= #1 irq_flag && ien; // interrupt signal is only generated when IEN (interrupt enable bit is set)
 
// assign status register bits
assign sr[7] = rxack;

powered by: WebSVN 2.1.0

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