华南理工大学vhdl课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
评阅老师
分数
数字系统课程设计
班级信息工程1班
组长
组员
1题目要求
设计要求
●设计一个由甲、乙双方参赛的3人乒乓球游戏机。
●用6个LED排成一条直线,两边各代表参赛双方的位置,其中一只点亮
的LED指示球的当前位置,点亮的LED依此从左到右,或从右到左,其移动的速度应能调节。在其他时候击球视为犯规,给对方加1分;都犯规,各自加1分;
●当“球”(点亮的那只LED)运动到某方的最后一位时,参赛者应能果断地按
下位于自己一方的按钮开关,即表示启动球拍击球。若击中,则球向相反方向移动;若未击中,则对方得1分。
●设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计满
11分为1局。
●甲、乙双方可轮流发球
●有一个按钮,可以使系统初始化。
2设计方案(或设计分析)
2.1.1设计原理
状态机设置了7个状态,分别是“等待发球状态”(waitserve),“第一盏灯亮状态”(light1on),“第六盏灯亮状态”(light6on),“球向乙移动状态”
(ballmove2),“球向甲移动状态”(ballmoveto1),“允许甲击球状态”(allow1hit),“允许乙击球状态”(allow2hit)。开始的时候处于“等待发球状态”,若甲发球则转移到“第一盏灯亮状态”,若乙发球则则转移到“第六盏灯亮状态”,具体以甲发球为例。
若发球后乙没有提前击球(规定球移动到对方第一个发光二极管时允许击球),那么装体机从“第一盏灯亮”转移到“球向乙移动”。若在“球向乙移动状态”乙仍然没有提前击球,状态就转移到“允许乙击球状态”,在此状
态下若乙击球了,那么状态就转移到“球向甲移动状态”。在“第一盏灯亮状态”,“球向乙移动状态”中,如果乙击球了,就算提前击球,这样甲得分,然后进入“等待发球状态”等待发球。“球向甲移动状态”之后的过程和前面的过程不过是甲乙角色的调换而已。
各个状态间的转移控制要根据要求来改变转移的状态由于设计要求实现LED灯依此从左到右,或从右到左的移动,同时球拍击球。若击中,则球向相反方向移动,若未击中,则对方得1。用VHDL中的状态机来实现其功能将非常简便和明了。就其功能,若要实现记分,就得用到7段数码管,考虑到硬件要求,考虑用动态扫描技术来解决。动态扫描前要进行译码,即把记数得分的结果译码成七段码。在等待状态里,在发球的条件上加上发球权属于谁。要求甲、乙双方参赛,即用两个输入信号代表,重新开始时,要求所有的计数器都清零,且进入等待状态。总的来说,要完成乒乓球游戏机的设计,可以以状态机为控制核心,附加其它功能模块来实现。
3模块实现
一、分频模块
这个模块主要是把开发板的50Mhz频率分频成1hz,这样可以使我们接下来的流水灯流动时间为1S。
具体代码如下:
PROCESS(clk)
VARIABLE time:integer RANGE0TO50000000;
BEGIN
IF rising_edge(clk)THEN
time:=time+1;
IF(time=25000000)THEN
clk1<='1';
ELSIF(time=50000000)THEN
clk1<='0';
time:=0;
END IF;
END IF;
END PROCESS;
接下来的流水的代码就开始使用clk1时钟。
二、主程序状态机模块
这个模块式主程序模块,也是最重要的模块。采用状态机单进程的方法,一
共设置了7个状态,分别是“等待发球状态”(waitserve),“第一盏灯亮状态”(light1on),“第六盏灯亮状态”(light6on),“球向乙移动状态”(ballmove2),“球向甲移动状态”(ballmoveto1),“允许甲击球状态”(allow1hit),“允许乙击球状态”(allow2hit)。
具体实现代码如下:
process(clk1,reset)--clk作为敏感信号触发进程
begin--进程开始
if reset='0'then--异步置位
i<=0;
count1<="00000";
count2<="00000";
elsif(rising_edge(clk1))then--当处于时钟inclock上升沿时
if count1="10101"or count2="10101"then
i<=0;
count1<="00000";--count1和count2分别为甲、乙的得分
count2<="00000";
else--以下case语句是程序中最关键的状态机部分
case state is
when waitserve=>--进程处于等待发球状态
if serve='0'then
i<=1;
state<=light1on;
else i<=6;
state<=light6on;
end if;
when light1on=>--进程处于第一盏灯亮状态
i<=2;
if hit2_en='0'then
i<=0;
count1<=count1+1;--甲得一分
state<=waitserve;
else
state<=ballmoveto2;
end if;
when light6on=>--进程处于第八盏灯亮状态
i<=5;
if hit1_en='0'then
i<=0;
count2<=count2+1;--乙得一分
state<=waitserve;
else
state<=ballmoveto1;
end if;
when ballmoveto1=>--进程处于球向乙移动状态