数字电路与逻辑设计综合课题实验报告DOC.docx
- 文档编号:14344191
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:18
- 大小:151.98KB
数字电路与逻辑设计综合课题实验报告DOC.docx
《数字电路与逻辑设计综合课题实验报告DOC.docx》由会员分享,可在线阅读,更多相关《数字电路与逻辑设计综合课题实验报告DOC.docx(18页珍藏版)》请在冰点文库上搜索。
数字电路与逻辑设计综合课题实验报告DOC
数字电路与逻辑设计综合课题实验报告
北京邮电大学信息与通信工程学院
一、设计课题的任务要求
题目三掷骰子游戏的电路的设计与实现
基本要求
1、电路可供甲乙二人游戏,游戏者甲使用的按键为BTN0,游戏者乙使用的按键为
BTN1。
2、每按一次按键,代表掷一次骰子,可随机得到1~6范围内的两个数字。
3、甲乙按键产生的随机数字分别用数码管DISP0-DISP1、DISP2-DISP3显示,并用
DISP7显示比赛局数,比赛结束用8×8点阵显示获胜方,并伴有声音效果。
4、具体游戏规则如下:
(1)第一局比赛,甲乙依次各按一次按键,按键所得两数之和为7或11者胜;若无
人取胜,则进行第二局比赛;
(2)第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比赛相同者获
胜,若无人获胜,则进行第三局比赛,重复进行步骤
(2),直到出现胜者为止。
(3)游戏局数最多进行六局。
在第六局比赛时,若重复进行步骤
(2)仍未出现胜者,
以按键所得两数之和最大者为获胜方。
提高要求
1、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。
2、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播放。
3、自拟其它功能。
二、系统设计
设计思路
首先根据实验的基本要求,可以知道掷骰子游戏至少有四种状态,分别是游戏状态(S0)、甲胜状态(S1)、乙胜状态(S2)和平局状态(S3),其中游戏状态可能到达其余三种状态中任意一种。
若是到达平局状态,就返回游戏状态,游戏继续;而一旦到达甲胜或者乙胜状态,游戏过程结束。
游戏状态中,由两个按键作为输入,每个按键控制两位数码管,共有四位数码管分别显示四个1~6的随机数,还有一位数码管显示当前局数。
离开游戏状态后,点阵显示甲胜、乙胜或平局,而且有胜者的状态中,蜂鸣器发声。
掷骰子游戏电路设计的结构图如下:
但我们还要在上述基本思想下注意几个问题:
1.由于按键输入不稳定,数字变化太快,所以需加入按键防抖模块。
2.数码管、点阵、蜂鸣器都需要特殊的分频,因此还需要多级的分频器。
3.局数会影响控制器的逻辑判断,因此在循环判断时,要将第一局,第六局与第二到五局分开考虑。
4.第一局的甲、乙两随机数之和需要单独记录,好跟后面产生的随机数的和比较。
5.该实验的一大难点在于随机数的产生,随机数发生器需要单独拿出来研究
因此,该实验程序大致分为:
随机数发生器、多级分频器、存储器、数码管显示译码、点阵显示、蜂鸣器控制、控制器和防抖模块。
分块设计
1.随机数发生器
由于VHDL语言不能直接调用随机数,因此需要通过代码实现伪随机数的生成。
查阅资料发现,生成伪随机数的方法一般有两种,一种是应用m序列发生器,将一段既定的人为书写的随机数列顺序输出,还有一种是通过时钟控制顺序计数,应用按键时刻的随机性输出随机数。
经各方面比较,我选择了后者。
两随机数中,低位的是按照时钟脉冲从一至六顺序输出计数,逢六进一位到高位,而高位的同理,从而使两随机数建立联系,实现一个按键随机按下,同时得出两随机数。
由于时钟变化很快,两随机数之间的时间差可忽略不计。
2.多级分频器
已知时钟的频率是50MHz,而输入到数码管和点阵的频率是1k~5kHz,输入到蜂鸣器的频率则希望控制在100Hz以下。
因此需要一个多级分频器,第一级分到100kHz,第二级再分到5kHz给数码管,1kHz给点阵,第三级从1kHz分到2Hz给蜂鸣器。
3.存储器
由于后几局的两个甲乙各自随机数之和要跟第一局的作比较,所以需要存储器来记录第一局产生的四个随机数。
4.数码管显示译码
5.点阵显示
6.蜂鸣器控制
7.控制器
8.防抖模块
由于防抖模块需要加入到所有按键输入,因此单独拿到主程序外。
加入防抖模块后,每次有按键输入,即电平发生改变,都能持续一个时钟脉冲,从而确保每次按键都能被控制器接收。
此次实验由按键输入的信号有甲(a),乙(b)和clear。
总体框图
掷骰子游戏电路的逻辑流程图如下:
掷骰子游戏的状态转移图如下:
三、仿真波形及波形分析
该实验的难点在于甲乙掷骰子时分别产生两个随机数,因此在实验开始之初,就对产生随机数的模块进行仿真。
仿真波形见下图:
四、源程序
总程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitys2012210709is
port(
clk:
instd_logic;
a_in,b_in,clear_in,switch_open:
instd_logic;
led:
outstd_logic_vector(6downto0);
light:
outstd_logic_vector(5downto0);
row,colr,colg:
outstd_logic_vector(7downto0);
beep:
outstd_logic);
ends2012210709;
architectureyouxiofs2012210709is
signala,b,clear:
std_logic;
signalwinner:
integerrange0to2;
signaltmpal,tmpah,tmpbl,tmpbh:
integerrange1to6;--计数器模值为6
signaljushu:
integerrange0to6:
=0;
signalnum0,num1,num2,num3,num5:
std_logic_vector(2downto0);--取得随机数
signaltmp0,tmp1,tmp2,tmp3:
integerrange1to6;--记录随机数
signaltmpnum0,tmpnum1,tmpnum2,tmpnum3:
integerrange1to6;--记录第一局的随机数
signaldianzhen:
integerrange0to7;
signaltmpfp:
integerrange0to249;--/100,000
signaltmpled:
integerrange0to9;--/5000
signaltmpdianzhen:
integerrange0to49;--/1000
signaltmpfeng:
integerrange0to249;--/2
signalclkfp,clkled,clkdianzhen,clkfeng:
std_logic;
componentfangdouis--防抖程序(见总程序结束后)
port(
clk_in:
instd_logic;
ai,bi,ci:
instd_logic;
ao,bo,clearo:
outstd_logic);
endcomponent;
begin
f0:
fangdouportmap(clk_in=>clk,ai=>a_in,bi=>b_in,ci=>clear_in,ao=>a,bo=>b,clearo=>clear);
p1:
process(clk)--输出两个1~6的随机数
begin
ifclk'eventandclk='1'then
ifclear='1'then
tmpal<=1;tmpah<=1;
elsiftmpal=6then
tmpal<=1;tmpah<=tmpah+1;
elsiftmpah=6then
tmpah<=1;
elsiftmpbl=6then
tmpbl<=1;tmpbh<=tmpbh+1;
elsiftmpbh=6then
tmpbh<=6;
elsetmpal<=tmpal+1;tmpbl<=tmpbl+1;
endif;
endif;
endprocessp1;
p2:
process(clear,clk)
begin
ifclear='1'then
tmpfp<=0;
elsifclk'eventandclk='1'then
iftmpfp=249then
tmpfp<=0;clkfp<=notclkfp;
elsetmpfp<=tmpfp+1;
endif;
endif;
endprocessp2;
p3:
process(clear,clkfp)
begin
ifclear='1'then
tmpdianzhen<=0;
elsifclkfp'eventandclkfp='1'then
iftmpdianzhen=49then
tmpdianzhen<=0;clkdianzhen<=notclkdianzhen;
elsetmpdianzhen<=tmpdianzhen+1;
endif;
endif;
endprocessp3;
p4:
process(clkdianzhen)
begin
ifclkdianzhen'eventandclkdianzhen='1'then
ifdianzhen=7then
dianzhen<=0;
else
dianzhen<=dianzhen+1;
endif;
endif;
endprocessp4;
p9:
process(a,b)
begin
num5<=conv_std_logic_vector(jushu,3);--num5记录数
ifa'eventanda='1'then--num0,num1,num2,num3分别记录4个随机数
tmp0<=tmpal;tmp1<=tmpah;
num0<=conv_std_logic_vector(tmpal,3);
num1<=conv_std_logic_vector(tmpah,3);
endif;
ifb'eventandb='1'then
tmp2<=tmpbl;tmp3<=tmpbh;
num2<=conv_std_logic_vector(tmpbl,3);
num3<=conv_std_logic_vector(tmpbh,3);
jushu<=jushu+1;
ifjushu=1then
tmpnum0<=tmp0;tmpnum1<=tmp1;tmpnum2<=tmp2;tmpnum3<=tmp3;
if(tmp0+tmp1=7ortmp0+tmp1=11)and(tmp2+tmp3/=7ortmp2+tmp3/=11)then
winner<=0;
elsif(tmp2+tmp3=7ortmp2+tmp3=11)and(tmp0+tmp1/=7ortmp0+tmp1/=11)then
winner<=1;
elsejushu<=jushu+1;
endif;
elsifjushu=6then
if(tmp0+tmp1)>(tmp2+tmp3)then
winner<=0;
elsif(tmp0+tmp1)<(tmp2+tmp3)then
winner<=1;
elsewinner<=2;
endif;
else
if(tmp0+tmp1)=(tmpnum0+tmpnum1)and(tmp2+tmp3)/=(tmpnum2+tmpnum3)then
winner<=0;
elsif(tmp2+tmp3)=(tmpnum2+tmpnum3)and(tmp0+tmp1)/=(tmpnum0+tmpnum1)then
winner<=1;
elsejushu<=jushu+1;
endif;
endif;
endif;
endprocessp9;
p10:
process(clear,clk)--数码管显示
begin
ifclear='1'then
tmpled<=0;
elsifclkfp'eventandclkfp='1'then
iftmpled=9then
tmpled<=0;clkled<=notclkled;
elsetmpled<=tmpled+1;
endif;
endif;
endprocessp10;
p11:
process(num0,num1,num2,num3,num5)
begin
light<="111110";
casenum0is
when"001"=>led<="0110000";
when"010"=>led<="1101101";
when"011"=>led<="1111001";
when"100"=>led<="0110011";
when"101"=>led<="1011011";
when"110"=>led<="1011111";
whenothers=>led<="0000000";
endcase;
light<="111100";
casenum1is
when"001"=>led<="0110000";
when"010"=>led<="1101101";
when"011"=>led<="1111001";
when"100"=>led<="0110011";
when"101"=>led<="1011011";
when"110"=>led<="1011111";
whenothers=>led<="0000000";
endcase;
light<="111000";
casenum2is
when"001"=>led<="0110000";
when"010"=>led<="1101101";
when"011"=>led<="1111001";
when"100"=>led<="0110011";
when"101"=>led<="1011011";
when"110"=>led<="1011111";
whenothers=>led<="0000000";
endcase;
light<="110000";
casenum3is
when"001"=>led<="0110000";
when"010"=>led<="1101101";
when"011"=>led<="1111001";
when"100"=>led<="0110011";
when"101"=>led<="1011011";
when"110"=>led<="1011111";
whenothers=>led<="0000000";
endcase;
light<="010000";
casenum5is
when"001"=>led<="0110000";
when"010"=>led<="1101101";
when"011"=>led<="1111001";
when"100"=>led<="0110011";
when"101"=>led<="1011011";
when"110"=>led<="1011111";
whenothers=>led<="0000000";
endcase;
endprocessp11;
p12:
process(winner)
begin
ifwinner=0then
casedianzhenis
when0=>row<="01111111";colr<="00111110";colg<="00000000";
when1=>row<="10111111";colr<="00101010";colg<="00000000";
when2=>row<="11011111";colr<="00111110";colg<="00000000";
when3=>row<="11101111";colr<="00101010";colg<="00000000";
when4=>row<="11110111";colr<="00111110";colg<="00000000";
when5=>row<="11111011";colr<="00001000";colg<="00000000";
when6=>row<="11111101";colr<="00001000";colg<="00000000";
when7=>row<="01111110";colr<="00001000";colg<="00000000";
endcase;
elsifwinner=1then
casedianzhenis
when0=>row<="01111111";colr<="01111110";colg<="01111110";
when1=>row<="10111111";colr<="01111110";colg<="01111110";
when2=>row<="11011111";colr<="00001100";colg<="00001100";
when3=>row<="11101111";colr<="00011000";colg<="00011000";
when4=>row<="11110111";colr<="00110010";colg<="00110010";
when5=>row<="11111011";colr<="01111110";colg<="01111110";
when6=>row<="11111101";colr<="01111110";colg<="01111110";
when7=>row<="11111110";colr<="00000000";colg<="00000000";
endcase;
else
casedianzhenis
when0=>row<="01111111";colr<="00000000";colg<="01111111";
when1=>row<="10111111";colr<="00000000";colg<="00101010";
when2=>row<="11011111";colr<="00000000";colg<="00101010";
when3=>row<="11101111";colr<="00000000";colg<="00011100";
when4=>row<="11110111";colr<="00000000";colg<="01111111";
when5=>row<="11111011";colr<="00000000";colg<="00001000";
when6=>row<="11111101";colr<="00000000";colg<="00001000";
when7=>row<="11111110";colr<="00000000";colg<="00001000";
endcase;
endif;
endprocessp12;
p13:
process(clkdianzhen)
begin
ifclear='1'then
tmpfeng<=0;
elsifclkdianzhen'eventandclkdianzhen='1'then
iftmpfeng=249then
tmpfeng<=0;clkfeng<=notclkfeng;
elsetmpfeng<=tmpfeng+1;
endif;
endif;
endprocessp13;
p14:
process(winner)
begin
ifwinner=0orwinner=1then
beep<='1';
elsebeep<='0';
endif;
endprocessp14;
endyouxi;
防抖程序模块
libraryieee;
useieee.std_logic_1164.all;
entityfangdouis
port(clk_in:
instd_logic;
ai,bi,ci:
instd_logic;
ao,bo,clearo:
outstd_logic);
endfangdou;
architectureaoffangdouis
signalaitmp1,aitmp2:
std_logic;
signalbitmp1,bitmp2:
std_logic;
signalcitmp1,citmp2:
std_logic;
begin
process(clk_in)
begin
ifclk_in'eventandclk_in='0'then
aitmp2<=aitmp1;
aitmp1<=ai;
bitmp2<=bitmp1;
bitmp1<=bi;
citmp2<=citmp1;
citmp1<=ci;
endif;
endprocess;
ao<=clk_inandaitmp1and(notaitmp2);
bo<=clk_inandbitmp1and(notbitmp2);
clearo<=clk_inandcitmp1and(notcitmp2);
enda;
五、功能说明及资源利用情况
功能说明
资源利用情况
由编译结果可知,本程序一共使用逻辑单元160个,占用率为13%,使用逻辑管脚43个,占用率为37%。
六、故障及问题分析
点阵显示
蜂鸣器
七、总结和结论
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 逻辑设计 综合 课题 实验 报告 DOC