文档库 最新最全的文档下载
当前位置:文档库 › eda拔河游戏机课程设计报告

eda拔河游戏机课程设计报告

eda拔河游戏机课程设计报告
eda拔河游戏机课程设计报告

报告书写要求

1、报告的撰写要求条理清晰、语言准确、表述简明。报告中段首空两个字符,中文字体为

宋体五号,数字、字符、字母为Times New Roman五号,且单倍行距。

2、报告中插图应与文字紧密配合,文图相符,技术容正确。每个图都应配有图题(由图号

和图名组成)。图题(宋体小五号)置于图下居中,其中图号按顺序编排,图名在图号之后空一格排写。图中若有分图时,分图号用(a)、(b)等置于分图之下。注:框图、流程图(矢量图)用专业画图软件。

3、报告中插表应与文字紧密配合,文表相符,技术容正确。表格不加左、右边线,上、下

线需加粗(1.5磅),每个表应配有表题(由表号和表名组成)。表题(宋体小五号)置于表上居中,其中表号按顺序编排,表名在表号之后空一格排写。

4、报告中公式原则上居中书写。注:公式编辑器编写。

5、设计报告应按如下容和顺序A4纸打印、左侧装订成册。

一、设计目的

1.掌握数字系统的设计方法;

2.掌握硬件描述语言——Verilog HDL;

3.掌握模块化设计方法;

4.掌握开发软件的使用方法。

二、设计要求

(1)设计拔河游戏电路,用按键与LED表示输入与输出。

(2)初始时,16个LED中间的两个点亮,然后游戏双方不停按动按键,点亮的两个LED 向按动按键慢的一方移动;

(3)每按动一下按键,LED向对方移动一格;

(4)只要LED移动到头,游戏结束;

(5)由裁判下达比赛开始命令后,甲乙双方才能输入信号,否则,输入信号无效。

用数码管显示获胜者的盘数,每次比赛结束自动给获胜方加分。

(6)完成全部流程:设计规文档、模块设计、代码输入、功能仿真、约束与综合、布局布线、时序仿真、下载验证等。

(7)三、设计环境

计算机、QuatusII开发软件

四、设计容(设计原理和方案、程序设计、仿真分析和适配)

4.1设计原理和方案

电子拔河游戏机是一种能容纳甲乙双方参赛或甲乙双方加裁判的三人游戏电路。由一排16个LED发光二极管表示拔河的“电子绳”。由甲乙双方通过按钮开关使发光的LED管向自己一方的终点延伸,当延伸到某方的最后一LED管时,则该方失败,对方获胜,并对获胜次数进行计数,连续比赛多局以定胜负。比赛开始,由裁判下达比赛命令后,甲乙双方才能输入信号,否则,输入信号无效。裁判信号由键盘空格键来控制。“电子绳”由16个LED管构成,裁判下达“开始比赛”的命令后,摁一下空格键,位于“电子绳”中点的LED发亮。甲乙双方通过按键输入信号,使发亮的LED管向自己一方移动,并阻止其向对方延伸,谁摁得快就向这一方移动。当从中点至自己一方的最后一个LED管发亮时,表示比赛结束,这时,电路自锁,保持当前状态不变,除非由裁判使电路复位,并对获胜的一方计数器自动加一。记分电路用两位七段数码管分别对双方得分进行累计,在每次比赛结束时电路自动加分。当比赛结束时,计分器清零,为下一次比赛做好准备。

4.2程序设计及仿真

4.2.1分频器模块程序设计及仿真

module fpq(_10000HzOut,_25HzOut,_50MHzIn);

input _50MHzIn;

output _10000HzOut,_25HzOut;

parameter width1=16,value1=2499;

parameter width2=10,value2=499;

reg _10000HzOut,_25HzOut;

reg [width1-1:0] Count;

reg [width2-1:0] Cnt;

always (posedge _50MHzIn) //2500*2*10000Hz=50MHz

if (Count==value1) //Binary Counter(0~2499)

begin

Count <= 15'd0; _10000HzOut <= ~_10000HzOut;

end

else Count <= Count + 1'b1;

always (posedge _50MHzIn) //100 000*2*25Hz=50MHz

if (Cnt==value2) //Binary Counter(0~99999)

begin

Cnt <= 15'd0; _25HzOut <= ~_25HzOut;

end

按键模块 主控制电路

模块 拔河LED 显

示模块 计分数码管显示模块

else Cnt <= Cnt + 1'b1;

endmodule

图1,分频器仿真波形图

4.2.2按键模块程序设计及仿真

按键模块采用3个或门消抖,由于有两个玩家,

所以设置有两个按键,采用25hz脉冲。

module xiaodou(key1, key2, _25H,k1, k2);

input key1; //// 按键1

input key2; //// 按键2

input _25H; //脉冲25Hz

output k1;

output k2;

assign k1=(a1|a2|a3); ////

assign k2=(b1|b2|b3); //// 采用3个或门消抖

reg a1,a2,a3,b1,b2,b3;

always (posedge _25H)

begin

a1<=key1;a2<=a1;a3<=a2;

b1<=key2;b2<=b1;b3<=b2;

end

endmodule

图2,仿真波形图

4.2.3主程序模块程序设计及仿真

拔河主程序开始时设有复位按键,通过左右数码管显示玩家分数,有两个led小灯代表拔河绳子的中点。拔河结束也可清零。

module xin(k1, k2, rst, nrst, _25H, q, left, right);

input k1; //

input k2; //

input rst; //拔河开始复位按键

input nrst; //计分清零按键

input _25H; //

output [2:0] q; //拔河led显示输出

output [2:0] left; //左边分数数码管输出

output [2:0] right; //右边分数数码管输出

reg [2:0]q;

reg n;

reg [2:0]left,right; //reg寄存器

always (negedge rst or posedge _25H or negedge nrst)

begin

if(~rst) begin q=7;n=1;end //q,led回中点 n使能开 else if(~nrst) begin left=0;right=0;end //计分清零 else if(n) //判断使能是否开! begin case({k1,k2}) // 按键组

2'b01: q=q+1; /// led向右移一位 2'b10: q=q-1; //// led向左移一位 default: q=q; /// 保持

endcase //

case(q)

3'b000:begin n=0;left=left+1;end //左+1分,n使能关

3'b110:begin n=0;right=right+1;end //右+1分,n使能关

default:n<=n; //保持

endcase

end

end

endmodule

图3,仿真波形图

4.2.4LED模块程序设计及仿真

Led设有16个灯。

module led(q, _50M, led);

input [2:0] q;

input _50M;

output [7:0] led;

reg [7:0] led;

always(posedge _50M)

case(q)

3'd0:led=16'b11111;

3'd1:led=16'b11111;

3'd2:led=16'b11111;

3'd3:led=16'b11111;

3'd4:led=16'b11111;

3'd5:led=16'b11111;

3'd6:led=16'b11111;

3'd7:led=16'b11111; // 中点

3'd8:led=16'b11111;

3'd9:led=16'b11111;

3'd10:led=16'b01111;

3'd11:led=16'b00111;

3'd12:led=16'b10011;

3'd13:led=16'b11001;

3'd14:led=16'b11100;

default:led<=led;

endcase

endmodule

图4,仿真波形图

4.2.5数码管模块程序设计及仿真

module shumaguan1(left, right, _10000H, segout, wx);

input [2:0] left;

input [2:0] right;

input _10000H;

output [6:0] segout; //数码管输出

output [2:0] wx;

reg [2:0] wx;

reg [6:0] segout;

reg [1:0] count;

reg [3:0] seg_in;

always(posedge _10000H)

case(count)

2'd0:begin wx<=3'b011;seg_in<=left;count<=count+1;end //left wx +,计数输入=left,count进一位继续判断

2'd1:begin wx<=3'b101;seg_in<=4'd8;count<=count+1;end //- wx

+,计数输入=8,同上

2'd2:begin wx<=3'b110;seg_in<=right;count<=0;end //rihht wx +,计数输入=right,conunt归零,重新判断

endcase

always(seg_in)

case(seg_in) //g f e d c b a//

4'd0:segout<=7'b1000000; //0

4'd1:segout<=7'b1111001; //1

4'd2:segout<=7'b0100100; //2

4'd3:segout<=7'b0110000; //3

4'd4:segout<=7'b0011001; //4

4'd5:segout<=7'b0010010; //5

4'd6:segout<=7'b0000010; //6

4'd7:segout<=7'b1111000; //7

4'd8:segout<=7'b0111111; //8

4'd9:segout<=7'b0111011; //9

default:segout<=7'b1000000;

endcase

endmodule

图5,仿真波形图

相关文档