Verilog项目设计报拔河游戏机.docx

上传人:b****5 文档编号:5171422 上传时间:2022-12-13 格式:DOCX 页数:14 大小:277.61KB
下载 相关 举报
Verilog项目设计报拔河游戏机.docx_第1页
第1页 / 共14页
Verilog项目设计报拔河游戏机.docx_第2页
第2页 / 共14页
Verilog项目设计报拔河游戏机.docx_第3页
第3页 / 共14页
Verilog项目设计报拔河游戏机.docx_第4页
第4页 / 共14页
Verilog项目设计报拔河游戏机.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Verilog项目设计报拔河游戏机.docx

《Verilog项目设计报拔河游戏机.docx》由会员分享,可在线阅读,更多相关《Verilog项目设计报拔河游戏机.docx(14页珍藏版)》请在冰豆网上搜索。

Verilog项目设计报拔河游戏机.docx

Verilog项目设计报拔河游戏机

 

河海大学物联网工程学院

VerilogHDL项目设计报告

 

题目拔河游戏机

专业电子科学与技术

学号1562910123、1562910125

授课班号6292758

学生姓名徐子豪、杨诗欣

指导教师华迪、齐本胜

 

摘要和关键字

为了掌握数字系统的设计方法,掌握硬件描述语言——VerilogHDL,掌握模块化设计方法,掌握开发软件的使用方法。

选择

基于FPGA开发板设计的拔河游戏机,使用两个按键进行比赛,利用按键按下的快慢作为模拟的双方选手拔河过程,led灯的变化决定绳子的位置,led灯到了一边以后比赛终止,整个过程的难点在于,需要过滤信号,使按键产生的信号稳定,所以程序中需要有按键消抖模块,同时需标识符来控制比赛的开始与结束。

关键词:

verilog拔河比赛消抖模块标识符

Inordertomasterthedesignmethodofdigitalsystem,wemustmasterthehardwaredescriptionlanguage--VerilogHDL,graspthemodulardesignmethodandmasterthewayofdevelopingsoftware.Choice

TugofwargameFPGAdevelopmentboardbasedonthedesign,theuseoftwobuttongame,usingkeypressspeedasbothplayerstugofwarofsimulation,changeledlampdecidethepositionoftherope,LEDlightstothesideaftertheendgame,thedifficultyliesinthewholeprocess,needtofilterthesignal,thestablesignalgeneratedbythekeysso,theprocedurerequiresakeydebouncemodule,alsoneedtocontrolthegame'sidentifierandendstart.

Keywords:

Verilogtugshake-offmoduleidentifier.一、系统设计

1.实验要求

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

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

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

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

(4)工作时钟100Hz即可;

(5)完成全部流程:

设计规范文档、模块设计、代码输入、功能仿真、约束与综合、布局布线、时序仿真、下载验证等。

2.方案对比

脉冲信号方案:

在选定一定的时间周期内,检测按键A与按键B的产生的脉冲个数,进行比较,若A的脉冲数量大于B,则Led向A方向移动,反之则向B方向移动,若相等则不动。

消抖模块方案

给所定按键两个状态,一个前状态,一个后状态,当时钟时钟的脉冲沿来临时,将按键状态赋值给前状态,设置定时器,当计数计满后,前状态值赋给后状态,按键输出值为前状态和后状态的取反的并。

此方案当一直按住按键时,按键电平信号一直为高,取反后的变为低,可以避免一直按住而直接比赛结束的特殊情况。

3.系统框图

4.

Led移动

比较模块

消抖模块

时钟分频

 

由分频后的时钟信号模块控制按键信号模块,之后进入比较模块,若A的脉冲数大于B,则Led向A代表方向移动,反之则向B代表方向移动,若相等则不动。

由Led的位置决定使能端的开启与关闭,若移动至A或B的顶端,则使能端控制Led无法再移动。

 

4.代码设计和说明

(1)对于输入端口输出端口的定义,和寄存器,线网型变量的,以及计数常量的定义

moduleproject_ba(Clk,Rst_n,KEY1,KEY2,LED);

inputClk;

inputRst_n;

inputKEY1;

inputKEY2;//定义输入

output[15:

0]LED;//定义输出

reg[27:

0]Cnt;

regClk_100hz;

regen;

regKey1_n;

regKey1_n_reg;

regKey2_n;

regKey2_n_reg;

reg[3:

0]t;

reg[15:

0]led;

wirekey1,key2;

parameterCNT=28'd49_999;

(2)分频模块,将Basys3的100M系统时钟分频成为周期为10ms,100Hz频率

always@(posedgeClkorposedgeRst_n)

begin

if(Rst_n)begin

Cnt<=28'd0;Clk_100hz<=0;end

elseif(Cnt==CNT)begin

Cnt<=28'd0;Clk_100hz<=~Clk_100hz;end

else

Cnt<=Cnt+1'b1;

end

(3)按键消抖模块,给每一个按键两个状态,保证按键产生的信号可以消除抖动稳定。

always@(posedgeClkorposedgeRst_n)

beginif(Rst_n)

beginKey1_n<=0;Key2_n<=0;end

elsebegin

Key1_n<=Key1_n_reg;

Key2_n<=Key2_n_reg;end

end

always@(*)

begin

if(Cnt==CNT)begin

Key1_n_reg=KEY1;

Key2_n_reg=KEY2;end

elsebegin

Key1_n_reg=Key1_n;

Key2_n_reg=Key2_n;end

end

assignkey1=Key1_n&(~Key1_n_reg);

assignkey2=Key2_n&(~Key2_n_reg);

(4)比较模块,每当时钟的上升沿,便比较A,B的脉冲个数,即谁按得快,输出就为1,否则就为0

always@(posedgeClk)

beginif(t==4'd0||t==4'd14)

en<=1'b0;

else

en<=1'b1;

end

(5)移动模块

always@(posedgeClk_100hzorposedgeRst_n)

begin

if(Rst_n)

t<=7;

else

if(en)

case({key1,key2})

2'b10:

t<=t+1'b1;

2'b01:

t<=t-1'b1;

default:

t<=t;

endcase

end

(6)译码模块,将得到的信号t转化为,Led的显示,最后赋值给Led输出端口,并且由数码管显示胜利的一方

always@(*)

begin

case(t)

4'd0:

led=16'b0000_0000_0000_0011;

4'd1:

led=16'b0000_0000_0000_0110;

4'd2:

led=16'b0000_0000_0000_1100;

4'd3:

led=16'b0000_0000_0001_1000;

4'd4:

led=16'b0000_0000_0011_0000;

4'd5:

led=16'b0000_0000_0110_0000;

4'd6:

led=16'b0000_0000_1100_0000;

4'd7:

led=16'b0000_0001_1000_0000;

4'd8:

led=16'b0000_0011_0000_0000;

4'd9:

led=16'b0000_0110_0000_0000;

4'd10:

led=16'b0000_1100_0000_0000;

4'd11:

led=16'b0001_1000_0000_0000;

4'd12:

led=16'b0011_0000_0000_0000;

4'd13:

led=16'b0110_0000_0000_0000;

4'd14:

led=16'b1100_0000_0000_0000;

default:

led=16'b0000_0000_0000_0000;

endcase

end

assignLED=led;

endmodule

 

2、结果与讨论

1、仿真代码

`defineclk_period10//定义时钟周期

moduleBaTB();

regClk;

regRst_n;

regKEY1,KEY2;

wire[15:

0]LED;

project_bau0(

.Clk(Clk),

.Rst_n(Rst_n),

.KEY1(KEY1),

.KEY2(KEY2),

.LED(LED));

initial

beginClk=0;end

always#(`clk_period/2)Clk=~Clk;

initialbegin

KEY1=0;KEY2=0;

#(`clk_period*10);

Rst_n=1;

#(`clk_period*10);

Rst_n=0;KEY1=1;KEY2=0;

#(`clk_period*100);

KEY1=1;KEY2=0;

#(`clk_period*100);

KEY1=1;KEY2=0;end

endmodule

2、仿真波形

可以看到一直给Key1施加高电平时钟信号,Led灯的高电平一直向1方向的led灯方向移动,由此可得仿真成功。

3、问题与分析

在仿真成功以后生成比特流文件时一直显示错误无法成功,之后在请教其他同学以后,共同分析后发现,一开始设计中的数码管模块无法在结束后对应显示,于是便删除了数码管模块,在led移动到一端后便是游戏结束标志。

4、结果

在分析出问题兵解决之后,将程序烧写到fpga开发板上,设计的功能都能实现,于是上板验证也成功。

三、心得体会

一开始接触这个课题的时候,不知道怎么下手,通过其他同学的讲解以及查找资料基本了解了拔河游戏机的设计原理。

通过这次课程设计,我更加感到理论和实际之间的差异很大。

我也越来越强烈地感到要掌握一项技术,唯一的办法也是最好的办法就是实践。

只有通过实践才能将书本上的知识应用,也只有实践才能发现很多问题,真正掌握知识,学以致用。

虽然遇到的问题很多,但是同时得到很多有用的经验。

这些对于以后的学习和工作都有很大的帮助。

四、参考文献

[1]夏宇闻,Verilog数字系统设计教程,北京航天航空大学出版社,2013

[2]王金明,数字系统设计与VerilogHDL,北京电子工业出版社,2009

[3]潘松,EDA技术实用教程,北京科学出版社,2009

附录

实物板级验证图:

1、左边队员胜利

 

2、右边队员胜利

 

 

3、清零重置

 

4、源代码

module project_ba(

Clk,Rst_n,KEY1,KEY2,

 LED);

input  Clk;

input  Rst_n;

input  KEY1;

input  KEY2;      //定义输入 

output [15:

0] LED;//定义输出

reg [27:

0] Cnt;

reg Clk_100hz;

reg en;

reg Key1_n;

reg Key1_n_reg;

reg Key2_n;

reg Key2_n_reg;

reg [3:

0] t;

reg [15:

0] led;

wire key1,key2;

parameter CNT = 28'd49_999;

always@(posedge Clk or posedge Rst_n)

begin

if(Rst_n) begin

Cnt <= 28'd0;Clk_100hz <= 0;end

else if(Cnt == CNT) begin

Cnt <= 28'd0;Clk_100hz <= ~Clk_100hz;end

else

Cnt <= Cnt + 1'b1;

end

always@(posedge Clk or posedge Rst_n)

begin if(Rst_n)

begin Key1_n <= 0;Key2_n <= 0;end

else begin

Key1_n <= Key1_n_reg;

Key2_n <= Key2_n_reg;end

end

always@(*)

begin

if(Cnt == CNT) begin

Key1_n_reg = KEY1;

Key2_n_reg = KEY2;end

else begin

Key1_n_reg = Key1_n;

Key2_n_reg = Key2_n;end

end

assign key1 = Key1_n & (~Key1_n_reg);

assign key2 = Key2_n & (~Key2_n_reg);

always@(posedge Clk_100hz or posedge Rst_n )

begin 

if(Rst_n)

t <= 7;

else

if(en)

case({key1,key2})

2'b10 :

 t <= t + 1'b1;

2'b01 :

 t <= t - 1'b1;

default:

t <= t;

endcase 

end

  

always@(posedge Clk)

begin if(t == 4'd0 || t == 4'd14)

en <= 1'b0;

 else

en <= 1'b1;

end

always@(*)

begin

case(t)

4'd0 :

 led = 16'b0000_0000_0000_0011;

4'd1 :

 led = 16'b0000_0000_0000_0110; 

4'd2 :

 led = 16'b0000_0000_0000_1100; 

4'd3 :

 led = 16'b0000_0000_0001_1000; 

4'd4 :

 led = 16'b0000_0000_0011_0000; 

4'd5 :

 led = 16'b0000_0000_0110_0000; 

4'd6 :

 led = 16'b0000_0000_1100_0000; 

4'd7 :

 led = 16'b0000_0001_1000_0000;

4'd8 :

 led = 16'b0000_0011_0000_0000; 

4'd9 :

 led = 16'b0000_0110_0000_0000; 

4'd10:

 led = 16'b0000_1100_0000_0000; 

4'd11:

 led = 16'b0001_1000_0000_0000; 

4'd12:

 led = 16'b0011_0000_0000_0000; 

4'd13:

 led = 16'b0110_0000_0000_0000;

4'd14:

 led = 16'b1100_0000_0000_0000;  

default :

 led = 16'b0000_0000_0000_0000;

endcase

end//译码模块

assign LED = led;

endmodule 

5、测试文件

`defineclk_period10//定义时钟周期

moduleBaTB();

regClk;

regRst_n;

regKEY1,KEY2;

wire[15:

0]LED;

project_bau0(

.Clk(Clk),

.Rst_n(Rst_n),

.KEY1(KEY1),

.KEY2(KEY2),

.LED(LED));

initial

beginClk=0;end

always#(`clk_period/2)Clk=~Clk;

initialbegin

KEY1=0;KEY2=0;

#(`clk_period*10);

Rst_n=1;

#(`clk_period*10);

Rst_n=0;KEY1=1;KEY2=0;

#(`clk_period*100);

KEY1=1;KEY2=0;

#(`clk_period*100);

KEY1=1;KEY2=0;end

endmodule

6、管脚约束

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[15]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[14]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[13]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[12]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[11]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[10]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[9]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[8]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[7]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[6]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[5]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[4]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[3]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[2]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[1]}]

set_propertyIOSTANDARDLVCMOS33[get_ports{LED[0]}]

set_propertyPACKAGE_PINL1[get_ports{LED[15]}]

set_propertyPACKAGE_PINP1[get_ports{LED[14]}]

set_propertyPACKAGE_PINN3[get_ports{LED[13]}]

set_propertyPACKAGE_PINP3[get_ports{LED[12]}]

set_propertyPACKAGE_PINU3[get_ports{LED[11]}]

set_propertyPACKAGE_PINW3[get_ports{LED[10]}]

set_propertyPACKAGE_PINV3[get_ports{LED[9]}]

set_propertyPACKAGE_PINV13[get_ports{LED[8]}]

set_propertyPACKAGE_PINV14[get_ports{LED[7]}]

set_propertyPACKAGE_PINU14[get_ports{LED[6]}]

set_propertyPACKAGE_PINU15[get_ports{LED[5]}]

set_propertyPACKAGE_PINW18[get_ports{LED[4]}]

set_propertyPACKAGE_PINV19[get_ports{LED[3]}]

set_propertyPACKAGE_PINU19[get_ports{LED[2]}]

set_propertyPACKAGE_PINE19[get_ports{LED[1]}]

set_propertyPACKAGE_PINU16[get_ports{LED[0]}]

set_propertyPACKAGE_PINW5[get_portsClk]

set_propertyPACKAGE_PINW19[get_portsKEY1]

set_propertyPACKAGE_PINT17[get_portsKEY2]

set_propertyPACKAGE_PINV17[get_portsRst_n]

set_propertyIOSTANDARDLVCMOS33[get_portsClk]

set_propertyIOSTANDARDLVCMOS33[get_portsKEY1]

set_propertyIOSTANDARDLVCMOS33[get_portsKEY2]

set_propertyIOSTANDARDLVCMOS33[get_portsRst_n]

 

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

当前位置:首页 > 高等教育 > 艺术

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

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