Subversion Repositories ngs

Rev

Rev 3 | 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.  
  40.  
  41.         assign out = rndbase_main[0];
  42.  
  43.  
  44.  
  45.         always @(posedge clk)
  46.         begin
  47.  
  48.                 init2 <= init;
  49.  
  50.                 if( init && !init2 ) // begin of initialization
  51.                 begin
  52.                         rndbase_main[0][0] <= 1'b1; // any non-zero init possible
  53.                 end
  54.                 else if( init && init2 ) // continue of initialization
  55.                 begin
  56.                         shift_lfsr;
  57.                 end
  58.                 else // no init, normal work
  59.                 begin
  60.  
  61.                         if( restore ) // restore event: higher priority
  62.                         begin
  63.                                 integer i;
  64.                                 for(i=0;i<LFSR_LENGTH;i=i+1)
  65.                                         rndbase_main[i] <= rndbase_store[i];
  66.                         end
  67.                         else
  68.                         begin
  69.                                 if( next ) // step to next value
  70.                                 begin
  71.                                         shift_lfsr;
  72.                                 end
  73.  
  74.                                 if( save ) // save current state
  75.                                 begin
  76.                                         integer j;
  77.                                         for(j=0;j<LFSR_LENGTH;j=j+1)
  78.                                                 rndbase_store[j] <= rndbase_main[j];
  79.                                 end
  80.                         end
  81.                 end
  82.         end
  83.  
  84.  
  85.  
  86. /*      function [LFSR_LENGTH-1:0] shift_lfsr;
  87.  
  88.                 input [LFSR_LENGTH-1:0] old_lfsr;
  89.  
  90.                 begin
  91.                         if( |old_lfsr ) // prevent spurious stalls if all LFSR is zeros
  92.                                 shift_lfsr[LFSR_LENGTH-1:0] = { old_lfsr[LFSR_LENGTH-2:0], old_lfsr[LFSR_LENGTH-1]^old_lfsr[LFSR_FEEDBACK-1] };
  93.                         else
  94.                         shift_lfsr[LFSR_LENGTH-1:0] = 2'd1;
  95.                 end
  96.         endfunction
  97. */
  98.  
  99.         task shift_lfsr;
  100.         begin
  101.                 reg [OUT_SIZE-1:0] sum;
  102.                 reg [LFSR_LENGTH-1:0] lsbs;
  103.  
  104.                 integer i;
  105.  
  106.                 for(i=0;i<LFSR_LENGTH;i=i+1)
  107.                         lsbs[i] = rndbase_main[i][0];
  108.  
  109.                 sum = rndbase_main[LFSR_LENGTH-1] + rndbase_main[LFSR_FEEDBACK-1];
  110.  
  111. //              integer j;
  112.                 for(i=1;i<LFSR_LENGTH;i=i+1)
  113.                         rndbase_main[i] <= rndbase_main[i-1];
  114.  
  115.                 rndbase_main[0] <= { sum[OUT_SIZE-1:1], (|lsbs)?sum[0]:1'b1 };
  116.         end
  117.         endtask
  118.  
  119.  
  120. endmodule
  121.  
  122.  
  123.  
  124.  
  125.  
  126.