使用Verilog在FPGA中实现伪随机数生成器

分享如何在Xilinx Breadboardable Spartan-7 FPGA, CMOD S7中实现4位伪随机数发生器(PRNGs)。

微信搜索关注《Java学研大本营》

现场可编程门阵列(FPGA)是一种高度可配置的集成电路,它使开发者能够测试和重写程序以执行各种功能。它在原型设计、测试数字电路和实现生产中的定制数字系统方面很受欢迎。

该领域涉及但不限于:

  • 数字信号处理

    -实现滤波器、变换和信号发生器

    -示例应用:音频、视频处理、通信系统和雷达处理。

  • 机器学习(ML)和人工智能(AI)

    -实现定制的ML和AI算法,如CNN

    -示例应用:计算机视觉、自然语言处理和语音识别

  • 通信系统和数据存储中的加密安全

    -实现加密算法,如AES、DES和RSA

    -示例应用:安全通信系统和数据存储

  • 工业控制系统

    -在各种工业中实现定制的控制系统:机器人、自动化和过程控制

    -示例应用:自主车辆控制系统和智能电网控制系统

  • 航空航天和国防

    -实现定制的数字系统,具有高性能、低功耗和抗辐射能力

    -示例应用:雷达处理和制导系统

1 问题陈述

虽然随机性是安全网络物理系统(CPS)的一个重要组成部分,但如何在FPGA中实现随机数发生器呢?今天分享一下关于如何在Xilinx Breadboardable Spartan-7 FPGA, CMOD S7中实现4位伪随机数发生器(PRNGs)。

请注意,PRNGs与真随机数发生器不同。PRNGs可能在输出中存在偏差或模式,因此应结合其他安全措施使用,如安全的密钥管理实践和强大的加密算法,以保护目标系统。

CMOD S7的近景

下面是用Verilog语言编写的程序,使用了Vivado软件。在这个程序中,主要有3个主要功能:

  • 这个程序使用计数器来确定1秒的间隔

  • 这个程序在反馈中进行LFSR操作,并计算4位lfsr_reg

  • 这个程序以二进制格式输出随机数,用LED灯显示,范围从0 ~ 15。下图显示为1011,即十进制的11。

随机数的一个输出。二进制的1011是十进制的11

4位二进制数转换为十进制。

下面是用Verilog语言实现4位LFSR的源代码。

  • 我们定义了一个名为“DELAY”的常量,其十进制值为12000000,以匹配默认时钟运行在12 MHz

  • 是一个函数,用于计算一个变量的以为底的对数的上限,在这里指的是clog2(12000000)=24

// 因为默认时钟运行在12 MHz 
`define DELAY 1_200_000_0 // 1秒

module lfsr(
    input clk,
    output reg [3:0] LED
);

reg [3:0] lfsr_reg;
reg [$clog2(`DELAY) - 1:0] counter = 0;

wire feedback;

assign feedback = ~(lfsr_reg[3] ^ lfsr_reg[2]);
  
always @(posedge clk) 
begin
    if ( counter == `DELAY - 1 ) 
    begin
        counter <= 0; // 复位计数器
        lfsr_reg <= {lfsr_reg[2:0], feedback}; // 更新LFSR // 反馈位在第3和第2位,向左移位
        LED = lfsr_reg;
    end 
    else
        counter <= counter + 1; // 增加计数器
        
end

Cmod-S7–25-Master.xdc的示例内容,其中定义了设计约束,如引脚分配、时钟约束和I/O时序参数,这些参数在实现阶段使用。

## This file is a general .xdc for the Cmod S7-25 Rev. B
## To use it in a project:
## - uncomment the lines corresponding to used pins
## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project

## 12 MHz System Clock
set_property -dict { PACKAGE_PIN M9    IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L13P_T2_MRCC_14 Sch=gclk
create_clock -add -name sys_clk_pin -period 83.33 -waveform {0 41.66} [get_ports { clk }];

## 4 LEDs
set_property -dict { PACKAGE_PIN E2    IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L8P_T1_34 Sch=led[1]
set_property -dict { PACKAGE_PIN K1    IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L16P_T2_34 Sch=led[2]
set_property -dict { PACKAGE_PIN J1    IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L16N_T2_34 Sch=led[3]
set_property -dict { PACKAGE_PIN E1    IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L8N_T1_34 Sch=led[4]

set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]

2 演示

3 结论

从综合报告中可以看出,这个程序只占用了FPGA中0.05%的LUT滑块。我们可以在这个CMOD S7中实现更多有趣的功能,充分利用资源。

推荐书单

IT BOOK 多得(点击查看5折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《Spring Cloud 微服务快速上手》

《Spring Cloud 微服务快速上手》介绍了当下最主流的属于Spring生态的微服务框架,它继承了Spring Boot的优点,开发部署都非常简单。本书内容全面,介绍了微服务架构的发展历程,包含Spring Cloud Netflix 和 Spring Cloud 阿里巴巴的组件,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。在解读核心组件的实现原理的同时,配以案例进行实践。本书内容包含微服务架构和云原生架构,读者在掌握微服务之后,可以进一步掌握云原生知识。
《Spring Cloud 微服务快速上手》icon-default.png?t=N7T8https://item.jd.com/13251159.html

精彩回顾

gRPC对比REST,在Spring Boot 中使用gRPC

20个强大的IntelliJ IDEA导航功能(下)

20个强大的IntelliJ IDEA导航功能(上)

在IntelliJ IDEA中运行多个微服务项目的小技巧

Java 17的新特性都有什么?

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值