FPGA生成随机数的方法

FPGA生成随机数的方法,目前有以下几种:

1、震荡采样法

实现方式一:通过低频时钟作为D触发器的时钟输入端,高频时钟作为D触发器的数据输入端,使用高频采样低频,利用亚稳态输出随机数。

实现方式二:使用三个或以上反相器首尾互联,形成环路振荡器。使用时钟采集,得到不稳定的数据,以形成随机数(其实此种方式与方式一相类似,反相器的组合逻辑相当于高频时钟,时钟信号相当于低频时钟,同样利用亚稳态生成随机数)。

(直接按照实现方式二,上具体实现代码)

复制代码
//反相器环形级联,组合为振荡器,利用亚稳态状态,得到随机数

module random_gen
(
    input clk,
    
    input start, //开始命令
    
    output reg random_valid = 0,
    output reg [7:0] random_data = 0
    );


reg state = 1'b0; //0空闲态  1随机态

(*dont_touch = "true" *)reg a = 1'b0;
(*dont_touch = "true" *)reg b = 1'b0;
(*dont_touch = "true" *)reg c = 1'b0;

reg [2:0] bit_cnt = 0; 

//3个取反器,环形震荡
//取反器
always@(state)
begin
    b <= !a;
end

//取反器
always@(state)
begin
    c <= !b;
end

//取反器
always@(state)
begin
    a <= !c;
end





always@(posedge clk)
begin
    if(state == 1'b0) begin  //state == 0
        bit_cnt <= 3'd0;
        random_valid <= 1'b0;
        if(start) begin 
            state <= 1'b1;
        end
        else begin
            state <= 1'b0;
        end
    end
    else begin   //state == 1
        bit_cnt <= bit_cnt + 1'b1;
        if(bit_cnt == 3'b111) begin
			state <= 1'b1;
            random_valid <= 1'b1;
        end
        else begin
            random_valid <= 1'b0;      
        end
        random_data <= {random_data[6:0],c};
            
    end
end       
           
    
    
endmodule

2、LFSR伪随机数

LFSR(Linear-feedback shift register)是一种特殊的的移位寄存器,他的输入取决于其先前状态,其生成的随机数是一种伪随机数。其架构如下图所示:

上图中,gn为反馈系数,取值只能是1或者0,N个D触发器,可以提供2^(N-1)个输出状态,为了保证随机性,gn的选择必须满足一定的条件,不能全部为0,且gn必须等于1。

假设输出的随机数的位宽为8bits,且取值g0g1g2g3g4g5g6g7g8=101110001,则可以实现如下代码:

复制代码
module LFSR #
( parameter [7:0] SEED = 8'h11) 
(
    input               rstn,    
    input               clk,       
    output reg [7:0]    rand_data //随机数
);


always@(posedge clk or negedge rstn)
begin
    if(!rstn)
        rand_data    <=SEED;
    else begin
            rand_data[0] <= rand_data[7];
            rand_data[1] <= rand_data[0];
            rand_data[2] <= rand_data[1];
            rand_data[3] <= rand_data[2];
            rand_data[4] <= rand_data[3]^rand_data[7];
            rand_data[5] <= rand_data[4]^rand_data[7];
            rand_data[6] <= rand_data[5]^rand_data[7];
            rand_data[7] <= rand_data[6];
    end       
end

endmodule

3、使用FLASH或EEPROM生成随机数

读取FLASH中预存的seed,然后进行相关逻辑运算,得到伪随机数。同时按照既定的逻辑生成新的seed,写入到FLASH或者EEPROM中,这样就可以保证每次输出的随机数不同。(此种方式较为复杂,不推荐)

此处不进行具体实现。

相关推荐
I'm a winner14 小时前
新手入门Makefile:FPGA项目实战教程(二)
笔记·fpga开发
我爱C编程17 小时前
基于FPGA的8PSK+卷积编码Viterbi译码通信系统,包含帧同步,信道,误码统计,可设置SNR
fpga开发·通信·8psk·帧同步·snr·卷积编码·维特比译码
I'm a winner1 天前
新手入门 Makefile:FPGA 项目实战教程(三)
fpga开发
范纹杉想快点毕业1 天前
嵌入式 C 语言编程规范个人学习笔记,参考华为《C 语言编程规范》
linux·服务器·数据库·笔记·单片机·嵌入式硬件·fpga开发
lazyduck2 天前
从半年到一年的 bug 往事:TCP modbus的卡死与补救
fpga开发·modbus
范纹杉想快点毕业2 天前
《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准
服务器·c语言·stm32·单片机·华为·fpga开发·51单片机
Chipi Chipi2 天前
FPGA即插即用Verilog驱动系列——串口数据、命令解析
fpga开发
FPGA_ADDA3 天前
基于 AMDXCVU47P HBM2 FPGA 的 2 路 100G 光纤 PCIe 高性能计算加速卡
fpga开发·vu47p·100g光纤pcie·高性能计算加速卡
霖003 天前
高级项目——基于FPGA的串行FIR滤波器
人工智能·经验分享·matlab·fpga开发·信息与通信·信号处理
I'm a winner3 天前
FPGA+护理:跨学科发展的探索(四)
笔记·fpga开发