首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于FPGA贪吃蛇游戏的设计

基于FPGA贪吃蛇游戏的设计

更新于2012-03-05 09:57:50 spartan3A 贪吃蛇 点阵 蜂鸣器


一.设计思路
1.基于FPGA的spartan3A实验箱上设计一款贪吃蛇游戏。
2.通过8*8点阵作为显示,2个led数码管用作计数器,2个led数码管用作计分器,4个按键作为控制方向键,1个开关作为暂停键,蜂鸣器作为吃米响声已经胜利标志。
3.游戏规则如下:要求在30秒内,蛇吃掉米粒数大于或等于10就胜利,否则就失败。
4.过程设置如下:蛇长4个点,米粒随机出现在点阵上的一个点,蛇吃掉米粒后,计分器加‘1’记分,蜂鸣器并鸣叫一下。胜利的时候点阵上显示‘√’,失败的时候点阵上显示‘×’。
二.系统框图





设计目的
1.本实验是基于FPGA设计,即使用EDA技术,进一步熟悉可编程逻辑器件(FPGA)编程原理。
2.基于spartan3an板卡设计,深入理解数字电路系统设计规则。
3.程序设计是使用硬件描述语言VerilogHDL设计,随着硬件设计技术的发展,VHDL和Verilog已成为硬件描述语言的主流语言,此次可以加强对Verilog语言的理解。
4.基于XilinxISE软件平台的设计,更加熟练对于ISE系列软件设计的流程。
5.通过8*8点阵和led数码管显示,对于这2中显示的显示原理有了更清楚的认识。

设计原理
1.spartan3an板卡实验箱体系结构图如下:



2.板卡上8*8点阵显示原理:
    8*8点阵led有2种,分为共阴极和共阳极。XUP板子上采用的是共阴极8*8点阵led。,8*8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置0电平,某一行置0电平,则相应的二极管就亮
    点阵结构图如下:

3.led数码管显示原理:
七段数码管从内部接线上分共阳和共阴两种;如下图所示,左为共阴,右为共阳。在电路设计时应根据情况决定采用共阳或共阴,开发板上采用的是共阴的,即:低电平亮。
七段数码管结构图如下:



课程模块化设计
1.端口模块。
  input clk,key,key1,key2,key3,key4;
Clk是系统时钟,其频率为66.67MHZ。Key为暂停键,key1,key2,key3,key4是控制上下左右四个方向的按键。
  output col,row,led,led_kongzhi,buzzer;
Col和row控制点阵的行和列,led和led_kongzhi控制4个led数码管,buzzer控制蜂鸣器。
2.分频模块
  分频器:因为原有低频时钟为66.67MHZ。其中,点阵显示扫描模块和数码管显示模块以不同的时钟工作,贪食蛇的游戏程设定时钟周期大约为1s来移动运行的。本次实验中共设置了3个时钟clk1,clk2,clk3.clk1是用来控制时间的;clk2是用来控制显示的;clk3使用来控制移动的。
3.游戏模块
  (1)游戏初始化:
  clk1=0;score=0;dir=2'b11;count2=0;count3=30;
开始时,蛇身以及米粒的位置固定,并且给一些计数器初始值,进行游戏的初始化。
  (2)计数器计数:由2个led数码管组成的计数器进行倒计时由30s逐步减到0s。
  (3)计分器计分:由2个led数码管组成的计分器,在蛇每次吃完米粒后进行积分,吃完10个米粒则完成。
  (4)蛇移动的模块:蛇的移动由4个方向按键控制。蛇身长4个单位点。定义了一个4为寄存器数组,移动过程中,低位一次将值传给高位,最低位的值由方向键来控制取得。
4.显示模块
  (1)8*8点阵显示:
  通过定义一个寄存器数组,在设计一个
循环扫描,则可以循环显示出5个点。
  case (snake_x[count1])
  3'b000: rown<=8'b01111111;
  3'b001: rown<=8'b10111111;
  3'b010: rown<=8'b11011111;
  3'b011: rown<=8'b11101111;
  3'b100: rown<=8'b11110111;
  3'b101: rown<=8'b11111011;
  3'b110: rown<=8'b11111101;
  3'b111: rown<=8'b11111110;
  default: rown<=8'b11111111;
Endcase
case (snake_y[count1])
  3'b000: coln<=8'b01111111;
  3'b001: coln<=8'b10111111;
  3'b010: coln<=8'b11011111;
  3'b011: coln<=8'b11101111;
  3'b100: coln<=8'b11110111;
  3'b101: coln<=8'b11111011;
  3'b110: coln<=8'b11111101;
  3'b111: coln<=8'b11111110;
  default: coln<=8'b11111111;
Endcase

led数码管显示:
  通过定义一个8位寄存器数组来显示数字和积分。主要在于循环控制led_kongzhi加上不同的分频器则可以显示出不同的数字。其主要思想如下:
always @(posedge clk2)   //4 ge 8 shuzixianshiqi xianshi
Begin
  if(count2==3)
     count2<=0;
  else count2<=count2+1;
  case (count2)
   2'b00:begin
          led_kongzhi<=4'b1110;
      led<=seven[0];
         end
   2'b01:begin
           led_kongzhi<=4'b1101;
    led<=seven[1];
         end
   2'b10:begin
          led_kongzhi<=4'b1011;
    led<=seven[2];
         end
   2'b11:begin
          led_kongzhi<=4'b0111;
    led<=seven[3];
         end
endcase  
End


5.引脚配置



返回列表