How to implement a (pseudo) hardware random number generator

前端 未结 3 1408
情深已故
情深已故 2020-12-05 09:14

How do you implement a hardware random number generator in an HDL (verilog)?

What options need to be considered?


This question is following the self-an

3条回答
  •  我在风中等你
    2020-12-05 09:37

    This is a TRNG (True random number generator) that works on an FPGA. It is basically an LFSR type structure without the flip flops, so it is a combinatorial loop that runs continuously. The signal oscillates chaotically, when you combine several of these modules and XOR bits you get a truly random bit, since the jitter from each combines. The maximum clock rate you can run this at depends on your FPGA, you should test the randomness with a testing suite like diehard, dieharder, STS or TestU01.

    These are called Galois Ring Oscillators(GARO). There are other TRNGs which use less power and area, but they are tricker to operate and write, usually relying on tuning delays to make a flipflop go metastable.

    module GARO (input stop,clk, reset, output random);
    
    (* OPTIMIZE="OFF" *)                    //stop *xilinx* tools optimizing this away
    wire [31:1] stage /* synthesis keep */; //stop *altera* tools optimizing this away
    reg meta1, meta2;
    
    assign random = meta2;
    
    always@(posedge clk or negedge reset)
    if(!reset)
      begin
        meta1 <= 1'b0;
        meta2 <= 1'b0;
      end
    else if(clk)
      begin
        meta1 <= stage[1];
        meta2 <= meta1;
      end
    
    assign stage[1] = ~&{stage[2] ^ stage[1],stop};
    assign stage[2] = !stage[3];
    assign stage[3] = !stage[4] ^ stage[1];
    assign stage[4] = !stage[5] ^ stage[1];
    assign stage[5] = !stage[6] ^ stage[1];
    assign stage[6] = !stage[7] ^ stage[1];
    assign stage[7] = !stage[8];
    assign stage[8] = !stage[9] ^ stage[1];
    assign stage[9] = !stage[10] ^ stage[1];
    assign stage[10] = !stage[11];
    assign stage[11] = !stage[12];
    assign stage[12] = !stage[13] ^ stage[1];
    assign stage[13] = !stage[14];
    assign stage[14] = !stage[15] ^ stage[1];
    assign stage[15] = !stage[16] ^ stage[1];
    assign stage[16] = !stage[17] ^ stage[1];
    assign stage[17] = !stage[18];
    assign stage[18] = !stage[19];
    assign stage[19] = !stage[20] ^ stage[1];
    assign stage[20] = !stage[21] ^ stage[1];
    assign stage[21] = !stage[22];
    assign stage[22] = !stage[23];
    assign stage[23] = !stage[24];
    assign stage[24] = !stage[25];
    assign stage[25] = !stage[26];
    assign stage[26] = !stage[27] ^ stage[1];
    assign stage[27] = !stage[28];
    assign stage[28] = !stage[29];
    assign stage[29] = !stage[30];
    assign stage[30] = !stage[31];
    assign stage[31] = !stage[1];
    
    endmodule
    

提交回复
热议问题