mirror of
https://github.com/fpganinja/taxi.git
synced 2026-04-07 04:38:42 -07:00
lss: Fix I2C master clock period
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
@@ -188,7 +188,6 @@ typedef enum logic [3:0] {
|
|||||||
PHY_STATE_READ_BIT_1,
|
PHY_STATE_READ_BIT_1,
|
||||||
PHY_STATE_READ_BIT_2,
|
PHY_STATE_READ_BIT_2,
|
||||||
PHY_STATE_READ_BIT_3,
|
PHY_STATE_READ_BIT_3,
|
||||||
PHY_STATE_READ_BIT_4,
|
|
||||||
PHY_STATE_STOP_1,
|
PHY_STATE_STOP_1,
|
||||||
PHY_STATE_STOP_2,
|
PHY_STATE_STOP_2,
|
||||||
PHY_STATE_STOP_3
|
PHY_STATE_STOP_3
|
||||||
@@ -204,6 +203,7 @@ logic phy_release_bus;
|
|||||||
|
|
||||||
logic phy_tx_data;
|
logic phy_tx_data;
|
||||||
|
|
||||||
|
logic phy_ready_reg = 1'b0, phy_ready_next;
|
||||||
logic phy_rx_data_reg = 1'b0, phy_rx_data_next;
|
logic phy_rx_data_reg = 1'b0, phy_rx_data_next;
|
||||||
|
|
||||||
logic [6:0] addr_reg = '0, addr_next;
|
logic [6:0] addr_reg = '0, addr_next;
|
||||||
@@ -310,7 +310,7 @@ always_comb begin
|
|||||||
missed_ack_next = 1'b0;
|
missed_ack_next = 1'b0;
|
||||||
|
|
||||||
// generate delays
|
// generate delays
|
||||||
if (phy_state_reg != PHY_STATE_IDLE && phy_state_reg != PHY_STATE_ACTIVE) begin
|
if (!phy_ready_reg) begin
|
||||||
// wait for phy operation
|
// wait for phy operation
|
||||||
state_next = state_reg;
|
state_next = state_reg;
|
||||||
end else begin
|
end else begin
|
||||||
@@ -592,6 +592,7 @@ end
|
|||||||
always_comb begin
|
always_comb begin
|
||||||
phy_state_next = PHY_STATE_IDLE;
|
phy_state_next = PHY_STATE_IDLE;
|
||||||
|
|
||||||
|
phy_ready_next = 1'b0;
|
||||||
phy_rx_data_next = phy_rx_data_reg;
|
phy_rx_data_next = phy_rx_data_reg;
|
||||||
|
|
||||||
delay_count_next = delay_count_reg;
|
delay_count_next = delay_count_reg;
|
||||||
@@ -642,9 +643,11 @@ always_comb begin
|
|||||||
case (phy_state_reg)
|
case (phy_state_reg)
|
||||||
PHY_STATE_IDLE: begin
|
PHY_STATE_IDLE: begin
|
||||||
// bus idle - wait for start command
|
// bus idle - wait for start command
|
||||||
|
phy_ready_next = 1'b1;
|
||||||
sda_o_next = 1'b1;
|
sda_o_next = 1'b1;
|
||||||
scl_o_next = 1'b1;
|
scl_o_next = 1'b1;
|
||||||
if (phy_start_bit) begin
|
if (phy_start_bit && phy_ready_reg) begin
|
||||||
|
phy_ready_next = 1'b0;
|
||||||
sda_o_next = 1'b0;
|
sda_o_next = 1'b0;
|
||||||
delay_run_next = 1'b1;
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_START_1;
|
phy_state_next = PHY_STATE_START_1;
|
||||||
@@ -654,19 +657,24 @@ always_comb begin
|
|||||||
end
|
end
|
||||||
PHY_STATE_ACTIVE: begin
|
PHY_STATE_ACTIVE: begin
|
||||||
// bus active
|
// bus active
|
||||||
if (phy_start_bit) begin
|
phy_ready_next = 1'b1;
|
||||||
|
if (phy_start_bit && phy_ready_reg) begin
|
||||||
|
phy_ready_next = 1'b0;
|
||||||
sda_o_next = 1'b1;
|
sda_o_next = 1'b1;
|
||||||
delay_run_next = 1'b1;
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_REPEATED_START_1;
|
phy_state_next = PHY_STATE_REPEATED_START_1;
|
||||||
end else if (phy_write_bit) begin
|
end else if (phy_write_bit && phy_ready_reg) begin
|
||||||
|
phy_ready_next = 1'b0;
|
||||||
sda_o_next = phy_tx_data;
|
sda_o_next = phy_tx_data;
|
||||||
delay_run_next = 1'b1;
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_WRITE_BIT_1;
|
phy_state_next = PHY_STATE_WRITE_BIT_1;
|
||||||
end else if (phy_read_bit) begin
|
end else if (phy_read_bit && phy_ready_reg) begin
|
||||||
|
phy_ready_next = 1'b0;
|
||||||
sda_o_next = 1'b1;
|
sda_o_next = 1'b1;
|
||||||
delay_run_next = 1'b1;
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_READ_BIT_1;
|
phy_state_next = PHY_STATE_READ_BIT_1;
|
||||||
end else if (phy_stop_bit) begin
|
end else if (phy_stop_bit && phy_ready_reg) begin
|
||||||
|
phy_ready_next = 1'b0;
|
||||||
sda_o_next = 1'b0;
|
sda_o_next = 1'b0;
|
||||||
delay_run_next = 1'b1;
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_STOP_1;
|
phy_state_next = PHY_STATE_STOP_1;
|
||||||
@@ -741,7 +749,6 @@ always_comb begin
|
|||||||
// ____
|
// ____
|
||||||
// scl __/ \__
|
// scl __/ \__
|
||||||
|
|
||||||
scl_o_next = 1'b0;
|
|
||||||
delay_run_next = 1'b1;
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_WRITE_BIT_3;
|
phy_state_next = PHY_STATE_WRITE_BIT_3;
|
||||||
end
|
end
|
||||||
@@ -752,6 +759,8 @@ always_comb begin
|
|||||||
// ____
|
// ____
|
||||||
// scl __/ \__
|
// scl __/ \__
|
||||||
|
|
||||||
|
scl_o_next = 1'b0;
|
||||||
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_ACTIVE;
|
phy_state_next = PHY_STATE_ACTIVE;
|
||||||
end
|
end
|
||||||
PHY_STATE_READ_BIT_1: begin
|
PHY_STATE_READ_BIT_1: begin
|
||||||
@@ -786,15 +795,6 @@ always_comb begin
|
|||||||
|
|
||||||
scl_o_next = 1'b0;
|
scl_o_next = 1'b0;
|
||||||
delay_run_next = 1'b1;
|
delay_run_next = 1'b1;
|
||||||
phy_state_next = PHY_STATE_READ_BIT_4;
|
|
||||||
end
|
|
||||||
PHY_STATE_READ_BIT_4: begin
|
|
||||||
// read bit
|
|
||||||
// ________
|
|
||||||
// sda X________X
|
|
||||||
// ____
|
|
||||||
// scl __/ \__
|
|
||||||
|
|
||||||
phy_state_next = PHY_STATE_ACTIVE;
|
phy_state_next = PHY_STATE_ACTIVE;
|
||||||
end
|
end
|
||||||
PHY_STATE_STOP_1: begin
|
PHY_STATE_STOP_1: begin
|
||||||
@@ -841,6 +841,7 @@ always_ff @(posedge clk) begin
|
|||||||
state_reg <= state_next;
|
state_reg <= state_next;
|
||||||
phy_state_reg <= phy_state_next;
|
phy_state_reg <= phy_state_next;
|
||||||
|
|
||||||
|
phy_ready_reg <= phy_ready_next;
|
||||||
phy_rx_data_reg <= phy_rx_data_next;
|
phy_rx_data_reg <= phy_rx_data_next;
|
||||||
|
|
||||||
addr_reg <= addr_next;
|
addr_reg <= addr_next;
|
||||||
@@ -875,7 +876,7 @@ always_ff @(posedge clk) begin
|
|||||||
last_scl_i_reg <= scl_i_reg;
|
last_scl_i_reg <= scl_i_reg;
|
||||||
last_sda_i_reg <= sda_i_reg;
|
last_sda_i_reg <= sda_i_reg;
|
||||||
|
|
||||||
busy_reg <= !(state_reg == STATE_IDLE || state_reg == STATE_ACTIVE_WRITE || state_reg == STATE_ACTIVE_READ) || !(phy_state_reg == PHY_STATE_IDLE || phy_state_reg == PHY_STATE_ACTIVE);
|
busy_reg <= !(state_reg == STATE_IDLE || state_reg == STATE_ACTIVE_WRITE || state_reg == STATE_ACTIVE_READ) || !phy_ready_reg;
|
||||||
|
|
||||||
if (start_bit) begin
|
if (start_bit) begin
|
||||||
bus_active_reg <= 1'b1;
|
bus_active_reg <= 1'b1;
|
||||||
|
|||||||
Reference in New Issue
Block a user