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)))
|