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

Subversion Repositories can

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

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

Rev 22 Rev 24
Line 43... Line 43...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.14  2003/01/16 13:36:19  mohor
 
// Form error supported. When receiving messages, last bit of the end-of-frame
 
// does not generate form error. Receiver goes to the idle mode one bit sooner.
 
// (CAN specification ver 2.0, part B, page 57).
 
//
// Revision 1.13  2003/01/15 21:59:45  mohor
// Revision 1.13  2003/01/15 21:59:45  mohor
// Data is stored to fifo at the end of ack stage.
// Data is stored to fifo at the end of ack stage.
//
//
// Revision 1.12  2003/01/15 21:05:11  mohor
// Revision 1.12  2003/01/15 21:05:11  mohor
// CRC checking fixed (when bitstuff occurs at the end of a CRC sequence).
// CRC checking fixed (when bitstuff occurs at the end of a CRC sequence).
Line 98... Line 103...
  rst,
  rst,
 
 
  sample_point,
  sample_point,
  sampled_bit,
  sampled_bit,
  sampled_bit_q,
  sampled_bit_q,
 
  tx_point,
  hard_sync,
  hard_sync,
  resync,
 
 
 
  addr,
  addr,
  data_out,
  data_out,
 
 
 
 
Line 116... Line 121...
 
 
  /* Clock Divider register */
  /* Clock Divider register */
  extended_mode,
  extended_mode,
 
 
  rx_idle,
  rx_idle,
 
  transmitting,
 
 
  /* 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 150... Line 156...
  tx_data_7,
  tx_data_7,
  tx_data_8,
  tx_data_8,
  tx_data_9,
  tx_data_9,
  tx_data_10,
  tx_data_10,
  tx_data_11,
  tx_data_11,
  tx_data_12
  tx_data_12,
  /* End: Tx data registers */
  /* End: Tx data registers */
 
 
 
  /* Tx signal */
 
  tx
 
 
);
);
 
 
parameter Tp = 1;
parameter Tp = 1;
 
 
input         clk;
input         clk;
input         rst;
input         rst;
input         sample_point;
input         sample_point;
input         sampled_bit;
input         sampled_bit;
input         sampled_bit_q;
input         sampled_bit_q;
 
input         tx_point;
input         hard_sync;
input         hard_sync;
input         resync;
 
input   [7:0] addr;
input   [7:0] addr;
output  [7:0] data_out;
output  [7:0] data_out;
 
 
 
 
input         reset_mode;
input         reset_mode;
Line 176... Line 185...
 
 
/* Command register */
/* Command register */
input         release_buffer;
input         release_buffer;
 
 
output        rx_idle;
output        rx_idle;
 
output        transmitting;
 
 
/* 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 215... Line 225...
input   [7:0] tx_data_10;
input   [7:0] tx_data_10;
input   [7:0] tx_data_11;
input   [7:0] tx_data_11;
input   [7:0] tx_data_12;
input   [7:0] tx_data_12;
  /* End: Tx data registers */
  /* End: Tx data registers */
 
 
 
/* Tx signal */
 
output        tx;
 
 
reg           reset_mode_q;
reg           reset_mode_q;
reg     [5:0] bit_cnt;
reg     [5:0] bit_cnt;
 
 
reg     [3:0] data_len;
reg     [3:0] data_len;
Line 243... Line 255...
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_rx_inter;
 
 
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 265... Line 280...
reg           rx_crc;
reg           rx_crc;
reg           rx_crc_lim;
reg           rx_crc_lim;
reg           rx_ack;
reg           rx_ack;
reg           rx_ack_lim;
reg           rx_ack_lim;
reg           rx_eof;
reg           rx_eof;
 
reg           rx_inter;
 
 
reg           rtr1;
reg           rtr1;
reg           ide;
reg           ide;
reg           rtr2;
reg           rtr2;
reg    [14:0] crc_in;
reg    [14:0] crc_in;
 
 
 
reg     [7:0] tmp_data;
 
reg     [7:0] tmp_fifo [0:7];
 
reg           write_data_to_tmp_fifo;
 
reg     [2:0] byte_cnt;
 
reg           bit_stuff_cnt_en;
reg           crc_enable;
reg           crc_enable;
 
 
reg     [2:0] eof_cnt;
reg     [2:0] eof_cnt;
wire   [14:0] calculated_crc;
wire   [14:0] calculated_crc;
wire          remote_rq;
wire          remote_rq;
wire    [3:0] limited_data_len;
wire    [3:0] limited_data_len;
reg           form_error;
//reg           form_error;
 
wire          form_error;
wire          set_form_error;
wire          set_form_error;
 
reg           transmitting;
 
 
 
reg           error_frame;
 
reg           enable_error_cnt2;
 
reg     [2:0] error_cnt1;
 
reg     [2:0] error_cnt2;
 
reg           tx;
 
reg           crc_error;
 
 
assign go_rx_idle     =                   sample_point &  rx_eof  & (eof_cnt == 5);   // Receiver ignores last (7th) bit of the end-of-frame.
wire          error_frame_ended;
assign go_rx_id1      =                   sample_point &  rx_idle & (~sampled_bit);
wire          bit_error = 0; // FIX ME !!!
 
wire          acknowledge_error = 0; // FIX ME !!!
 
wire          need_to_tx = 0; // When the CAN core has something to transmit and a dominant bit is sampled at the third bit
 
                              // of intermission, it starts reading the identifier (and transmitting its own). // FIX ME !!!
 
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. Counter?   FIX ME
 
 
 
assign go_rx_idle     =                   sample_point &  sampled_bit & rx_inter & (bit_cnt == 2);  // Look the following line for TX
 
//assign go_rx_id1      =                   sample_point &  (~sampled_bit) & (rx_idle | rx_inter & (bit_cnt == 2) & need_to_tx);
 
assign go_rx_id1      =                   sample_point &  (~sampled_bit) & (rx_idle | rx_inter & (bit_cnt == 2));
assign go_rx_rtr1     = (~bit_de_stuff) & sample_point &  rx_id1  & (bit_cnt == 10);
assign go_rx_rtr1     = (~bit_de_stuff) & sample_point &  rx_id1  & (bit_cnt == 10);
assign go_rx_ide      = (~bit_de_stuff) & sample_point &  rx_rtr1;
assign go_rx_ide      = (~bit_de_stuff) & sample_point &  rx_rtr1;
assign go_rx_id2      = (~bit_de_stuff) & sample_point &  rx_ide  &   sampled_bit;
assign go_rx_id2      = (~bit_de_stuff) & sample_point &  rx_ide  &   sampled_bit;
assign go_rx_rtr2     = (~bit_de_stuff) & sample_point &  rx_id2  & (bit_cnt == 17);
assign go_rx_rtr2     = (~bit_de_stuff) & sample_point &  rx_id2  & (bit_cnt == 17);
assign go_rx_r1       = (~bit_de_stuff) & sample_point &  rx_rtr2;
assign go_rx_r1       = (~bit_de_stuff) & sample_point &  rx_rtr2;
Line 296... Line 335...
                                                          rx_data & (bit_cnt == ((limited_data_len<<3) - 1'b1)));
                                                          rx_data & (bit_cnt == ((limited_data_len<<3) - 1'b1)));
assign go_rx_crc_lim  = (~bit_de_stuff) & sample_point &  rx_crc  & (bit_cnt == 14);
assign go_rx_crc_lim  = (~bit_de_stuff) & sample_point &  rx_crc  & (bit_cnt == 14);
assign go_rx_ack      =                   sample_point &  rx_crc_lim;
assign go_rx_ack      =                   sample_point &  rx_crc_lim;
assign go_rx_ack_lim  =                   sample_point &  rx_ack;
assign go_rx_ack_lim  =                   sample_point &  rx_ack;
assign go_rx_eof      =                   sample_point &  rx_ack_lim  | (~reset_mode) & reset_mode_q;
assign go_rx_eof      =                   sample_point &  rx_ack_lim  | (~reset_mode) & reset_mode_q;
 
assign go_rx_inter    =                 ((sample_point &  rx_eof  & (eof_cnt == 6)) | error_frame_ended) & (~overload_needed);
 
 
 
assign go_error_frame = form_error | stuff_error | bit_error | acknowledge_error | (crc_error & go_rx_eof);
 
assign error_frame_ended = (error_cnt2 == 7) & tx_point;
 
 
 
assign go_overload_frame = ((sample_point &  rx_eof  & (eof_cnt == 6)) | error_frame_ended) & overload_needed |
 
                             sample_point & (~sampled_bit) & rx_inter & ((bit_cnt == 0) | (bit_cnt == 1))     |
 
                             sample_point & (~sampled_bit) & (error_cnt2 == 7)
 
                            ;
 
 
assign go_crc_enable  = hard_sync;
assign go_crc_enable  = hard_sync;
assign rst_crc_enable = go_rx_crc;
assign rst_crc_enable = go_rx_crc;
 
 
assign bit_de_stuff_set   = go_rx_id1;
assign bit_de_stuff_set   = go_rx_id1;
assign bit_de_stuff_reset = go_rx_crc_lim;
assign bit_de_stuff_reset = go_rx_crc_lim | reset_mode | go_error_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;
 
 
 
 
// Rx idle state
// Rx idle state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_idle <= 1'b1;
    rx_idle <= 1'b0;
  else if (reset_mode | go_rx_id1)
  else if (reset_mode | go_rx_id1 | error_frame)
    rx_idle <=#Tp 1'b0;
    rx_idle <=#Tp 1'b0;
  else if (go_rx_idle)
  else if (go_rx_idle)
    rx_idle <=#Tp 1'b1;
    rx_idle <=#Tp 1'b1;
end
end
 
 
Line 324... Line 372...
// Rx id1 state
// Rx id1 state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_id1 <= 1'b0;
    rx_id1 <= 1'b0;
  else if (reset_mode | go_rx_rtr1)
  else if (reset_mode | go_rx_rtr1 | error_frame)
    rx_id1 <=#Tp 1'b0;
    rx_id1 <=#Tp 1'b0;
  else if (go_rx_id1)
  else if (go_rx_id1)
    rx_id1 <=#Tp 1'b1;
    rx_id1 <=#Tp 1'b1;
end
end
 
 
Line 336... Line 384...
// Rx rtr1 state
// Rx rtr1 state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_rtr1 <= 1'b0;
    rx_rtr1 <= 1'b0;
  else if (reset_mode | go_rx_ide)
  else if (reset_mode | go_rx_ide | error_frame)
    rx_rtr1 <=#Tp 1'b0;
    rx_rtr1 <=#Tp 1'b0;
  else if (go_rx_rtr1)
  else if (go_rx_rtr1)
    rx_rtr1 <=#Tp 1'b1;
    rx_rtr1 <=#Tp 1'b1;
end
end
 
 
Line 348... Line 396...
// Rx ide state
// Rx ide state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_ide <= 1'b0;
    rx_ide <= 1'b0;
  else if (reset_mode | go_rx_r0 | go_rx_id2)
  else if (reset_mode | go_rx_r0 | go_rx_id2 | error_frame)
    rx_ide <=#Tp 1'b0;
    rx_ide <=#Tp 1'b0;
  else if (go_rx_ide)
  else if (go_rx_ide)
    rx_ide <=#Tp 1'b1;
    rx_ide <=#Tp 1'b1;
end
end
 
 
Line 360... Line 408...
// Rx id2 state
// Rx id2 state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_id2 <= 1'b0;
    rx_id2 <= 1'b0;
  else if (reset_mode | go_rx_rtr2)
  else if (reset_mode | go_rx_rtr2 | error_frame)
    rx_id2 <=#Tp 1'b0;
    rx_id2 <=#Tp 1'b0;
  else if (go_rx_id2)
  else if (go_rx_id2)
    rx_id2 <=#Tp 1'b1;
    rx_id2 <=#Tp 1'b1;
end
end
 
 
Line 372... Line 420...
// Rx rtr2 state
// Rx rtr2 state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_rtr2 <= 1'b0;
    rx_rtr2 <= 1'b0;
  else if (reset_mode | go_rx_r1)
  else if (reset_mode | go_rx_r1 | error_frame)
    rx_rtr2 <=#Tp 1'b0;
    rx_rtr2 <=#Tp 1'b0;
  else if (go_rx_rtr2)
  else if (go_rx_rtr2)
    rx_rtr2 <=#Tp 1'b1;
    rx_rtr2 <=#Tp 1'b1;
end
end
 
 
Line 384... Line 432...
// Rx r0 state
// Rx r0 state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_r1 <= 1'b0;
    rx_r1 <= 1'b0;
  else if (reset_mode | go_rx_r0)
  else if (reset_mode | go_rx_r0 | error_frame)
    rx_r1 <=#Tp 1'b0;
    rx_r1 <=#Tp 1'b0;
  else if (go_rx_r1)
  else if (go_rx_r1)
    rx_r1 <=#Tp 1'b1;
    rx_r1 <=#Tp 1'b1;
end
end
 
 
Line 396... Line 444...
// Rx r0 state
// Rx r0 state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_r0 <= 1'b0;
    rx_r0 <= 1'b0;
  else if (reset_mode | go_rx_dlc)
  else if (reset_mode | go_rx_dlc | error_frame)
    rx_r0 <=#Tp 1'b0;
    rx_r0 <=#Tp 1'b0;
  else if (go_rx_r0)
  else if (go_rx_r0)
    rx_r0 <=#Tp 1'b1;
    rx_r0 <=#Tp 1'b1;
end
end
 
 
Line 408... Line 456...
// Rx dlc state
// Rx dlc state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_dlc <= 1'b0;
    rx_dlc <= 1'b0;
  else if (reset_mode | go_rx_data | go_rx_crc)
  else if (reset_mode | go_rx_data | go_rx_crc | error_frame)
    rx_dlc <=#Tp 1'b0;
    rx_dlc <=#Tp 1'b0;
  else if (go_rx_dlc)
  else if (go_rx_dlc)
    rx_dlc <=#Tp 1'b1;
    rx_dlc <=#Tp 1'b1;
end
end
 
 
Line 420... Line 468...
// Rx data state
// Rx data state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_data <= 1'b0;
    rx_data <= 1'b0;
  else if (reset_mode | go_rx_crc)
  else if (reset_mode | go_rx_crc | error_frame)
    rx_data <=#Tp 1'b0;
    rx_data <=#Tp 1'b0;
  else if (go_rx_data)
  else if (go_rx_data)
    rx_data <=#Tp 1'b1;
    rx_data <=#Tp 1'b1;
end
end
 
 
Line 432... Line 480...
// Rx crc state
// Rx crc state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_crc <= 1'b0;
    rx_crc <= 1'b0;
  else if (reset_mode | go_rx_crc_lim)
  else if (reset_mode | go_rx_crc_lim | error_frame)
    rx_crc <=#Tp 1'b0;
    rx_crc <=#Tp 1'b0;
  else if (go_rx_crc)
  else if (go_rx_crc)
    rx_crc <=#Tp 1'b1;
    rx_crc <=#Tp 1'b1;
end
end
 
 
Line 444... Line 492...
// Rx crc delimiter state
// Rx crc delimiter state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_crc_lim <= 1'b0;
    rx_crc_lim <= 1'b0;
  else if (reset_mode | go_rx_ack)
  else if (reset_mode | go_rx_ack | error_frame)
    rx_crc_lim <=#Tp 1'b0;
    rx_crc_lim <=#Tp 1'b0;
  else if (go_rx_crc_lim)
  else if (go_rx_crc_lim)
    rx_crc_lim <=#Tp 1'b1;
    rx_crc_lim <=#Tp 1'b1;
end
end
 
 
Line 456... Line 504...
// Rx ack state
// Rx ack state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_ack <= 1'b0;
    rx_ack <= 1'b0;
  else if (reset_mode | go_rx_ack_lim)
  else if (reset_mode | go_rx_ack_lim | error_frame)
    rx_ack <=#Tp 1'b0;
    rx_ack <=#Tp 1'b0;
  else if (go_rx_ack)
  else if (go_rx_ack)
    rx_ack <=#Tp 1'b1;
    rx_ack <=#Tp 1'b1;
end
end
 
 
Line 468... Line 516...
// Rx ack delimiter state
// Rx ack delimiter state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_ack_lim <= 1'b0;
    rx_ack_lim <= 1'b0;
  else if (reset_mode | go_rx_eof)
  else if (reset_mode | go_rx_eof | error_frame)
    rx_ack_lim <=#Tp 1'b0;
    rx_ack_lim <=#Tp 1'b0;
  else if (go_rx_ack_lim)
  else if (go_rx_ack_lim)
    rx_ack_lim <=#Tp 1'b1;
    rx_ack_lim <=#Tp 1'b1;
end
end
 
 
Line 480... Line 528...
// Rx eof state
// Rx eof state
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    rx_eof <= 1'b0;
    rx_eof <= 1'b0;
  else if (go_rx_idle)
  else if (go_rx_inter | error_frame)
    rx_eof <=#Tp 1'b0;
    rx_eof <=#Tp 1'b0;
  else if (go_rx_eof)
  else if (go_rx_eof)
    rx_eof <=#Tp 1'b1;
    rx_eof <=#Tp 1'b1;
end
end
 
 
 
 
 
 
 
// Interframe space
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    rx_inter <= 1'b0;
 
  else if (go_rx_idle | go_rx_id1 | go_overload_frame | go_error_frame)
 
    rx_inter <=#Tp 1'b0;
 
  else if (go_rx_inter)
 
    rx_inter <=#Tp 1'b1;
 
end
 
 
 
 
// ID register
// ID register
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    id <= 0;
    id <= 0;
Line 538... Line 599...
    data_len <=#Tp {data_len[2:0], sampled_bit};
    data_len <=#Tp {data_len[2:0], sampled_bit};
end
end
 
 
 
 
// Data
// Data
reg [7:0] tmp_data;
 
reg [7:0] tmp_fifo [0:7];
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    tmp_data <= 0;
    tmp_data <= 0;
  else if (sample_point & rx_data & (~bit_de_stuff))
  else if (sample_point & rx_data & (~bit_de_stuff))
    tmp_data <=#Tp {tmp_data[6:0], sampled_bit};
    tmp_data <=#Tp {tmp_data[6:0], sampled_bit};
end
end
 
 
 
 
reg write_data_to_tmp_fifo;
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    write_data_to_tmp_fifo <= 0;
    write_data_to_tmp_fifo <= 0;
  else if (sample_point & rx_data & (~bit_de_stuff) & (&bit_cnt[2:0]))
  else if (sample_point & rx_data & (~bit_de_stuff) & (&bit_cnt[2:0]))
Line 561... Line 619...
  else
  else
    write_data_to_tmp_fifo <=#Tp 0;
    write_data_to_tmp_fifo <=#Tp 0;
end
end
 
 
 
 
reg [2:0] byte_cnt;
 
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 (write_data_to_tmp_fifo)
  else if (write_data_to_tmp_fifo)
Line 573... Line 630...
  else if (sample_point & go_rx_crc_lim)
  else if (sample_point & go_rx_crc_lim)
    byte_cnt <=#Tp 0;
    byte_cnt <=#Tp 0;
end
end
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk)
begin
begin
  if (write_data_to_tmp_fifo)
  if (write_data_to_tmp_fifo)
    tmp_fifo[byte_cnt] <=#Tp tmp_data;
    tmp_fifo[byte_cnt] <=#Tp tmp_data;
end
end
 
 
Line 596... Line 653...
// bit_cnt
// bit_cnt
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    bit_cnt <= 0;
    bit_cnt <= 0;
  else if (go_rx_id1 | go_rx_id2 | go_rx_dlc | go_rx_data | go_rx_crc | go_rx_ack | go_rx_eof)
  else if (go_rx_id1 | go_rx_id2 | go_rx_dlc | go_rx_data | go_rx_crc |
 
           go_rx_ack | go_rx_eof | go_rx_inter | go_error_frame | go_overload_frame)
    bit_cnt <=#Tp 0;
    bit_cnt <=#Tp 0;
  else if (sample_point & (~bit_de_stuff))
  else if (sample_point & (~bit_de_stuff))
    bit_cnt <=#Tp bit_cnt + 1'b1;
    bit_cnt <=#Tp bit_cnt + 1'b1;
end
end
 
 
Line 619... Line 677...
    end
    end
end
end
 
 
 
 
// Enabling bit de-stuffing
// Enabling bit de-stuffing
reg bit_stuff_cnt_en;
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    bit_stuff_cnt_en <= 1'b0;
    bit_stuff_cnt_en <= 1'b0;
  else if (bit_de_stuff_set)
  else if (bit_de_stuff_set)
    bit_stuff_cnt_en <=#Tp 1'b1;
    bit_stuff_cnt_en <=#Tp 1'b1;
  else if (bit_de_stuff_reset)
  else if (bit_de_stuff_reset)
    bit_stuff_cnt_en <=#Tp 1'b0;
    bit_stuff_cnt_en <=#Tp 1'b0;
end
end
 
 
 
 
// bit_stuff_cnt
// bit_stuff_cnt
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    bit_stuff_cnt <= 1;
    bit_stuff_cnt <= 1;
Line 652... Line 710...
 
 
 
 
assign bit_de_stuff = bit_stuff_cnt == 5;
assign bit_de_stuff = bit_stuff_cnt == 5;
 
 
 
 
 
 
// stuff_error
// stuff_error
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    stuff_error <= 0;
    stuff_error <= 0;
  else if (sample_point & (rx_id1) & bit_de_stuff & (sampled_bit == sampled_bit_q))   // Add other stages (data, control, etc.) !!!
  else if (reset_mode | go_rx_idle | error_frame)     // Stuff error might reset itself
 
    stuff_error <=#Tp 0;
 
  else if (sample_point & bit_stuff_cnt_en & bit_de_stuff & (sampled_bit == sampled_bit_q))
    stuff_error <=#Tp 1'b1;
    stuff_error <=#Tp 1'b1;
//  else if (reset condition)       // Add reset condition
 
//    stuff_error <=#Tp 0;
 
end
end
 
 
 
 
// Generating delayed reset_mode signal
// Generating delayed reset_mode signal
always @ (posedge clk)
always @ (posedge clk)
Line 683... Line 742...
  else if (reset_mode | rst_crc_enable)
  else if (reset_mode | rst_crc_enable)
    crc_enable <=#Tp 1'b0;
    crc_enable <=#Tp 1'b0;
end
end
 
 
 
 
reg crc_error;
 
// CRC error generation
// CRC error generation
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    crc_error <= 0;
    crc_error <= 0;
  else if (go_rx_ack)
  else if (go_rx_ack)
    crc_error <=#Tp crc_in != calculated_crc;
    crc_error <=#Tp crc_in != calculated_crc;
  else if (reset_mode | rx_eof)
  else if (reset_mode | go_rx_idle | error_frame)   // CRC error might reset itself
    crc_error <=#Tp 0;
    crc_error <=#Tp 0;
end
end
 
 
 
 
// Conditions for form error
// Conditions for form error
assign set_form_error = sample_point & ( (~bit_de_stuff) & rx_ide     &   sampled_bit & (~rtr1) |
//assign set_form_error = sample_point & ( (~bit_de_stuff) & rx_ide     &   sampled_bit & (~rtr1) |
 
assign     form_error = sample_point & ( (~bit_de_stuff) & rx_ide     &   sampled_bit & (~rtr1) |
                                                           rx_crc_lim & (~sampled_bit)          |
                                                           rx_crc_lim & (~sampled_bit)          |
                                                           rx_ack_lim & (~sampled_bit)          |
                                                           rx_ack_lim & (~sampled_bit)          |
                                                           rx_eof     & (~sampled_bit)
                                                           rx_eof     & (~sampled_bit)
                                       );
                                       );
 
 
 
/*
// Form error 
// Form error
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    form_error <= 1'b0;
    form_error <= 1'b0;
  else if (reset_mode | form_error)
  else if (reset_mode | go_rx_idle | error_frame)
    form_error <=#Tp 1'b0;
    form_error <=#Tp 1'b0;
  else if (set_form_error)
  else if (set_form_error)
    form_error <=#Tp 1'b1;
    form_error <=#Tp 1'b1;
end
end
 
*/
 
 
// Instantiation of the RX CRC module
// Instantiation of the RX CRC module
can_crc i_can_crc_rx
can_crc i_can_crc_rx
(
(
  .clk(clk),
  .clk(clk),
Line 770... Line 829...
  .acceptance_mask_1(acceptance_mask_1),
  .acceptance_mask_1(acceptance_mask_1),
  .acceptance_mask_2(acceptance_mask_2),
  .acceptance_mask_2(acceptance_mask_2),
  .acceptance_mask_3(acceptance_mask_3),
  .acceptance_mask_3(acceptance_mask_3),
  /* End: This section is for EXTENDED mode */
  /* End: This section is for EXTENDED mode */
 
 
  .sample_point(sample_point),
 
  .go_rx_crc_lim(go_rx_crc_lim),
  .go_rx_crc_lim(go_rx_crc_lim),
  .go_rx_idle(go_rx_idle),
  .go_rx_idle(go_rx_idle),
 
 
  .data0(tmp_fifo[0]),
  .data0(tmp_fifo[0]),
  .data1(tmp_fifo[1]),
  .data1(tmp_fifo[1]),
Line 799... Line 857...
wire [2:0]  header_len;
wire [2:0]  header_len;
wire        storing_header;
wire        storing_header;
wire [3:0]  limited_data_len_minus1;
wire [3:0]  limited_data_len_minus1;
wire        reset_wr_fifo;
wire        reset_wr_fifo;
wire        no_error;
wire        no_error;
 
 
assign header_len[2:0] = extended_mode ? (ide? (3'h5) : (3'h3)) : 3'h2;
assign header_len[2:0] = extended_mode ? (ide? (3'h5) : (3'h3)) : 3'h2;
assign storing_header = header_cnt < header_len;
assign storing_header = header_cnt < header_len;
assign limited_data_len_minus1[3:0] = remote_rq? 4'hf : ((data_len < 8)? (data_len -1'b1) : 4'h7);   // - 1 because counter counts from 0
assign limited_data_len_minus1[3:0] = remote_rq? 4'hf : ((data_len < 8)? (data_len -1'b1) : 4'h7);   // - 1 because counter counts from 0
assign reset_wr_fifo = data_cnt == (limited_data_len_minus1 + header_len);
assign reset_wr_fifo = data_cnt == (limited_data_len_minus1 + header_len);
assign no_error = ~crc_error;
assign no_error = (~crc_error) & (~form_error) & (~stuff_error);
 
 
 
 
 
 
// Write enable signal for 64-byte rx fifo
// Write enable signal for 64-byte rx fifo
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
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_idle & id_ok & no_error)
  else if (go_rx_inter & id_ok & (~error_frame_ended))
    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 842... Line 903...
    data_cnt <=#Tp data_cnt + 1;
    data_cnt <=#Tp data_cnt + 1;
end
end
 
 
 
 
// Multiplexing data that is stored to 64-byte fifo depends on the mode of operation and frame format
// Multiplexing data that is stored to 64-byte fifo depends on the mode of operation and frame format
always @ (extended_mode or ide or data_cnt or header_cnt or storing_header or id or rtr1 or rtr2 or data_len or
always @ (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[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])
          tmp_fifo[1] or tmp_fifo[3] or tmp_fifo[5] or tmp_fifo[7])
begin
begin
  if (storing_header)
  if (storing_header)
    begin
    begin
      if (extended_mode)      // extended mode
      if (extended_mode)      // extended mode
        begin
        begin
          if (ide)              // extended format
          if (ide)              // extended format
            begin
            begin
              case (header_cnt)            // synopsys parallel_case synopsys full_case
              case (header_cnt) // synthesis parallel_case 
                4'h0  : data_for_fifo <= {1'b1, rtr2, 2'h0, data_len};
                3'h0  : data_for_fifo <= {1'b1, rtr2, 2'h0, data_len};
                4'h1  : data_for_fifo <= id[28:21];
                3'h1  : data_for_fifo <= id[28:21];
                4'h2  : data_for_fifo <= id[20:13];
                3'h2  : data_for_fifo <= id[20:13];
                4'h3  : data_for_fifo <= id[12:5];
                3'h3  : data_for_fifo <= id[12:5];
                4'h4  : data_for_fifo <= {id[4:0], 3'h0};
                3'h4  : data_for_fifo <= {id[4:0], 3'h0};
 
                default: data_for_fifo <= 0;
              endcase
              endcase
            end
            end
          else                  // standard format
          else                  // standard format
            begin
            begin
              case (header_cnt)            // synopsys parallel_case synopsys full_case
              case (header_cnt) // synthesis parallel_case 
                4'h0  : data_for_fifo <= {1'b0, rtr1, 2'h0, data_len};
                3'h0  : data_for_fifo <= {1'b0, rtr1, 2'h0, data_len};
                4'h1  : data_for_fifo <= id[10:3];
                3'h1  : data_for_fifo <= id[10:3];
                4'h2  : data_for_fifo <= {id[2:0], 5'h0};
                3'h2  : data_for_fifo <= {id[2:0], 5'h0};
 
                default: data_for_fifo <= 0;
              endcase
              endcase
            end
            end
        end
        end
      else                    // normal mode
      else                    // normal mode
        begin
        begin
          case (header_cnt)            // synopsys parallel_case synopsys full_case
          case (header_cnt) // synthesis parallel_case 
            4'h0  : data_for_fifo <= id[10:3];
            3'h0  : data_for_fifo <= id[10:3];
            4'h1  : data_for_fifo <= {id[2:0], rtr1, data_len};
            3'h1  : data_for_fifo <= {id[2:0], rtr1, data_len};
 
            default: data_for_fifo <= 0;
          endcase
          endcase
        end
        end
    end
    end
  else
  else
    data_for_fifo <= tmp_fifo[data_cnt-header_len];
    data_for_fifo <= tmp_fifo[data_cnt-header_len];
Line 905... Line 970...
 
 
);
);
 
 
 
 
 
 
 
// transmitting signals that core is a transmitter. No synchronization is done meanwhile.
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    transmitting <= 1'b0;
 
  else if (go_rx_idle | reset_mode)
 
    transmitting <=#Tp 1'b0;
 
  else if (~no_error)
 
    transmitting <=#Tp 1'b1;
 
end
 
 
 
 
 
 
 
// Transmitting error frame. The same counters are used for sending overload frame, too.
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    error_frame <= 1'b0;
 
  else if (reset_mode | error_frame_ended)
 
    error_frame <=#Tp 1'b0;
 
  else if (go_error_frame | go_overload_frame)
 
    error_frame <=#Tp 1'b1;
 
end
 
 
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    error_cnt1 <= 1'b0;
 
  else if (reset_mode | error_frame_ended)
 
    error_cnt1 <=#Tp 1'b0;
 
  else if (error_frame & tx_point & (error_cnt1 < 6))
 
    error_cnt1 <=#Tp error_cnt1 + 1'b1;
 
end
 
 
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    enable_error_cnt2 <= 1'b0;
 
  else if (reset_mode | error_frame_ended)
 
    enable_error_cnt2 <=#Tp 1'b0;
 
  else if (sample_point & sampled_bit & (error_cnt1 == 6))
 
    enable_error_cnt2 <=#Tp 1'b1;
 
end
 
 
 
 
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    error_cnt2 <= 1'b0;
 
  else if (reset_mode | error_frame_ended)
 
    error_cnt2 <=#Tp 1'b0;
 
  else if (enable_error_cnt2 & tx_point)
 
    error_cnt2 <=#Tp error_cnt2 + 1'b1;
 
end
 
 
 
 
 
wire node_error_passive = 1;
 
 
 
always @ (posedge clk or posedge rst)
 
begin
 
  if (rst)
 
    tx <= 1'b1;
 
  else if (reset_mode | error_frame_ended)
 
    tx <=#Tp 1'b1;
 
  else if (tx_point & error_frame)
 
    begin
 
      if (error_cnt1 < 6)
 
        begin
 
          if (node_error_passive)
 
            tx <=#Tp 1'b1;
 
          else
 
            tx <=#Tp 1'b0;
 
        end
 
      else if (error_cnt2 < 7)
 
        tx <=#Tp 1'b1;
 
    end
 
end
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

powered by: WebSVN 2.1.0

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