fpga 乒乓球游戏机


基于 FPGA 的乒乓球游戏机设计
Design of the table tennis game based on FPGA

1

摘要
FPGA 在复杂逻辑电路以及数字信号处理领域中扮演越来越重要的角色。 FPGA 有很高的数据处理速度,这就为我们处理高速信号提供了便利条件。本次 设计是以示波器为显示器,基于 FPGA 构造一个乒乓球游戏机。用 FPGA 产生两组 PWM 波,通过两条 I/O 口线将信号传给 RC 低通滤波器,取出 PWM 信号的均值电 压,输给示波器的 XY 模式。这样我们就可以在示波器上观察到一亮点移动。同 时设置了计分机制,得分在七段数码管上显示双方得分。

关键字: 关键字:FPGA Verilog 乒乓球游戏机

2

Abstract
FPGA in complex logic circuit and digital signal processing technology plays an increasingly important role.FPGA has very high data processing speed, this is for us to deal with high speed signal to provide convenient conditions. The design is based on the oscilloscope display, based on the FPGA structure of a table tennis ball game machine. Using FPGA to generate a two set of PWM wave, by two I / O line transmits a signal to the RC low-pass filter, remove the PWM signal of the average voltage, lost to the XY model. So that we can in the oscilloscope to observe an window mobile. By setting the button to generate the control signal, transmitted to the FPGA and the bright spot motion control. At the same time set a scoring mechanism, scoring in the seven digital tube display the scores of both parties.

Keyword: FPGA Verilog table tennis game

3

目录
摘要 ............................................................... 2 Abstract .......................................................... 3 第一章 设计任务与要求 ........................................... 5
1.1 设计任务..................................................... 5 1.2 基本要求和扩展指标........................................... 5

第二章 系统总体设计 ............................................. 6
2.1 理论分析与计算............................................... 6 2.1.1 2.1.2 PWM 调制原理.......................................... 6 理论计算.............................................. 6

2.2 系统总体框图................................................. 7

第三章 电路分析与模块设计 ...................................... 9
3.1 低通滤波电路................................................. 9 3.2 增益放大电路................................................. 9 3.3 按键击球得分控制............................................ 10 3.4 七段数码管显示.............................................. 10

第四章 系统软件设计 ............................................ 12
4.1 系统软件总体设计............................................ 12 4.2 判断显示函数................................................ 13

附录一:硬件原理图.............................................. 15 附录二:程序清单 ................................................ 16

4

第一章 设计任务与要求
设计任务 1.1 设计任务
通过 FPGA 开发平台构造一台乒乓球游戏机。用 FPGA 产生两路 PWM 信号波, 通过两条 I/O 信号线传输低通滤波器,去得这两个 PWM 波的均值电压,传输到双 通示波器中控制亮点的运动。示波器要工作在 XY 模式下,示波器上的亮点代表 乒乓球。

1.2 基本要求和扩展指标
基本要求:构造两组无源低通滤波器,是得 FPGA 可以通过 PWM 波控制乒乓 球的位置;要求用给定的运放 LM324 制作放大器,使光点的运动范围在示波器的 X 轴,Y 轴方向上可调;乒乓球可按照抛物线自动在屏幕上左右弹射,球的落点 为屏幕两侧边的中间。 扩展指标:使用两个按钮分别作为左侧击球和右侧击球;当乒乓球靠近屏幕 左边时,按下左侧击球按钮,可将球击回右侧,右侧击球亦然;建立击球成败机 制,即球到达边沿而为按下按钮,认为击球失败,用 LED 灯光表示;建立计分机 制,在七段数码管上显示双方得分。特殊功能,在不调整放大器的情况下,连按 两下击球键能击出高抛球,轨迹抛物线的曲率变大;在人眼能分辨的前提下,球 的运动速率可以改变。

5

第二章 系统总体设计
2.1 理论分析与计算
2.1.1 PWM 调制原理

PWM 波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采 样值成比例。图 1 所示为脉冲宽度调制系统的原理框图和波形图。该系统有一 个比较器和一个周期为 Ts 的锯齿波发生器组成。 语音信号如果大于锯齿波信号, 比较器输出正常数 A,否则输出 0。因此,从图 1 中可以看出,比较器输出一列 下降沿调制的脉冲宽度调制波。 图 2.1 为脉冲宽度调制原理。

图 2.1 脉宽调制原理

2.1.2

理论计算

本设计由 FPGA 提供

6

f= 频率的小三角波信号; 提供 fsignal_

=9.7847

(2.1)

(2.2)

频率的大三角波作为水平扫描信号; 提供 fsignal_y (2.3) 频率的抛物线波信号。 由式(2.2)和式(2.3)可得出 fsignal_y=2fsignal_x (2.3)

这就满足了在一个 X 扫描周期下能在示波器上看到乒乓球的运动轨迹能来回显 示一次。

2.2 系统总体框图
有 FPGA 产生 X 轴的三角波水平来回扫描信号和 Y 轴垂直方向方向的抛物线 波的 PWM 波信号,分别经过低通滤波,取其均值电压,再通过放大电路,分别输 入到示波器的两个通道。 使示波器工作在 XY 模式下,这样在示波器上能看到像乒乓球一样的亮点运 动轨迹。 系统总体框图如图 2.2 所示。

7

PWMX

低通 滤波

直流 X

放大 电路

X 控制

FPGA
PWMY 低通 滤波 直流 Y 放大 电路 Y 控制

示波器 显示

七段数码管显示(得分) 按键 击球控制

图 2.1 系统总体框图

8

第三章 电路分析与模块设计
低通滤波电路 3.1 低通滤波电路
在这里我们采用的是二阶 RC 无源低通滤波电路,PWM(脉宽调制波)信号经 过二阶 RC 低通滤波后输出的是直流信号。 高频信号经过 RC 低通滤波后被衰减了, 而低频信号和直流信号可以完好的通过低通滤波器。 这样我们就能有效地获得控 制光点运动的电压信号。 二阶低通滤波电路如图 3.1 所示。其中心频率 f=1/(2πRC)=1/(2π *10000*0.00001)=1.59Hz。

R1 Res2 750

R2 Res2 750 C1 Cap 0.01uF C2 Cap 0.01uF VCC
图 3.1 二阶低通滤波电路

增益放大电路 3.2 增益放大电路
该部分主要采用 LM324 集成运放,LM324 系列器件是带有真差动输入的四运 算放大器。与单电源应用场合的标准运算放大器相比,它们有一些显著优点。该 四放大器可以工作在低到 3.0 伏或者高到 32 伏的电源下,静态电流为 MC1741 的静态电流的五分之一。 共模输入范围包括负电源, 因而消除了在许多应用场合中采用外部偏置元件
9

的必要性。该运放功耗较小,价格便宜,增益带宽为 1.2MHz,因而可以满足本 设计的要求。 可调增益放大电路如图 3.2 所示。 此运放的增益 G=1+R6/R3, 最大增益为 7.6。

图 3.2 可调增益放大电路

按键击球得分控制 击球得分 3.3 按键击球得分控制
使用两个按钮分别作为左侧击球键和右侧击球键, 对应有左右两个 led 灯作 为按键指示。按键产生的信号传送到 FPGA 中,通过软件控制击球。这里要说明 的是按键一般都有抖动,因此我们要进行按键消抖,在此设计中,我们采用软件 延时的方法进行消抖,效果良好。

3.4 七段数码管显示
本设计中得分采用的是 0——9 积分规则,所以两个计分各采用一个七段数

10

码管即可。复位后得分清零,都显示为 0,当击球成功后,对应的计分显示会自 动加分。由于要同时显示两个七段数码管,因此需要采用动态扫描的方式进行轮 流选通数码管。 乒乓球运动的过程通过示波器来模拟显示。将设计中最终产生的 X、Y 信号 输入到示波器对应的两个输入端,并调整示波器工作于 XY 模式下,这样我们就 可以在示波器上观察到光点(乒乓球)的整个运动过程。

11

第四章 系统软件设计
4.1 系统软件总体设计

开始

大三角波 (X 信号)

小三角波

抛物线波 (Y 信号)

比较

比较

PWMX

PWMY

击球控制

数码管显示

返回

图 4.1 系统总体软件设计框图

12

由 FPGA 产生大三角波、小三角波和抛物线波三种波形信号,其中抛物线波 频率为大三角波频率的两倍,这样保证了在 X 轴一个扫描周期下,乒乓球的抛物 线波能来回显示一次。 通过大三角波信号与小三角波信号比较,产生 X 轴的 PWM 波;通过抛物线波 与小三角波比较,产生 Y 轴的 PWM 波。 系统的总体软件设计框图如图 4.1 所示。

4.2 判断显示函数

13

开始

否 球是否运动 到左侧? 球是否运动到 右侧?



是 否 甲是否击 球? 是 甲得分数 码管加 1

否 否 乙是否击 球? 是 乙得分数码 管加 1

否 甲计分是否 大于 9? 是 甲计分数 码管清零 乙计分是否 大于 9?



是 乙计分数 码管清零

返回

14

附录一:硬件原理图

P1 VCC GND VSS 1 2 3 Header 3 R1 Res2 750 P4 2 1 Header 2 C3 Cap R6 0.01uF Res2 750 C1 Cap 0.01F

R3 Res2 750 R8 Res Tap 5K R2 Res2 750 C2 Cap 0.01uF VCC U1 1 2 3 4 5 6 7

P3 5 4 3 2 1 Header 5 GND GND GND GND GND

R5 Res2 750

C4 Cap 0.01uF R7 Res2 750

1OUT 4OUT 1IN- 4IN1IN+4IN+ VCC VSS 2IN+3IN+ 2IN- 3IN2OUT 3OUT LM324

14 13 12 11 10 9 8

P2 VSS 1 2 Header 2

R4

Res Tap 5K

15

附录二:程序清单
程序清单如下: module xyc(button1,button2,clk,reset,en,light,shuma,x,y); input button1,button2,reset,clk; //分别对应的 S3,S6,S2

output [1:0]en; //数码管位选通使能信号 output [1:0]light;//led 指示灯选通信号 output [7:0]shuma; //八位段码 output x,y; //输出的 x 方向和 y 方向的 PWM 波 reg [1:0]en; reg [1:0]light; reg [7:0]shuma; reg [7:0]tmp,sanjiao,signal_x,signal_y; reg h,divclk,divclk1,aa,x,y,c,o,q; reg [3:0]count1,count2,count; reg [26:0]a,p,cc,bb,gg,i; always@ (posedge clk) begin if (gg<4) gg=gg+1; else begin gg=0; divclk1=~divclk1;

16

end end always @ (posedge divclk1) begin if(reset==0) begin sanjiao=0; signal_x=0; signal_y=0; count1=0; count2=0; end if(aa==0) sanjiao=sanjiao+1; else begin sanjiao=sanjiao-1; if(sanjiao==0) aa=0; end if(sanjiao==255) aa=1; if(bb<25000) bb=bb+1; else begin bb=0; if(bb==0) begin if(c==0) begin signal_x=signal_x+1; if(signal_x==255) c=1; //signal_x 递增波形 //sanjiao 三角波

17

end else begin signal_x=signal_x-1; if(signal_x==0) c=0; end if(signal_x==0 || signal_x==255) tmp=0; if(signal_x==128) light=2'b00; o=signal_x==0 && button1==0; 否击球 q=signal_x==255 && button2==0; if(o) begin count1=count1+1; if(count1>9) light=2'b10; end if(q) begin count2=count2+1; if(count2>9) light=2'b01; end end end if(cc<49902) cc=cc+1; else begin cc=0; //产生 signal_y 抛物线信号 count2=0; //在右边击球计数 count1=0; //在左边击球计数 //判断是

18

case(tmp) 0:signal_y=0; 8:signal_y=30; 16:signal_y=59; 24:signal_y=86; 32:signal_y=111; 40:signal_y=134; 48:signal_y=155; 56:signal_y=174;

//一共 128 个点 2:signal_y=6; 10:signal_y=37; 18:signal_y=66; 26:signal_y=93; 34:signal_y=117; 42:signal_y=140; 50:signal_y=160; 58:signal_y=179; 4:signal_y=14; 12:signal_y=45; 20:signal_y=73; 28:signal_y=99; 36:signal_y=123; 44:signal_y=145; 52:signal_y=165; 60:signal_y=183; 68:signal_y=199; 76:signal_y=213; 84:signal_y=225; 92:signal_y=235; 6:signal_y=22; 14:signal_y=52; 22:signal_y=80; 30:signal_y=105; 38:signal_y=129; 46:signal_y=150; 54:signal_y=170; 62:signal_y=187; 70:signal_y=203; 78:signal_y=216; 86:signal_y=228; 94:signal_y=237;

64:signal_y=192; 66:signal_y=195; 72:signal_y=206; 80:signal_y=219; 88:signal_y=230; 74:signal_y=210; 82:signal_y=222; 90:signal_y=233;

96:signal_y=239; 98:signal_y=241;

100:signal_y=243; 102:signal_y=245;

104:signal_y=246; 106:signal_y=248;108:signal_y=249; 110:signal_y=250; 112:signal_y=251; 114:signal_y=252; 116:signal_y=253; 118:signal_y=253; 120:signal_y=254;122:signal_y=254;124:signal_y=254; 126:signal_y=254;

128:signal_y=254; 130:signal_y=254; 132:signal_y=254; 134:signal_y=254; 136:signal_y=253;138:signal_y=253; 140:signal_y=252; 142:signal_y=251; 144:signal_y=250; 146:signal_y=249; 148:signal_y=248; 150:signal_y=246; 152:signal_y=245; 154:signal_y=243; 156:signal_y=241; 158:signal_y=239; 160:signal_y=237;162:signal_y=235; 164:signal_y=233; 166:signal_y=230; 168:signal_y=228; 170:signal_y=225; 172:signal_y=222; 174:signal_y=219; 176:signal_y=216; 178:signal_y=213;180:signal_y=210; 182:signal_y=206; 184:signal_y=203; 186:signal_y=199; 188:signal_y=195; 190:signal_y=192; 192:signal_y=187;194:signal_y=183;196:signal_y=179; 198:signal_y=174;

200:signal_y=170; 202:signal_y=165; 204:signal_y=160; 206:signal_y=155; 208:signal_y=150;210:signal_y=145; 212:signal_y=140; 214:signal_y=134; 216:signal_y=129; 218:signal_y=123; 220:signal_y=117; 222:signal_y=111;

19

224:signal_y=105; 226:signal_y=99; 232:signal_y=80; 240:signal_y=52; 234:signal_y=73; 242:signal_y=45;

228:signal_y=93; 236:signal_y=66; 244:signal_y=37; 252:signal_y=6;

230:signal_y=86; 238:signal_y=59; 246:signal_y=30; 254:signal_y=0;

248:signal_y=22; 250:signal_y=14; endcase tmp=tmp+2; if(tmp>250) tmp=0; end

if(signal_x>sanjiao) x=1; 递增比较 (产生 x 信号的 PWM 波) else x=0; if(signal_y>sanjiao) y=1; 物线比较,(产生 y 信号的 PWM 波) else y=0; end always @ (posedge clk) begin if(p<10000) p=p+1; else begin p=0; divclk=~divclk; end end //数码管显示 always @ (posedge divclk) begin case(h) 0: begin

//sanjiao 三角波和 signal_x

// sanjiao 三角波和 signal_y 抛

20

en=2'b01; h=1; end 1: begin en=2'b10; h=0; end endcase case(h) 1: count=count1; 0: count=count2; endcase case(count) //七段数码管 0—9 数字的段码

4'd0: shuma=8'b0000_0011; 4'd1: shuma=8'b1001_1111; 4'd2: shuma=8'b0010_0101; 4'd3: shuma=8'b0000_1101; 4'd4: shuma=8'b1001_1001; 4'd5: shuma=8'b0100_1001; 4'd6: shuma=8'b1100_0001; 4'd7: shuma=8'b0001_1111; 4'd8: shuma=8'b0000_0001; 4'd9: shuma=8'b0001_1001; default: shuma=8'b0000_0011; endcase end endmodule

21


相关文档

基于FPGA的乒乓球游戏机
基于FPGA乒乓球比赛游戏机的设计
基于FPGA的乒乓球游戏机控制器设计
FPGA乒乓游戏机设计方案
基于FPGA的乒乓球游戏机设计
基于FPGA乒乓球游戏机Verilog设计
基于FPGA_乒乓球比赛游戏机_的设计
基于FPGA的乒乓球游戏机设计综述
电子设计自选赛参赛作品-基于FPGA的乒乓球游戏机
电脑版