Skip to content

Commit b58a9d6

Browse files
committed
fix txd latch
1 parent b9192e5 commit b58a9d6

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

hdl/ip/vhd/i2c/controller/txn_layer/i2c_ctrl_txn_layer.vhd

+21-19
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,23 @@ architecture rtl of i2c_ctrl_txn_layer is
7474
tx_byte : std_logic_vector(7 downto 0);
7575
tx_byte_valid : std_logic;
7676
next_valid : std_logic;
77+
txd : std_logic_vector(7 downto 0);
78+
txd_valid : std_logic;
7779
end record;
7880

7981
constant SM_REG_RESET : sm_reg_t := (
80-
IDLE, -- state
81-
CMD_RESET, -- cmd
82-
false, -- in_random_read
83-
(others => '0'),-- bytes_done
84-
'0', -- do_start
85-
'0', -- do_ack
86-
'0', -- do_stop
87-
(others => '0'),-- tx_byte
88-
'0', -- tx_byte_valid
89-
'0' -- next_valid
82+
state => IDLE,
83+
cmd => CMD_RESET,
84+
in_random_read => false,
85+
bytes_done => (others => '0'),
86+
do_start => '0',
87+
do_ack => '0',
88+
do_stop => '0',
89+
tx_byte => (others => '0'),
90+
tx_byte_valid => '0',
91+
next_valid => '0',
92+
txd => (others => '0'),
93+
txd_valid => '0'
9094
);
9195

9296
signal sm_reg, sm_reg_next : sm_reg_t;
@@ -125,15 +129,13 @@ begin
125129
reg_sm_next: process(all)
126130
variable v : sm_reg_t;
127131
variable is_read : std_logic;
128-
variable txd : std_logic_vector(7 downto 0);
129-
variable txd_valid : std_logic;
130132
begin
131133
v := sm_reg;
132134
is_read := '1' when sm_reg.cmd.op = READ or sm_reg.in_random_read else '0';
133135

134136
-- single cycle pulses
135137
v.next_valid := '0';
136-
txd_valid := '0';
138+
v.txd_valid := '0';
137139

138140
case sm_reg.state is
139141

@@ -150,8 +152,8 @@ begin
150152

151153
-- wait for link layer to finish START sequence and load up the address byte
152154
when WAIT_START =>
153-
txd := sm_reg.cmd.addr & is_read;
154-
txd_valid := '1';
155+
v.txd := sm_reg.cmd.addr & is_read;
156+
v.txd_valid := '1';
155157
if ll_ready then
156158
v.next_valid := '1';
157159
v.state := WAIT_ADDR_ACK;
@@ -170,8 +172,8 @@ begin
170172
else
171173
v.state := WAIT_WRITE_ACK;
172174
-- load up the register address
173-
txd := sm_reg.cmd.reg;
174-
txd_valid := '1';
175+
v.txd := sm_reg.cmd.reg;
176+
v.txd_valid := '1';
175177
end if;
176178
else
177179
-- TODO: address nack error
@@ -244,9 +246,9 @@ begin
244246
v.do_start := '1' when v.state = START else '0';
245247
v.do_stop := '1' when v.state = STOP else '0';
246248

247-
v.tx_byte := txd when sm_reg.state = WAIT_START or sm_reg.state = WAIT_ADDR_ACK
249+
v.tx_byte := v.txd when sm_reg.state = WAIT_START or sm_reg.state = WAIT_ADDR_ACK
248250
else tx_st_if.data;
249-
v.tx_byte_valid := txd_valid when sm_reg.state = WAIT_START or sm_reg.state = WAIT_ADDR_ACK
251+
v.tx_byte_valid := v.txd_valid when sm_reg.state = WAIT_START or sm_reg.state = WAIT_ADDR_ACK
250252
else tx_st_if.valid;
251253

252254
sm_reg_next <= v;

0 commit comments

Comments
 (0)