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

Subversion Repositories openrisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openrisc/trunk/orpsocv2/rtl/verilog/i2c_master_slave
    from Rev 543 to Rev 545
    Reverse comparison

Rev 543 → Rev 545

/i2c_master_bit_ctrl.v
193,14 → 193,6
// state machine variable
reg [17:0] c_state; // synopsys enum_state
reg [4:0] slave_state;
// A counter to indicate a too-long wait has occurred for the next set
// of clocks for the read, and in fact it's likely the master has simply
// released SCL and wants to issue a stop.
reg [3:0] slave_read_timeout_cnt;
wire slave_read_timeout;
//
// module body
//
210,15 → 202,11
always @(posedge clk)
dscl_oen <= scl_oen;
 
// slave_wait is asserted when master wants to drive SCL high, but the
// slave pulls it low.
// slave_wait is asserted when master wants to drive SCL high, but the slave pulls it low
// slave_wait remains asserted until the slave releases SCL
always @(posedge clk or negedge nReset)
if (!nReset)
slave_wait <= 1'b0;
else
slave_wait <= (scl_oen & ~dscl_oen & ~sSCL) |
(slave_wait & ~sSCL) ;
if (!nReset) slave_wait <= 1'b0;
else slave_wait <= (scl_oen & ~dscl_oen & ~sSCL) | (slave_wait & ~sSCL);
 
// master drives SCL high, but another master pulls it low
// master start counting down its low cycle now (clock synchronization)
248,6 → 236,7
clk_en <= 1'b0;
end
 
 
// generate bus status controller
 
// capture SDA and SCL
641,7 → 630,9
slave_act <= 1'b0;
end
end
parameter [4:0] slave_idle = 5'b0_0000;
parameter [4:0] slave_wr = 5'b0_0001;
parameter [4:0] slave_wr_a = 5'b0_0010;
649,22 → 640,8
parameter [4:0] slave_rd_a = 5'b0_1000;
parameter [4:0] slave_wait_next_cmd_1 = 5'b1_0000;
parameter [4:0] slave_wait_next_cmd_2 = 5'b1_0001;
 
// Slave timeout counter during read
always @(posedge clk or negedge nReset)
if (~nReset)
slave_read_timeout_cnt <= 0;
else if (rst)
slave_read_timeout_cnt <= 0;
else if (slave_state==slave_wr)
slave_read_timeout_cnt <= 0;
else if (slave_state==slave_wr_a && sSCL && cnt==1)
slave_read_timeout_cnt <= slave_read_timeout_cnt + 1;
 
assign slave_read_timeout = (&slave_read_timeout_cnt) & cnt==1;
always @(posedge clk or negedge nReset)
if (!nReset)
begin
slave_state <= slave_idle;
695,7 → 672,12
case (slave_cmd) // synopsys full_case parallel_case
`I2C_SLAVE_CMD_WRITE: slave_state <= slave_wr;
`I2C_SLAVE_CMD_READ: slave_state <= slave_rd;
`I2C_SLAVE_CMD_READ:
begin
slave_state <= slave_rd;
// Restore SDA high here in case we're got it low
sda_oen_slave <= 1'b1;
end
default:
begin
slave_state <= slave_idle;
706,7 → 688,7
slave_wr:
begin
if (~sSCL & ~dSCL) begin //SCL = LOW
if (~sSCL & ~dSCL) begin //SCL == LOW
slave_state <= slave_wr_a;
sda_oen_slave <= din;
end
717,11 → 699,6
if (~sSCL & dSCL) begin //SCL FALLING EDGE
cmd_slave_ack <= 1'b1;
slave_state <= slave_wait_next_cmd_1;
end
// Timeout! Go back to idle, release SDA
else if(slave_read_timeout) begin
slave_state <= slave_idle;
sda_oen_slave <= 1;
end
end
 
734,7 → 711,7
slave_rd:
begin
if (sSCL & ~dSCL) begin
if (sSCL & ~dSCL) begin // SCL Rising edge
slave_state <= slave_rd_a;
end
end
741,7 → 718,7
slave_rd_a:
begin
if (~sSCL & dSCL) begin
if (~sSCL & dSCL) begin // SCL falling edge
cmd_slave_ack <= 1'b1;
slave_state <= slave_wait_next_cmd_1;
end

powered by: WebSVN 2.1.0

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