Subversion Repositories pentevo

Rev

Rev 255 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. module rnd_vec_gen(
  2.  
  3.         clk,
  4.  
  5.         init,
  6.  
  7.         save,
  8.         restore,
  9.         next,
  10.  
  11.  
  12.         out
  13. );
  14.  
  15. parameter OUT_SIZE = 16; // size of output port, independent of LFSR register size
  16.  
  17. parameter LFSR_LENGTH   = 55; // LFSR
  18. parameter LFSR_FEEDBACK = 24; //     definition
  19.  
  20.  
  21.         input clk;
  22.  
  23.         input init; // positive initialization strobe, synchronous to clock, its length will determine initial state
  24.  
  25.         input save,restore,next; // strobes for required events: positive, one clock cycle long
  26.  
  27.  
  28.         reg init2;
  29.  
  30.  
  31.         output  [OUT_SIZE-1:0] out;
  32.         wire    [OUT_SIZE-1:0] out;
  33.  
  34.  
  35.         reg [OUT_SIZE-1:0] rndbase_main  [0:LFSR_LENGTH-1];
  36.         reg [OUT_SIZE-1:0] rndbase_store [0:LFSR_LENGTH-1];
  37.  
  38.  
  39. //`define simple_rnd
  40.  
  41.  
  42. `ifdef simple_rnd
  43.  
  44.         reg [OUT_SIZE-1:0] back,front;
  45.        
  46.         always @(posedge clk)
  47.         begin
  48.                 if( restore )
  49.                         front <= back;
  50.                 else if( save )
  51.                         back <= front;
  52.                 else if( next )
  53.                         front <= (front!=0)?(front + 1):2;
  54.         end
  55.  
  56.         assign out = front;
  57.  
  58. `else
  59.  
  60.  
  61.         assign out = rndbase_main[0];
  62.  
  63.  
  64.  
  65.         always @(posedge clk)
  66.         begin
  67.  
  68.                 init2 <= init;
  69.  
  70.                 if( init && !init2 ) // begin of initialization
  71.                 begin
  72.                         rndbase_main[0][0] <= 1'b1; // any non-zero init possible
  73.                 end
  74.                 else if( init && init2 ) // continue of initialization
  75.                 begin
  76.                         shift_lfsr;
  77.                 end
  78.                 else // no init, normal work
  79.                 begin
  80.  
  81.                         if( restore ) // restore event: higher priority
  82.                         begin
  83.                                 integer i;
  84.                                 for(i=0;i<LFSR_LENGTH;i=i+1)
  85.                                         rndbase_main[i] <= rndbase_store[i];
  86.                         end
  87.                         else
  88.                         begin
  89.                                 if( save ) // save current state
  90.                                 begin
  91.                                         integer j;
  92.                                         for(j=0;j<LFSR_LENGTH;j=j+1)
  93.                                                 rndbase_store[j] <= rndbase_main[j];
  94.                                 end
  95.                                 else if( next ) // step to next value
  96.                                 begin
  97.                                         shift_lfsr;
  98.                                 end
  99.  
  100.                         end
  101.                 end
  102.         end
  103.  
  104.  
  105.  
  106.         task shift_lfsr;
  107.         begin
  108.                 reg [OUT_SIZE-1:0] sum;
  109.                 reg [LFSR_LENGTH-1:0] lsbs;
  110.  
  111.                 integer i;
  112.  
  113.                 for(i=0;i<LFSR_LENGTH;i=i+1)
  114.                         lsbs[i] = rndbase_main[i][0];
  115.  
  116.                 sum = rndbase_main[LFSR_LENGTH-1] + rndbase_main[LFSR_FEEDBACK-1];
  117.  
  118.                 for(i=1;i<LFSR_LENGTH;i=i+1)
  119.                         rndbase_main[i] <= rndbase_main[i-1];
  120.  
  121.                 rndbase_main[0] <= { sum[OUT_SIZE-1:1], (|lsbs)?sum[0]:1'b1 };
  122.         end
  123.         endtask
  124.  
  125. `endif
  126.  
  127. endmodule
  128.  
  129.  
  130.  
  131.  
  132.  
  133.