Verilog项目设计报拔河游戏机.docx
- 文档编号:6295429
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:16
- 大小:499.98KB
Verilog项目设计报拔河游戏机.docx
《Verilog项目设计报拔河游戏机.docx》由会员分享,可在线阅读,更多相关《Verilog项目设计报拔河游戏机.docx(16页珍藏版)》请在冰豆网上搜索。
Verilog项目设计报拔河游戏机
Verilog项目设计报拔河游戏机
河海大学物联网工程学院
VerilogHDL项目设计报告
题目拔河游戏机
专业电子科学与技术
学号1562910123、1562910125
授课班号6292758
学生姓名徐子豪、杨诗欣
指导教师华迪、齐本胜
摘要和关键字
为了掌握数字系统的设计方法,掌握硬件描述语言——VerilogHDL,掌握模块化设计方法,掌握开发软件的使用方法。
选择
基于FPGA开发板设计的拔河游戏机,使用两个按键进行比赛,利用按键按下的快慢作为模拟的双方选手拔河过程,led灯的变化决定绳子的位置,led灯到了一边以后比赛终止,整个过程的难点在于,需要过滤信号,使按键产生的信号稳定,所以程序中需要有按键消抖模块,同时需标识符来控制比赛的开始与结束。
关键词:
verilog拔河比赛消抖模块标识符
Inordertomasterthedesignmethodofdigitalsystem,wemustmasterthehardwaredescriptionlanguage--VerilogHDL,graspthemodulardesignmethodandmasterthewayofdevelopingsoftware.Choice
TugofwargameFPGAdevelopmentboardbasedonthedesign,theuseoftwobuttongame,usingkeypressspeedasboth
消抖模块方案
给所定按键两个状态,一个前状态,一个后状态,当时钟时钟的脉冲沿来临时,将按键状态赋值给前状态,设置定时器,当计数计满后,前状态值赋给后状态,按键输出值为前状态和后状态的取反的并。
此方案当一直按住按键时,按键电平信号一直为高,取反后的变为低,可以避免一直按住而直接比赛结束的特殊情况。
3.系统框图
由分频后的时钟信号模块控制按键信号模块,之后进入比较模块,若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
二、结果与讨论
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]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog 项目 设计 拔河 游戏机