EDAVerilog拔河游戏机报告讲解.docx

上传人:b****4 文档编号:3779048 上传时间:2022-11-25 格式:DOCX 页数:23 大小:126.96KB
下载 相关 举报
EDAVerilog拔河游戏机报告讲解.docx_第1页
第1页 / 共23页
EDAVerilog拔河游戏机报告讲解.docx_第2页
第2页 / 共23页
EDAVerilog拔河游戏机报告讲解.docx_第3页
第3页 / 共23页
EDAVerilog拔河游戏机报告讲解.docx_第4页
第4页 / 共23页
EDAVerilog拔河游戏机报告讲解.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

EDAVerilog拔河游戏机报告讲解.docx

《EDAVerilog拔河游戏机报告讲解.docx》由会员分享,可在线阅读,更多相关《EDAVerilog拔河游戏机报告讲解.docx(23页珍藏版)》请在冰豆网上搜索。

EDAVerilog拔河游戏机报告讲解.docx

EDAVerilog拔河游戏机报告讲解

课程设计(论文)任务书

电气与电子工程学  院  电子信息工程专  业2013-2 班

一、课程设计(论文)题目 拔河游戏机

二、课程设计(论文)工作自2015年12月28日起至2016年1月8日止。

三、课程设计(论文)地点:

电子测控实验室

四、课程设计(论文)内容要求:

1)课程设计任务:

1)设计一个能进行拔河游戏的电路

2)电路使用8个(或7个)发光二极管,开机后只有中间两个(或中间一个)

发亮,此即拔河的终点。

3)游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按得快,亮

点就向谁的方向移动,每按一次,亮点就移动一次。

4)亮点移动到任意一端的终端二极管时,这一方就获胜,此时双方按钮均无

作用,输出保持,只有复位后才使亮点恢复到中心。

5)用数码管显示获胜者的盘数。

6)*在亮点移动到中端二极管是蜂鸣器报警一方获胜。

2)课程设计论文编写要求

(1)课程设计任务及要求

(2)总体电路设计

(3)模块设计---给出各个模块的详细设计思路

(4)管脚绑定---列表或截图给出管脚绑定情况

(5)仿真及FPGA开发板调试---给出运行仿真波形截图,分析运行结果。

(6)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,

巩固了哪些知识,有哪些提高。

(7)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)

(8)报告按规定排版打印,要求装订平整,否则要求返工;

(9)课设报告的装订顺序如下:

封面---任务书---中文摘要---目录----正文---附录

(代码及相关图片)

(10)严禁抄袭,如有发现,按不及格处理。

3)课程设计评分标准:

(1)学习态度:

10分;

(2)系统设计:

20分;

(3)代码调试:

20分;

(4)回答问题:

20分;

(5)论文撰写:

30分。

4)课程设计进度安排

进度安排:

本设计持续10天,其中最后一天为答辩时间。

第1-2天:

讲解题目,准备参考资料,检查、调试实验软硬件,进入设计环境,开始

设计方案和验证方案的准备;

第3-4天:

完成设计与验证方案,经指导老师验收后进入模块电路设计;

第5-7天:

完成模块电路设计,进行代码输入,并完成代码的初步仿真;

第8-9天:

代码功能仿真正确,约束设计,综合、下载,实现设计目标,并指导老师

验收设计;整理设计资料,撰写报告、准备答辩;

第10天:

验收合格后进行答辩。

学生签名:

2015年12月28日

 

课程设计(论文)评审意见

(1)学习态度(10分):

优( )、良( )、中( )、一般( )、差( );

(2)系统设计(20分):

优()、良( )、中( )、一般( )、差( );

(3)代码调试(20分):

优( )、良( )、中( )、一般( )、差( );

(4)回答问题(20分):

优( )、良( )、中( )、一般( )、差( );

(5)论文撰写(30分):

优( )、良( )、中( )、一般( )、差( );

评阅人:

   职称:

2016年1月10日

摘要

经过一个学期的EDA学习,要检验自己的学习效果,最好的方法就是课程设计。

拔河游戏机是一个十分有趣的项目,不仅可以检验学习的情况,同时可以提高自己对EDA的兴趣。

拔河游戏机由分频模块、按键扫描模块、计分模块、响铃模块、动态扫描模块、数码管选择模块以及译码模块组成,把输入20MHz时钟晶振信号分成合适频率的时钟输入进各个模块,开始游戏后,令双方按下按键,即可完成项目目标。

本次项目设计使用VerilogHDL语言,完成拔河游戏机的设计。

实用软件有Quartus

13和ModelSim-Altera10.1d,在其环境下进行代码的编写编译以及现象仿真,而后烧写到Cyclone

EEP4CE30F23C7FPGA实验板中,经过测试之后最终完成拔河游戏机的基本要求。

关键字:

VerilogHDL,Quartus

,FPGA,拔河游戏机

目 录

一、课程设计任务及要求

1、设计任务:

1)设计一个能进行拔河游戏的电路。

2)电路使用8个(或7个)发光二极管,开机后只有中间两个(一个)发亮,此即拔河的中心点。

3)游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按得快,亮点就向谁的方向移动,每按一次,亮点移动一次。

4)亮点移到任一方终端二极管时,这一方就获胜,此时双方按钮均无作用,输出保持,只有复位后才使亮点恢复到中心。

5)用数码管显示获胜者的盘数。

6)附加,亮点移动到任意一方终点时,蜂鸣器报警提醒。

2、要求:

1)全部使用VerilogHDL硬件描述语言编写。

2)使用ModelSim-Altera软件进行仿真并对结果进行分析。

3)分析预期现象与实际现象之间产生差别的原因。

二、总体电路设计

1、拔河游戏机总体设计思想:

在20MHz的时钟信号作用下,经过分频模块分频成1KHz和10Hz的时钟信号,数码管动态扫描使用1KHz的频率,按键扫描使用10Hz的频率,通过按键扫描将双方的按键情况输入,并产生与之相对应晶体管亮点位置的位移,当位移至某一方的终点时,将按键使能端关闭,蜂鸣器报警开启,并使获胜方的分数加一,将分数通过译码在数码管上显示出来。

可以通过游戏复位按键是晶体管亮点回到中心,通过分数复位按键使双方分数全部清零。

2、总体电路组成

CLK

 

 

图2-1拔河游戏机总体设计框图

三、模块设计

1、分频模块设计

设计思路:

由于FPGA芯片内部提供的时钟信号为20MHz,因此需要将其分频为10Hz,1KHz的信号,为后续的按键扫描,,蜂鸣器报警以及数码管动态扫描显示提供时钟脉冲激励。

通过设置模计数器cnt1khz与cnt10hz,在20MHz时钟脉冲下计数,并将输出时钟翻转,最终输出的分别是1KHz,10Hz的时钟分别名为clk1khz与clk10hz。

 

cnt1khz

9999时翻转

CLK

20MHz

cnt10hz

999999时翻转

 

图3-1分频模块框图

 

2、按键扫描与亮点位移模块设计

设计思路:

s1和s2是按键经过消抖后的输入变量,8位ledtemp是亮点当前位置的状态变量,初值为00011000,t是亮点位移的中间变量初值为3即亮点处在中间。

配合时钟脉冲,并且游戏使能端开启的情况下,当key1按下key2不按下时,t自减1,当key1不按下key2按下时,t自加1,其他情况t保持不变。

而后用case语句对应不同的t给予不同的ledtemp值,例如t=1意味着亮点应该左移了两位,给ledtemp赋值01100000。

最后在always块之外用assign语句将ledtemp赋值给输出led。

 

clk10hz

 

不是

不是

 

Case(t)

 

图3-2按键扫描与亮点位移框图

3、比赛计分以及游戏锁定模块

设计思路:

拔河游戏机在任意一方将亮点按动到自己那边终点后,所得分数就会加一,且此时按动游戏按键无效。

按动按键使亮点到达终点时即t等于0或者等于6,0为左端终点,6为右端终点。

故可以设定一个游戏使能变量k且赋初始值为1,计数使能变量j初始值为1,在k等于1时按键有效,然后每当t变化一次之后就对其进行判断,当t到达了0或者6,将游戏时能变量k置0,且对相应的分数变量left与right加一,并将计数使能变量j置0,同时在这之中放入BCD码转换模块,将二进制的left和right转换为十进制方便译码。

k=1

 

不是t变化

 

不是

t=6

 

图3-3比赛计分与游戏锁定框图

4、获胜报警模块

设计思路:

在时钟脉冲激励下,检测并判断t的值,若t等于0或6,蜂鸣器变量ring置1,是蜂鸣器报警。

clk1khz

 

 

图3-4获胜报警模块框图

5、动态扫描、数码管选择与译码模块

设计思路:

通过绑定三个通选信号,对8个数码管进行扫描。

在代码中设定输出q以及与其对应的中间变量qtemp,赋予初值为0,令其在1KHz的时钟下自加一,而当其等于7时置零。

选择译码管使用case语句,在q所对应的数码管上赋予希望输出的值,即可完成选择。

Case语句对应相应数字的段码完成译码。

1khz时钟

qtemp=0

不是

 

图3-5动态扫描模块框图

6、按键消抖模块

设计思路:

按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

所以在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象我们需要将其消抖。

不断地检测输入信号,与上个及上上个信号进行或运算,除非连续出现三个低电平才能说出现下降沿认为是按键按下。

四、管脚绑定

表一管脚绑定

NodeName

Direction

Location

a

output

PIN_W10

b

output

PIN_V10

c

output

PIN_U10

d

output

PIN_T10

e

output

PIN_V11

f

output

PIN_U11

g

output

PIN_T11

led[7]

output

PIN_U8

led[6]

output

PIN_AB8

led[5]

output

PIN_U7

led[4]

output

PIN_V7

led[3]

output

PIN_W7

led[2]

output

PIN_Y7

led[1]

output

PIN_AA7

led[0]

output

PIN_AB7

Ring

output

PIN_A20

q[2]

output

PIN_AA8

q[1]

output

PIN_Y10

q[0]

output

PIN_AA10

clk

input

PIN_G22

key1

input

PIN_E12

key2

input

PIN_E13

rst_n

input

PIN_T2

rsts_n

input

PIN_T1

 

1、abcdefg为数码管输出段码。

2、8位led对应8位发光二极管。

3、Ring为对应蜂鸣器。

4、3位q为数码管通选信号。

5、clk绑定20MHz时钟。

6、key1、key2为双方玩家输入按键。

7、rst_n、rsts_n分别为发光二级管与游戏使能端的复位以及游戏分数清零的按钮。

五、仿真及FPGA开发板调试

1、rst_n对使能端的复位

在rst_n一开始为高电平时,j、k、t变量没有给赋值所以为高阻态,而当rst_n复位为低电平之后就对他们进行了赋值,使三个变量j=1、k=1、t=3。

图5-1rst_n复位仿真图像

2、不同按键状态的led变化

当左边玩家按下按键右边玩家没有按下时,即key1为0、key2为1则led应该一直往左移直到11000000停止,而当右边玩家按下按键左边玩家没有按下时,即key1为1、key2为0则led应该一直往右移直到00000011停止,其他情况时led保持初值00011000不变。

图5-2key1/key2为0/1时led仿真图像

图5-3key1/key2为1/0时led仿真图像

3、计分与蜂鸣器的报警

在rst_n置0将led复位后,再将rsts_n置0将left和right同时置0,而后移动led。

当led位移到最左端或者最右端时,停止移动,并且蜂鸣器置1,最左端则left加一最右断则right加一。

图5-4左边玩家获胜仿真图像

图5-5右边玩家获胜仿真图像

六、设计体会与小结

两周的EDA课程设计让我学到了很多东西,之前的实验的内容相比课程设计实在是小巫见大巫。

实验仅仅只是一个小模块,而课程设计确实众多模块合成一个大的工程。

不光是对EDA所学知识的检验,同时也是对我们细心程度以及耐心的极大考验。

从得到课题,再到查找资料,代码编写,仿真以及烧写到板子上调试,每一步都不简单,每一步都会涉及到方方面面,总的来说最后的完工真的是不容易。

在设计过程中有一些容易忽略的小问题,可能就会使得整个项目出错。

比如说时序的选择、阻塞非阻塞赋值以及if语句case语句的其他情况考虑,在代码的编写过程中经常会出现的问题比如同一个变量一会儿使用阻塞赋值一会儿使用非阻塞赋值,或者是同一个变量在不同always块中被赋值,这些都是不允许的。

还有就是代码的逻辑问题,可能你的代码编译出来没有错误,仿真貌似也是正确的图像,但是烧写到开发板上就是不对,那么就要考虑代码逻辑的问题了,在几个变量当中谁的优先级更高,判断语句嵌套是到底应该先满足那个条件等等。

通过这次课程设计我学到了许多以前没有重视的东西,不仅丰富了知识量,还提高了自己的实践能力。

我认为学习这种课程就应该多多实践,多找闲暇时间做一做比较有代表性的项目,丰富见识,积累经验,这样不单单能巩固课堂所学,还可以汲取更多的课外知识,真正有效的提高自己的能力。

七、参考文献

[1]王金明.数字系统设计与VerilogHDL[M].北京:

电子工业出版社,2010.

[2]王金明,徐志军,苏勇.EDA技术与VerilogHDL设计[M].北京:

电子工业出版社,2013.

[3]夏宇文.Verilog数字系统设计教程[M].北京:

北京航空航天大学出版社,2003.

[4]潘松,黄继业.EDA技术实用教程(第三版).北京:

科学出版社,2006

[5]孟涛.电子电工与EDA实践教程(第二版).北京:

电子工业出版社,2012

 

附录

RTL代码:

moduletug(clk,rst_n,rsts_n,led,q,key1,key2,a,b,c,d,e,f,g,Ring);

inputkey1,key2,clk,rst_n,rsts_n;

output[7:

0]led;

reg[7:

0]left,right;

outputRing;

regring;

wires1,s2;

output[2:

0]q;

outputrega,b,c,d,e,f,g;

reg[2:

0]qtemp;

reg[7:

0]ledtemp;

regj,k;//使能中间变量

reg[3:

0]y;

reg[2:

0]t;

regclk1khz;

reg[31:

0]cnt1khz;

regclk10hz;

reg[31:

0]cnt10hz;

//--------------1khz分频--------------

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

begin

cnt1khz<=0;

clk1khz<=0;

end

elseif(cnt1khz==9999)

begin

cnt1khz<=0;

clk1khz<=~clk1khz;

end

else

cnt1khz<=cnt1khz+1;

end

//--------------10hz分频--------------

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

begin

cnt10hz<=0;

clk10hz<=0;

end

elseif(cnt10hz==999999)

begin

cnt10hz<=0;

clk10hz<=~clk10hz;

end

else

cnt10hz<=cnt10hz+1;

end

//--------------主函数--------------

always@(posedgeclkornegedgerst_n)

begin

if(!

rst_n)

begin

ledtemp<=8'b00011000;

k<=1;

j<=1;

t<=3;

end

elseif(!

rsts_n)

begin

right<=0;

left<=0;

end

elseif(k==1)

begin

case({key1,key2})

2'b01:

t<=t-1;

2'b10:

t<=t+1;

default:

t<=t;

endcase

if(t>=6||t<=0)

begin

k<=0;

if(t==6&&j==1)

begin

if(right[3:

0]==9)

begin

right[3:

0]<=0;

if(right[7:

4]==9)

right[7:

4]<=0;

else

begin

right[7:

4]<=right[7:

4]+1;

j<=0;

end

end

else

begin

right[3:

0]<=right[3:

0]+1;

j<=0;

end

end

elseif(t==0&&j==1)

begin

if(left[3:

0]==9)

begin

left[3:

0]<=0;

if(left[7:

4]==9)

left[7:

4]<=0;

else

begin

left[7:

4]<=left[7:

4]+1;

j<=0;

end

end

else

begin

left[3:

0]<=left[3:

0]+1;

j<=0;

end

end

end

else

begin

k<=k;

end

end

begin

case(t)

3'd0:

ledtemp<=8'b11000000;

3'd1:

ledtemp<=8'b01100000;

3'd2:

ledtemp<=8'b00110000;

3'd3:

ledtemp<=8'b00011000;

3'd4:

ledtemp<=8'b00001100;

3'd5:

ledtemp<=8'b00000110;

3'd6:

ledtemp<=8'b00000011;

default:

ledtemp<=ledtemp;

endcase

end

end

assignled=ledtemp;

//--------------响铃模块--------------

always@(posedgeclk)

begin

if(!

rst_n)

begin

ring<=0;

end

elseif(t==0||t==6)

begin

ring<=1;

end

elsering<=0;

end

assignRing=ring&&clk1khz;

//---------------动态扫描--------------

always@(posedgeclk1khzornegedgerst_n)

begin

if(!

rst_n)

qtemp<=0;

elseif(qtemp==7)

qtemp[2:

0]<=0;

else

qtemp<=qtemp+1;

end

assignq=qtemp;

//--------------数码管选择模块--------------

always@(q)

begin

case(q)

3'b000:

y=right[3:

0];

3'b001:

y=right[7:

4];

3'b010:

y=4'd10;

3'b011:

y=4'd10;

3'b100:

y=4'd10;

3'b101:

y=4'd10;

3'b110:

y=left[3:

0];

3'b111:

y=left[7:

4];

default:

y=4'd10;

endcase

end

//--------------译码模块--------------

always@(y)

begin

case(y)

4'd0:

{a,b,c,d,e,f,g}=7'b1111110;

4'd1:

{a,b,c,d,e,f,g}=7'b0110000;

4'd2:

{a,b,c,d,e,f,g}=7'b1101101;

4'd3:

{a,b,c,d,e,f,g}=7'b1111001;

4'd4:

{a,b,c,d,e,f,g}=7'b0110011;

4'd5:

{a,b,c,d,e,f,g}=7'b1011011;

4'd6:

{a,b,c,d,e,f,g}=7'b1011111;

4'd7:

{a,b,c,d,e,f,g}=7'b1110000;

4'd8:

{a,b,c,d,e,f,g}=7'b1111111;

4'd9:

{a,b,c,d,e,f,g}=7'b1111011;

default:

{a,b,c,d,e,f,g}=7'b0000000;

endcase

end

Xiaodouu1(.clk(clk),.key1(key1),.key2(key2),.s1(s1),.s2(s2));

endmodule

 

moduleXiaodou(key1,key2,clk,s1,s2);

inputkey1,key2,clk;

outputs1,s2;

rega1,a2,a3,b1,b2,b3;

//---------消抖模块-----------

always@(posedgeclk)

begin

a1<=key1;

a2<=a1;

a3<=a2;

b1<=key2;

b2<=b1;

b3<=b2;

end

assigns1=(a1|a2|a3);

assigns2=(b1|b2|b3);

endmodule

 

Testbench仿真测试代码:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1