哈工大数电自主设计实验免试报告模板Word文档下载推荐.docx
《哈工大数电自主设计实验免试报告模板Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《哈工大数电自主设计实验免试报告模板Word文档下载推荐.docx(27页珍藏版)》请在冰点文库上搜索。
(2)游戏初始模块
该模块有三个输入和一个输出,输入端clk和reset分别为时钟和复位功能,输入端switch为五位开关输入,用来选择本次游戏所需的游戏对应答案顺序。
输出端judge_array输出一组16位二进制数用以表示对应顺序,输出到判断按键模块供其判断答案正误。
(3)提示灯模块
该模块有四个输入和一个输出,输入端reset为复位功能开关,输入端clk_delay为clk_mod提供的3s周期时钟驱动,输入端led2和step_num_out都由下面将要介绍的判断按键模块输出提供,用以判断当前游戏胜利或失败状态,led2判断胜利,step_num_out判断失败,然后根据当前状态处于游戏中或游戏胜利或游戏失败由输出端led1输出不同提示灯状态。
游戏中亮相应灯,游戏胜利灯全亮,游戏失败灯全灭。
(4)判断按键模块
该模块有六个输入和两个输出,输入端clk为时钟输入,输入端reset为复位功能开关,输入端clk_delay为clk_mod提供的3s周期时钟驱动,用以判断是否新点亮一盏灯,从而使按键处于按下有效状态,从而实现每次亮灯只能按下一次按键有效,输入led1、judge_array、key为提示灯状态、对应顺序、按键状态三者,从而判断答案正误。
输出端led2为答案显示灯,输出端step_num_out为操作步数输出,输出到led_mod用于判断,输出到数码管显示模块用于显示操作步数。
(5)数码管显示模块
该模块有四个输入端和两个输出端,输入端clk为时钟输入,输入端reset为复位功能开关,输入端clk_delay_2ms为clk_mod提供的2ms周期时钟驱动,输入step_num_in为操作步数输入,输出端seg_num_out为数码管段选,输出端seg_pos_out为数码管位选。
(6)顶层模块连接图
该图显示了各个模块的连接关系,与上面的各个介绍一致。
整体输入有clk时钟,switch开关,reset复位开关,用户按键key,输出为数码管、led灯。
4.仪器设备名称、型号和技术指标
Basys2开发板1块
PC1台
ISE13.4开发平台及仿真工具
5.理论分析或仿真分析结果
下面,我将分模块进行假定用户输入下的仿真。
(1)时钟分频模块仿真
由上图可以看出每2ms,clk_delay_2ms的波形会出现一个峰值,仿真结果正确。
由上图可以看出每3s,clk_delay的波形会出现一个峰值,仿真结果正确。
(2)游戏初始模块仿真
假定switch输入为五位二进制数01010,可以看到输出judge_array输出一组十六位二进制数010*********,仿真结果正确。
(4)整体仿真
提示灯模块、判断按键模块属于整体游戏过程,数码管模块属于显示输出,这三个模块需要其他模块驱动,故与整体一起仿真。
设定假设用户输入如上图,假设用户按键为按下第三个键。
通过以上验证可以看出,switch为00000时,理论对应关系应为当led1为0010时,按键0010为正确答案,此时led2变为0010,仿真结果正确;
6.详细实验步骤及实验测量数据记录
实验步骤如下:
1.了解verilog语言语法及设计方法
2.设计游戏规则
3.根据游戏规则及verilog语法设计相应模块
4.了解basys2开发板结构,决定输入输出控制
5.编写基本游戏过程代码
6.通过综合工具调试代码
7.下载至basys2开发板进行调试
8.完善更多细节功能,通过实践发现bug,分析bug原因加以改进
9.最终调试及检测
7.实验结论
实现了设计的全部功能,以下是成果展示:
游戏失败照片
游戏胜利照片
游戏过程中照片
8.实验中出现的问题及解决对策
我将本次实验的问题分为两类,一类是程序逻辑设计上的问题,一类是开发板及verilog语言使用上的问题下面逐一介绍:
1.本次实验过程中,由于第一次上手,遇到了很多的问题,开发板使用方面,在程序设计时遇到了很多的警告与错误,下面是我总结的我的常见错误:
(1)不同always语句中对同一变量赋值操作;
(2)顶层模块调用时,各模块中间的输入输出需要定义wire,且注意命名不能出错;
(3)注意数制,输入数时均按照二进制位数输入;
(4)调用case,if语句时记得end终止;
(5)调用case,if语句时,用不上的条件情况最好也加以说明,哪怕default后加空语句,可减少不必要的警告。
2.游戏逻辑设计上的问题
(1)如何使每局游戏对应关系唯一?
使用了一个标志量,只有reset时使标志量重置,一旦产生对应关系,则利用标志量使模块不再产生新的对应关系。
(2)如何使一次亮灯后只有一次按键有效?
同样使用标志量,只有新的灯亮后,标志量重置,使按键有效。
(3)如何判断游戏胜利、失败和游戏状态?
令led_mod和和judge_mod互相输入对方模块的输出,达到模块间信息交互,从而判断各种状态。
9.本次实验的收获和体会、对电路实验室的意见或建议
通过本次实验,熟悉了通过verilog语言在ISE平台编写调试程序并下载到fpga实验的整体流程,深入了解了verilog模块化编程的思想与可编程逻辑器件的编程思想。
通过这次实验,不仅是对fpga,对于数电这门也有了新的认识,同时初步了解fpga的设计方法,对于以后也有很大的帮助。
建议实验室开设更多培训,可以提供一些常用的的外设,让我们可以设计并完成更多样实验。
10.参考文献
[1]
沈涛,李传志,张小平,李斌.Xilinx
FPGA/CPLD设计初级教程[M].西安电子科技大学出版社,2009.
[2]杜勇.FPGA/VHDL设计入门与进阶[M].机械工业出版社,2011.
[3]周兴华.手把手教你学CPLD/FPGA与单片机联合设计[M].北京航空航天大学出版社,2010.11.
附录I本次实验代码
moduletest77(
inputclk,
inputreset,
input[4:
0]switch,
output[3:
0]seg_pos_out,
output[6:
0]seg_num_out,
input[3:
0]key,
output[7:
4]led1,
0]led2
);
wireclk_delay_w;
wire[5:
0]step_num_out_w;
wire[16:
1]judge_array_w;
wireclk_delay_2ms_w;
clk_modclk_mod(
.clk(clk),
.reset(reset),
.clk_delay(clk_delay_w),
.clk_delay_2ms(clk_delay_2ms_w)
start_modstart_mod(
.switch(switch),
.judge_array(judge_array_w)
segment_modsegment_mod(
.step_num_in(step_num_out_w),
.clk_delay_2ms(clk_delay_2ms_w),
.seg_pos_out(seg_pos_out),
.seg_num_out(seg_num_out)
led_modled_mod(
.clk_delay(clk_delay_w),
.step_num_out(step_num_out_w),
.led2(led2),
.led1(led1)
judge_modjudge_mod(
.led1(led1),
.key(key),
.judge_array(judge_array_w),
.step_num_out(step_num_out_w)
endmodule
//------------时钟分频模块--------------------------------------------------
moduleclk_mod(
outputclk_delay,
outputclk_delay_2ms
reg[32:
1]time_delay;
1]time_cal=0;
1]time_delay1;
1]time_cal1=0;
regclk_delay_out=0;
regclk_delay_2ms_out=0;
always@(posedgeclk)
begin
if(reset)begin
//
end
else
begin
time_delay=150000000;
time_delay1=100000;
time_cal=time_cal+1;
time_cal1=time_cal1+1;
if(clk_delay_out==1)begin
clk_delay_out=0;
end
if(time_cal==time_delay)begin
clk_delay_out=1;
time_cal=0;
if(clk_delay_2ms_out==1)begin
clk_delay_2ms_out=0;
if(time_cal1==time_delay1)begin
clk_delay_2ms_out=1;
time_cal1=0;
end
assignclk_delay=clk_delay_out;
assignclk_delay_2ms=clk_delay_2ms_out;
//------------游戏开始产生对应关系--------------------------------------
modulestart_mod(
0]switch,
output[16:
1]judge_array
reg[4:
0]rand_status;
reg[16:
1]judge_array_out;
begin
if(reset)begin
end
else
begin
rand_status=switch[4:
0];
case(rand_status)
0:
beginjudge_array_out<
=16'
h8421;
end
1:
h8412;
2:
h8241;
3:
h8214;
4:
h8142;
5:
h8124;
6:
h4812;
7:
h4821;
8:
h4281;
9:
h4218;
10:
h4182;
11:
h4128;
12:
h2841;
13:
h2814;
14:
h2481;
15:
h2418;
16:
h2184;
17:
h2148;
18:
h1842;
19:
h1824;
20:
h1482;
21:
h1428;
22:
h1284;
default:
h1248;
endcase
assignjudge_array=judge_array_out;
//-----------------随机亮提示灯-----------------------------------------
moduleled_mod(
inputclk_delay,
0]led2,
input[6:
0]step_num_out,
4]led1
);
reg[1:
0]rand_led;
reg[3:
0]led_temp;
0]led_in;
reg[6:
0]step_num=0;
reg[31:
0]rand_num=32'
b1101_1010_0110_1011_0010_1001_1011_0100;
always@(posedgeclk_delay)
begin
rand_num<
=rand_num>
>
1;
rand_num[31]<
=rand_num[0];
always@(posedgeclk_delayorposedgereset)
led_temp<
=4'
b0000;
elsebegin
led_in=led2;
step_num=step_num_out;
if(led_in==4'
b1111)begin
b1111;
end
elseif(step_num>
39)begin
elsebegin
rand_led=rand_num[7:
6];
case(rand_led)
beginled_temp<
b0001;
b0010;
b0100;
b1000;
endcase
end
assignled1[7:
4]=led_temp;
endmodule
//-----------------判断按键正误--------------------------------------------
modulejudge_mod(
input[7:
4]led1,
input[16:
1]judge_array,
0]step_num_out
regflag=0;
0]led_answer=4'
0]led_temp_out;
0]step_num=7'
d0;
led_answer<
step_num=7'
else
if(step_num>
6'
d40)begin
if(clk_delay==1)begin
flag<
=1;
if(led_answer<
4'
step_num=step_num+1;
if(flag==1)begin
if(key>
b0000)begin
led_temp_out=led1;
case(led_temp_out)
4'
b0001:
if(judge_array[4:
1]==key)begin
if({led_temp_out&
led_answer}>
0&
&
step_num>
0)begin
step_num=step_num-1;
end
led_answer<
=led_answer|led_temp_out;
else
begin
if({led_temp_out&
step_num=step_num+1;
b0010:
if(judge_array[8:
5]==key)begin
b0100:
if(judge_array[12:
9]==key)begin
b1000:
if(judge_array[16:
13]==key)begin
if({led_temp_out