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

Subversion Repositories can

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

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

Rev 36 Rev 39
Line 48... Line 48...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.24  2003/02/18 00:10:15  mohor
 
// Most of the registers added. Registers "arbitration lost capture", "error code
 
// capture" + few more still need to be added.
 
//
// Revision 1.23  2003/02/14 20:17:01  mohor
// Revision 1.23  2003/02/14 20:17:01  mohor
// Several registers added. Not finished, yet.
// 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.
Line 164... Line 168...
  tx_request,
  tx_request,
  abort_tx,
  abort_tx,
  self_rx_request,
  self_rx_request,
  single_shot_transmission,
  single_shot_transmission,
 
 
 
  /* Arbitration Lost Capture Register */
 
  read_arbitration_lost_capture_reg,
 
 
 
  /* Error Code Capture Register */
 
  read_error_code_capture_reg,
 
  error_capture_code,
 
 
  /* Error Warning Limit register */
  /* Error Warning Limit register */
  error_warning_limit,
  error_warning_limit,
 
 
  /* Rx Error Counter register */
  /* Rx Error Counter register */
  we_rx_err_cnt,
  we_rx_err_cnt,
Line 190... Line 201...
  receive_status,
  receive_status,
  tx_successful,
  tx_successful,
  need_to_tx,
  need_to_tx,
  overrun,
  overrun,
  info_empty,
  info_empty,
  go_error_frame,
  set_bus_error_irq,
  priority_lost,
  set_arbitration_lost_irq,
 
  arbitration_lost_capture,
  node_error_passive,
  node_error_passive,
  node_error_active,
  node_error_active,
 
  rx_message_counter,
 
 
 
 
 
 
  /* This section is for BASIC and EXTENDED mode */
  /* This section is for BASIC and EXTENDED mode */
  /* Acceptance code register */
  /* Acceptance code register */
Line 267... Line 280...
input         tx_request;
input         tx_request;
input         abort_tx;
input         abort_tx;
input         self_rx_request;
input         self_rx_request;
input         single_shot_transmission;
input         single_shot_transmission;
 
 
 
/* Arbitration Lost Capture Register */
 
input         read_arbitration_lost_capture_reg;
 
 
 
/* Error Code Capture Register */
 
input         read_error_code_capture_reg;
 
output  [7:0] error_capture_code;
 
 
/* 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 */
input         we_rx_err_cnt;
input         we_rx_err_cnt;
Line 290... Line 310...
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        set_bus_error_irq;
output        priority_lost;
output        set_arbitration_lost_irq;
 
output  [4:0] arbitration_lost_capture;
output        node_error_passive;
output        node_error_passive;
output        node_error_active;
output        node_error_active;
 
output  [6:0] rx_message_counter;
 
 
 
 
/* 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 396... Line 418...
reg     [2:0] overload_cnt1;
reg     [2:0] overload_cnt1;
reg     [2:0] overload_cnt2;
reg     [2:0] overload_cnt2;
reg           tx;
reg           tx;
reg           crc_err;
reg           crc_err;
 
 
reg           priority_lost;
reg           arbitration_lost;
 
reg           arbitration_lost_q;
 
reg     [4:0] arbitration_lost_capture;
 
reg           arbitration_cnt_en;
 
reg           arbitration_blocked;
reg           tx_q;
reg           tx_q;
 
 
reg           need_to_tx;   // When the CAN core has something to transmit and a dominant bit is sampled at the third bit
reg           need_to_tx;   // When the CAN core has something to transmit and a dominant bit is sampled at the third bit
reg     [3:0] data_cnt;     // Counting the data bytes that are written to FIFO
reg     [3:0] data_cnt;     // Counting the data bytes that are written to FIFO
reg     [2:0] header_cnt;   // Counting header length
reg     [2:0] header_cnt;   // Counting header length
Line 436... Line 462...
reg           susp_cnt_en;
reg           susp_cnt_en;
reg     [2:0] susp_cnt;
reg     [2:0] susp_cnt;
reg           go_error_frame_q;
reg           go_error_frame_q;
reg           error_flag_over_blocked;
reg           error_flag_over_blocked;
 
 
 
reg     [7:0] error_capture_code;
 
reg     [7:6] error_capture_code_type;
 
reg           error_capture_code_blocked;
 
 
 
wire    [4:0] error_capture_code_segment;
 
wire          error_capture_code_direction;
 
 
wire          bit_de_stuff;
wire          bit_de_stuff;
wire          bit_de_stuff_tx;
wire          bit_de_stuff_tx;
 
 
 
 
/* Rx state machine */
/* Rx state machine */
Line 458... Line 491...
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_overload_frame;
wire          go_overload_frame;
wire          go_rx_inter;
wire          go_rx_inter;
 
wire          go_error_frame;
 
 
wire          go_crc_enable;
wire          go_crc_enable;
wire          rst_crc_enable;
wire          rst_crc_enable;
 
 
wire          bit_de_stuff_set;
wire          bit_de_stuff_set;
Line 567... Line 601...
 
 
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 & (~self_test_mode);
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));
assign bit_err_exc5 = (error_frame & (error_cnt2 == 7)) | (overload_frame & (overload_cnt2 == 7));
assign bit_err_exc5 = (error_frame & (error_cnt2 == 7)) | (overload_frame & (overload_cnt2 == 7));
Line 1289... Line 1323...
 
 
  .reset_mode(reset_mode),
  .reset_mode(reset_mode),
  .release_buffer(release_buffer),
  .release_buffer(release_buffer),
  .extended_mode(extended_mode),
  .extended_mode(extended_mode),
  .overrun(overrun),
  .overrun(overrun),
  .info_empty(info_empty)
  .info_empty(info_empty),
 
  .info_cnt(rx_message_counter)
 
 
);
);
 
 
 
 
// Transmitting error frame.
// Transmitting error frame.
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
Line 1592... Line 1625...
  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) | single_shot_transmission);
assign tx_successful = transmitter & go_rx_inter & ((~error_frame_ended) & (~overload_frame_ended) & (~arbitration_lost) | single_shot_transmission);
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
Line 1616... Line 1649...
// Tx state
// Tx state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    tx_state <= 1'b0;
    tx_state <= 1'b0;
  else if (reset_mode | go_rx_inter | error_frame | priority_lost)
  else if (reset_mode | go_rx_inter | error_frame | arbitration_lost)
    tx_state <=#Tp 1'b0;
    tx_state <=#Tp 1'b0;
  else if (go_tx)
  else if (go_tx)
    tx_state <=#Tp 1'b1;
    tx_state <=#Tp 1'b1;
end
end
 
 
Line 1645... Line 1678...
begin
begin
  if (rst)
  if (rst)
    transmitting <= 1'b0;
    transmitting <= 1'b0;
  else if (go_error_frame | go_overload_frame | go_tx)
  else if (go_error_frame | go_overload_frame | go_tx)
    transmitting <=#Tp 1'b1;
    transmitting <=#Tp 1'b1;
  else if (reset_mode | go_rx_idle | (go_rx_id1 & (~tx_state)) | (priority_lost & tx_state))
  else if (reset_mode | go_rx_idle | (go_rx_id1 & (~tx_state)) | (arbitration_lost & tx_state))
    transmitting <=#Tp 1'b0;
    transmitting <=#Tp 1'b0;
end
end
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
Line 1699... Line 1732...
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    priority_lost <= 1'b0;
    arbitration_lost <= 1'b0;
  else if (go_rx_idle | error_frame | reset_mode)
  else if (go_rx_idle | error_frame | reset_mode)
    priority_lost <=#Tp 1'b0;
    arbitration_lost <=#Tp 1'b0;
  else if (tx_state & sample_point & tx & arbitration_field)
  else if (tx_state & sample_point & tx & arbitration_field)
    priority_lost <=#Tp (~sampled_bit);
    arbitration_lost <=#Tp (~sampled_bit);
 
end
 
 
 
 
 
always @ (posedge clk)
 
begin
 
  arbitration_lost_q <=#Tp arbitration_lost;
 
end
 
 
 
 
 
assign set_arbitration_lost_irq = arbitration_lost & (~arbitration_lost_q) & (~arbitration_blocked);
 
 
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    arbitration_cnt_en <= 1'b0;
 
  else if (arbitration_blocked)
 
    arbitration_cnt_en <=#Tp 1'b0;
 
  else if (rx_id1 & sample_point & (~arbitration_blocked))
 
    arbitration_cnt_en <=#Tp 1'b1;
 
end
 
 
 
 
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    arbitration_blocked <= 1'b0;
 
  else if (read_arbitration_lost_capture_reg)
 
    arbitration_blocked <=#Tp 1'b0;
 
  else if (set_arbitration_lost_irq)
 
    arbitration_blocked <=#Tp 1'b1;
 
end
 
 
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    arbitration_lost_capture <= 5'h0;
 
  else if (read_arbitration_lost_capture_reg)
 
    arbitration_lost_capture <=#Tp 5'h0;
 
  else if (sample_point & (~arbitration_blocked) & arbitration_cnt_en & (~bit_de_stuff))
 
    arbitration_lost_capture <=#Tp arbitration_lost_capture + 1'b1;
end
end
 
 
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
Line 1863... Line 1939...
                                                     ((rx_err_cnt >= 96) | (tx_err_cnt >= 96))                                      ;
                                                     ((rx_err_cnt >= 96) | (tx_err_cnt >= 96))                                      ;
 
 
assign transmit_status = transmitting                 | (extended_mode & waiting_for_bus_free);
assign transmit_status = transmitting                 | (extended_mode & waiting_for_bus_free);
assign receive_status  = (~rx_idle) & (~transmitting) | (extended_mode & waiting_for_bus_free);
assign receive_status  = (~rx_idle) & (~transmitting) | (extended_mode & waiting_for_bus_free);
 
 
 
 
 
/* Error code capture register */
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    error_capture_code <= 8'h0;
 
  else if (read_error_code_capture_reg)
 
    error_capture_code <=#Tp 8'h0;
 
  else if (set_bus_error_irq)
 
    error_capture_code <=#Tp {error_capture_code_type[7:6], error_capture_code_direction, error_capture_code_segment[4:0]};
 
end
 
 
 
 
 
 
 
assign error_capture_code_segment[0] = rx_idle | rx_ide | (rx_id2 & (bit_cnt<13)) | rx_r1 | rx_r0 | rx_dlc | rx_ack | rx_ack_lim | error_frame & node_error_active;
 
assign error_capture_code_segment[1] = rx_idle | rx_id1 | rx_id2 | rx_dlc | rx_data | rx_ack_lim | rx_eof | rx_inter | error_frame & node_error_passive;
 
assign error_capture_code_segment[2] = (rx_id1 & (bit_cnt>7)) | rx_rtr1 | rx_ide | rx_id2 | rx_rtr2 | rx_r1 | error_frame & node_error_passive | overload_frame;
 
assign error_capture_code_segment[3] = (rx_id2 & (bit_cnt>4)) | rx_rtr2 | rx_r1 | rx_r0 | rx_dlc | rx_data | rx_crc | rx_crc_lim | rx_ack | rx_ack_lim | rx_eof | overload_frame;
 
assign error_capture_code_segment[4] = rx_crc_lim | rx_ack | rx_ack_lim | rx_eof | rx_inter | error_frame | overload_frame;
 
assign error_capture_code_direction  = ~transmitting;
 
 
 
 
 
always @ (bit_err or form_err or stuff_err)
 
begin
 
  if (bit_err)
 
    error_capture_code_type[7:6] <= 2'b00;
 
  else if (form_err)
 
    error_capture_code_type[7:6] <= 2'b01;
 
  else if (stuff_err)
 
    error_capture_code_type[7:6] <= 2'b10;
 
  else
 
    error_capture_code_type[7:6] <= 2'b11;
 
end
 
 
 
 
 
assign set_bus_error_irq = go_error_frame & (~error_capture_code_blocked);
 
 
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    error_capture_code_blocked <= 1'b0;
 
  else if (read_error_code_capture_reg)
 
    error_capture_code_blocked <=#Tp 1'b0;
 
  else if (set_bus_error_irq)
 
    error_capture_code_blocked <=#Tp 1'b1;
 
end
 
 
 
 
endmodule
endmodule
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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