⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can_bsp.v

📁 一个用硬件描述语言编写CAN总线控制器的IP
💻 V
📖 第 1 页 / 共 5 页
字号:
  .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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -