西安郵電大学
数字控制系统课程设计报告书
院(系)名称 : 学生姓名 : 专业名称 : 班
级 : 时
自 动 化 学 院
自动化 自动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.
四、软件设计: 源程序
module paobiao(clk,rst,pause,save,mg,md,bg,bd);//秒高,秒低,百分秒高,百分秒低
input clk,rst,pause,save;
output reg [3:0] mg,md,bg,bd; reg [15:0] zd,zz,zg;//中间变量 reg [17:0] count1; reg clk1;//100ms reg pause_temp,save_temp;//取上升沿 reg [13:0] count2,reg0,reg1,reg2,reg3,reg4,reg5; reg [2:0] count3;// reg [1:0] state,next_state; reg cn1; parameter S0=2\'b00,S1=2\'b01,S2=2\'b11; //分频
always @(posedge clk or negedge rst)
begin if(!rst) count1
else if(count1==200000) count1
else count1
end
always @(posedge clk ) begin if(!rst) clk1
end //总计时
always @(negedge clk1 or negedge rst)//clk1 begin if(!rst) count2
else if(state==S1) count2
// else if(state==S2) count2
else count2
//存储个数计数
always @(negedge rst or negedge save) begin if(!rst)
count3
else if (next_state==S1)
count3
else if (next_state==S2)
count3
else count3
end
//毫秒低位显示结果
always @(negedge rst or posedge clk) begin
if(!rst)
bd
else if(state==S1) bd
else if(state==S2)
begin case (count3)
3\'b000: bd
3\'b001: bd
3\'b010: bd
3\'b011: bd
3\'b100: bd
3\'b101: bd
default:
bd
endcase
end
else
bd
end
//毫秒高位显示结果
always @(negedge rst or posedge clk) begin
if(!rst)
bg
else if(state==S1)
bg
else if(state==S2)
begin case (count3)
3\'b000: bg
3\'b001: bg
3\'b010: bg
3\'b011: bg
3\'b100: bg
3\'b101: bg
default:
bg
endcase
end
else
bg
end
//秒位显示结果
always @(negedge rst or posedge clk) begin
if(!rst)
md
else if(state==S1) md
else if(state==S2)
begin
case (count3)
3\'b000: md
3\'b001: md
3\'b010: md
3\'b011: md
3\'b100: md
3\'b101: md
default:
md
endcase end
else
md
//十秒位显示结果
always @(negedge rst or posedge clk)
begin
if(!rst)
mg
else if(state==S1) mg
else if(state==S2)
begin
case (count3)
3\'b000: mg
3\'b001: mg
3\'b010: mg
3\'b011: mg
3\'b100: mg
3\'b101: mg
default:
mg
endcase
end
else
mg
end
always @(negedge rst or posedge clk)//定义当前状态
begin if(!rst) state
else
state
end
//状态转移
always @(state or pause or
pause_temp ) begin
case (state)
S0:begin if(pause==0&&pause_temp==1) next_state
else next_state
end
S1:begin if(pause==0&&pause_temp==1) next_state
else next_state
S2:begin if(pause==0&&pause_temp==1) next_state
else next_state
default:next_state
endcase
end
//存数
always@(negedge rst or negedge save ) begin if(!rst) begin
reg0
else
begin if(count3==0) reg0
else if(count3==1) reg1
else if(count3==2) reg2
else if(count3==3) reg3
else if(count3==4) reg4
else if(count3==5) reg5
else begin reg0
reg3
end end
//取启停键上升沿 always @(posedge clk ) begin if(!rst) pause_temp
else
pause_temp
end
//取保存翻看上升沿
always @(posedge clk ) begin if(!rst) save_temp
else
save_temp
endmodule
2.测试程序
module paobiao_tp; reg clk,rst,pause,save; wire[3:0] mg,md,bg,bd; parameter DELY=10; paobiao u1(clk,rst,pause,save,mg,md,bg,bd); always #(DELY/2)
clk=~clk; initial
begin clk=0;pause=0;save=0;rst=0;
#DELY rst=1;save=0;pause=0;
#DELY pause=1;
#DELY pause=0;
#DELY save=1; end endmodule
五、实验结果 1.仿真图像
2.硬件电路显示
六、个人完成工作及心得体会
我们组设计的是数字跑表,我负责画状态图和系统程序和仿真。画状态图时由于对状态机理解不到位,画的状态图有点问题,后来经老师指导改正了;我负责写仿真测试程序,这需要对源程序的输入输出很清晰,对其暂停、启停、存储、回显的掌握;再就是系统仿真,先在modelsim 上仿真,出来波形后再在开发板上仿真,刚开始程序分频、计数输出都有问题,后来逐项排除错误代码,仿真才出来。
课设过程中,我学到了很多关于Verilog的知识,比如写程序要注意的分频、计数、输入输出等问题,仿真时要注意时间长短的选择、进制间的转换等等,还有最后往开发板下载程序时注意的问题等。认识比较深刻的是:一个小组,只有相互帮助、团结努力,才能很好地完成任务。