猜数字vhdl设计-数字电路实验报告_第1页
猜数字vhdl设计-数字电路实验报告_第2页
猜数字vhdl设计-数字电路实验报告_第3页
猜数字vhdl设计-数字电路实验报告_第4页
猜数字vhdl设计-数字电路实验报告_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.数字电路实验报告猜数字学院:班级:姓名: 学号:实验组号:一.实验要求【基本要求】1、 游戏规则:通常由两个人玩,一方出数字,另一方猜。出数字的人要想好一个没有重复数字的4位数,不能让猜的人知道。2、 数字设置:通过4*4键盘进行4位数字输入,在数码管(DISP0DISP3)上显示当前所输入的数字。通过设置确定键(BTN1键)进行锁定,此时数码管上的数值消失,同时用点阵开始倒计时,即:初始状态点阵全亮,然后从右下角开始,由右到左、由下到上逐点逐排依次熄灭,间隔时间为1s,共计64s。3、 猜数字:可以通过4*4键盘进行4位数字输入进行猜数字,且每输入一位数字在数码管(DISP0DISP3)上

2、显示当前所输入的数字,按确定键(BTN2键)进行确认,此时要根据输入的这组数字给出几A几B,其中:l A前面的数字表示位置正确的数的个数,用DISP5显示l B前的数字表示数字正确而位置不对的数的个数,用DISP4显示l 如正确答案为 2134,而猜的人猜 5314,则是 1A2B,其中有一个4的位置对了,记为1A,而1和3这三个数字对了,而位置没对,因此记为 2B,合起来就是 1A2Bl 接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。4、 若数字正确则显示猜数字成功,点阵显示“”笑脸;若输入数字错误系统仍然处于猜数字状态,点阵显示“X”,并用蜂鸣器或led闪烁报警。5

3、、 若到点阵全灭时(64s结束)仍未猜出正确数字,游戏失败,点阵显示“囧”。6、 设置游戏机开关。【实验所用仪器及元器件】 1.计算机 2.数字系统与逻辑设计实验开发板【实验软件】Quartus 【资源利用】二、 程序设计1、 程序流程图开始初始化开始游戏?设置数字猜测猜数字,点阵倒计时确认数字?A?B计时结束?正确?重新开始?结束是否是否否显示笑脸是是显示囧否否是2、 逻辑框图蜂鸣器模块点阵模块数码管模块分频模块状态机CLK键盘模块3、 MDS图Idle初始化S1设置数字S3?A?BS2猜数字Over结束st=1rs=1rs=1reset=1ms1=1ms2=1done=1tm=1tf=0t

4、m=0st=1rs=1三、程序分析1、 引脚注释clk时钟st游戏开始scan_out3.0键盘的行扫描输出信号key_row3.0键盘的列输入信号ms1输入确认键ms2猜数字rs 复位bee_out蜂鸣器输出ld_out状态指示灯seg_out 数码管显示cat_out数码管排列显示led_row_out点阵行显示led_col_out点阵列显示2、 键盘数字data0<="1111110"-0data1<="0110000"-1data2<="1101101"-2data3<="1111001&q

5、uot;-3data4<="0110011"-4data5<="1011011"-5data6<="1011111"-6data7<="1110000"-7data8<="1111111"-8data9<="1111011"-93、 状态设置程序设置程序状态当st=1时,游戏开始当ms=1时,确认输入数字,可以猜数字当ms=1时,将输入猜测的数字与原始数字做对比,计算A,B当rs=1时,程序复位清零P1:PROCESS(st,ms1,ms2

6、,rs,tm,done,state,clk_tm) VARIABLE count_anyway:INTEGER RANGE 0 TO 2:=0; BEGINnext_state<=state;IF rs='1' THEN next_state<=idle;-复位键,程序复位清零ELSECASE state ISWHEN idle => IF st='1' THEN next_state<=s1;-游戏开始 ELSE next_state<=idle; END IF; WHEN s1 => IF ms1='1'

7、THEN确认输入数字next_state<=s2; ELSE next_state<=s1; END IF; WHEN s2 => IF ms2='1' THEN -开始猜数字next_state<=s3; ELSIF tm='1' THENnext_state<=over;ELSE next_state<=s2; END IF;WHEN s3 =>IF done='1' THEN 判断完成,数字对比结束next_state<=over; ELSE next_state<=s3;END IF;

8、WHEN over =>IF st='1' THEN next_state<=idle;-游戏开始,初始化ELSIF tf='0' THEN IF tm='0' THENnext_state<=s2;ELSE next_state<=over;END IF;ELSE next_state<=over; END IF;WHEN OTHERS =>next_state<=idle;-其他,程序置0END CASE;END IF;END PROCESS p1;4、 分频器将50MHz的时钟频率分成1KHzP2:

9、PROCESS(clk) -fenpingVARIABLE count3:INTEGER:=0;VARIABLE count4:INTEGER:=0;BEGINIF clk'event AND clk='1' THENIF count4=24999 THENclk_scan<=NOT clk_scan; count4:=0;IF count3=24999999 THEN clk_tm<=NOT clk_tm; count3:=0;ELSE count3:=count3+1;END IF;ELSE count3:=count3+1; count4:=count

10、4+1;END IF;END IF;END PROCESS p2;5、 点阵计数64s倒计时,在点阵显示,判断当tf=1时,led赋值为2,显示2号点阵,即为笑脸,游戏通过,当计时结束,count_clear=1,led赋值4,tm,赋值0,显示为空,当bee=1时,蜂鸣器响,提示猜测错误P3:PROCESS(clk_tm,count_clear,tf,bee) -count downBEGINIF tf='1' THENled<=2;ELSIF count_clear='1' THENcount_down<=0; led<=4; tm<

11、='0'ELSIF bee='1' THENled<=3;ELSIF state=s2 THENIF clk_tm'event AND clk_tm='1' THENIF count_down=64 THEN tm<='1' count_down<=0; led<=1; ELSE count_down<=count_down+1; led<=0;END IF;END IF;ELSE NULL;END IF;END PROCESS p3;6、 数码管显示State为idle,,游戏初始化,

12、数码管置零State为s1,显示输入要猜测的数字State为s2、s3、over,显示输入猜测数字P4:PROCESS(clk_scan)-display segBEGINIF clk_scan'event AND clk_scan='1' THENCASE state IS WHEN idle =>CASE cat ISWHEN "111110" => cat<="011111"seg<="0000000"WHEN "011111" => cat<=&q

13、uot;101111"seg<="0000000"WHEN "101111" => cat<="110111"seg<="0000000"WHEN "110111" => cat<="111011"seg<="0000000"WHEN "111011" => cat<="111101"seg<="0000000"WHEN &qu

14、ot;111101" => cat<="111110"seg<="0000000"WHEN OTHERS => cat<="011111"seg<="0000000"END CASE;WHEN s1 =>CASE cat ISWHEN "111110" => cat<="011111"seg<="0000000"WHEN "011111" => cat<=

15、"101111"seg<="0000000"WHEN "101111" => cat<="110111"seg<=x1;WHEN "110111" => cat<="111011"seg<=x2;WHEN "111011" => cat<="111101"seg<=x3;WHEN "111101" => cat<="111110&quo

16、t;seg<=x4;WHEN OTHERS => cat<="011111"seg<="0000000"END CASE;WHEN s2 =>CASE cat ISWHEN "111110" => cat<="011111"seg<=seg_a;WHEN "011111" => cat<="101111"seg<=seg_b;WHEN "101111" => cat<="

17、;110111"seg<=y1;WHEN "110111" => cat<="111011"seg<=y2;WHEN "111011" => cat<="111101"seg<=y3;WHEN "111101" => cat<="111110"seg<=y4;WHEN OTHERS => cat<="011111"seg<="0000000"END

18、CASE;WHEN s3 =>CASE cat ISWHEN "111110" => cat<="011111"seg<=seg_a;WHEN "011111" => cat<="101111"seg<=seg_b;WHEN "101111" => cat<="110111"seg<=y1;WHEN "110111" => cat<="111011"seg<=

19、y2;WHEN "111011" => cat<="111101"seg<=y3;WHEN "111101" => cat<="111110"seg<=y4;WHEN OTHERS => cat<="011111"seg<="0000000"END CASE;WHEN over =>CASE cat ISWHEN "111110" => cat<="011111"s

20、eg<=seg_a;WHEN "011111" => cat<="101111"seg<=seg_b;WHEN "101111" => cat<="110111"seg<=y1;WHEN "110111" => cat<="111011"seg<=y2;WHEN "111011" => cat<="111101"seg<=y3;WHEN "11110

21、1" => cat<="111110"seg<=y4;WHEN OTHERS => cat<="011111"seg<="0000000"END CASE;WHEN OTHERS =>NULL;END CASE;cat_out<=cat; seg_out<=seg;END IF;END PROCESS p4;7、 键盘扫描P5:PROCESS(clk_scan) -scanBEGINIF clk_scan'event AND clk_scan='1'

22、; THENCASE scan ISWHEN "1110" => scan<="0111"WHEN "0111" => scan<="1011"WHEN "1011" => scan<="1101"WHEN "1101" => scan<="1110"WHEN OTHERS => scan<="0111"END CASE;scan_out<=scan;

23、END IF;END PROCESS p5;8、 数字传输将判断所得A、B显示在数码管上P6:PROCESS(num_a,num_b) -trans num to segBEGINCASE num_a ISWHEN 0 => seg_a<=data0;WHEN 1 => seg_a<=data1;WHEN 2 => seg_a<=data2;WHEN 3 => seg_a<=data3;WHEN 4 => seg_a<=data4;WHEN OTHERS => seg_a<="0000000"END C

24、ASE;CASE num_b ISWHEN 0 => seg_b<=data0;WHEN 1 => seg_b<=data1;WHEN 2 => seg_b<=data2;WHEN 3 => seg_b<=data3;WHEN 4 => seg_b<=data4;WHEN OTHERS => seg_b<="0000000"END CASE;END PROCESS p6;9、 输入判断当state=idle时,初始化;当state=s1时,从键盘输入初始数字,并将键盘数字分别赋值给x1,x2,x3,x4

25、,即为要猜数字;当state=s2时,蜂鸣器初始化,键盘输入猜测数字,并将键盘数字赋值给y1,y2,y3,y4,即为猜测数字;当state=s3时,判断:将x1分别于y1,y2,y3,y4对比,若x1=y1,则A加1,若x1=x2或x3或x4,则B加1,将x2分别于y1,y2,y3,y4对比,若x2=y2,则A加1,若x1=x1或x3或x4,则B加1,将x3分别于y1,y2,y3,y4对比,若x3=y3,则A加1,若x1=x1或x2或x4,则B加1,将x4分别于y1,y2,y3,y4对比,若x4=y4,则A加1,若x1=x1或x2或x3,则B加1,p7:PROCESS(clk_scan) -k

26、ey inVARIABLE count1:INTEGER RANGE 0 TO 3:=0; VARIABLE count2:INTEGER RANGE 0 TO 3:=0; VARIABLE count5:INTEGER RANGE 0 TO 4:=0; VARIABLE count6:INTEGER RANGE 0 TO 4:=0; VARIABLE count11:INTEGER :=0;BEGIN IF clk_scan'event AND clk_scan='1' THENCASE state IS WHEN idle =>x1<="000

27、0000" x2<="0000000" x3<="0000000" x4<="0000000"y1<="0000000" y2<="0000000" y3<="0000000" y4<="0000000" num_a<=0; num_b<=0; tf<='0' key1<="0000000" key2<="0000000"

28、;count1:=0; count2:=0; count5:=0; count6:=0; done<='0'count_clear<='1' bee<='0' WHEN s1 =>count_clear<='0' CASE key_row IS WHEN "0111" =>CASE scan IS WHEN "0111" => key1<=data3;WHEN "1011" => key1<=data0;WHEN

29、 "1101" => key1<=data1;WHEN "1110" => key1<=data2;WHEN OTHERS => NULL;END CASE;WHEN "1011" =>CASE scan IS WHEN "0111" => key1<=data7;WHEN "1011" => key1<=data4;WHEN "1101" => key1<=data5;WHEN "1110&q

30、uot; => key1<=data6;WHEN OTHERS => NULL;END CASE;WHEN "1101" =>CASE scan IS WHEN "1011" => key1<=data8;WHEN "1101" => key1<=data9;WHEN OTHERS => NULL;END CASE;WHEN OTHERS => NULL;END CASE;CASE count1 ISWHEN 0 => IF key1 /= x4 THEN x1<

31、=key1; count1:=1;ELSE NULL;END IF;WHEN 1 =>IF key1 /= x1 THEN x2<=key1; count1:=2;ELSE NULL;END IF;WHEN 2 => IF key1 /= x2 THEN x3<=key1; count1:=3;ELSE NULL;END IF;WHEN 3 => IF key1 /= x3 THEN x4<=key1; count1:=0;ELSE NULL;END IF;WHEN OTHERS => NULL;END CASE;WHEN s2 =>bee<

32、;='0' CASE key_row IS WHEN "0111" =>CASE scan IS WHEN "0111" => key2<=data3;WHEN "1011" => key2<=data0;WHEN "1101" => key2<=data1;WHEN "1110" => key2<=data2;WHEN OTHERS => NULL;END CASE;WHEN "1011" =>

33、;CASE scan IS WHEN "0111" => key2<=data7;WHEN "1011" => key2<=data4;WHEN "1101" => key2<=data5;WHEN "1110" => key2<=data6;WHEN OTHERS => NULL;END CASE;WHEN "1101" =>CASE scan IS WHEN "1011" => key2<=data8

34、;WHEN "1101" => key2<=data9;WHEN OTHERS => NULL;END CASE;WHEN OTHERS => NULL;END CASE;CASE count2 ISWHEN 0 => IF key2 /= y4 THEN y1<=key2; count2:=1;ELSE NULL;END IF;WHEN 1 =>IF key2 /= y1 THEN y2<=key2; count2:=2;ELSE NULL;END IF;WHEN 2 => IF key2 /= y2 THEN y3&

35、lt;=key2; count2:=3;ELSE NULL;END IF;WHEN 3 => IF key2 /= y3 THEN y4<=key2; count2:=0;ELSE NULL;END IF;WHEN OTHERS => NULL;END CASE;WHEN s3=>count5:=0; count6:=0;IF x1=y1 THEN count5:=count5+1;ELSIF x1=y2 THEN count6:=count6+1;ELSIF x1=y3 THEN count6:=count6+1;ELSIF x1=y4 THEN count6:=co

36、unt6+1;ELSE NULL;END IF;IF x2=y2 THEN count5:=count5+1;ELSIF x2=y1 THEN count6:=count6+1;ELSIF x2=y3 THEN count6:=count6+1;ELSIF x2=y4 THEN count6:=count6+1;ELSE NULL;END IF;IF x3=y3 THEN count5:=count5+1;ELSIF x3=y1 THEN count6:=count6+1;ELSIF x3=y2 THEN count6:=count6+1;ELSIF x3=y4 THEN count6:=co

37、unt6+1;ELSE NULL;END IF;IF x4=y4 THEN count5:=count5+1;ELSIF x4=y1 THEN count6:=count6+1;ELSIF x4=y2 THEN count6:=count6+1;ELSIF x4=y3 THEN count6:=count6+1;ELSE NULL;END IF;IF count5=4 THEN tf<='1' bee<='0'ELSE tf<='0' bee<='1'END IF;num_a<=count5; num

38、_b<=count6; If count11=1000 THENdone<='1' count11:=0;ELSE count11:=count11+1;END IF;WHEN over=>done<='0' count5:=0; count6:=0; count2:=0;IF tf='0' THEN key2<="0000000"y1<="0000000" y2<="0000000" y3<="0000000" y4&

39、lt;="0000000" ELSE NULL;END IF;WHEN OTHERS => NULL;END CASE;END IF;END PROCESS p7;10、 状态指示灯P8:PROCESS(clk_scan)BEGINIF clk_scan'event AND clk_scan='1' THENCASE state ISWHEN idle => ld_out<="1000"-指示电源联通WHEN s1 =>ld_out<="0100"-指示游戏开始WHEN s2 =&

40、gt;ld_out<="0010"-指示要猜测的数字已键入WHEN s3 =>ld_out<="0001"-指示数字猜测WHEN over => ld_out<="1111"-指示游戏结束WHEN OTHERS =>ld_out<="0000"-系统故障END CASE;state<=next_state;END IF;END PROCESS p8;11、 点阵显示Led=1、2、3、4,分别代表囧、笑脸、X、nullCount_down=0、1、2·

41、83;·64,表示点阵倒计时P9:PROCESS(clk_scan) -xianshi BEGINIF clk_scan'event AND clk_scan='1' THENIF led=1 THEN -jiongCASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="11111111"WHEN "11011111" => led_row<="10111111"

42、led_col<="10100101"WHEN "11101111" => led_row<="11011111"led_col<="10100101"WHEN "11110111" => led_row<="11101111"led_col<="10111101"WHEN "11111011" => led_row<="11110111"led_col<=

43、"11000011"WHEN "11111101" => led_row<="11111011"led_col<="10100101"WHEN "11111110" => led_row<="11111101"led_col<="10011001"WHEN "01111111" => led_row<="11111110"led_col<="111111

44、11"WHEN OTHERS => led_row<="01111111"led_col<="11111111" END CASE;ELSIF led=2 THEN -xiaonianCASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="00000000"WHEN "11011111" => led_row<="10111111"

45、;led_col<="00011000"WHEN "11101111" => led_row<="11011111"led_col<="00100100"WHEN "11110111" => led_row<="11101111"led_col<="01000010"WHEN "11111011" => led_row<="11110111"led_col<

46、="00000000"WHEN "11111101" => led_row<="11111011"led_col<="10100101"WHEN "11111110" => led_row<="11111101"led_col<="01000010"WHEN "01111111" => led_row<="11111110"led_col<="00000

47、000"WHEN OTHERS => led_row<="01111111"led_col<="11111111" END CASE;ELSIF led=3 THEN -XCASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="10000001"WHEN "11011111" => led_row<="10111111"led_c

48、ol<="01000010"WHEN "11101111" => led_row<="11011111"led_col<="00100100"WHEN "11110111" => led_row<="11101111"led_col<="00011000"WHEN "11111011" => led_row<="11110111"led_col<="

49、;00011000"WHEN "11111101" => led_row<="11111011"led_col<="00100100"WHEN "11111110" => led_row<="11111101"led_col<="01000010"WHEN "01111111" => led_row<="11111110"led_col<="10000001&qu

50、ot;WHEN OTHERS => led_row<="01111111"led_col<="11111111" END CASE;ELSIF led=4 THEN -nullCASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="00000000"WHEN "11011111" => led_row<="10111111"led_col&

51、lt;="00000000"WHEN "11101111" => led_row<="11011111"led_col<="00000000"WHEN "11110111" => led_row<="11101111"led_col<="00000000"WHEN "11111011" => led_row<="11110111"led_col<="00

52、000000"WHEN "11111101" => led_row<="11111011"led_col<="00000000"WHEN "11111110" => led_row<="11111101"led_col<="00000000"WHEN "01111111" => led_row<="11111110"led_col<="00000000"

53、WHEN OTHERS => led_row<="01111111"led_col<="00000000" END CASE; ELSE -daojishiCASE count_down ISWHEN 0 =>CASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="11111111"WHEN "11011111" => led_row<="10

54、111111"led_col<="11111111"WHEN "11101111" => led_row<="11011111"led_col<="11111111"WHEN "11110111" => led_row<="11101111"led_col<="11111111"WHEN "11111011" => led_row<="11110111"

55、led_col<="11111111"WHEN "11111101" => led_row<="11111011"led_col<="11111111"WHEN "11111110" => led_row<="11111101"led_col<="11111111"WHEN "01111111" => led_row<="11111110"led_col<=

56、"11111111"WHEN OTHERS => led_row<="01111111"led_col<="11111111" END CASE;WHEN 1 =>CASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="01111111"WHEN "11011111" => led_row<="10111111"l

57、ed_col<="11111111"WHEN "11101111" => led_row<="11011111"led_col<="11111111"WHEN "11110111" => led_row<="11101111"led_col<="11111111"WHEN "11111011" => led_row<="11110111"led_col<=&

58、quot;11111111"WHEN "11111101" => led_row<="11111011"led_col<="11111111"WHEN "11111110" => led_row<="11111101"led_col<="11111111"WHEN "01111111" => led_row<="11111110"led_col<="1111111

59、1"WHEN OTHERS => led_row<="01111111"led_col<="11111111"END CASE;WHEN 2 =>CASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="00111111"WHEN "11011111" => led_row<="10111111"led_col<=&qu

60、ot;11111111"WHEN "11101111" => led_row<="11011111"led_col<="11111111"WHEN "11110111" => led_row<="11101111"led_col<="11111111"WHEN "11111011" => led_row<="11110111"led_col<="11111111&

61、quot;WHEN "11111101" => led_row<="11111011"led_col<="11111111"WHEN "11111110" => led_row<="11111101"led_col<="11111111"WHEN "01111111" => led_row<="11111110"led_col<="11111111"WHEN OT

62、HERS => led_row<="01111111"led_col<="11111111"END CASE;WHEN 3 =>CASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="00011111"WHEN "11011111" => led_row<="10111111"led_col<="11111111&qu

63、ot;WHEN "11101111" => led_row<="11011111"led_col<="11111111"WHEN "11110111" => led_row<="11101111"led_col<="11111111"WHEN "11111011" => led_row<="11110111"led_col<="11111111"WHEN &quo

64、t;11111101" => led_row<="11111011"led_col<="11111111"WHEN "11111110" => led_row<="11111101"led_col<="11111111"WHEN "01111111" => led_row<="11111110"led_col<="11111111"WHEN OTHERS => led

65、_row<="01111111"led_col<="11111111"END CASE;WHEN 4 =>CASE led_row ISWHEN "10111111" => led_row<="01111111"led_col<="00001111"WHEN "11011111" => led_row<="10111111"led_col<="11111111"WHEN "

66、11101111" => led_row<="11011111"led_col<="11111111"WHEN "11110111" => led_row<="11101111"led_col<="11111111"WHEN "11111011" => led_row<="11110111"led_col<="11111111"WHEN "11111101" => led_row<="11111011"l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论