《EDA设计与应用》 课程设计报告
题 目: 乒乓球游戏机 姓 名: 专 业:
班 级: 学 号: 指导教师:
二0一五年6月26日
目录
1、设计目的 …………………………………………………….1 2、设计原理 ……………………………………………………….1 3、设计内容及过程…………………………………………………2 4、调试分析…………………………………………………………….7 5、结束语 ………………………………………………… …8 6、参考文献…………………………………………………………. .8
乒乓球游戏机
1设计目的
1学会使用软件QuartusII进行设计项目工程,并对这个项目进行编程,让其实现相应的功能。
2掌握软件QuartusII软件的操作界面和操作原理,能利用软件进行设计并进行仿真。分析相应的程序并进行改进。
3总结经验,改进实验。
2设计原理
乒乓球游戏以发光二极管逐个点亮模拟乒乓球运动轨迹,乒乓球游戏机是用16个发光二极管代表乒乓球台的,中间两个发光二极管兼做为乒乓球网,用点亮的发光二极管按一定的方向移动来表示乒乓球的运动。另外设置发球开关Af、Bf,以及接球开关Aj、Bj。利用7段数码管作为记分牌。
甲乙双方按乒乓球比赛的规则来操作开关。当甲方按动发球开关Af时,靠近甲方的第一个灯亮,然后按照顺序向乙方移动;当球过网后乙方可以接球,接球后灯反方向移动,双方比赛继续;如果一方提前击球或未击到球,则判失分。重新发球后继续比赛。
电路符号图
本设计中的乒乓游戏机是由5个发光二极管代表乒乓球台,中间的发光二极管兼作球网,用点亮的发光二极管按一定方向移动来表示球的运动。在游戏机的两侧各设置两个开关,一个是发球开关af、bf;另一个是击球开关aj、bj。甲乙二人按乒乓球比赛规则来操作开
关。当甲方按动发球开关af时,靠近甲方的第一个发光二极管亮,然后发光二极管由甲向乙依次点亮,代表乒乓球的移动。当球过网后按设计者规定的球位,乙方就可以击球。若乙方提前击球或没有击中球,则判乙方失分,甲方的记分牌自动加一分。然后重新发球,比赛继续进行。比赛一直要进行到一方记分牌达到21分,该局才结束。本设计由译码显示器、按键去抖、状态机/球台控制器和记分器等部分所组成。
游戏原理图如下
3设计内容及过程
3.1设计内容
设计一个乒乓球游戏机,模拟乒乓球比赛的基本过程和规则,并能自动裁判和几分。具体要求如下:
(1)使用乒乓球游戏机的甲乙双方在不同的位置发球或击球。
(2)乒乓球的位置和移动方向可由LED显示灯和依次点亮的方向决定,球的移动速度设为0.5s移动1位。使用者可按乒乓球的移动位置发出相应的动作,提前击球或出界均判失分。
3.2设计电路
(1)设计该乒乓球游戏机的输入与输出端口。首先考虑输入端口,一般应该设置一个异步置位端口rst,用于在系统不正常时回到初始状态:两个发球输入端Af和Bf,逻辑‘1’分别表示甲方和乙方的发球;两个击球输入端Aj和Bj,逻辑‘1’分别表示甲击球和乙击球;一个时钟输入端口clk。
其次考虑输出端口,芯片应该有16个输出端口来控制16个发光二极管,输出逻辑‘1’即输出一个高电平,可以使发光二极管点亮;另外,要直观地表示双方的得分,就得用到4个七段译码器,每方用到2个,可以表示0到11的数字,每个七段译码器需要芯片的7个输出端口来控制,总共28个输出端口。
(2) 在整个程序中,状态机器是中央控制器的作用,由它控制的信号来影响整个程序中的其他相关部分,如记分部分,发光二极管部分。乒乓球游戏机中有两个计数器a_score和b_score,分别记忆甲和乙的得分,用发光二极管的轮流发光表示球的移动轨迹。
(3)七段译码器是在数学电路设计中经常用到的显示电路。所谓七段译码器,其实是由7段发光二极管组成的用于显示数字的器件。记分译码器(mydecoder):由于记分需要显示出来,所以要使用七段译码器。而状态机中的记分是由4位二进制码来表示的,即a_score和b_score。以下程序就是实现从4位二进制码转换成七段译码显示。
(4)还需要设计一个数码管的程序来显示乒乓球的运动地址。以便准确的判断乒乓球的运动轨迹。 总的程序如下: library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ping_pang is
port(clk1khz:in std_logic;------1khz时钟信号
rst:in std_logic;----------系统复位
af,aj:in std_logic;--------A方发球,A方击球
bf,bj:in std_logic;--------B方发球,B方击球 shift:out
std_logic_vector(15
signal cnt:integer range 0 to 3; signal
data:std_logic_vector(3
downto 0);
signal
a_one,a_ten,b_one,b_ten:std_logic_vector(3 downto 0); begin
-------------------------------------2Hz分频----- process(clk1khz)
variable count:integer range 0 to 2;
begin
if clk1khz'event and clk1khz='1' then if count=2 then clk1_2hz
---------------------------------乒乓球比赛规则---------- process(rst,clk1_2hz)
variable a,b:std_logic;---a和b的
downto 0);----16个led代表乒乓球台 scan:out
std_logic_vector(3
downto 0);------数码管地址选择信号 seg7:out
std_logic_vector(6
downto 0));-----7段显示控制信号(abcdefg) end;
architecture a_one of ping_pang is
signal clk1_2hz:std_logic; signal
a_score,b_score:integer
range 0 to 11;
控制位
variable 球则继续向b移动 end if; elsif
shift_1=0
shift_1:std_logic_vector(15 downto 0); begin
if rst='1' then
a_score
shift_1:=(others=>'0');
then-------------如果b一直没接球则a加分
a_score
if bj='1' then----如果b击球成功则b的控制位置1,a的控制位清0 a:='0'; b:='1'; else shift_1(15 downto 1); end if; end if;
elsif b='1' and a='0' then ----------------球从b向a移动
if shift_1
shift_1:='0'&
elsif clk1_2hz'event and clk1_2hz='1' then
if a='0' and b='0' and af='1' then ---------如果a发球 a:='1';
shift_1:=
elsif a='0' and b='0' and bf='1' then ------如果b发球 b:='1';
shift_1:=
elsif a='1' and b='0' then -----------------球从a向b移动 if
shift_1>128
then if
aj='1'
then
b_score
a:='0'; b:='0';
shift_1:=
elsif shift_1=0 then
b_score
then----------------------------如果没到球网b击球则a加分 if bj='1' then a_score
shift_1:=
shift_1:='0'&
shift_1:=shift_1(14
shift_1(15 downto 1);----如果b没有击
a:='0'; b:='0'; else
if aj='1' then ---如果b击球成功则a的控制位置1,b的控制位清0 a:='1'; b:='0'; else downto 0)&'0'; end if; end if; end if; end if;
shift
shift_1:=shift_1(14
=>a_ten
when 10|11=>a_ten
end case; case b_score is
when 0|10 =>b_one
end process;
----------------------------------将a和b的计分换成bcd码------------------ process(a_score,b_score) begin
case a_score is
when 0|10 =>a_one
end case; case b_score is when =>b_ten
when 10|11=>b_ten
0|1|2|3|4|5|6|7|8|9
end case; end process;
------------------------------------数码管动态扫描计数-------- process(clk1khz) begin
if clk1khz'event and clk1khz='1' then if cnt=3 then cnt
end case; case a_score is when
0|1|2|3|4|5|6|7|8|9
end process;
-------------------------------------数码管动态扫描-----------
process(cnt,a_ten,a_one,b_one,b_ten) begin case cnt is
when 0=> data
begin case data is
when
when
end case; end process;
-----------------------------------------七段译码-------------------- process(data) end;
when others=>seg7
3.3仿真结果
由于a方和b方的游戏规则相同,下面仅给出a方发球后各种情况的功能仿真结果,而b方发球后的情况与其类似
(1)a方发球后b方提前击球,同时a方得分。此情况的功能仿真结果见图2,观察波形可知,球的移动方向为从左到右,b方提前击球后a_score加1,即a方得分
图2 a方发球后b方提前击球的功能仿真图
(2)a方发球后,b方在过网后击球。此情况的功能仿真结果见图3,观察波形可知,b方接到球后,球的移动方向为从右到左。
图3 a方发球后b方在过网后击球的功能仿真图
(3)b方击球后,a方没有击球。此情况的功能仿真结果见图4,观察波形可知,b方击球后,球的移动方向为从右到左,球过网后,a方没有击球,同时b方得分
图4 b方击球后a方没有击球的功能仿真图
4调试分析
通过调试我们可以观察到,16个LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依此从左到右,或从右到左,其移动的速度应能调节。当“球”(点亮的那只LED)运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。若击中,则球向相反方向移动;若未击中,则对方得1分。一方得分时,电路自动响铃3秒,这期间发球无效,等铃声停止后方能继续比赛。 12 设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计满11分为1局。甲、乙双方各设一个发光二极管,表示拥有发球权,拥有发球权的一方发球有效。
结束语:
通过设计,了解了软件QuartusII的使用并能对相应的程序进行分析,学会了自主建立和设计工程,并进行仿真和分析。受益匪浅。所以,我觉得这次的实验还是很有意义的,让课本的只是和实践相结合,这样学起东西来会更让人深刻。
参考文献:
[1] 黄平.基于QuartusⅡ的FPGA/CPLD数字系统设计与应用. 北京:电子工业出版社,2014. [2] 徐颖.Protel 99 SE EDA技术及应用[M].西安:机械工业出版社.2005
[3] 杨恒,卢飞成. FPGA/VHDL快速工程实践入门与提高[M].北京航空航天大学出版社.2003 [4]甘历.VHDL应用与开发实践[M].科学出版社.2003
《EDA设计与应用》 课程设计报告
题 目: 乒乓球游戏机 姓 名: 专 业:
班 级: 学 号: 指导教师:
二0一五年6月26日
目录
1、设计目的 …………………………………………………….1 2、设计原理 ……………………………………………………….1 3、设计内容及过程…………………………………………………2 4、调试分析…………………………………………………………….7 5、结束语 ………………………………………………… …8 6、参考文献…………………………………………………………. .8
乒乓球游戏机
1设计目的
1学会使用软件QuartusII进行设计项目工程,并对这个项目进行编程,让其实现相应的功能。
2掌握软件QuartusII软件的操作界面和操作原理,能利用软件进行设计并进行仿真。分析相应的程序并进行改进。
3总结经验,改进实验。
2设计原理
乒乓球游戏以发光二极管逐个点亮模拟乒乓球运动轨迹,乒乓球游戏机是用16个发光二极管代表乒乓球台的,中间两个发光二极管兼做为乒乓球网,用点亮的发光二极管按一定的方向移动来表示乒乓球的运动。另外设置发球开关Af、Bf,以及接球开关Aj、Bj。利用7段数码管作为记分牌。
甲乙双方按乒乓球比赛的规则来操作开关。当甲方按动发球开关Af时,靠近甲方的第一个灯亮,然后按照顺序向乙方移动;当球过网后乙方可以接球,接球后灯反方向移动,双方比赛继续;如果一方提前击球或未击到球,则判失分。重新发球后继续比赛。
电路符号图
本设计中的乒乓游戏机是由5个发光二极管代表乒乓球台,中间的发光二极管兼作球网,用点亮的发光二极管按一定方向移动来表示球的运动。在游戏机的两侧各设置两个开关,一个是发球开关af、bf;另一个是击球开关aj、bj。甲乙二人按乒乓球比赛规则来操作开
关。当甲方按动发球开关af时,靠近甲方的第一个发光二极管亮,然后发光二极管由甲向乙依次点亮,代表乒乓球的移动。当球过网后按设计者规定的球位,乙方就可以击球。若乙方提前击球或没有击中球,则判乙方失分,甲方的记分牌自动加一分。然后重新发球,比赛继续进行。比赛一直要进行到一方记分牌达到21分,该局才结束。本设计由译码显示器、按键去抖、状态机/球台控制器和记分器等部分所组成。
游戏原理图如下
3设计内容及过程
3.1设计内容
设计一个乒乓球游戏机,模拟乒乓球比赛的基本过程和规则,并能自动裁判和几分。具体要求如下:
(1)使用乒乓球游戏机的甲乙双方在不同的位置发球或击球。
(2)乒乓球的位置和移动方向可由LED显示灯和依次点亮的方向决定,球的移动速度设为0.5s移动1位。使用者可按乒乓球的移动位置发出相应的动作,提前击球或出界均判失分。
3.2设计电路
(1)设计该乒乓球游戏机的输入与输出端口。首先考虑输入端口,一般应该设置一个异步置位端口rst,用于在系统不正常时回到初始状态:两个发球输入端Af和Bf,逻辑‘1’分别表示甲方和乙方的发球;两个击球输入端Aj和Bj,逻辑‘1’分别表示甲击球和乙击球;一个时钟输入端口clk。
其次考虑输出端口,芯片应该有16个输出端口来控制16个发光二极管,输出逻辑‘1’即输出一个高电平,可以使发光二极管点亮;另外,要直观地表示双方的得分,就得用到4个七段译码器,每方用到2个,可以表示0到11的数字,每个七段译码器需要芯片的7个输出端口来控制,总共28个输出端口。
(2) 在整个程序中,状态机器是中央控制器的作用,由它控制的信号来影响整个程序中的其他相关部分,如记分部分,发光二极管部分。乒乓球游戏机中有两个计数器a_score和b_score,分别记忆甲和乙的得分,用发光二极管的轮流发光表示球的移动轨迹。
(3)七段译码器是在数学电路设计中经常用到的显示电路。所谓七段译码器,其实是由7段发光二极管组成的用于显示数字的器件。记分译码器(mydecoder):由于记分需要显示出来,所以要使用七段译码器。而状态机中的记分是由4位二进制码来表示的,即a_score和b_score。以下程序就是实现从4位二进制码转换成七段译码显示。
(4)还需要设计一个数码管的程序来显示乒乓球的运动地址。以便准确的判断乒乓球的运动轨迹。 总的程序如下: library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ping_pang is
port(clk1khz:in std_logic;------1khz时钟信号
rst:in std_logic;----------系统复位
af,aj:in std_logic;--------A方发球,A方击球
bf,bj:in std_logic;--------B方发球,B方击球 shift:out
std_logic_vector(15
signal cnt:integer range 0 to 3; signal
data:std_logic_vector(3
downto 0);
signal
a_one,a_ten,b_one,b_ten:std_logic_vector(3 downto 0); begin
-------------------------------------2Hz分频----- process(clk1khz)
variable count:integer range 0 to 2;
begin
if clk1khz'event and clk1khz='1' then if count=2 then clk1_2hz
---------------------------------乒乓球比赛规则---------- process(rst,clk1_2hz)
variable a,b:std_logic;---a和b的
downto 0);----16个led代表乒乓球台 scan:out
std_logic_vector(3
downto 0);------数码管地址选择信号 seg7:out
std_logic_vector(6
downto 0));-----7段显示控制信号(abcdefg) end;
architecture a_one of ping_pang is
signal clk1_2hz:std_logic; signal
a_score,b_score:integer
range 0 to 11;
控制位
variable 球则继续向b移动 end if; elsif
shift_1=0
shift_1:std_logic_vector(15 downto 0); begin
if rst='1' then
a_score
shift_1:=(others=>'0');
then-------------如果b一直没接球则a加分
a_score
if bj='1' then----如果b击球成功则b的控制位置1,a的控制位清0 a:='0'; b:='1'; else shift_1(15 downto 1); end if; end if;
elsif b='1' and a='0' then ----------------球从b向a移动
if shift_1
shift_1:='0'&
elsif clk1_2hz'event and clk1_2hz='1' then
if a='0' and b='0' and af='1' then ---------如果a发球 a:='1';
shift_1:=
elsif a='0' and b='0' and bf='1' then ------如果b发球 b:='1';
shift_1:=
elsif a='1' and b='0' then -----------------球从a向b移动 if
shift_1>128
then if
aj='1'
then
b_score
a:='0'; b:='0';
shift_1:=
elsif shift_1=0 then
b_score
then----------------------------如果没到球网b击球则a加分 if bj='1' then a_score
shift_1:=
shift_1:='0'&
shift_1:=shift_1(14
shift_1(15 downto 1);----如果b没有击
a:='0'; b:='0'; else
if aj='1' then ---如果b击球成功则a的控制位置1,b的控制位清0 a:='1'; b:='0'; else downto 0)&'0'; end if; end if; end if; end if;
shift
shift_1:=shift_1(14
=>a_ten
when 10|11=>a_ten
end case; case b_score is
when 0|10 =>b_one
end process;
----------------------------------将a和b的计分换成bcd码------------------ process(a_score,b_score) begin
case a_score is
when 0|10 =>a_one
end case; case b_score is when =>b_ten
when 10|11=>b_ten
0|1|2|3|4|5|6|7|8|9
end case; end process;
------------------------------------数码管动态扫描计数-------- process(clk1khz) begin
if clk1khz'event and clk1khz='1' then if cnt=3 then cnt
end case; case a_score is when
0|1|2|3|4|5|6|7|8|9
end process;
-------------------------------------数码管动态扫描-----------
process(cnt,a_ten,a_one,b_one,b_ten) begin case cnt is
when 0=> data
begin case data is
when
when
end case; end process;
-----------------------------------------七段译码-------------------- process(data) end;
when others=>seg7
3.3仿真结果
由于a方和b方的游戏规则相同,下面仅给出a方发球后各种情况的功能仿真结果,而b方发球后的情况与其类似
(1)a方发球后b方提前击球,同时a方得分。此情况的功能仿真结果见图2,观察波形可知,球的移动方向为从左到右,b方提前击球后a_score加1,即a方得分
图2 a方发球后b方提前击球的功能仿真图
(2)a方发球后,b方在过网后击球。此情况的功能仿真结果见图3,观察波形可知,b方接到球后,球的移动方向为从右到左。
图3 a方发球后b方在过网后击球的功能仿真图
(3)b方击球后,a方没有击球。此情况的功能仿真结果见图4,观察波形可知,b方击球后,球的移动方向为从右到左,球过网后,a方没有击球,同时b方得分
图4 b方击球后a方没有击球的功能仿真图
4调试分析
通过调试我们可以观察到,16个LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依此从左到右,或从右到左,其移动的速度应能调节。当“球”(点亮的那只LED)运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。若击中,则球向相反方向移动;若未击中,则对方得1分。一方得分时,电路自动响铃3秒,这期间发球无效,等铃声停止后方能继续比赛。 12 设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计满11分为1局。甲、乙双方各设一个发光二极管,表示拥有发球权,拥有发球权的一方发球有效。
结束语:
通过设计,了解了软件QuartusII的使用并能对相应的程序进行分析,学会了自主建立和设计工程,并进行仿真和分析。受益匪浅。所以,我觉得这次的实验还是很有意义的,让课本的只是和实践相结合,这样学起东西来会更让人深刻。
参考文献:
[1] 黄平.基于QuartusⅡ的FPGA/CPLD数字系统设计与应用. 北京:电子工业出版社,2014. [2] 徐颖.Protel 99 SE EDA技术及应用[M].西安:机械工业出版社.2005
[3] 杨恒,卢飞成. FPGA/VHDL快速工程实践入门与提高[M].北京航空航天大学出版社.2003 [4]甘历.VHDL应用与开发实践[M].科学出版社.2003