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

Subversion Repositories can

[/] [can/] [tags/] [asyst_3/] [rtl/] [verilog/] [can_btl.v] - Diff between revs 106 and 108

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

Rev 106 Rev 108
Line 48... Line 48...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.24  2003/07/10 15:32:28  mohor
 
// Unused signal removed.
 
//
// Revision 1.23  2003/07/10 01:59:04  tadejm
// Revision 1.23  2003/07/10 01:59:04  tadejm
// Synchronization fixed. In some strange cases it didn't work according to
// Synchronization fixed. In some strange cases it didn't work according to
// the VHDL reference model.
// the VHDL reference model.
//
//
// Revision 1.22  2003/07/07 11:21:37  mohor
// Revision 1.22  2003/07/07 11:21:37  mohor
Line 197... Line 200...
reg           clk_en_q;
reg           clk_en_q;
reg           sync_blocked;
reg           sync_blocked;
reg           hard_sync_blocked;
reg           hard_sync_blocked;
reg           sampled_bit;
reg           sampled_bit;
reg           sampled_bit_q;
reg           sampled_bit_q;
reg     [4:0] quant_cnt;
reg     [3:0] quant_cnt;
reg     [3:0] delay;
reg     [3:0] delay;
reg           sync;
reg           sync;
reg           seg1;
reg           seg1;
reg           seg2;
reg           seg2;
reg           resync_latched;
reg           resync_latched;
Line 213... Line 216...
reg           tx_point;
reg           tx_point;
 
 
wire          go_sync_unregistered;
wire          go_sync_unregistered;
wire          go_seg1_unregistered;
wire          go_seg1_unregistered;
wire          go_seg2_unregistered;
wire          go_seg2_unregistered;
wire [8:0]    preset_cnt;
wire [7:0]    preset_cnt;
wire          sync_window;
wire          sync_window;
wire          resync;
wire          resync;
wire          quant_cnt_rst;
 
 
 
 
 
 
 
assign preset_cnt = (baud_r_presc + 1'b1)<<1;        // (BRP+1)*2
assign preset_cnt = (baud_r_presc + 1'b1)<<1;        // (BRP+1)*2
assign hard_sync  =   (rx_idle | not_first_bit_of_inter)    & (~rx) & sampled_bit & (~hard_sync_blocked);  // Hard synchronization
assign hard_sync  =   (rx_idle | not_first_bit_of_inter)    & (~rx) & sampled_bit & (~hard_sync_blocked);  // Hard synchronization
Line 229... Line 231...
 
 
/* Generating general enable signal that defines baud rate. */
/* Generating general enable signal that defines baud rate. */
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    clk_cnt <= 0;
    clk_cnt <= 7'h0;
  else if (clk_cnt >= (preset_cnt-1'b1))
  else if (clk_cnt >= (preset_cnt-1'b1))
    clk_cnt <=#Tp 0;
    clk_cnt <=#Tp 7'h0;
  else
  else
    clk_cnt <=#Tp clk_cnt + 1'b1;
    clk_cnt <=#Tp clk_cnt + 1'b1;
end
end
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    clk_en  <= 1'b0;
    clk_en  <= 1'b0;
  else if (clk_cnt == (preset_cnt-1'b1))
  else if ({1'b0, clk_cnt} == (preset_cnt-1'b1))
    clk_en  <=#Tp 1'b1;
    clk_en  <=#Tp 1'b1;
  else
  else
    clk_en  <=#Tp 1'b0;
    clk_en  <=#Tp 1'b0;
end
end
 
 
Line 268... Line 270...
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    go_sync <= 1'b0;
    go_sync <=#Tp 1'b0;
  else
  else
    go_sync <=#Tp go_sync_unregistered;
    go_sync <=#Tp go_sync_unregistered;
end
end
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    go_seg1 <= 1'b0;
    go_seg1 <=#Tp 1'b0;
  else
  else
    go_seg1 <=#Tp go_seg1_unregistered;
    go_seg1 <=#Tp go_seg1_unregistered;
end
end
 
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    go_seg2 <= 1'b0;
    go_seg2 <=#Tp 1'b0;
  else
  else
    go_seg2 <=#Tp go_seg2_unregistered;
    go_seg2 <=#Tp go_seg2_unregistered;
end
end
 
 
 
 
Line 319... Line 321...
 
 
/* Synchronization stage/segment */
/* Synchronization stage/segment */
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    sync <= 0;
    sync <= 1'b0;
  else if (go_sync)
  else if (go_sync)
    sync <=#Tp 1'b1;
    sync <=#Tp 1'b1;
  else if (clk_en_q | go_seg1)
  else if (clk_en_q | go_seg1)
    sync <=#Tp 1'b0;
    sync <=#Tp 1'b0;
end
end
Line 331... Line 333...
 
 
/* Seg1 stage/segment (together with propagation segment which is 1 quant long) */
/* Seg1 stage/segment (together with propagation segment which is 1 quant long) */
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    seg1 <= 1;
    seg1 <= 1'b1;
  else if (go_seg1)
  else if (go_seg1)
    seg1 <=#Tp 1'b1;
    seg1 <=#Tp 1'b1;
  else if (go_seg2)
  else if (go_seg2)
    seg1 <=#Tp 1'b0;
    seg1 <=#Tp 1'b0;
end
end
Line 343... Line 345...
 
 
/* Seg2 stage/segment */
/* Seg2 stage/segment */
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    seg2 <= 0;
    seg2 <= 1'b0;
  else if (go_seg2)
  else if (go_seg2)
    seg2 <=#Tp 1'b1;
    seg2 <=#Tp 1'b1;
  else if (go_sync | go_seg1)
  else if (go_sync | go_seg1)
    seg2 <=#Tp 1'b0;
    seg2 <=#Tp 1'b0;
end
end
 
 
 
 
/* Quant counter */
/* Quant counter */
assign quant_cnt_rst = go_sync | go_seg1 | go_seg2;
 
 
 
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    quant_cnt <= 0;
    quant_cnt <= 4'h0;
  else if (quant_cnt_rst)
  else if (go_sync | go_seg1 | go_seg2)
    quant_cnt <=#Tp 0;
    quant_cnt <=#Tp 4'h0;
  else if (clk_en_q)
  else if (clk_en_q)
    quant_cnt <=#Tp quant_cnt + 1'b1;
    quant_cnt <=#Tp quant_cnt + 1'b1;
end
end
 
 
 
 
/* When late edge is detected (in seg1 stage), stage seg1 is prolonged. */
/* When late edge is detected (in seg1 stage), stage seg1 is prolonged. */
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    delay <= 0;
    delay <= 4'h0;
  else if (resync & seg1 & (~transmitting))  // when transmitting 0 with positive error delay is set to 0
  else if (resync & seg1 & (~transmitting))  // when transmitting 0 with positive error delay is set to 0
    delay <=#Tp (quant_cnt > {3'h0, sync_jump_width})? (sync_jump_width + 1'b1) : (quant_cnt + 1'b1);
    delay <=#Tp (quant_cnt > {2'h0, sync_jump_width})? ({2'h0, sync_jump_width} + 1'b1) : (quant_cnt + 1'b1);
  else if (go_sync | go_seg1)
  else if (go_sync | go_seg1)
    delay <=#Tp 0;
    delay <=#Tp 4'h0;
end
end
 
 
 
 
// If early edge appears within this window (in seg2 stage), phase error is fully compensated
// If early edge appears within this window (in seg2 stage), phase error is fully compensated
assign sync_window = ((time_segment2 - quant_cnt[2:0]) < ( sync_jump_width + 1'b1));
assign sync_window = ((time_segment2 - quant_cnt[2:0]) < ( sync_jump_width + 1'b1));
Line 396... Line 396...
// When enabled, tripple sampling is done here.
// When enabled, tripple sampling is done here.
always @ (posedge clk or posedge rst)
always @ (posedge clk or posedge rst)
begin
begin
  if (rst)
  if (rst)
    begin
    begin
      sampled_bit <= 1;
      sampled_bit <= 1'b1;
      sampled_bit_q <= 1;
      sampled_bit_q <= 1'b1;
      sample_point <= 0;
      sample_point <= 1'b0;
    end
    end
  else if (clk_en_q & (~hard_sync))
  else if (clk_en_q & (~hard_sync))
    begin
    begin
      if (seg1 & (quant_cnt == (time_segment1 + delay)))
      if (seg1 & (quant_cnt == (time_segment1 + delay)))
        begin
        begin
          sample_point <=#Tp 1;
          sample_point <=#Tp 1'b1;
          sampled_bit_q <=#Tp sampled_bit;
          sampled_bit_q <=#Tp sampled_bit;
          if (triple_sampling)
          if (triple_sampling)
            sampled_bit <=#Tp (sample[0] & sample[1]) | ( sample[0] & rx) | (sample[1] & rx);
            sampled_bit <=#Tp (sample[0] & sample[1]) | ( sample[0] & rx) | (sample[1] & rx);
          else
          else
            sampled_bit <=#Tp rx;
            sampled_bit <=#Tp rx;
        end
        end
    end
    end
  else
  else
    sample_point <=#Tp 0;
    sample_point <=#Tp 1'b0;
end
end
 
 
 
 
 
 
/* Blocking synchronization (can occur only once in a bit time) */
/* Blocking synchronization (can occur only once in a bit time) */
Line 428... Line 428...
    sync_blocked <=#Tp 1'b1;
    sync_blocked <=#Tp 1'b1;
  else if (clk_en_q)
  else if (clk_en_q)
    begin
    begin
      if (resync)
      if (resync)
        sync_blocked <=#Tp 1'b1;
        sync_blocked <=#Tp 1'b1;
//      else if (seg2 & (quant_cnt[2:0] == time_segment2))
 
      else if (go_seg2)
      else if (go_seg2)
        sync_blocked <=#Tp 1'b0;
        sync_blocked <=#Tp 1'b0;
    end
    end
end
end
 
 

powered by: WebSVN 2.1.0

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