简易数字跑表设计.docx

上传人:b****1 文档编号:2006569 上传时间:2023-05-02 格式:DOCX 页数:12 大小:257.23KB
下载 相关 举报
简易数字跑表设计.docx_第1页
第1页 / 共12页
简易数字跑表设计.docx_第2页
第2页 / 共12页
简易数字跑表设计.docx_第3页
第3页 / 共12页
简易数字跑表设计.docx_第4页
第4页 / 共12页
简易数字跑表设计.docx_第5页
第5页 / 共12页
简易数字跑表设计.docx_第6页
第6页 / 共12页
简易数字跑表设计.docx_第7页
第7页 / 共12页
简易数字跑表设计.docx_第8页
第8页 / 共12页
简易数字跑表设计.docx_第9页
第9页 / 共12页
简易数字跑表设计.docx_第10页
第10页 / 共12页
简易数字跑表设计.docx_第11页
第11页 / 共12页
简易数字跑表设计.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

简易数字跑表设计.docx

《简易数字跑表设计.docx》由会员分享,可在线阅读,更多相关《简易数字跑表设计.docx(12页珍藏版)》请在冰点文库上搜索。

简易数字跑表设计.docx

简易数字跑表设计

西安郵電大学

数字控制系统课程设计报告书

 

院(系)名称

自动化学院

学生姓名

专业名称

自动化

班级

自动1103

时间

2014年9月1日至2014年9月12日

乘法器设计

1、设计要求:

计时精度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.

 

4、软件设计:

源程序

modulepaobiao(clk,rst,pause,save,mg,md,bg,bd);//秒高,秒低,百分秒高,百分秒低

inputclk,rst,pause,save;

outputreg[3:

0]mg,md,bg,bd;

reg[15:

0]zd,zz,zg;//中间变量

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;//200000

elsecount1<=count1+1;

end

always@(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

elsebd<=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

end

elsebg<=bg;

end

//秒位显示结果

always@(negedgerstorposedgeclk)

beginif(!

rst)md<=0;

elseif(state==S1)md<=(count2/100)%10;

elseif(state==S2)

begin

case(count3)

3'b000:

md<=(reg0/100)%10;

3'b001:

md<=(reg1/100)%10;

3'b010:

md<=(reg2/100)%10;

3'b011:

md<=(reg3/100)%10;

3'b100:

md<=(reg4/100)%10;

3'b101:

md<=(reg5/100)%10;

default:

md<=(reg0/100)%10;

endcase

end

elsemd<=md;

end

//十秒位显示结果

always@(negedgerstorposedgeclk)

beginif(!

rst)mg<=0;

elseif(state==S1)mg<=(count2/1000)%10;

elseif(state==S2)

begin

case(count3)

3'b000:

mg<=(reg0/100)%10;

3'b001:

mg<=(reg1/100)%10;

3'b010:

mg<=(reg2/100)%10;

3'b011:

mg<=(reg3/100)%10;

3'b100:

mg<=(reg4/100)%10;

3'b101:

mg<=(reg5/100)%10;

default:

mg<=(reg0/100)%10;

endcase

end

elsemg<=mg;

end

always@(negedgerstorposedgeclk)//定义当前状态

beginif(!

rst)state<=S0;//异步复位,S0为初始状态

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;

end

endmodule

2.测试程序

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的知识,比如写程序要注意的分频、计数、输入输出等问题,仿真时要注意时间长短的选择、进制间的转换等等,还有最后往开发板下载程序时注意的问题等。

认识比较深刻的是:

一个小组,只有相互帮助、团结努力,才能很好地完成任务。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2