《数字电子技术A》 课程设计报告
题目 授课教师 向乾尹 课程助教 曾思杰 课程代码 3045600 冒险游戏有限状态机设计 教学班 2 学年度 2015-2016(A) 成绩比例 10% 综合评价(助教) 项目分工情况说明(学生填写) 组长 组员1 姓名 汤朋 单源超 学号 2014112217 2014112212 班级 软件四班 软件四班 在课题中的分工与贡献(100字内) 电路设计+仿真验证+引脚分配 +下载开发板验证 录制视频+ppt制作+实测照片 画状态转移图+状态转换表+写总结心得与建议 状态编码+状态机的激励方程、输出方程+检查自启动能力、输出信号、误输出等 组员2 朱浩楠 2014112219 软件四班 组员3 马昊 2014112210 软件四班 报告正文
格式注意:正文字体为宋体小四,行距1.25,段落设置首行缩进2个字符。
一、状态机理论设计
1. Room FSM完整的状态转移图(状态转移图要求用visio画出,可直接拷贝到word中。必须图文并茂,对补充的内容进行阐述说明)
1.ROOM状态图
2.SWORD状态图
2. 状态转换表
ROOM FSM状态表
输入 reset 1 0 0 0 0 0 0 0 0 0 0 0 n x 0 0 0 0 0 0 0 1 0 0 0 s x 0 1 0 0 0 0 0 0 0 0 0 e x 1 0 0 1 1 1 0 0 0 0 0 w x 0 0 1 0 0 0 1 0 1 0 0 v x x x 0 1 1 0 x x 1 0 1 现次态 态 Sn Sn+1 cc tt cc cc 1 0 cc tt 0 1 tt rr 0 0 rr ss 0 0 ss rr 0 0 rr dd 0 0 rr dd 0 0 tt cc 1 0 rr tt 0 1 rr ss 0 0 dd gg 0 0 dd vv 0 0 输出 rr 0 0 1 0 1 0 0 0 0 0 0 0 ss 0 0 0 1 0 0 0 0 0 1 0 0 dd 0 0 0 0 0 1 1 0 0 0 0 0 vv 0 0 0 0 0 0 0 0 0 0 0 1 gg win dead sw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 SWORD FSM状态表
注:注意列表时未涉及的状态可不列,以减小表格规模!
3. 状态编码方案及状态转换真值表
采用“一对一”编码方案。以7个D触发器表示状态,现态为Q6n,Q5n,Q 4n ,Q3n,Q2n,Q1n,Q0n 输 入信号为reset,n,s,w,e,v。次态为Q6n+1(cc),Q5n+1(tt),Q4n+1(rr) ,Q3n+1(ss) ,Q2n+1(dd),Q1n+1(vv),Q0n+1(gg)。win,dead,sw作为输出。
列出状态转换真值表如下
4. 触发器激励方程、输出方程,自启动能力及误输出检查更正¯
得到7个D触发器的激励方程组
D6=Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w +reset
D5= Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w + Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w D4=Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w+ Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v D3=Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v+ Q6n Q5n Q4n Q3nQ2n Q1n Q0n reset n s e w v D2=Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v+ Q6n Q5n Q4n Q3nQ2n Q1n Q0n reset n s e w v
D1=Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v+ Q6n Q5n Q4n Q3nQ2n Q1n Q0n reset n s e w v D0=Q6 Q5 Q4 Q3 Q2 Q1 Q0 reset n s e w v
输出方程为
win=Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v+ Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v+ Q6n Q5n Q4n Q3nQ2n Q1n Q0n reset n s e w v
dead= Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v+ Q6n Q5n Q4n Q3nQ2n Q1n Q0n reset n s e w v
sw= Q6n Q5n Q4n Q3n Q2n Q1n Q0n reset n s e w v
有效编码状态有:1000000、0100000、0010000、0001000、0000100、0000010、0000001. 其他无效编码要么为全0要么至少含有两个1,当进入无效态时,根据输出方程可以看出,win = 0 ,dead = 0 , sw = 0,所以没有误输出。然而当状态进入0000000时,D6D5D4D3D2D1 D0 全为 0,不具备自启动能力,所以我们通过将 reset = D6+D5+D4+D3+D2+D1+D0 的当进入全0状态时,reset为1,重置为初始态。而其他态至少有两个1,进入这些状态后,在下一个时钟沿后都进入全0态(在Verilog中通过case中的default语句实现),最后进入初始态。所以此时就具备了自启动能力。
二、电路设计(此部分默认要求是用D触发器和逻辑门在Quartus中进行电路设计,也可用VERILOG HDL进行编程设计)
ROOM FSM
module T175066(input clk ,n,s,e,w,v,reset,output reg cc,tt,rr,ss,dd,vv,gg,win,dead,sw);
reg[6:0] temp ; integer flag = 0; initial begin cc <= 1'b1; tt <= 1'b0; rr <= 1'b0; ss <= 1'b0; dd <= 1'b0;
n
n
n
n
n
n
n
vv <= 1'b0; gg <= 1'b0; win <= 1'b0; dead <=1'b0; sw <= 1'b0;
temp <= {cc,tt,rr,ss,dd,vv,gg}; end
always @ (posedge clk) begin if(reset) else
begin case(temp)
7'b1000000:
if(e) begin cc <= 1'b0; tt <= 1'b1; end else; 7'b0100000:
if(w) begin cc <= 1'b1; tt <= 1'b0; end else if(s) begin tt <= 1'b0; rr <= 1'b1; end
else ;
7'b0010000: begin cc <= 1'b1; tt <= 1'b0; rr <= 1'b0; ss <= 1'b0; dd <= 1'b0; vv <= 1'b0; gg <= 1'b0; win <= 1'b0; dead <= 1'b0; sw <= 1'b0;
temp <= {cc,tt,rr,ss,dd,vv,gg}; end
else ;
7'b0001000:
if(e) begin ss <= 1'b0; rr <= 1'b1; end else ; 7'b0000100: if(v)
begin vv <= 1'b1; dd <= 1'b0; win <= 1'b1; dead <= 1'b0;end else begin gg <= 1'b1; dd <= 1'b0; win <= 1'b0; dead <= 1'b1;end 7’b0000010: begin win <= 1’b1; dead <= 1’b0; end
7’b0000001: begin win <= 1’b0; dead <= 1’b1; end
default: flag = 1;
endcase
temp <= {cc,tt,rr,ss,dd,vv,gg}; end
if(flag == 1) begin temp <= 0; flag = 0; end
if(temp == 0) reset <= 1;
end Endmodule
if(n) begin tt <= 1'b1; rr <= 1'b0; end else if(e) begin dd <= 1'b1; rr <= 1'b0 ; end
else if(w) begin ss <= 1'b1; rr <= 1'b0; sw <= 1'b1;end
SWORD FSM
module N175066(output reg v,input sw,reset,clk); always @ (posedge clk) begin if(reset) end endmodule
v <= 1'b0;
v <= 1'b1;
else if(sw)
else v <= 1'b0;
三、仿真验证与引脚分配(图文并茂,要有分析/说明)
1. 仿真激励设计说明
① 通过reset1、reset2置为1,初始化所有状态。
② 初始化处于cc(洞穴)(cc为1,其他位置都为0),然后置e为1,向东走到tt(隧道)(tt为1,其他为0,以下类似,不再累赘)。
③ 再向南走s = 1,到达rr(河流)。
④ 如果再向东走(e = 1)没有拿到宝剑(sw = 0),到达dd(龙穴),由于v = 0则玩家被杀死扔到gg(墓地),win = 0 ,dead = 1,游戏结束。如下图一所示。
⑤ 如果向西走(w = 1),到达ss(剑阁)获得宝剑(sw = 1) 。 ⑥ 向东走(e = 1),到达rr(河流)。
⑦ 再向东走(e = 1) , 到达dd(龙穴),因为 v = 1,则成功杀死龙,到达vv(穹顶)获胜,win = 1, dead = 0,游戏结束。如下图二所示
另外可以在游戏途中没收玩家的剑,通过reset2 = 1 ,将 v 置为0。如下图三所示,在玩家获得宝剑后,没收,然后玩家再向东走,没有宝剑则被龙杀死。 2. 仿真结果
仿真波形图:
图一
图二
图三
3. FPGA引脚分配图
4. 实测照片
房间一(the Cave of Cacophony、洞穴)
房间二(the Twisty Tunnel、隧道)
房间三(the Rapid River、河流)
房间四(the Secret Sword Stash、剑阁)
房间五(the Dragon Den、龙穴)
房间六(the Victory Vault、穹顶)
房间七(the Grievous Graveyard、墓地)
四、总结、心得与建议
经过艰辛的探索与不懈的努力,灭龙团队克服重重困难,最终完成了本次课程设计。最终的产品虽然有进一步优化的空间,但确实可以提高我们自己动手的能力,让我们的学习得到了实际的检验。通过本次课程设计,我们团队已初步具有了设计能力,相信在今后更加艰苦的学习过程中,也可以运用这项技能让自己如鱼得水。本次课程设计中,不足之处在于对时钟频率的把握不够充分,也发现了在学习过程中自己的一些不足。这个游戏设计的还算到位,所以对我们今后的学习和工作发展打下了坚实的基础,对我们的团队协作能力也有了一定的要求。
在下载到开发板的过程中,我们遇到了许多问题。首先,下载之后存在一些错误 。处理错误之后,发现实际功能并不能和我们之前设想的那样完全吻合。所以在实验室,我们又进行了非常大的改动。这让我们认识到设计师的重要性。做一个产品,在动手制作之前有一个好的设
计是非常必要的。失败的产品未必失败在技术上,而是失败在了产品设计上。好在灭龙团队的工程师们要么学识渊博,要么内涵丰富,最终,我们击败了龙,完成了实验。
当然,也希望实验室可以打造更强大的设备,让我们可以更加灵活的发挥。在游戏设计中,我们发现实验室的电路板并不能很好的反映游戏中的东西南北等地理位置。而在造作过程中,也会存在操作比较抽象,设计出的游戏不能很好的让用户理解等缺点。所以我们在设计过程中,尽量优化游戏的显示方式,力求让游戏更友好,更美观的呈现在用户面前。所以对本次实验设计比较满意。
因篇幅问题不能全部显示,请点此查看更多更全内容