@@ -74,19 +74,23 @@ architecture rtl of i2c_ctrl_txn_layer is
74
74
tx_byte : std_logic_vector (7 downto 0 );
75
75
tx_byte_valid : std_logic ;
76
76
next_valid : std_logic ;
77
+ txd : std_logic_vector (7 downto 0 );
78
+ txd_valid : std_logic ;
77
79
end record ;
78
80
79
81
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'
90
94
);
91
95
92
96
signal sm_reg, sm_reg_next : sm_reg_t;
@@ -125,15 +129,13 @@ begin
125
129
reg_sm_next : process (all )
126
130
variable v : sm_reg_t;
127
131
variable is_read : std_logic ;
128
- variable txd : std_logic_vector (7 downto 0 );
129
- variable txd_valid : std_logic ;
130
132
begin
131
133
v := sm_reg;
132
134
is_read := '1' when sm_reg.cmd.op = READ or sm_reg.in_random_read else '0' ;
133
135
134
136
-- single cycle pulses
135
137
v.next_valid := '0' ;
136
- txd_valid := '0' ;
138
+ v. txd_valid := '0' ;
137
139
138
140
case sm_reg.state is
139
141
@@ -150,8 +152,8 @@ begin
150
152
151
153
-- wait for link layer to finish START sequence and load up the address byte
152
154
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' ;
155
157
if ll_ready then
156
158
v.next_valid := '1' ;
157
159
v.state := WAIT_ADDR_ACK;
@@ -170,8 +172,8 @@ begin
170
172
else
171
173
v.state := WAIT_WRITE_ACK;
172
174
-- 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' ;
175
177
end if ;
176
178
else
177
179
-- TODO: address nack error
@@ -244,9 +246,9 @@ begin
244
246
v.do_start := '1' when v.state = START else '0' ;
245
247
v.do_stop := '1' when v.state = STOP else '0' ;
246
248
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
248
250
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
250
252
else tx_st_if.valid;
251
253
252
254
sm_reg_next <= v;
0 commit comments