长沙学院EDA课程设计说明书题目乒乓球游戏电路设计系 (部)专业(班级)姓名学号指导教师起止日期2008电子信息工程专业课程设计任务书系(部):电子与通信工程系专业:电子信息工程长沙学院课程设计鉴定表目录摘要:............................................................................................................................................................ - 6 - 1.设计要求.................................................................................................................................................. - 6 - 2.设计方案...................................................................................................................................................... - 6 -2.1乒乓球游戏机系统组成................................................................................................................... - 6 -2.2 功能模块设计.................................................................................................................................. - 6 -2.2.1 分频模块.............................................................................................................................. - 6 -2.2.2 按键消抖模块...................................................................................................................... - 7 -2.2.3 比赛规则控制(含发球控制器、乒乓球控制器、计分器) .......................................... - 9 -2.3顶层原理图...................................................................................................................................... - 11 -2.4 波形仿真........................................................................................................................................ - 11 -3.心得体会.................................................................................................................................................... - 12 -4.参考文献.................................................................................................................................................... - 12 -乒乓球游戏电路设计摘要:本设计使用FPGA 芯片来模拟实际的乒乓球游戏。
本设计是基于Altera 公司的FPGA Cyclone 芯片EP1C20F324C8 的基础上实现,运用Verilog HDL 语言编程,在Quartus II 软件上进行编译、仿真,最终在开发板上成功实现下载和调试。
关键字:乒乓球游戏FPGA Verilog HDL1.设计要求1.1一个乒乓球游戏电路,能实现基本的乒乓球比赛规则。
1.2 要求使用数码管显示比赛双方的代号及得分,比赛采用21分制。
比赛结束时8位LED灯同时闪烁5秒。
1.3 拓展要求,要求增加局分显示,每一局比赛结束后局分自动增加,比分清零。
2.设计方案2.1乒乓球游戏机系统组成乒乓球比赛游戏机的组成如图1 所示。
A、B方各持一按键进行接发球操作,当乒乓球移动到最靠近己端,即最靠近己方的数码管发光期间,及时按下了按键,则接发球成功,提前按下或按下不及时则接、发球失败,对方得1分。
图1 基于Fpga乒乓球游戏机组成框图2.2 功能模块设计2.2.1 分频模块将50Mhz频率分成2hz程序://-----------------------------2Hz分频-------------------------always @(posedge clk50M)beginif(cnt==24'd1*******)beginclk2hz=~clk2hz;cnt<=0;endelsecnt<=cnt+1;end2.2.2 按键消抖模块程序:module key_debounce(input i_clk,input [3:0] i_key, // 按下为0,松开为1 output reg [3:0] o_key_val // 键值);//++++++++++++++++++++++++++++++++++++++reg [3:0] key_samp1, key_samp1_locked;// 将i_key采集至key_samp1always @ (posedge i_clk)beginkey_samp1 <= i_key;end// 将key_samp1锁存至key_samp1_lockedalways @ (posedge i_clk)beginkey_samp1_locked <= key_samp1;end//++++++++++++++++++++++++++++++++++++++wire [3:0] key_changed1;// 当key_samp1由1变为0时//--------------------------------------reg [19:0] cnt;// 一旦有按键按下,cnt立即被清零always @ (posedge i_clk)beginif(key_changed1)cnt <= 20'h0;elsecnt <= cnt + 1'b1;end//--------------------------------------reg [3:0] key_samp2, key_samp2_locked;// 只有当按键不变化(不抖动),且维持20ms以上时// 才将i_key采集至key_samp2always @ (posedge i_clk)beginif(cnt == 20'hF_FFFF) // 0xFFFFF/50M = 20.9715ms key_samp2 <= i_key;end// 将key_samp2锁存至key_samp2_lockedalways @ (posedge i_clk)beginkey_samp2_locked <= key_samp2;end//--------------------------------------wire [3:0] key_changed2;// 当key_samp2由1变为0时//--------------------------------------// 每次按键稳定后,都将键值取反always @ (posedge i_clk)beginif(key_changed2[0])o_key_val[0] <= ~o_key_val[0];if(key_changed2[1])o_key_val[1] <= ~o_key_val[1];if(key_changed2[2])o_key_val[2] <= ~o_key_val[2];if(key_changed2[3])o_key_val[3] <= ~o_key_val[3];end//--------------------------------------endmodule2.2.3 比赛规则控制(含发球控制器、乒乓球控制器、计分器)程序://----------------------比赛规则------------------------------always @(posedge clk2hz)beginif(rst)begin a_score<=0;b_score<=0;a_jufen<=0;b_jufen<=0;a<=0;b<=0;led_1<=8'b11111111; end elsebeginif(!a&&!b&&led_ctrl[0]) //如果a发球begin a<=1;led_1<=8'b01111111; end //a的控制位置1begin b<=1;led_1<=8'b11111110; end //b的控制位置1else if(a&&!b) //球从A向B移动beginif(led_1>8'b00011111) //如果没到球网B击球则A加分beginif(led_ctrl[3])begina_score<=a_score+1;a<=0;b<=0;led_1<=8'b11111111;endelsebegin led_1[7:0]<={1'b1,led_1[7:1]}; end //右移endelse if(led_1==8'b11111111) //如果B一直没有接球则A加分begin a_score<=a_score+1;a<=0;b<=0; endelsebeginif(led_ctrl[3]) //如果B击球成功,则B的控制位置1,A的控制位清零 begin a<=0;b<=1; endelsebegin led_1[7:0]<={1'b1,led_1[7:1]};endendendelse if(b&&!a) //球从B向A移动beginif(led_1>8'b11110000&&led_1!=8'b11111111)beginif(led_ctrl[1]) //如果没到球网A击球则B加分beginb_score<=b_score+1;a<=0;b<=0;led_1<=8'b11111111;endelseendelse if(led_1==8'b11111111) //如果A一直没接球则B加分begin b_score<=b_score+1;a<=0;b<=0; endelsebeginif(led_ctrl[1]) //如果A击球成功,则A的控制位置1,B的控制位清零begin a<=1;b<=0; endelsebegin led_1[7:0]<={led_1[6:0],1'b1}; endendendendled<=led_1;if(a_score==5'b10101&&b_score<5'b10101) begin a_score<=0;b_score<=0;a_jufen<=a_jufen+1;a<=0;b<=0;led_1<=8'b11111111; endif(b_score==5'b10101&&a_score<5'b10101) begin a_score<=0;b_score<=0;b_jufen<=b_jufen+1;a<=0;b<=0;led_1<=8'b11111111; endend2.3顶层原理图2.4 波形仿真2.4.1 A方发球B方不接球2.4.2 A方发球B提前接球犯规2.4.3 B方发球A不接球2.4.4 B方发球A提前接球犯规2.4.5 AB僵持球3.心得体会通过这次课程设计,我进一步熟悉了verilog语言的结构,语言规则和语言类型。