Verilog项目设计报拔河游戏机样本Word文档格式.docx
《Verilog项目设计报拔河游戏机样本Word文档格式.docx》由会员分享,可在线阅读,更多相关《Verilog项目设计报拔河游戏机样本Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
设计拔河游戏电路,用按键与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)分频模块,将Basys3100M系统时钟分频成为周期为10ms,100Hz频率
always@(posedgeClkorposedgeRst_n)
begin
if(Rst_n)begin
Cnt<
=28'
d0;
Clk_100hz<
=0;
end
elseif(Cnt==CNT)begin
=~Clk_100hz;
else
=Cnt+1'
b1;
(3)按键消抖模块,给每一种按键两个状态,保证按键产生信号可以消除抖动稳定。
beginif(Rst_n)
beginKey1_n<
Key2_n<
elsebegin
Key1_n<
=Key1_n_reg;
=Key2_n_reg;
always@(*)
if(Cnt==CNT)begin
Key1_n_reg=KEY1;
Key2_n_reg=KEY2;
Key1_n_reg=Key1_n;
Key2_n_reg=Key2_n;
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
(5)移动模块
always@(posedgeClk_100hzorposedgeRst_n)
begin
if(Rst_n)
t<
=7;
if(en)
case({key1,key2})
2'
b10:
=t+1'
b01:
=t-1'
default:
=t;
endcase
(6)译码模块,将得到信号t转化为,Led显示,最后赋值给Led输出端口,并且由数码管显示胜利一方
case(t)
4'
d0:
led=16'
b0000_0000_0000_0011;
d1:
b0000_0000_0000_0110;
d2:
b0000_0000_0000_1100;
d3:
b0000_0000_0001_1000;
d4:
b0000_0000_0011_0000;
d5:
b0000_0000_0110_0000;
d6:
b0000_0000_1100_0000;
d7:
b0000_0001_1000_0000;
d8:
b0000_0011_0000_0000;
d9:
b0000_0110_0000_0000;
d10:
b0000_1100_0000_0000;
d11:
b0001_1000_0000_0000;
d12:
b0011_0000_0000_0000;
d13:
b0110_0000_0000_0000;
d14:
b1100_0000_0000_0000;
default:
b0000_0000_0000_0000;
endcase
assignLED=led;
endmodule
二、成果与讨论
1、仿真代码
`defineclk_period10//定义时钟周期
moduleBaTB();
regClk;
regRst_n;
regKEY1,KEY2;
wire[15:
project_bau0(
.Clk(Clk),
.Rst_n(Rst_n),
.KEY1(KEY1),
.KEY2(KEY2),
.LED(LED));
initial
beginClk=0;
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;
#(`clk_period*100);
KEY1=1;
KEY1=1;
KEY2=0;
endmodule
2、仿真波形
可以看到始终给Key1施加高电平时钟信号,Led灯高电平始终向1方向led灯方向移动,由此可得仿真成功。
3、问题与分析
在仿真成功后来生成比特流文献时始终显示错误无法成功,之后在请教其她同窗后来,共同分析后发现,一开始设计中数码管模块无法在结束后相应显示,于是便删除了数码管模块,在led移动到一端后便是游戏结束标志。
4、成果
在分析出问题兵解决之后,将程序烧写到fpga开发板上,设计功能都能实现,于是上板验证也成功。
三、心得体会
一开始接触这个课题时候,不懂得怎么下手,通过其她同窗解说以及查找资料基本理解了拔河游戏机设计原理。
通过这次课程设计,我更加感到理论和实际之间差别很大。
我也越来越强烈地感到要掌握一项技术,唯一办法也是最佳办法就是实践。
只有通过实践才干将课本上知识应用,也只有实践才干发现诸多问题,真正掌握知识,学以致用。
虽然遇到问题诸多,但是同步得到诸多有用经验。
这些对于后来学习和工作均有很大协助。
四、参照文献
[1]夏宇闻,Verilog数字系统设计教程,北京航天航空大学出版社,
[2]王金明,数字系统设计与VerilogHDL,北京电子工业出版社,
[3]潘松,EDA技术实用教程,北京科学出版社,
附录
实物板级验证图:
1、左边队员胜利
2、右边队员胜利
3、清零重置
4、源代码
module
project_ba(
Clk,Rst_n,KEY1,KEY2,
LED);
input