1、二、系统设计1.设计思路用8*8双色点阵显示游戏界面,其中游戏边界使用6*6,红色LED灯表示地鼠出现,4*4键盘对应锤子,两个数码管显示游戏倒计时,两个数码管显示分数,当游戏成绩达到十分时游戏结束,点阵显示“V”,当游戏时间超过59秒而成绩未达到10分时,游戏失败,点阵实现“X”。2. 总体框图 是 是 否 是3. 分块设计3、仿真波形及波形分析 因按照原程序仿真时间过长,所以将原程序所有分频统一调小1000倍,从而实现仿真中60ms等于实际过程中60s的效果,并在过程中人为设置按键,复位和暂停观察仿真结果。3.1 数码管扫描如图为键盘扫描波形。因为6个数码管的管脚连接在一起,无法使其同时显
2、示不同的数字,所以需要对数码管进行扫描,使不同的数码管在不同的时间亮起,显示不同的数字,并通过人眼的视觉暂留效应实现数字的清晰显示。3.2 键盘扫描tempclk3(1000Hz)每发生一次,kbrow的一位变为低电平,其余三位为高电平,表示扫描该行,并记录此时数值。当kbrow的高位到低位依次变为低电平,表示进行了一次完整的扫描。3.3 点阵扫描如图为点阵扫描波形。Tempclk4(500Hz)每发生一次,row的一位变为低电平,其余七位为高电平,表示扫描该行,。当row的高位到低位依次变为低电平,表示进行了一次完整的扫描。3.4 田地边界如图为田地边界的显示(绿色LED灯)。此处稍作说明的
3、是,此程序中的边界与课题要求中稍有不同,占据点阵正中央的6*6边界,完全对称。3.5 地鼠出现如图为地鼠出现模块波形。可以看到,当未按下或正确按下按键时,colr(红色LED灯)波形2s变化一次,即地鼠2s变化出现。当正确按下按键,波形立刻变化,即地鼠立刻变换位置。3.6 暂停如图为按下暂停键之后的波形。可以看到,点阵(colg和colr)不再亮起。程序暂停。3.7 复位如图为按下复位键之后波形。可以看到,colr的波形按照初始时刻波形重新变化,表示游戏重新开始。4、源程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_
4、unsigned.all;-entity dadishu is port( clk: in std_logic; rst:- kbrow: in std_logic_vector(3 downto 0); kbcol:out std_logic_vector(3 downto 0); -键盘- row: out std_logic_vector(7 downto 0); colg: colr:- shumaguan:out std_logic_vector(6 downto 0); catout: out std_logic_vector(5 downto 0) ;-数码管- clear: -
5、BTN0- 复位- mode: in std_logic );end entity;architecture a of dadishu is-TYPE matrix_index is array (29 downto 0) of std_logic_vector(15 downto 0);constant dishu : matrix_index:=( x4000,x0800000180000020001001000002, x00800400100002000008 );signal cnt: integer range 0 to 10000;signal cnt2: integer ran
6、ge 0 to 50000000;signal clk_tmp : std_logic;signal st1: std_logic_vector(7 downto 0); -点阵-signal data:signal ling: std_logic_vector(1 downto 0);signal change: integer range 0 to 29;signal k: std_logic_vector(15 downto 0):=x0000;signal red:signal location:-signal scanand:std_logic_vector(7 downto 0);
7、signal col: std_logic_vector(3 downto 0);signal cntscan:integer range 0 to 3;signal clk_tmp1:std_logic;signal key:1111 -jianpan-signal counter1:signal counter2:integer range 0 to 50000;signal n: std_logic_vector(15 downto 0);-signal co: std_logic_vector(6 downto 0);signal co1:signal co2:signal co3:
8、-记分signal co4:signal cat: std_logic_vector(5 downto 0);signal up: integer range 0 to 1:=0;signal counter3:integer range 0 to 25000000;-signal i: integer range 0 to 20;signal j: integer range 0 to 60;signal vx: integer range 0 to 2;signal stop: integer range 0 to 1 : - game over-signal fuwei: -复位begi
9、nling=00- dianzhenprocess(clk,rst) if rising_edge(clk) and rst=0then if cnt=10000 then cnt clk_tmp= not clk_tmp; else=cnt+1; end if; end if;end process;process(clk_tmp1,up,rst,fuwei)variable count9:integer range 0 to 1000 :if falling_edge(clk_tmp1) and fuwei=1 then change=29;elsif falling_edge(clk_t
10、mp1) and fuwei=0 then if up=1 then count9: if change=0 then change else change=change-1; elsif up=0 then if count9=1000 then count9: if change=0 then change else changek=dishu(28); when 27=dishu(27); when 26=dishu(26); - 随机 when 25=dishu(25); when 24=dishu(24); when 23=dishu(23); when 22=dishu(22);
11、when 21=dishu(21); when 20=dishu(20); when 19=dishu(19); when 18=dishu(18); when 17=dishu(17); when 16=dishu(16); when 15=dishu(15); when 14=dishu(14); when 13=dishu(13); when 12=dishu(12); when 11=dishu(11); when 10=dishu(10); when 9=dishu(9); when 8=dishu(8); when 7=dishu(7); when 6=dishu(6); when
12、 5=dishu(5); when 4=dishu(4); when 3=dishu(3); when 2=dishu(2); when 1=dishu(1); when 0=dishu(0); end case;end if;process(clk_tmp,rst) if rising_edge(clk_tmp) and rst= then if (vx=2) then if st1=00000000 or st1=11111110 then st101111111 data11111100red elsif st1=10111111=1& ling(1 downto 0);k(15 dow
13、nto 12)&00011011111 &k(11 downto 8)&11101111k(7 downto 4)&11110111k(3 downto 0)&1111101111111101 elsif (vx=1) then 01000001001000100001010000001000 elsif (vx=0) then10000001010000100010010000011000row=st1;colg=data;colr=red;-键盘begin if counter2=50000 then counter2 clk_tmp1= not clk_tmp1;=counter2+1;
14、process(clk_tmp1,rst) if rising_edge(clk_tmp1) and rst= if cntscan=3 then cntscancol1011 when 2 =1101 when 3 =1110 end case; end process; begin if falling_edge(clk_tmp1) and rst= if kbrow= if counter1=3 then counter1=counter1+1; key011110110111110101111110101101111011101110111101004010111110000411010111200011011011110111011101111011100111