1 module can_bsp_txstream #()
5 input wire extended_mode,
9 input wire [ 7:0] tx_data_i_par,
10 output reg [ 3:0] tx_data_addr_o,
11 input wire [14:0] calculated_crc,
13 output reg [ 5:0] limited_tx_cnt_ext,
14 output reg [ 5:0] limited_tx_cnt_std,
15 output reg tx_is_extended_frame,
16 input wire rst_tx_pointer,
17 input wire [ 5:0] tx_pointer
25 always @(*) tx_data_i = tx_data_i_par;
27 wire [15:0] r_calculated_crc;
29 wire [18:0] basic_chain;
30 wire [63:0] basic_chain_data;
31 wire [18:0] extended_chain_std;
32 wire [38:0] extended_chain_ext;
33 wire [63:0] extended_chain_data_std;
34 wire [63:0] extended_chain_data_ext;
38 wire [5*4-1 : 0] basic_chain_byte;
39 wire [5*4-1 : 0] basic_chain_duration;
41 wire [6*4-1 : 0] extended_chain_std_byte;
42 wire [6*4-1 : 0] extended_chain_std_duration;
44 wire [10*4-1 : 0] extended_chain_ext_byte;
45 wire [10*4-1 : 0] extended_chain_ext_duration;
48 reg [10*4-1 : 0] chain_byte;
49 reg [10*4-1 : 0] chain_duration;
50 reg [3:0] tx_data_addr_wire;
56 wire [8*4-1 : 0] basic_chain_data_byte;
57 wire [8*4-1 : 0] extended_chain_data_std_byte;
58 wire [8*4-1 : 0] extended_chain_data_ext_byte;
60 assign basic_chain_byte = { 4'h1, 4'hx, 4'h1, 4'h0, 4'hx};
61 assign basic_chain_duration = { 4'h4, 4'h2, 4'h4, 4'h8, 4'h1};
62 assign basic_chain = {r_tx_data[7:4], 2'h0, r_tx_data[3:0], r_tx_data[7:0], 1'b0};
64 assign extended_chain_std_byte = { 4'h0, 4'hx, 4'h0, 4'h2, 4'h1, 4'hx};
65 assign extended_chain_std_duration = { 4'h4, 4'h2, 4'h1, 4'h3, 4'h8, 4'h1};
66 assign extended_chain_std = {r_tx_data[7:4], 2'h0, r_tx_data[1], r_tx_data[2:0], r_tx_data[7:0], 1'b0};
68 assign extended_chain_ext_byte = { 4'h0, 4'hx, 4'h0, 4'h4, 4'h3, 4'h2, 4'hx, 4'h2, 4'h1, 4'hx};
69 assign extended_chain_ext_duration = { 4'h4, 4'h2, 4'h1, 4'h5, 4'h8, 4'h5, 4'h2, 4'h3, 4'h8, 4'h1};
70 assign extended_chain_ext = {r_tx_data[7:4], 2'h0, r_tx_data[1], r_tx_data[4:0], r_tx_data[7:0], r_tx_data[7:3], 2'b11, r_tx_data[2:0], r_tx_data[7:0], 1'b0};
72 assign basic_chain_data_byte = {4'd9, 4'd8, 4'd7, 4'd6, 4'd5, 4'd4, 4'd3, 4'd2};
73 assign extended_chain_data_std_byte = {4'd10, 4'd9, 4'd8, 4'd7, 4'd6, 4'd5, 4'd4, 4'd3};
74 assign extended_chain_data_ext_byte = {4'd12, 4'd11, 4'd10, 4'd9, 4'd8, 4'd7, 4'd6, 4'd5};
84 if (tx_is_extended_frame) // Extended frame
86 chain_byte = extended_chain_ext_byte;
87 chain_duration = extended_chain_ext_duration;
89 chain_byte = {{4{4'h0}}, extended_chain_std_byte};
90 chain_duration = {{4{4'h0}}, extended_chain_std_duration};
93 chain_byte = {{5{4'h0}}, basic_chain_byte};
94 chain_duration = {{5{4'h0}}, basic_chain_duration};
98 always @(posedge rst or posedge clk)
100 if (rst || rst_tx_pointer)
105 else if (~rx_data & ~rx_crc & ~finish_msg)
107 if (item_cnt >= chain_duration[item_idx])
109 item_idx <= item_idx + 1'b1;
113 item_cnt <= item_cnt + 1'b1;
117 wire [2:0] data_byte_idx;
118 assign data_byte_idx = tx_pointer[5:3];
120 always @(posedge rst or posedge clk)
123 tx_data_addr_o <= 4'h0;
125 tx_data_addr_o <= tx_data_addr_wire;
128 reg [10*4-1 : 0] chain_data_byte;
132 if (extended_mode) // Extended mode
134 if (tx_is_extended_frame) // Extended frame
135 chain_data_byte <= extended_chain_data_ext_byte;
137 chain_data_byte <= extended_chain_data_std_byte;
140 chain_data_byte <= basic_chain_data_byte;
146 // tx_data_addr_wire is invalid on rst!
149 if (rx_data) // data stage
152 3'h0: tx_data_addr_wire = chain_data_byte[0*4+3 : 0*4];
153 3'h1: tx_data_addr_wire = chain_data_byte[1*4+3 : 1*4];
154 3'h2: tx_data_addr_wire = chain_data_byte[2*4+3 : 2*4];
155 3'h3: tx_data_addr_wire = chain_data_byte[3*4+3 : 3*4];
156 3'h4: tx_data_addr_wire = chain_data_byte[4*4+3 : 4*4];
157 3'h5: tx_data_addr_wire = chain_data_byte[5*4+3 : 5*4];
158 3'h6: tx_data_addr_wire = chain_data_byte[6*4+3 : 6*4];
159 3'h7: tx_data_addr_wire = chain_data_byte[7*4+3 : 7*4];
160 3'h8: tx_data_addr_wire = chain_data_byte[8*4+3 : 8*4];
161 3'h9: tx_data_addr_wire = chain_data_byte[9*4+3 : 9*4];
162 3'ha: tx_data_addr_wire = chain_data_byte[10*4+3 : 10*4];
163 3'hb: tx_data_addr_wire = chain_data_byte[11*4+3 : 11*4];
164 3'hc: tx_data_addr_wire = chain_data_byte[12*4+3 : 12*4];
165 3'hd: tx_data_addr_wire = chain_data_byte[13*4+3 : 13*4];
166 3'he: tx_data_addr_wire = chain_data_byte[14*4+3 : 14*4];
167 3'hf: tx_data_addr_wire = chain_data_byte[15*4+3 : 15*4];
169 //tx_data_addr_wire = chain_data_byte[data_byte_idx*4+3 +: 4];
172 tx_data_addr_wire <= 4'hx;
174 tx_data_addr_wire <= 4'hx;
177 3'h0: tx_data_addr_wire = chain_byte[0*4+3 : 0*4];
178 3'h1: tx_data_addr_wire = chain_byte[1*4+3 : 1*4];
179 3'h2: tx_data_addr_wire = chain_byte[2*4+3 : 2*4];
180 3'h3: tx_data_addr_wire = chain_byte[3*4+3 : 3*4];
181 3'h4: tx_data_addr_wire = chain_byte[4*4+3 : 4*4];
182 3'h5: tx_data_addr_wire = chain_byte[5*4+3 : 5*4];
183 3'h6: tx_data_addr_wire = chain_byte[6*4+3 : 6*4];
184 3'h7: tx_data_addr_wire = chain_byte[7*4+3 : 7*4];
185 3'h8: tx_data_addr_wire = chain_byte[8*4+3 : 8*4];
186 3'h9: tx_data_addr_wire = chain_byte[9*4+3 : 9*4];
187 3'ha: tx_data_addr_wire = chain_byte[10*4+3 : 10*4];
188 3'hb: tx_data_addr_wire = chain_byte[11*4+3 : 11*4];
189 3'hc: tx_data_addr_wire = chain_byte[12*4+3 : 12*4];
190 3'hd: tx_data_addr_wire = chain_byte[13*4+3 : 13*4];
191 3'he: tx_data_addr_wire = chain_byte[14*4+3 : 14*4];
192 3'hf: tx_data_addr_wire = chain_byte[15*4+3 : 15*4];
194 //tx_data_addr_wire <= 4'hx;//chain_byte[item_idx]; // TODO
197 //assign basic_chain = {r_tx_data_1[7:4], 2'h0, r_tx_data_1[3:0], r_tx_data_0[7:0], 1'b0};
198 //assign extended_chain_std = {r_tx_data_0[7:4], 2'h0, r_tx_data_0[1], r_tx_data_2[2:0], r_tx_data_1[7:0], 1'b0};
199 //assign extended_chain_ext = {r_tx_data_0[7:4], 2'h0, r_tx_data_0[1], r_tx_data_4[4:0], r_tx_data_3[7:0], r_tx_data_2[7:3], 1'b1, 1'b1, r_tx_data_2[2:0], r_tx_data_1[7:0], 1'b0};
201 assign basic_chain_data = {r_tx_data_9, r_tx_data_8, r_tx_data_7, r_tx_data_6, r_tx_data_5, r_tx_data_4, r_tx_data_3, r_tx_data_2};
202 assign extended_chain_data_std = {r_tx_data_10, r_tx_data_9, r_tx_data_8, r_tx_data_7, r_tx_data_6, r_tx_data_5, r_tx_data_4, r_tx_data_3};
203 assign extended_chain_data_ext = {r_tx_data_12, r_tx_data_11, r_tx_data_10, r_tx_data_9, r_tx_data_8, r_tx_data_7, r_tx_data_6, r_tx_data_5};
206 /* Changing bit order from [7:0] to [0:7] */
207 can_ibo i_ibo_tx_data (.di(tx_data_i), .do(r_tx_data));
209 /* Changing bit order from [14:0] to [0:14] */
210 can_ibo i_calculated_crc0 (.di(calculated_crc[14:7]), .do(r_calculated_crc[7:0]));
211 can_ibo i_calculated_crc1 (.di({calculated_crc[6:0], 1'b0}), .do(r_calculated_crc[15:8]));
213 always @ (extended_mode or rx_data or tx_pointer or rx_crc or r_calculated_crc or r_tx_data or
214 tx_is_extended_frame or extended_chain_ext or extended_chain_std or basic_chain or
219 if (rx_data) // data stage
220 if (tx_is_extended_frame) // Extended frame
221 tx_bit = r_tx_data[tx_pointer[2:0]];
223 tx_bit = r_tx_data[tx_pointer[2:0]];
225 tx_bit = r_calculated_crc[tx_pointer];
230 if (tx_is_extended_frame) // Extended frame
231 tx_bit = extended_chain_ext[tx_pointer];
233 tx_bit = extended_chain_std[tx_pointer];
238 if (rx_data) // data stage
239 tx_bit = r_tx_data[tx_pointer[2:0]];
241 tx_bit = r_calculated_crc[tx_pointer];
245 tx_bit = basic_chain[tx_pointer];
249 // MJ: what is this? maybe total data length ?
250 always @(posedge rst or posedge clk)
254 limited_tx_cnt_ext <= 6'h0;
255 limited_tx_cnt_std <= 6'h0;
256 tx_is_extended_frame <= 1'b0;
260 // there bytes are header; they are always read before the data bytes
261 if (tx_data_addr_wire == 4'h0)
263 limited_tx_cnt_ext <= tx_data_i[3] ? 6'h3f : ((tx_data_i[2:0] <<3) - 1'b1);
264 tx_is_extended_frame <= r_tx_data[0];
266 if (tx_data_addr_wire == 4'h1)
267 limited_tx_cnt_std <= tx_data_i[3] ? 6'h3f : ((tx_data_i[2:0] <<3) - 1'b1);