]> rtime.felk.cvut.cz Git - fpga/zynq/canbench-sw.git/blob - system/ip/sja1000_1.0/hdl/can_bsp_txstream.v
sja1000: TX stream generation split into separate module
[fpga/zynq/canbench-sw.git] / system / ip / sja1000_1.0 / hdl / can_bsp_txstream.v
1 module can_bsp_txstream #()
2 (
3         input  wire        clk,
4         input  wire        rst,
5         input  wire        extended_mode,
6         input  wire        rx_data,
7         input  wire        rx_crc,
8         input  wire        finish_msg,
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,
12         output reg         tx_bit,
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
18 );
19
20 `ifdef _
21 begin
22 `endif
23
24 reg [ 7:0] tx_data_i;
25 always @(*) tx_data_i = tx_data_i_par;
26
27 wire   [15:0] r_calculated_crc;
28
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;
35
36 wire    [7:0] r_tx_data;
37
38 wire [5*4-1 : 0] basic_chain_byte;
39 wire [5*4-1 : 0] basic_chain_duration;
40
41 wire [6*4-1 : 0] extended_chain_std_byte;
42 wire [6*4-1 : 0] extended_chain_std_duration;
43
44 wire [10*4-1 : 0] extended_chain_ext_byte;
45 wire [10*4-1 : 0] extended_chain_ext_duration;
46
47 // combinatorial
48 reg [10*4-1 : 0] chain_byte;
49 reg [10*4-1 : 0] chain_duration;
50 reg [3:0] tx_data_addr_wire;
51
52 // registers
53 reg [3:0] item_idx;
54 reg [3:0] item_cnt;
55
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;
59
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};
63
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};
67
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};
71
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};
75
76 `ifdef _
77 end
78 `endif
79
80 always @(*)
81 begin
82         if (extended_mode)
83         begin
84                 if (tx_is_extended_frame)    // Extended frame
85                 begin
86                         chain_byte = extended_chain_ext_byte;
87                         chain_duration = extended_chain_ext_duration;
88                 end else begin
89                         chain_byte = {{4{4'h0}}, extended_chain_std_byte};
90                         chain_duration = {{4{4'h0}}, extended_chain_std_duration};
91                 end
92         end else begin
93                 chain_byte = {{5{4'h0}}, basic_chain_byte};
94                 chain_duration = {{5{4'h0}}, basic_chain_duration};
95         end
96 end
97
98 always @(posedge rst or posedge clk)
99 begin
100         if (rst || rst_tx_pointer)
101         begin
102                 item_idx <= 0;
103                 item_cnt <= 0;
104         end 
105         else if (~rx_data & ~rx_crc & ~finish_msg)
106         begin
107                 if (item_cnt >= chain_duration[item_idx])
108                 begin
109                         item_idx <= item_idx + 1'b1;
110                         item_cnt <= 0;
111                 end
112                 else
113                         item_cnt <= item_cnt + 1'b1;
114         end
115 end
116
117 wire [2:0] data_byte_idx;
118 assign data_byte_idx = tx_pointer[5:3];
119
120 always @(posedge rst or posedge clk)
121 begin
122         if (rst)
123                 tx_data_addr_o <= 4'h0;
124         else
125                 tx_data_addr_o <= tx_data_addr_wire;
126 end
127
128 reg [10*4-1 : 0] chain_data_byte;
129
130 always @(*)
131 begin
132         if (extended_mode) // Extended mode
133         begin
134                 if (tx_is_extended_frame)    // Extended frame
135                         chain_data_byte <= extended_chain_data_ext_byte;
136                 else
137                         chain_data_byte <= extended_chain_data_std_byte;
138         end
139         else   // Basic mode
140                 chain_data_byte <= basic_chain_data_byte;
141 end
142
143
144 integer i;
145
146 // tx_data_addr_wire is invalid on rst!
147 always @(*)
148 begin
149         if (rx_data)  // data stage
150         begin
151                 case (data_byte_idx)
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];
168                 endcase
169                 //tx_data_addr_wire = chain_data_byte[data_byte_idx*4+3 +: 4]; 
170         end
171         else if (rx_crc)
172                 tx_data_addr_wire <= 4'hx;
173         else if (finish_msg)
174                 tx_data_addr_wire <= 4'hx;
175         else
176                 case (item_idx)
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];
193                 endcase
194                 //tx_data_addr_wire <= 4'hx;//chain_byte[item_idx]; // TODO
195 end
196
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};
200 /*
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};
204 */
205
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));
208
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]));
212
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
215           finish_msg)
216 begin
217   if (extended_mode)
218     begin
219       if (rx_data)  // data stage
220         if (tx_is_extended_frame)    // Extended frame
221           tx_bit = r_tx_data[tx_pointer[2:0]];
222         else
223           tx_bit = r_tx_data[tx_pointer[2:0]];
224       else if (rx_crc)
225         tx_bit = r_calculated_crc[tx_pointer];
226       else if (finish_msg)
227         tx_bit = 1'b1;
228       else
229         begin
230           if (tx_is_extended_frame)    // Extended frame
231             tx_bit = extended_chain_ext[tx_pointer];
232           else
233             tx_bit = extended_chain_std[tx_pointer];
234         end
235     end
236   else  // Basic mode
237     begin
238       if (rx_data)  // data stage
239         tx_bit = r_tx_data[tx_pointer[2:0]];
240       else if (rx_crc)
241         tx_bit = r_calculated_crc[tx_pointer];
242       else if (finish_msg)
243         tx_bit = 1'b1;
244       else
245         tx_bit = basic_chain[tx_pointer];
246     end
247 end
248
249 // MJ: what is this? maybe total data length ?
250 always @(posedge rst or posedge clk)
251 begin
252         if (rst)
253         begin
254                 limited_tx_cnt_ext <= 6'h0;
255                 limited_tx_cnt_std <= 6'h0;
256                 tx_is_extended_frame <= 1'b0;
257         end
258         else
259         begin
260                 // there bytes are header; they are always read before the data bytes
261                 if (tx_data_addr_wire == 4'h0)
262                 begin
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];
265                 end
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);
268         end
269 end
270
271 endmodule