OpenCores
URL https://opencores.org/ocsvn/can/can/trunk

Subversion Repositories can

[/] [can/] [tags/] [rel_6/] [rtl/] [verilog/] [can_bsp.v] - Diff between revs 35 and 36

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 35 Rev 36
Line 48... Line 48...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.23  2003/02/14 20:17:01  mohor
 
// Several registers added. Not finished, yet.
 
//
// Revision 1.22  2003/02/12 14:23:59  mohor
// Revision 1.22  2003/02/12 14:23:59  mohor
// abort_tx added. Bit destuff fixed.
// abort_tx added. Bit destuff fixed.
//
//
// Revision 1.21  2003/02/11 00:56:06  mohor
// Revision 1.21  2003/02/11 00:56:06  mohor
// Wishbone interface added.
// Wishbone interface added.
Line 150... Line 153...
 
 
 
 
 
 
  /* Mode register */
  /* Mode register */
  reset_mode,
  reset_mode,
 
  listen_only_mode,
  acceptance_filter_mode,
  acceptance_filter_mode,
 
  self_test_mode,
 
 
  /* Command register */
  /* Command register */
  release_buffer,
  release_buffer,
  tx_request,
  tx_request,
  abort_tx,
  abort_tx,
 
  self_rx_request,
 
  single_shot_transmission,
 
 
  /* Error Warning Limit register */
  /* Error Warning Limit register */
  error_warning_limit,
  error_warning_limit,
 
 
  /* Rx Error Counter register */
  /* Rx Error Counter register */
Line 183... Line 190...
  receive_status,
  receive_status,
  tx_successful,
  tx_successful,
  need_to_tx,
  need_to_tx,
  overrun,
  overrun,
  info_empty,
  info_empty,
 
  go_error_frame,
 
  priority_lost,
 
  node_error_passive,
 
  node_error_active,
 
 
 
 
 
 
  /* This section is for BASIC and EXTENDED mode */
  /* This section is for BASIC and EXTENDED mode */
  /* Acceptance code register */
  /* Acceptance code register */
  acceptance_code_0,
  acceptance_code_0,
Line 242... Line 254...
input   [7:0] data_in;
input   [7:0] data_in;
output  [7:0] data_out;
output  [7:0] data_out;
 
 
 
 
input         reset_mode;
input         reset_mode;
 
input         listen_only_mode;
input         acceptance_filter_mode;
input         acceptance_filter_mode;
input         extended_mode;
input         extended_mode;
 
input         self_test_mode;
 
 
 
 
/* Command register */
/* Command register */
input         release_buffer;
input         release_buffer;
input         tx_request;
input         tx_request;
input         abort_tx;
input         abort_tx;
 
input         self_rx_request;
 
input         single_shot_transmission;
 
 
/* Error Warning Limit register */
/* Error Warning Limit register */
input   [7:0] error_warning_limit;
input   [7:0] error_warning_limit;
 
 
/* Rx Error Counter register */
/* Rx Error Counter register */
Line 274... Line 290...
output        receive_status;
output        receive_status;
output        tx_successful;
output        tx_successful;
output        need_to_tx;
output        need_to_tx;
output        overrun;
output        overrun;
output        info_empty;
output        info_empty;
 
output        go_error_frame;
 
output        priority_lost;
 
output        node_error_passive;
 
output        node_error_active;
 
 
 
 
/* This section is for BASIC and EXTENDED mode */
/* This section is for BASIC and EXTENDED mode */
/* Acceptance code register */
/* Acceptance code register */
input   [7:0] acceptance_code_0;
input   [7:0] acceptance_code_0;
Line 436... Line 456...
wire          go_rx_crc;
wire          go_rx_crc;
wire          go_rx_crc_lim;
wire          go_rx_crc_lim;
wire          go_rx_ack;
wire          go_rx_ack;
wire          go_rx_ack_lim;
wire          go_rx_ack_lim;
wire          go_rx_eof;
wire          go_rx_eof;
wire          go_error_frame;
 
wire          go_overload_frame;
wire          go_overload_frame;
wire          go_rx_inter;
wire          go_rx_inter;
 
 
wire          go_crc_enable;
wire          go_crc_enable;
wire          rst_crc_enable;
wire          rst_crc_enable;
Line 462... Line 481...
wire          bit_err;
wire          bit_err;
wire          ack_err;
wire          ack_err;
wire          stuff_err;
wire          stuff_err;
                                    // of intermission, it starts reading the identifier (and transmitting its own).
                                    // of intermission, it starts reading the identifier (and transmitting its own).
wire          overload_needed = 0;  // When receiver is busy, it needs to send overload frame. Only 2 overload frames are allowed to
wire          overload_needed = 0;  // When receiver is busy, it needs to send overload frame. Only 2 overload frames are allowed to
                                    // be send in a row. This is not implemented because host can not send an overload request. FIX ME !!!!
                                    // be send in a row. This is not implemented because host can not send an overload request.
 
 
wire          id_ok;                // If received ID matches ID set in registers
wire          id_ok;                // If received ID matches ID set in registers
wire          no_byte0;             // There is no byte 0 (RTR bit set to 1 or DLC field equal to 0). Signal used for acceptance filter.
wire          no_byte0;             // There is no byte 0 (RTR bit set to 1 or DLC field equal to 0). Signal used for acceptance filter.
wire          no_byte1;             // There is no byte 1 (RTR bit set to 1 or DLC field equal to 1). Signal used for acceptance filter.
wire          no_byte1;             // There is no byte 1 (RTR bit set to 1 or DLC field equal to 1). Signal used for acceptance filter.
 
 
Line 547... Line 566...
assign bit_de_stuff_reset = go_rx_crc_lim | reset_mode | go_error_frame | go_overload_frame;
assign bit_de_stuff_reset = go_rx_crc_lim | reset_mode | go_error_frame | go_overload_frame;
 
 
assign remote_rq = ((~ide) & rtr1) | (ide & rtr2);
assign remote_rq = ((~ide) & rtr1) | (ide & rtr2);
assign limited_data_len = (data_len < 8)? data_len : 4'h8;
assign limited_data_len = (data_len < 8)? data_len : 4'h8;
 
 
assign ack_err = rx_ack & sample_point & sampled_bit & tx_state;
assign ack_err = rx_ack & sample_point & sampled_bit & tx_state & (~self_test_mode);
assign bit_err = (tx_state | error_frame | overload_frame | rx_ack) & sample_point & (tx !== sampled_bit) & (~bit_err_exc1) & (~bit_err_exc2) & (~bit_err_exc3) & (~bit_err_exc4) & (~bit_err_exc5);
assign bit_err = (tx_state | error_frame | overload_frame | rx_ack) & sample_point & (tx !== sampled_bit) & (~bit_err_exc1) & (~bit_err_exc2) & (~bit_err_exc3) & (~bit_err_exc4) & (~bit_err_exc5);
assign bit_err_exc1 = tx_state & arbitration_field & tx;
assign bit_err_exc1 = tx_state & arbitration_field & tx;
assign bit_err_exc2 = rx_ack & tx;
assign bit_err_exc2 = rx_ack & tx;
assign bit_err_exc3 = error_frame & node_error_passive & (error_cnt1 < 7);
assign bit_err_exc3 = error_frame & node_error_passive & (error_cnt1 < 7);
assign bit_err_exc4 = (error_frame & (error_cnt1 == 7) & (~enable_error_cnt2)) | (overload_frame & (overload_cnt1 == 7) & (~enable_overload_cnt2));
assign bit_err_exc4 = (error_frame & (error_cnt1 == 7) & (~enable_error_cnt2)) | (overload_frame & (overload_cnt1 == 7) & (~enable_overload_cnt2));
Line 828... Line 847...
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    byte_cnt <= 0;
    byte_cnt <= 0;
  else if (reset_mode | write_data_to_tmp_fifo)
  else if (write_data_to_tmp_fifo)
    byte_cnt <=#Tp byte_cnt + 1;
    byte_cnt <=#Tp byte_cnt + 1;
  else if (sample_point & go_rx_crc_lim)
  else if (reset_mode | (sample_point & go_rx_crc_lim))
    byte_cnt <=#Tp 0;
    byte_cnt <=#Tp 0;
end
end
 
 
 
 
always @ (posedge clk)
always @ (posedge clk)
Line 1178... Line 1197...
begin
begin
  if (rst)
  if (rst)
    wr_fifo <= 1'b0;
    wr_fifo <= 1'b0;
  else if (reset_wr_fifo)
  else if (reset_wr_fifo)
    wr_fifo <=#Tp 1'b0;
    wr_fifo <=#Tp 1'b0;
  else if (go_rx_inter & id_ok & (~error_frame_ended))                // FIX ME !!! Look following line
  else if (go_rx_inter & id_ok & (~error_frame_ended) & ((~tx_state) | self_rx_request))
//  else if (go_rx_inter & id_ok & (~error_frame_ended) & (~tx_state))    // FIX ME !!! This line is the correct one. The above line is for easier debugging only.
 
    wr_fifo <=#Tp 1'b1;
    wr_fifo <=#Tp 1'b1;
end
end
 
 
 
 
// Header counter. Header length depends on the mode of operation and frame format.
// Header counter. Header length depends on the mode of operation and frame format.
Line 1439... Line 1457...
  else if (go_overload_frame & overload_frame)            // This is a second sequential overload
  else if (go_overload_frame & overload_frame)            // This is a second sequential overload
    overload_frame_blocked <=#Tp 1'b1;
    overload_frame_blocked <=#Tp 1'b1;
end
end
 
 
 
 
assign send_ack = (~tx_state) & rx_ack & (~err);
assign send_ack = (~tx_state) & rx_ack & (~err) & (~listen_only_mode);
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
Line 1552... Line 1570...
      else
      else
        tx_bit = basic_chain[tx_pointer];
        tx_bit = basic_chain[tx_pointer];
    end
    end
end
end
 
 
 
assign rst_tx_pointer = ((~bit_de_stuff_tx) & tx_point & (~rx_data) &   extended_mode  &   r_tx_data_0[0]   & tx_pointer == 38                      ) |   // arbitration + control for extended format
assign rst_tx_pointer = ((~bit_de_stuff_tx) & tx_point & (~rx_data) &   extended_mode  & tx_pointer == 38                      ) |   // arbitration + control for extended format
                        ((~bit_de_stuff_tx) & tx_point & (~rx_data) &   extended_mode  & (~r_tx_data_0[0])  & tx_pointer == 18                      ) |   // arbitration + control for extended format
                        ((~bit_de_stuff_tx) & tx_point & (~rx_data) & (~extended_mode) & tx_pointer == 18                      ) |   // arbitration + control for standard format
                        ((~bit_de_stuff_tx) & tx_point & (~rx_data) & (~extended_mode) & tx_pointer == 18                      ) |   // arbitration + control for standard format
                        ((~bit_de_stuff_tx) & tx_point &   rx_data  &   extended_mode  & tx_pointer == (8 * tx_data_0[3:0] - 1)) |   // data
                        ((~bit_de_stuff_tx) & tx_point &   rx_data  &   extended_mode  & tx_pointer == (8 * tx_data_0[3:0] - 1)) |   // data
                        ((~bit_de_stuff_tx) & tx_point &   rx_data  & (~extended_mode) & tx_pointer == (8 * tx_data_1[3:0] - 1)) |   // data
                        ((~bit_de_stuff_tx) & tx_point &   rx_data  & (~extended_mode) & tx_pointer == (8 * tx_data_1[3:0] - 1)) |   // data
                        (                     tx_point &   rx_crc_lim                                                          ) |   // crc
                        (                     tx_point &   rx_crc_lim                                                          ) |   // crc
                        (go_rx_idle                                                                                            ) |   // at the end
                        (go_rx_idle                                                                                            ) |   // at the end
Line 1574... Line 1592...
  else if (go_early_tx | (tx_point & tx_state & (~bit_de_stuff_tx)))
  else if (go_early_tx | (tx_point & tx_state & (~bit_de_stuff_tx)))
    tx_pointer <=#Tp tx_pointer + 1'b1;
    tx_pointer <=#Tp tx_pointer + 1'b1;
end
end
 
 
 
 
assign tx_successful = transmitter & go_rx_inter & (~error_frame_ended) & (~overload_frame_ended) & (~priority_lost);
assign tx_successful = transmitter & go_rx_inter & ((~error_frame_ended) & (~overload_frame_ended) & (~priority_lost) | single_shot_transmission);
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
Line 1589... Line 1607...
    need_to_tx <=#Tp 1'b1;
    need_to_tx <=#Tp 1'b1;
end
end
 
 
 
 
 
 
assign go_early_tx = need_to_tx & (~tx_state) & (~suspend) & sample_point & (~sampled_bit) & (rx_idle | last_bit_of_inter);
assign go_early_tx = (~listen_only_mode) & need_to_tx & (~tx_state) & (~suspend) & sample_point & (~sampled_bit) & (rx_idle | last_bit_of_inter);
assign go_tx       = need_to_tx & (~tx_state) & (~suspend) & (go_early_tx | rx_idle);
assign go_tx       = (~listen_only_mode) & need_to_tx & (~tx_state) & (~suspend) & (go_early_tx | rx_idle);
 
 
 
 
// Tx state
// Tx state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
Line 1700... Line 1718...
    rx_err_cnt <=#Tp {1'b0, data_in};
    rx_err_cnt <=#Tp {1'b0, data_in};
  else if (set_reset_mode)
  else if (set_reset_mode)
    rx_err_cnt <=#Tp 'h0;
    rx_err_cnt <=#Tp 'h0;
  else
  else
    begin
    begin
 
      if (~listen_only_mode)
 
        begin
      if ((~transmitter) & go_rx_ack_lim & (~err) & (rx_err_cnt > 0))
      if ((~transmitter) & go_rx_ack_lim & (~err) & (rx_err_cnt > 0))
        begin
        begin
          if (rx_err_cnt > 127)
          if (rx_err_cnt > 127)
            rx_err_cnt <=#Tp 127;
            rx_err_cnt <=#Tp 127;
          else
          else
Line 1719... Line 1739...
                  )
                  )
            rx_err_cnt <=#Tp rx_err_cnt + 4'h8;
            rx_err_cnt <=#Tp rx_err_cnt + 4'h8;
        end
        end
    end
    end
end
end
 
end
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
Line 1769... Line 1790...
  else if (((rx_err_cnt >= 128) | (tx_err_cnt >= 128)) & (error_frame_ended | (~reset_mode) & reset_mode_q) & (~node_bus_off))
  else if (((rx_err_cnt >= 128) | (tx_err_cnt >= 128)) & (error_frame_ended | (~reset_mode) & reset_mode_q) & (~node_bus_off))
    node_error_passive <=#Tp 1'b1;
    node_error_passive <=#Tp 1'b1;
end
end
 
 
 
 
 
assign node_error_active = ~(node_error_passive | node_bus_off);
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    node_bus_off <= 1'b0;
    node_bus_off <= 1'b0;
  else if ((rx_err_cnt == 0) & (tx_err_cnt == 0) & (~reset_mode) | (we_tx_err_cnt & (data_in < 255)))
  else if ((rx_err_cnt == 0) & (tx_err_cnt == 0) & (~reset_mode) | (we_tx_err_cnt & (data_in < 255)))

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.