EDA课程设计报告.docx
- 文档编号:7513348
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:13
- 大小:194.21KB
EDA课程设计报告.docx
《EDA课程设计报告.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
EDA课程设计报告
设计报告
课程名称在系统编程技术
任课教师
设计题目乒乓球游戏
班级
姓名
学号
日期
一、题目分析
课程设计制作了一个乒乓球游戏机。
在课程设计中,程序设计语言为VHDL语言。
乒乓球游戏机能够正确判断与显示乒乓球的位置,且显示分数。
裁判发出比赛开始信号后,触发FPGA内部随机数发生器模块产生首次发球权方;比赛进行中,选手连续两次获得发球权后,8个LED排列成行模拟乒乓球台;点亮的LED模拟乒乓球,受FPGA控制从左到右或从右到左移动;比赛选手通过按钮输入模拟击球信号,实现LED移位方向的控制;若发亮的LED运动在球台中点至对方终点之间时,对方未能及时按下击球按钮使其向相反方向移动,即失去一分;若发亮的LED运动在球台中点至对方终点之间时,对方能及时按下击球按钮使其向相反方向移动,即得到一分。
根据分析该游戏的原理,采用自顶向下的设计方法得到系统框图,如图1:
乒乓球
计数器
选手端
控制器
译码器
数码显示管
图1
二、选择方案
该乒乓球游戏机的设计主要包括的模块与内容有:
乒乓球游戏机实体的设计,游戏机编程的实现。
直接对状态机进行描述,所有的状态均可表达为CASE_WHEN结构中的一条CASE语句,而状态的转移则通过IF_THEN_ELSE语句实现。
状态机设置了7个状态,分别是“等待发球状态”,“第一盏灯亮状态”,“第八盏灯亮状态”,“球向乙移动状态”,“球向甲移动状态”,“允许甲击球状态”,
“允许乙击球状态”,这是该程序中起决定作用的七个状态。
三、细化框图
设计该乒乓球游戏机的输入与输出端口。
首先考虑输入端口,一般应该设置一个异步置位端口reset,用于在系统不正常时回到初始状态:
两个发球输入端serve1和serve2,逻辑‘1’分别表示甲方和乙方的发球;两个击球输入端hit1和hit2,逻辑‘1’分别表示甲击球和乙击球;一个开始游戏按钮startbutton,处于逻辑‘1’表示可以游戏;还得有一个时钟输入端口clk。
其次考虑输出端口,芯片应该有8个输出端口来控制8个发光二极管,输出逻辑‘1’即输出一个高电平,可以使发光二极管点亮;另外,要直观地表示双方的得分,就得用到4个七段译码器,每方用到2个,可以表示0到21的数字,每个七段译码器需要芯片的7个输出端口来控制,总共28个输出端口。
状态机设置了7个状态,分别是waitserve,light1on,ballmoveto2,
乒乓球
Allow2hit,light8on,ballmoveto1,和allow1hit它们代表的具体数值依次是0到6。
在波形模拟图中是用数值来表示状态的。
在整个程序中,状态机起的是中央控制器的作用,由它控制的信号来影响整个程序中的其他相关部分,如记分部分,发光二极管部分。
乒乓球游戏机中有两个计数器count1和count2,分别记忆甲和乙的得分,用发光二极管的轮流发光表示球的移动轨迹。
计数器
控制器
数码显示管
选手端
译码器
选手乙拍按钮
选手甲拍按钮
时钟分频器
开始按钮
复位开关
图2
四、编写应用程序及仿真
本设计的程序见附录。
仿真波形如:
图3。
图3
五、引脚锁定
clk_1:
时钟信号;startbutton:
开始键;serve(0,1):
甲和乙发球;hit1,hit2:
甲和乙击球;light(0~8):
8个灯用来当球桌。
各引脚号为:
hit1:
pin-1;hit2:
pin-10;serve0:
pin-2;serve1:
pin-3;reset:
pin-7;startbotton:
pin-5;light0~8:
pin-11,32,33,34,35,36,37,38。
引脚锁定见图4。
图4
六、硬件测试及说明
以甲先发球为例。
开始的时候处于“等待发球状态”,具体说明以甲球为例。
若乙未接住球,则甲得分;若甲接住球,则继续发球。
经测试结果正确。
七、结论
通过一周的努力,终于完成了此次课程设计。
通过这次设计,我掌握了如何利用可编程逻辑设计器件进行设计,并学习了宏模块的设计与应用的基础。
通过该课程设计,结合计算机科学的理论、抽象和设计三种形态,进一步掌握计算机中各功能部件的工作原理和逻辑实现,我熟悉了乒乓球游戏机的基本工作原理,为今后我在分析、设计、开发以及使用计算机打下坚实的基础。
通过系统的设计,对QUARTUS使用更加熟练,还学习了一些新功能。
在进行编程时遇到了一些困难,通过查阅相关资料都一一克服,学习了不少新的语法现象,对积累编程经验有很大的提高。
通过本次设计,切身感受到EDA技术的魔力,在今后的学习中,我将继续加强对此课程的学习运用,在实践中提高实际操作能力。
八、课程总结
EDA实验是电子信息工程专业必修的课程之一,对电子信息类专业的学生具有非常重要的作用。
本实验课程是电子设计技术、在系统可编程技术、可编程逻辑器件和EDA紧密结合、同时进行的。
EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL为系统逻辑描述手段完成的设计文件,自动的完成逻辑编译、逻辑化简、逻辑分割、逻辑综合、结构综合,以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
实验中我们主要应用到了VHDL语言,VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,VHDL主要用于描述数字系统的结构、行为、功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分[4]。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
在课题设计中,通过使用QuartusⅡ6.0这个完全集成化、易学易用的可编程逻辑设计环境,利用VHDL语言设计的乒乓球游戏机,较成功的完成了预期的效果,能够正确判断与显示乒乓球的位置和记分的装置。
在具体设计过程中还需要改进的是控制系统的纠错功能。
由于时间关系,系统功能实现不够完善,这些都需要不断的改进和补充。
九、参考文献
[1]李果.基于FPGA的扩频通信芯片设计及应用[D].武汉:
武汉理工大学,2008.
[2]张帆.基于FPGA的航电总线适配器设计[D].南京:
南京理工大学,2006.
[3]高士峰.医疗机器人主操作手接门研究与开发[D]_天津;天津大学,2005.
[4]LatticeSemiconductorCorporation.利用低成本FPGA设计下一代游戏控制台[EB/OL].http:
//www.eeworld.toni.cn/FP(;A/2009/0424/article一574.html,2009.
[5]彭介华.电子技术课程设计指导[M].北京:
高等教育出版社,1997.
[6]潘松,黄继业.EDA技术与VHDLEM].北京:
清华大学出版社,2007.
十、附录(源程序)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;--引用必要的库函数和包集合
entitycompeteis--实体名为compete
port(reset:
instd_logic;
clk_1:
instd_logic;
startbutton:
instd_logic;--开始游戏输入端口
serve:
instd_logic_vector(1downto0);--发球输入端口
hit1,hit2:
instd_logic;--甲和乙的击球输入端口
--控制8个发光二极管的输出端口
light:
outstd_logic_vector(1to8);
counta,countb:
outstd_logic_vector(3downto0));--4个用于控制4个7段译码器的输出端口
endcompete;
architectureoneofcompeteis
typepingpongis(waitserve,light1on,ballmoveto2,allow2hit,
light8on,ballmoveto1,allow1hit);
---设置7个状态,为枚举数据类型,记为pingpong
signalstate:
pingpong;
signali:
integerrange0to8;
signalcount1,count2,count3,count4:
std_logic_vector(3downto0):
="0000";
---内部计数器,是5位二进制变量
begin
process(clk_1)
begin
if(clk_1'eventandclk_1='1')then
ifcount3="0010"orcount4="0010"then
music_begin<='1';
endif;
if(reset='1')then
music_begin<='0';
endif;
endif;
endprocess;
process(clk_1)--状态机进程
--clk作为敏感信号触发进程
begin--进程开始
ifreset='1'then--异步置位
i<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000";
elsifclk_1'eventandclk_1='1'then--当处于时钟inclock上升沿时
ifcount1="1011"then
i<=0;count1<="0000";count3<=count3+1;
elsifcount2="1011"then
i<=0;count2<="0000";count4<=count4+1;
elsifstartbutton='0'then
i<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000";
else--以下case语句是程序中最关键的状态机部分
casestateis
whenwaitserve=>--进程处于等待发球状态
caseserveis
when"01"=>i<=1;state<=light1on;
when"10"=>i<=8;state<=light8on;
when"11"=>i<=0;
whenothers=>i<=0;
endcase;
whenlight1on=>--进程处于第一盏灯亮状态
i<=2;
ifhit2='1'then
i<=0;
count1<=count1+1;state<=waitserve;
else
state<=ballmoveto2;
endif;
whenlight8on=>--进程处于第八盏灯亮状态
i<=7;
ifhit1='1'then
i<=0;
count2<=count2+1;state<=waitserve;
else
state<=ballmoveto1;
endif;
whenballmoveto1=>--进程处于球向乙移动状态
ifhit1='1'then
i<=0;
count2<=count2+1;state<=waitserve;
elsifi=2theni<=1;
state<=allow1hit;
elsei<=i-1;
endif;
whenballmoveto2=>--进程处于球向乙移动状态
ifhit2='1'then
i<=0;
count1<=count1+1;state<=waitserve;
elsifi=7theni<=8;
state<=allow2hit;
elsei<=i+1;
endif;
whenallow1hit=>--进程处于允许甲击球状态
ifhit1='1'theni<=2;
state<=ballmoveto2;
elsecount2<=count2+1;i<=0;
state<=waitserve;
endif;
whenallow2hit=>--进程处于允许乙击球状态
ifhit2='1'theni<=7;state<=ballmoveto1;
elsecount1<=count1+1;i<=0;
state<=waitserve;
endif;
endcase;
endif;
endif;
endprocess;
counta<=count1;countb<=count2;
--进程处i信号控制发光二极管的亮暗
light<="10000000"when(i=1)else
"01000000"when(i=2)else
"00100000"when(i=3)else
"00010000"when(i=4)else
"00001000"when(i=5)else
"00000100"when(i=6)else
"00000010"when(i=7)else
"00000001"when(i=8)else
"00000000";--其他情况所有发光二极管都暗
endone;
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitydecoderis
port(binaryin:
instd_logic_vector(3downto0);
--4位二进制码的输入端口
bcdout1:
outstd_logic_vector(3downto0);--七段译码器输出端口
bcdout2:
outstd_logic_vector(3downto0)
);
enddecoder;
architectureoneofdecoderis
signaltembinaryin:
std_logic_vector(3downto0);
begin
process(binaryin)
begin
tembinaryin<=binaryin;
casetembinaryinis
--把0到9的4位二进制码转换成七段译码
when"0000"=>bcdout1<="0000";bcdout2<="0000";--bcdout1<="1111110";bcdout2<="1111110";
when"0001"=>bcdout1<="0000";bcdout2<="0001";--bcdout1<="1111110";bcdout2<="0110000";
when"0010"=>bcdout1<="0000";bcdout2<="0010";--bcdout1<="1111110";bcdout2<="1101101";
when"0011"=>bcdout1<="0000";bcdout2<="0011";--bcdout1<="1111110";bcdout2<="1111001";
when"0100"=>bcdout1<="0000";bcdout2<="0100";--bcdout1<="1111110";bcdout2<="0110011";
when"0101"=>bcdout1<="0000";bcdout2<="0101";--bcdout1<="1111110";bcdout2<="1011011";
when"0110"=>bcdout1<="0000";bcdout2<="0110";--bcdout1<="1111110";bcdout2<="1011111";
when"0111"=>bcdout1<="0000";bcdout2<="0111";--bcdout1<="1111110";bcdout2<="1110000";
when"1000"=>bcdout1<="0000";bcdout2<="1000";--bcdout1<="1111110";bcdout2<="1111111";
when"1001"=>bcdout1<="0000";bcdout2<="1001";--bcdout1<="1111110";bcdout2<="1111011";
--把10到19的4位二进制码转换成七段译码
when"1010"=>bcdout1<="0001";bcdout2<="0000";--bcdout1<="0110000";bcdout2<="1111110";
when"1011"=>bcdout1<="0001";bcdout2<="0001";--bcdout1<="0110000";bcdout2<="0110000";
--如果4位二进制码不在0到11范围内,那么两个七段译码器都显示0
whenothers=>bcdout1<="0000";bcdout2<="0000";--bcdout1<="1111110";bcdout2<="1111110";
endcase;
endprocess;
endone;
libraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entitydivisionis
port(clk:
instd_logic;
clk_4,clk_1:
outstd_logic
);
enddivision;
architecturedivision_bodyofdivisionis
signalclk_100:
std_logic;
signalcount1:
integerrange0to4999;
--signalcount1:
integerrange0to1;
signalcount2:
integerrange0to124999;
signalcount3:
integerrange0to49;
--signalcount3:
integerrange0to1;
signalclk1,clk2,clk3:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(count1=4999)then
count1<=0;
clk1<=notclk1;
elsecount1<=count1+1;
endif;
endif;
endprocess;
process(clk)
begin
if(clk'eventandclk='1')then
if(count2=124999)then
count2<=0;
clk2<=notclk2;
elsecount2<=count2+1;
endif;
endif;
endprocess;
process(clk1)
begin
if(clk1'eventandclk1='1')then
if(count3=49)then
count3<=0;
clk3<=notclk3;
elsecount3<=count3+1;
endif;
endif;
endprocess;
clk_100<=clk1;
clk_4<=clk2;
clk_1<=clk3;
enddivision_body;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 报告