简易数字跑表设计.docx
《简易数字跑表设计.docx》由会员分享,可在线阅读,更多相关《简易数字跑表设计.docx(9页珍藏版)》请在冰豆网上搜索。
简易数字跑表设计
西安邮电大学
数字控制系统课程设计报告书
学生姓名:
自动化
专业名称:
自动1103
2014年9月1日至2014年9月12日
乘法器设计
一、设计要求:
计时精度10ms,计时范围59.99秒。
(1)对单人计时,能实现暂停、显示及清零功能,在数码管上
实时显示,设置启动/暂停、清零按键;
(2)对多个人同时计时,在数码管上实时显示,并能回显出六
个时间。
可控制显示,设置清零、取时按键;
(3)采用状态机设计;
(4)百分秒在数码管上实时显示,秒利用多个数码管显示BCD
值。
二、设计过程:
1.方案设计:
1)画状态图:
按键
状态
输出
复位:
00
开始:
S0
清零:
z=0;
启/停:
01
计数:
S1
不清零:
z=1;
存/回显:
10
暂停:
S2
存/回显:
S3
2)写程序:
在一个module模块里,有多个always块;有分频、计数、存储、输出等模块;测试模块的输入输出与源程序的输入输出相反;
2.系统仿真:
Verilog仿真所需仿真环境:
modelsim
3.管脚配置:
1.
四、软件设计:
源程序
秒高,秒
modulepaobiao(clk,rst,pause,save,mg,md,bg,bd);//
低,百分秒高,百分秒低
inputclk,rst,pause,save;
outputreg[3:
0]mg,md,bg,bd;
reg[17:
0]count1;
regclk1;//100ms
regpause_temp,save_temp;//取上升沿
reg[13:
0]count2,reg0,reg1,reg2,reg3,reg4,reg5;
reg[2:
0]count3;//
reg[1:
0]state,next_state;
regcn1;
parameterS0=2'b00,S1=2'b01,S2=2'b11;
//分频
always@(posedgeclkornegedgerst)
beginif(!
rst)count1<=0;
elseif(count1==200000)count1<=0;//200000elsecount1<=count1+1;
endalways@(posedgeclk)beginif(!
rst)clk1<=0;
elseif(count1==99999)clk1<=~clk1;//99999
elseclk1<=clk1;
end
//总计时
always@(negedgeclk1ornegedgerst)//clk1
beginif(!
rst)count2<=0;
elseif(state==S1)count2<=count2+1;
//elseif(state==S2)count2<=count2;
elsecount2<=count2;
end
//存储个数计数
always@(negedgerstornegedgesave)
beginif(!
rst)count3<=0;
elseif(next_state==S1)count3<=count3+1;
elseif(next_state==S2)count3<=count3-1;
elsecount3<=count3;
end
//毫秒低位显示结果
always@(negedgerstorposedgeclk)
beginif(!
rst)bd<=0;
elseif(state==S1)bd<=count2%10;
elseif(state==S2)begincase(count3)
3'b000:
bd<=reg0%10;
3'b001:
bd<=reg1%10;
3'b010:
bd<=reg2%10;
3'b011:
bd<=reg3%10;
3'b100:
bd<=reg4%10;
3'b101:
bd<=reg5%10;
default:
bd<=reg0%10;
endcase
end
else
bd<=bd;
end
//毫秒高位显示结果
always@(negedgerstorposedgeclk)
beginif(!
rst)bg<=0;
elseif(state==S1)bg<=(count2/10)%10;
elseif(state==S2)begincase(count3)
3'b000:
bg<=(reg0/10)%10;
3'b001:
bg<=(reg1/10)%10;
3'b010:
bg<=(reg2/10)%10;
3'b011:
bg<=(reg3/10)%10;
3'b100:
bg<=(reg4/10)%10;
3'b101:
bg<=(reg5/10)%10;
default:
bg<=(reg0/10)%10;
endcase
else
endbg<=bg;
end
//秒位显示结果
always@(negedgerstorposedgeclk)
beginif(!
rst)md<=0;
elseif(state==S1)md<=(count2/100)%10;
elseif(state==S2)
begin
case(count3)
endcaseend
elsemd<=md;
end
//十秒位显示结果
always@(negedgerstorposedgeclk)
beginif(!
rst)mg<=0;
elseif(state==S1)mg<=(count2/1000)%10;
elseif(state==S2)
begin
case(count3)
endcase
end
elsemg<=mg;
end
always@(negedgerstorposedgeclk)//定义当前状态
elsestate<=next_state;
end
//状态转移
always@(stateorpauseorpause_temp)
begin
case(state)
S0:
beginif(pause==0&&pause_temp==1)
next_state<=S1;
elsenext_state<=S0;
end
S1:
beginif(pause==0&&pause_temp==1)next_state<=S2;
elsenext_state<=S1;end
S2:
beginif(pause==0&&pause_temp==1)next_state<=S1;
elsenext_state<=S2;end
default:
next_state<=S0;
endcase
end
//存数
always@(negedgerstornegedgesave)
beginif(!
rst)begin
reg0<=0;reg1<=0;reg2<=0;reg3<=0;
reg4<=0;reg5<=0;end
else
beginif(count3==0)reg0<=count2;
elseif(count3==1)reg1<=count2;
elseif(count3==2)reg2<=count2;
elseif(count3==3)reg3<=count2;
elseif(count3==4)reg4<=count2;
elseif(count3==5)reg5<=count2;
elsebeginreg0<=0;reg1<=0;reg2<=0;
reg3<=0;reg4<=0;reg5<=0;end
end
end
//取启停键上升沿
always@(posedgeclk)
beginif(!
rst)pause_temp<=0;
elsepause_temp<=pause;
end
//取保存翻看上升沿
always@(posedgeclk)
beginif(!
rst)save_temp<=0;
elsesave_temp<=save;
endendmodule2.测试程序
modulepaobiao_tp;
regclk,rst,pause,save;
wire[3:
0]mg,md,bg,bd;
parameterDELY=10;
paobiaou1(clk,rst,pause,save,mg,md,bg,bd);
always#(DELY/2)clk=~clk;
initial
beginclk=0;pause=0;save=0;rst=0;
#DELYrst=1;save=0;pause=0;
#DELYpause=1;
#DELYpause=0;
#DELYsave=1;
end
endmodule
五、实验结果
1.仿真图像
2.硬件电路显示六、个人完成工作及心得体会
我们组设计的是数字跑表,我负责画状态图和系统程序和仿真。
画状态图时由于对状态机理解不到位,画的状态图有点问题,后来经老师指导改正了;我负责写仿真测试程序,这需要对源程序的输入输出很清晰,对其暂停、启停、存储、回显的掌握;再就是系统仿真,先在modelsim上仿真,出来波形后再在开发板上仿真,刚开始程序分频、计数输出都有问题,后来逐项排除错误代码,仿真才出来。
课设过程中,我学到了很多关于Verilog的知识,比如写程序要注意的分频、计数、输入输出等问题,仿真时要注意时间长短的选择、进制间的转换等等,还有最后往开发板下载程序时注意的问题等。
认识比较深刻的是:
一个小组,只有相互帮助、团结努力,才能很好地完成任务。