可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx
《可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx》由会员分享,可在线阅读,更多相关《可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx(14页珍藏版)》请在冰豆网上搜索。
可编程式逻辑器件设计试验报告期末报告出租车计费器
昆明理工大学信息工程与自动化学院学生实验报告
(2012———2013学年第2学期)
课程名称:
可编程逻辑器件开课实验室:
信自楼5042013年5月31日
年级、专业、班
计科102班
学号
2010104052
姓名
成绩
实验项目名称
出租车计费器
指导教师
江虹
教师评语
该同学是否了解实验原理:
A.了解□B.基本了解□C.不了解□
该同学的实验能力:
A.强□B.中等□C.差□
该同学的实验是否达到要求:
A.达到□B.基本达到□C.未达到□
实验报告是否规范:
A.规范□B.基本规范□C.不规范□
实验过程是否详细记录:
A.详细□B.一般□C.没有□
教师签名:
年月日
一、试验设计要求
设计一个出租车计费器,能按路程计费,具体要求如下所述:
1)实现计费功能,计费标准为:
按行驶里程计费,起步价6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每km加收50%的车费,车辆停止和暂停时不计费。
2)现场模拟汽车的起动、停止、暂停和换挡等状态。
3)设计数码管动态扫描电路,将车费和路程显示出来,各有两位小数。
二、试验设计原理
(1)设计该出租车有起动键、停止键、暂停键和档位键。
起动键为脉冲触发信号,当其为一个脉冲时,表示汽车已起动,并根据车速的选择和基本车速发出响应频率的脉冲(计费脉冲)以此来实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;档位键用于改变车速,不同的档位对应着不同的车速,同时路程计数的速度也不同。
出租车计费器可分为两大模块,即控制模块和译码显示模块。
系统框图如下所示。
控制模块实现了计费和路程的计数,并且通过不同的档位来控制车速。
译码显示模块实现十进制数到4位二进制数的转换,以及车费和路程的显示。
(A)系统框图
(2)电路符号
出租车计费器的电路符号如下图(B)、输入信号:
计费始终脉冲clk;译码高频时钟ckl20mhz;汽车启动键start;汽车停止键stop;汽车暂停键pause;档位speedup[1..0]。
输出信号:
数码管地址选择信号scan[7..1];7段显示控制信号seg7[6..0],小数点dp
(B)出租车计费器的电路符号
(3)设计方法:
A、自底向上的混合编辑采用混合编辑法,设计不同的模块,最后在原理图编辑器中连接各模块作为顶层设计,其电路如下图(C)所示,其中taxi为控制模块;decoder为译码和显示模块。
(C)出租车计费电路图
三、实验设计过程
控制模块taxi的源代码:
Moduletaxi(money,distance,clk,start,stop,pause,speedup)
Inputclk;//计费时钟
Inputstart;//汽车启动
Inputstop;//汽车停止
Inputpause;//汽车暂停
Input[1:
0]speedup;//档位
Output[12:
0]money;//车费
Output[12:
0]distance;//路程
Reg[12:
0]money;
Reg[12:
0]distance;
Reg[12:
0]money_reg;//车费寄存器
Reg[12:
0]distance_reg//路程寄存器
Reg[3:
0]num;//控制车速的计数器
Reg[12:
0]dis;//千米计数器
Regd;//千米标志位
Always@(posedgeclk)
Begin
If(stop)//汽车停止,计费和路程清零
Beginmoney_reg<=’d0;
distance_reg<=’d0;
dis<=’d0;
num<=’d0;
end
elseif(start)//汽车启动后,起步价为6元
begin
money_reg<=’d600;
distance_reg<=’d0;
dis<=’d0;
num<=’d0;
end
else
begin
if(!
start&&!
speedup&&!
pause&&!
stop)//1档
begin
if(num==’d9)
begin
num<=’d0;
distance_reg<=distance_reg+1;
dis<=dis+1;
end
else
begin
num<=num+1;end
end
else
if(!
start&&speedup==’b01&&!
pause&&!
stop)//2档
begin
if(num==’d9)
begin
num<=’d0;
distance_reg<=distance_reg+2;
dis<=dis+2;
end
else
begin
num<=num+1;
end
end
elseif(!
start&&speedup==’b10&&!
pause&&!
stop)//3档
begin
if(num==’d9)
begin
num<=’d0;
distance_reg<=distance_reg+5;
dis<=dis+5;
end
else
begin
num<=num+1;
end
end
elseif(!
start&&speedup==’b11&&!
pause&&!
stop)//4档
begin
distance_reg<=distance_reg+1;
dis<=dis+1;
end
end
if(dis>=’d100)
begin
d<=’d1;dis<=’d0;
end
else
begin
d<=’d0;
end
if(distance_reg>=’d300)//如果超过3km则按1.2元/km计算
begin
if(money_reg<’d2000&&d==”d1)
begin
money_reg<=money_reg+’d120;
end
elseif(distance_reg>’d2000&&d==”d1)
begin
money_reg<=money_reg+’d180;
end
//当计费器达到20元时,每千米加收50%的车费
end
money<=money_reg;
distance<=distance_reg;
end
endmoudle
(2)译码显示模块decoder的源代码:
Moduledeceder(scan,seg7,dp,clk20mhz,money_in,distance_in):
Output[7:
0]scan;//数码管地址选择信号
Output[7:
0]scan;//7段显示控制信号
Output[7:
0]scan;//小数点
Inputclk20mhz;//系统时钟20MHz
Input[12:
0]money_in//车费
Input[12:
0]distance_in//路程
Reg[7:
0]scan:
Reg[6:
0]seg7;
Regdp;
Regclk1khz;//1khz的分频时钟,用于扫描数码管地址
Reg[3:
0]data:
Reg[3:
0]m_one,m_ten,m_hun,m_tho;//钱数的4位十进制数表示
Reg[3:
0]d_one,d_ten,d_hun,d_tho;//路程的4位十进制数表示
Reg[15:
0]count:
Reg[15:
0]comb1:
Reg[3:
0]comb1_a,comb1_b,comb1_c,comb1_d;
Reg[15:
0]comb2;
Reg[3:
0]comb2_a,comb2_b,comb2_c,comb2_d;
Reg[2:
0]cnt;
//--------1khz分频,用于扫描数码管地址
Always@(posedgeclk20mhz)
Begin
If(count==’d10000)
Beginclk1khz<=~clk1khz;count<=’d0;end
Else
Begincount<=count+1;end
//--------将车费的十进制数转化为4位的十进制数
If(comb1Begin
If(comb1_a=’d9&&comb1_==’d9&&comb1_c==’d9)
Begin
Comb1_a=’d0000;
Comb1_c=’d0000;
Comb1_d=’d0000;
Comb1_d<=Comb1_d+1;
Comb<=comb+1;
End
Elseif(comb1_a==’d9&&comb1_b==’d9)
Begin
Comb1_a<=’d0000;
Comb1_b<=’d0000;
Comb1_c<=comb_c+1;
Comb1<=comb1+1;
End
Elseif(comb1_a==’d9)
Begin
Comb1_a<=’d0000;
Comb1_b<=comb1_b+1;
Comb1<=comb1+1;
End
Else
Begin
Comb1_a<=comb1_a+1;
Comb1<=comb1+1;
End
End
Elseif(comb1==money_in)
begin
M_one<=comb1_a;
M_ten<=comb1_b;
M_hun<=comb1_c;
M_tho<=comb1_d;
End
Elseif(comb1>money_in)
Begin
Comb1_a<=’b0000;
Comb1_b<=’b0000;
Comb1_c<=’b0000;
Comb1_d<=’b0000;
Comb1<=’d0;
End
//-------------将路程的十进制数转化为4位十进制数
if(comb2begin
if(comb2_a==’d9&&comb2_b=’d9&&comb2_c==’d9)
begin
Comb2_a<=’b0000;
Comb2_b<=’b0000;
Comb2_c<=’b0000;
Comb2_d<=comb2_d+1;
Comb2<=comb2+1;
End
Elseif(comb2_a==’d9&&comb2_b=’d9)
Begin
Comb2_a<=’b0000;
Comb2_b<=’b0000;
Comb2_c<=comb2_c+1;
Comb2<=comb2+1;
End
Elseif(comb2_a==’d9)
Begin
Comb2_a<=’b0000;
Comb2_b<=comb2_b+2;
Comb2<=comb2+1;
end
else
begin
comb2_a<=comb2_a+1;
comb2<=comb2+1;
end
end
elseif(comb2==distance_in)
begin
d_one<=comb2_a;
d_ten<=comb2_b;
d_hun<=comb2_c;
d_tho<=comb2_d;
end
elseif(comb2>distance_in)
begin
comb2_a<=’b0000;
comb2_b<=’b0000;
comb2_c<=’b0000;
comb2_d<=’b0000;
comb2_a<=’d0;
end
end
//--------------数码管动态扫描------
always@(posedgeclk1khz)
begin
cnt<=cnt+1;
end
always@(cnt)
begin
case(cnt)
‘b000:
begindata<=m_one;dp<=’d0;scan<=’b00000001;end
‘b001:
begindata<=m_ten;dp<=’d0;scan<=’b00000010;end
‘b010:
begindata<=m_hun;dp<=’d1;scan<=’b00000100;end
‘b011:
begindata<=m_tho;dp<=’d0;scan<=’b00001000;end
‘b100:
begindata<=d_one;dp<=’d0;scan<=’b00010000;end
‘b101:
begindata<=d_ten;dp<=’d0;scan<=’b00100000;end
‘b110:
begindata<=d_hun;dp<=’d1;scan<=’b01000000;end
‘b111:
begindata<=d_tho;dp<=’d0;scan<=’b10000000;end
default:
begindata<=’bx;dp<=’bx;scan<=’bx;end
endcase
end
//----------7段译码--------------------
always@(data)
begin
case(data[3:
0])
4’b0000:
seg7[6:
0]=7’b1111110;
4’b0001:
seg7[6:
0]=7’b0110000;
4’b0010:
seg7[6:
0]=7’b1101101;
4’b0011:
seg7[6:
0]=7’b1111001;
4’b0100:
seg7[6:
0]=7’b0110011;
4’b0101:
seg7[6:
0]=7’b1011011;
4’b0110:
seg7[6:
0]=7’b1011111;
4’b0111:
seg7[6:
0]=7’b1110000;
4’b1000:
seg7[6:
0]=7’b1111111;
4’b1001:
seg7[6:
0]=7’b1111011;
default:
seg7[6:
0]=7’b0000000;
endcase
end
endmodule
四、实验运行截图:
对控制器模块Taxi进行仿真后得到的运行结构分别如下:
(1)对控制模块taxi进行仿真后的到的结果图如下图(D)所示,时序仿真结果如图(E)所示。
(D)控制模块功能仿真结果
(E)控制模块时序仿真结果
(2)将扫描书码馆的分频系数改小后,对译码显示模块decoder的功能仿真结果如[F]图所示,时序仿真结果如图(G)所示。
(G)控制模块时序仿真结果
[G]显示模块仿真
五、实验总结和分析:
经过了一个学期的学习和实验认识,这次是要需要完成的设计相对难一些,我们的任务主要是运用VHDL语言设计了一个出租车计费器,设计该出租车有起动键、停止键、暂停键和档位键。
起动键为脉冲触发信号,当其为一个脉冲时,表示汽车已起动,并根据车速的选择和基本车速发出响应频率的脉冲(计费脉冲)以此来实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;档位键用于改变车速,不同的档位对应着不同的车速,同时路程计数的速度也不同。
对我来说这个设计存在很多的问题,不过我通过对老师给的参考程序,对其进行了调试和修改,使其能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计了动态显示车费和里程的硬件电路。
出租车暂停时不计费,车费保持不变,且里程也保持不变,若复位则车费和里程清零,等待下一次计费的开始。
最后终于达到了实验的要求,成功的完成了设计。
这次实验的最大收获是我对对软件QuartusII的应用也更加熟练。
通过在设计中发现问题,并对遇到某个问题知道该从哪几方面去对其进行解析和理解。
通过对软件的仿真,发现编写的问题,和解决所要解决的问题,在设计中遇到对的问题我不断的查阅资料并同老师请教,收获很多。
在这次试验中,使我学到很多的东西,出租车计费器可分为两大模块,即控制模块和译码显示模块。
控制模块实现了计费和路程的计数,并且通过不同的档位来控制车速。
译码显示模块实现十进制数到4位二进制数的转换,以及车费和路程的显示。
通过对实验原理的了解我不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次试验使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
这些对我以后的学习都有很大的帮助,对以后的思考、动手能力将有很大的改变。