可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx
- 文档编号:7031976
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:14
- 大小:422.16KB
可编程式逻辑器件设计试验报告期末报告 出租车计费器.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(comb1 Begin 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(comb2 begin 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位二进制数的转换,以及车费和路程的显示。 通过对实验原理的了解我不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次试验使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 这些对我以后的学习都有很大的帮助,对以后的思考、动手能力将有很大的改变。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可编程式逻辑器件设计试验报告期末报告 出租车计费器 程式 逻辑 器件 设计 试验报告 期末 报告 出租车 计费
![提示](https://static.bdocx.com/images/bang_tan.gif)