• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

随机数生成器设计Verilog代码Quartus DE2开发板

09/12 13:34
500
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-2410151UIbS.doc

共1个文件

名称:随机数生成器设计Verilog代码Quartus? DE2开发板

软件:Quartus

语言:Verilog

代码功能:

在 Verilog模拟它们并证明它们正常工作

多游戏都需要输入随机数,目标是开发一种可以随机显示在DE2板7段显示屏上的十进制数字。在此示例中,我们将使用数字作为我们选择的国家彩票的号码,数字的选择从1开始到59。

操作如下:

1.按KEY3,开始序列。

2.然后按KEY2,并且第一个数字显示在HEX2-1上9秒。

3.然后,系统再次开始计数,重复阶段2,不能再次选择先前选择的号码。

4.重复该过程,直到选了6次。

要求:

1.架构和控制器的描述(用框图表示互连)和所有ASM图表。

2.七段解码器的每个模块的带注释的 Verilog代码和设计中的所有计数器

3.七段解码器和设计中的所有计数器的完整仿真,带有注释的仿真表明。

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

本代码已在DE2开发板验证,DE2开发板如下,其他开发板可以修改管脚适配:

DE2开发板.png

演示视频:

设计文档:

设计报告

1.架构和控制器的描述(框图显示互连)。

本设计共分为3个模块,分别是分频模块div,状态控制模块state_ctrl,显示模块display。

分频模块用于将系统时钟50MHz分频为1Hz的信号,用于后续控制计时9秒。状态控制模块采用状态机设计,用于实现按键控制产生随机数,并且随机数不能重复。显示模块用于将状态控制模块输出的随机数通过数码管显示出来。这三个模块通过顶层代码Random.v连接起来,组成最终的完整代码,连接框图如下所示:

2.所有算法状态机的ASM图表。?(每个ASM?1页)

本设计只在状态控制模块state_ctrl里面使用了状态机设计,状态机的状态图如下所示:

状态机中一共分为5个状态,分别是s_idle、s_count、s_random、s_display、s_end状态。s_idle状态为初始状态,即复位后进入s_idle状态,该状态下系统为空闲状态,还未开始。按下key_3后,进入s_count状态,s_count状态为计数状态,即1~59循环计数,并跳过已出现过的随机数。当key_2按下时,进入s_random状态,该状态为取随机数状态,在该状态下,将计数器的值作为当前的随机数输出,同时将重复次数加1(用于后续判断是否重复6次)。s_random状态后下一时钟进入s_display状态,s_display状态用于将前一状态产生的随机数输出到显示模块,同时在s_display状态下,进行计时9秒,9秒后判断是否已经重复6次,若不到6次,则回到s_count状态,否则跳转到s_end状态。s_end状态表示结束状态,即6个数均已产生完毕。若要回到s_idle状态,复位即可。

3.注释每个模块的Verilog代码。

见具体工程文件

4.对设计中每个模块的完整仿真

4.1?分频模块仿真

分频模块用于将系统时钟50MHz分频为1Hz的信号,在仿真时,为了便于观察仿真图,将分频的计数器改小了,即原本50MHz分频到1Hz需要计数50000000,为便于仿真,将计数器改小为50,分频模块仿真图如下:

图中可以看到,由于数器改小为50,为50分频,在计数到50后输出一个高电平脉冲,同时计数到50后计数器回到1重新计数。可知若计数值改为50000000,可以输出1Hz的脉冲信号,脉冲高电平时间为1个时钟周期。

4.2状态控制模块仿真

状态控制模块采用状态机设计,用于实现按键控制产生随机数,并且随机数不能重复,仿真图如下所示:

上图中模拟了key_3按下一次,然后key_2按下6次的情况,产生了6个不同的随机数,图中data信号为产生的随机数,随机数分别为:3、50、54、15、49、33。产生6次后key_2再按下无效。data_ten为data的十位,data_one为data的个位。

上图可以看到,key_3按下(低电平脉冲)后count开始计数,直到key_2按下,停止计数,并将计数值3存储到data_temp1中,同时将重复次数repeat_cnt加1,然后输出随机数data=3,并等待time_cnt计时9秒,计时结束后count继续计数,直到下次key_2按下。

上图为count的具体计数值,可以看到,由于随机数3已经出现过,在后续的计数中就不在有3。

4.3显示模块仿真

显示模块用于将状态控制模块输出的随机数通过数码管显示出来,下图为显示模块仿真图,图中data_ten为data的十位,data_one为data的个位,HEX2显示的十位,HEX1显示的个位。数码管为8段数码管,低电平点亮。数码管示意图如下,最高位为DP(小数点)。

当data_one=0,data_ten=0时,HEX1值为11000000,HEX2为11000000,数码管显示00,当data_one=3,data_ten=0时,HEX1值为10110000,HEX2为11000000,数码管显示03,当data_one=0,data_ten=5时,HEX1值为11000000,HEX2为10010010,数码管显示50,同理后面的都是类似的,仿真图表明数码管可以准确显示十位和个位。

4.整个系统的RTL示意图。

系统RTL图如下所示:

共有3个模块,分别是分频模块div,状态控制模块state_ctrl,显示模块display,div模块输出的1Hz信号输入到state_ctrl模块,state_ctrl模块输出的data_one和data_ten信号输入到display模块。

5.整个系统的仿真。?(带注解,任何内容最多?页评论)

系统整体仿真图如下:

图中clk、rst_n、key_3、key_2为外部输入信号,HEX1、HEX2为输出信号,data_ten,data_one,clk_1Hz为内部连线信号。整体仿真图可以看出,系统最初显示00,按下key_3后开始,按下key_2后显示第1个随机数03,等待9秒后,回到00;再按下key_2后显示第2个随机数50,等待9秒后,回到00;再按下key_2后显示第3个随机数54,等待9秒后,回到00;再按下key_2后显示第4个随机数15,等待9秒后,回到00;再按下key_2后显示第5个随机数49,等待9秒后,回到00;再按下key_2后显示第6个随机数33。

6.实验测试结果的说明。?(最多1页)真的是随机的吗?

在s_count状态下,在系统时钟下对计数器进行计数(1~59),剔除重复数据的思路为,将每次产生的随机数存储起来,再下次计数的时候判断当前数据是否为之前出现过的数据,若是则将这个数跳过。在s_random状态下,也判断当前数据是否为之前出现过的数据,若是则将这个数跳过。通过上面的方法,保证不出现重复数据。根据状态控制模块仿真图可以看到,已经出现过的随机数,在后续的计数中不会再出现。在s_random状态下,将计数器的值作为当前的随机数输出,由于计数器是在系统时钟50M下计数的,计数值变化的非常快(20ns变化一次),因此无法估算key_2按下时计数到哪个值,因此输出的数是随机的。

7.结论(最多?页)

通过对每个模块的仿真验证了各个模块对应的功能,仿真结果显示每个模块都实现了所设计的功能,最后通过整体仿真验证了系统的整体功能,结果表明该设计可正确完成所要求的功能,设计正确。

部分代码展示:

//显示模块
module?display(
input?clk,
input?[3:0]?data_ten,//输出十位
input?[3:0]?data_one,//输出个位
output?reg?[7:0]HEX1,//显示个位
output?reg?[7:0]HEX2?//显示十位
);
always?@(posedge?clk)
begin
case?(data_ten)??//数字显示码
8'd0:?HEX2<=?8'b1100_0000;
8'd1:?HEX2<=?8'b1111_1001;
8'd2:?HEX2<=?8'b1010_0100;
8'd3:?HEX2<=?8'b1011_0000;
8'd4:?HEX2<=?8'b1001_1001;
8'd5:?HEX2<=?8'b1001_0010;
8'd6:?HEX2<=?8'b1000_0010;
8'd7:?HEX2<=?8'b1111_1000;
8'd8:?HEX2<=?8'b1000_0000;
8'd9:?HEX2<=?8'b1001_0000;
default:;
endcase
end

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1205

  • 2-2410151UIbS.doc
    下载

相关推荐