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
|