?? can_bsp.v
字號:
.extended_mode(extended_mode), /* This section is for BASIC and EXTENDED mode */ /* Acceptance code register */ .acceptance_code_0(acceptance_code_0), /* Acceptance mask register */ .acceptance_mask_0(acceptance_mask_0), /* End: This section is for BASIC and EXTENDED mode */ /* This section is for EXTENDED mode */ /* Acceptance code register */ .acceptance_code_1(acceptance_code_1), .acceptance_code_2(acceptance_code_2), .acceptance_code_3(acceptance_code_3), /* Acceptance mask register */ .acceptance_mask_1(acceptance_mask_1), .acceptance_mask_2(acceptance_mask_2), .acceptance_mask_3(acceptance_mask_3), /* End: This section is for EXTENDED mode */ .go_rx_crc_lim(go_rx_crc_lim), .go_rx_inter(go_rx_inter), .go_error_frame(go_error_frame), .data0(tmp_fifo[0]), .data1(tmp_fifo[1]), .rtr1(rtr1), .rtr2(rtr2), .ide(ide), .no_byte0(no_byte0), .no_byte1(no_byte1), .id_ok(id_ok));assign header_len[2:0] = extended_mode ? (ide? (3'h5) : (3'h3)) : 3'h2;assign storing_header = header_cnt < header_len;assign limited_data_len_minus1[3:0] = remote_rq? 4'hf : ((data_len < 4'h8)? (data_len -1'b1) : 4'h7); // - 1 because counter counts from 0assign reset_wr_fifo = (data_cnt == (limited_data_len_minus1 + {1'b0, header_len})) || reset_mode;assign err = form_err | stuff_err | bit_err | ack_err | form_err_latched | stuff_err_latched | bit_err_latched | ack_err_latched | crc_err;// Write enable signal for 64-byte rx fifoalways @ (posedge clk or posedge rst)begin if (rst) wr_fifo <= 1'b0; else if (reset_wr_fifo) wr_fifo <=#Tp 1'b0; else if (go_rx_inter & id_ok & (~error_frame_ended) & ((~tx_state) | self_rx_request)) wr_fifo <=#Tp 1'b1;end// Header counter. Header length depends on the mode of operation and frame format.always @ (posedge clk or posedge rst)begin if (rst) header_cnt <= 3'h0; else if (reset_wr_fifo) header_cnt <=#Tp 3'h0; else if (wr_fifo & storing_header) header_cnt <=#Tp header_cnt + 1'h1;end// Data counter. Length of the data is limited to 8 bytes.always @ (posedge clk or posedge rst)begin if (rst) data_cnt <= 4'h0; else if (reset_wr_fifo) data_cnt <=#Tp 4'h0; else if (wr_fifo) data_cnt <=#Tp data_cnt + 4'h1;end// Multiplexing data that is stored to 64-byte fifo depends on the mode of operation and frame formatalways @ (extended_mode or ide or data_cnt or header_cnt or header_len or storing_header or id or rtr1 or rtr2 or data_len or tmp_fifo[0] or tmp_fifo[2] or tmp_fifo[4] or tmp_fifo[6] or tmp_fifo[1] or tmp_fifo[3] or tmp_fifo[5] or tmp_fifo[7])begin casex ({storing_header, extended_mode, ide, header_cnt}) /* synthesis parallel_case */ 6'b1_1_1_000 : data_for_fifo = {1'b1, rtr2, 2'h0, data_len}; // extended mode, extended format header 6'b1_1_1_001 : data_for_fifo = id[28:21]; // extended mode, extended format header 6'b1_1_1_010 : data_for_fifo = id[20:13]; // extended mode, extended format header 6'b1_1_1_011 : data_for_fifo = id[12:5]; // extended mode, extended format header 6'b1_1_1_100 : data_for_fifo = {id[4:0], 3'h0}; // extended mode, extended format header 6'b1_1_0_000 : data_for_fifo = {1'b0, rtr1, 2'h0, data_len}; // extended mode, standard format header 6'b1_1_0_001 : data_for_fifo = id[10:3]; // extended mode, standard format header 6'b1_1_0_010 : data_for_fifo = {id[2:0], rtr1, 4'h0}; // extended mode, standard format header 6'b1_0_x_000 : data_for_fifo = id[10:3]; // normal mode header 6'b1_0_x_001 : data_for_fifo = {id[2:0], rtr1, data_len}; // normal mode header default : data_for_fifo = tmp_fifo[data_cnt - {1'b0, header_len}]; // data endcaseend// Instantiation of the RX fifo modulecan_fifo i_can_fifo( .clk(clk), .rst(rst), .wr(wr_fifo), .data_in(data_for_fifo), .addr(addr[5:0]), .data_out(data_out), .fifo_selected(fifo_selected), .reset_mode(reset_mode), .release_buffer(release_buffer), .extended_mode(extended_mode), .overrun(overrun), .info_empty(info_empty), .info_cnt(rx_message_counter)`ifdef CAN_BIST , .mbist_si_i(mbist_si_i), .mbist_so_o(mbist_so_o), .mbist_ctrl_i(mbist_ctrl_i)`endif);// Transmitting error frame.always @ (posedge clk or posedge rst)begin if (rst) error_frame <= 1'b0;// else if (reset_mode || error_frame_ended || go_overload_frame) else if (set_reset_mode || error_frame_ended || go_overload_frame) error_frame <=#Tp 1'b0; else if (go_error_frame) error_frame <=#Tp 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) error_cnt1 <= 3'd0; else if (error_frame_ended | go_error_frame | go_overload_frame) error_cnt1 <=#Tp 3'd0; else if (error_frame & tx_point & (error_cnt1 < 3'd7)) error_cnt1 <=#Tp error_cnt1 + 1'b1;endassign error_flag_over = ((~node_error_passive) & sample_point & (error_cnt1 == 3'd7) | node_error_passive & sample_point & (passive_cnt == 3'h6)) & (~enable_error_cnt2);always @ (posedge clk or posedge rst)begin if (rst) error_flag_over_latched <= 1'b0; else if (error_frame_ended | go_error_frame | go_overload_frame) error_flag_over_latched <=#Tp 1'b0; else if (error_flag_over) error_flag_over_latched <=#Tp 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) enable_error_cnt2 <= 1'b0; else if (error_frame_ended | go_error_frame | go_overload_frame) enable_error_cnt2 <=#Tp 1'b0; else if (error_frame & (error_flag_over & sampled_bit)) enable_error_cnt2 <=#Tp 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) error_cnt2 <= 3'd0; else if (error_frame_ended | go_error_frame | go_overload_frame) error_cnt2 <=#Tp 3'd0; else if (enable_error_cnt2 & tx_point) error_cnt2 <=#Tp error_cnt2 + 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) delayed_dominant_cnt <= 3'h0; else if (enable_error_cnt2 | go_error_frame | enable_overload_cnt2 | go_overload_frame) delayed_dominant_cnt <=#Tp 3'h0; else if (sample_point & (~sampled_bit) & ((error_cnt1 == 3'd7) | (overload_cnt1 == 3'd7))) delayed_dominant_cnt <=#Tp delayed_dominant_cnt + 1'b1;end// passive_cntalways @ (posedge clk or posedge rst)begin if (rst) passive_cnt <= 3'h1; else if (error_frame_ended | go_error_frame | go_overload_frame | first_compare_bit) passive_cnt <=#Tp 3'h1; else if (sample_point & (passive_cnt < 3'h6)) begin if (error_frame & (~enable_error_cnt2) & (sampled_bit == sampled_bit_q)) passive_cnt <=#Tp passive_cnt + 1'b1; else passive_cnt <=#Tp 3'h1; endend// When comparing 6 equal bits, first is always equalalways @ (posedge clk or posedge rst)begin if (rst) first_compare_bit <= 1'b0; else if (go_error_frame) first_compare_bit <=#Tp 1'b1; else if (sample_point) first_compare_bit <= 1'b0;end// Transmitting overload frame.always @ (posedge clk or posedge rst)begin if (rst) overload_frame <= 1'b0; else if (overload_frame_ended | go_error_frame) overload_frame <=#Tp 1'b0; else if (go_overload_frame) overload_frame <=#Tp 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) overload_cnt1 <= 3'd0; else if (overload_frame_ended | go_error_frame | go_overload_frame) overload_cnt1 <=#Tp 3'd0; else if (overload_frame & tx_point & (overload_cnt1 < 3'd7)) overload_cnt1 <=#Tp overload_cnt1 + 1'b1;endassign overload_flag_over = sample_point & (overload_cnt1 == 3'd7) & (~enable_overload_cnt2);always @ (posedge clk or posedge rst)begin if (rst) enable_overload_cnt2 <= 1'b0; else if (overload_frame_ended | go_error_frame | go_overload_frame) enable_overload_cnt2 <=#Tp 1'b0; else if (overload_frame & (overload_flag_over & sampled_bit)) enable_overload_cnt2 <=#Tp 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) overload_cnt2 <= 3'd0; else if (overload_frame_ended | go_error_frame | go_overload_frame) overload_cnt2 <=#Tp 3'd0; else if (enable_overload_cnt2 & tx_point) overload_cnt2 <=#Tp overload_cnt2 + 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) overload_request_cnt <= 2'b0; else if (go_error_frame | go_rx_id1) overload_request_cnt <=#Tp 2'b0; else if (overload_request & overload_frame) overload_request_cnt <=#Tp overload_request_cnt + 1'b1;endalways @ (posedge clk or posedge rst)begin if (rst) overload_frame_blocked <= 1'b0; else if (go_error_frame | go_rx_id1) overload_frame_blocked <=#Tp 1'b0; else if (overload_request & overload_frame & overload_request_cnt == 2'h2) // This is a second sequential overload_request overload_frame_blocked <=#Tp 1'b1;endassign send_ack = (~tx_state) & rx_ack & (~err) & (~listen_only_mode);always @ (reset_mode or node_bus_off or tx_state or go_tx or bit_de_stuff_tx or tx_bit or tx_q or send_ack or go_overload_frame or overload_frame or overload_cnt1 or go_error_frame or error_frame or error_cnt1 or node_error_passive)begin if (reset_mode | node_bus_off) // Reset or node_bus_off tx_next = 1'b1; else begin if (go_error_frame | error_frame) // Transmitting error frame begin if (error_cnt1 < 3'd6) begin if (node_error_passive) tx_next = 1'b1; else tx_next = 1'b0; end else tx_next = 1'b1; end else if (go_overload_frame | overload_frame) // Transmitting overload frame begin if (overload_cnt1 < 3'd6) tx_next = 1'b0; else tx_next = 1'b1; end else if (go_tx | tx_state) // Transmitting message tx_next = ((~bit_de_stuff_tx) & tx_bit) | (bit_de_stuff_tx & (~tx_q)); else if (send_ack) // Acknowledge tx_next = 1'b0; else tx_next = 1'b1; endendalways @ (posedge clk or posedge rst)begin if (rst) tx <= 1'b1; else if (reset_mode) tx <= 1'b1; else if (tx_point) tx <=#Tp tx_next;endalways @ (posedge clk or posedge rst)begin if (rst) tx_q <=#Tp 1'b0; else if (reset_mode) tx_q <=#Tp 1'b0; else if (tx_point) tx_q <=#Tp tx & (~go_early_tx_latched);end/* Delayed tx point */always @ (posedge clk or posedge rst)begin if (rst) tx_point_q <=#Tp 1'b0; else if (reset_mode) tx_point_q <=#Tp 1'b0; else tx_point_q <=#Tp tx_point;end/* Changing bit order from [7:0] to [0:7] */can_ibo i_ibo_tx_data_0 (.di(tx_data_0), .do(r_tx_data_0));can_ibo i_ibo_tx_data_1 (.di(tx_data_1), .do(r_tx_data_1));can_ibo i_ibo_tx_data_2 (.di(tx_data_2), .do(r_tx_data_2));can_ibo i_ibo_tx_data_3 (.di(tx_data_3), .do(r_tx_data_3));can_ibo i_ibo_tx_data_4 (.di(tx_data_4), .do(r_tx_data_4));can_ibo i_ibo_tx_data_5 (.di(tx_data_5), .do(r_tx_data_5));can_ibo i_ibo_tx_data_6 (.di(tx_data_6), .do(r_tx_data_6));can_ibo i_ibo_tx_data_7 (.di(tx_data_7), .do(r_tx_data_7));can_ibo i_ibo_tx_data_8 (.di(tx_data_8), .do(r_tx_data_8));can_ibo i_ibo_tx_data_9 (.di(tx_data_9), .do(r_tx_data_9));can_ibo i_ibo_tx_data_10 (.di(tx_data_10), .do(r_tx_data_10));can_ibo i_ibo_tx_data_11 (.di(tx_data_11), .do(r_tx_data_11));can_ibo i_ibo_tx_data_12 (.di(tx_data_12), .do(r_tx_data_12));/* Changing bit order from [14:0] to [0:14] */can_ibo i_calculated_crc0 (.di(calculated_crc[14:7]), .do(r_calculated_crc[7:0]));can_ibo i_calculated_crc1 (.di({calculated_crc[6:0], 1'b0}), .do(r_calculated_crc[15:8]));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};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};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};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};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};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};always @ (extended_mode or rx_data or tx_pointer or extended_chain_data_std or extended_chain_data_ext or rx_crc or r_calculated_crc or r_tx_data_0 or extended_chain_ext or extended_chain_std or basic_chain_data or basic_chain or finish_msg)begin if (extended_mode) begin if (rx_data) // data stage if (r_tx_data_0[0]) // Extended frame tx_bit = extended_chain_data_ext[tx_pointer]; else tx_bit = extended_chain_data_std[tx_pointer]; else if (rx_crc) tx_bit = r_calculated_crc[tx_pointer]; else if (finish_msg) tx_bit = 1'b1; else begin
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -