EDA 技 术 期 末 综 合 报 告DOC.docx
《EDA 技 术 期 末 综 合 报 告DOC.docx》由会员分享,可在线阅读,更多相关《EDA 技 术 期 末 综 合 报 告DOC.docx(17页珍藏版)》请在冰豆网上搜索。
EDA技术期末综合报告DOC
EDA技术期末综合报告
课程名称:
EDA技术
题目:
出租车计费器
学院:
信息工程与自动化学院
摘要
随着出租车行业的发展,对出租车计费器的要求也越来越高,用户不仅要求计费器性能稳定计费准确,而且要求在乘坐出租车时,显示起步价、行车里程二部分,由自动计费器自动记录。
安装在与汽车轮相连接的传感器在汽车行进时向自动计费器发送脉冲信号,在一定的公里数内,按起步价计费;超过这一里程后,自动计费器按里程计费;超过一定费用后,则则增加里程费用;如果停车等候,则不收费。
出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有一个应用价值的。
而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试,对于模式的切换需要用到机械开关,机械开关时间久了会造成接触不良,功能不易实现。
而采用FPGA进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
针对计费模式的切换,通过软件编程就可以轻易而举的实现。
避免了机械开关带来的不稳定因素。
关键词:
出租车计费器EDAverilog语言
目录
绪论3
第一章系统设计4
1出租车计费系统的概述:
4
2设计的意义5
3设计的要求6
3设计的原理6
第二章系统设计方案7
第三章主要模块8
1taxi(控制)模块:
8
2Decode(译码显示)模块:
11
小结17
参考文献:
18
绪论
人类社会已进入到高度发达的信息化社会,信息社会的发展离不开电子产品的进步。
现代电子产品在性能提高、复杂度增大的同时,价格却一直呈下降趋势,而且产品更新换代的步伐也越来越快,实现这种进步的主要因素是生产制造技术和电子设计技术的发展。
前者以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数千万个晶体管。
后者的核心就是EDA技术,EDA是指以计算机为工作平台,融合应用电子技术、计算机技术、智能化技术最新成果而研制成的电子CAD通用软件包,主要能辅助进行三方面的设计工作:
IC设计,电子电路设计,PCB设计。
没有EDA技术的支持,想要完成上述超大规模集成电路的设计制造是不可想象的,反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。
近年来,我国出租汽车行业迅猛发展,出租汽车已成为我国城市公共交通的重要组成部分和现代化城市必备的基础设施,成为人们工作、生活中不可缺少的交通工具。
它对繁荣经济、促进发展、方便群众、改善交通起到了积极作用。
出租汽车对我国人民物质和文化生活影响之大、作用之广是前所未有的。
出租汽车行业的服务水平和程度已经成为现代化的重要标志。
出租汽车服务行业和出租汽车计价器紧密相关,因为出租汽车必须安装出租汽车计价器才能投入营运。
出租汽车计价器是一种能根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并直接显示车费值的计量器具。
计价器是出租汽车的经营者和乘坐出租汽车的消费者之间用于公平贸易结算的工具,因而计价器量值准确与否,直接关系到经营者和消费者的经济利益,用户不仅要求计费器性能稳定,计费准确,有防作弊功能;同时还要求其具有车票资料打印、IC卡付费、语音报话、和电脑串行通信等功能,而这些与电子技术的发展是分不开的。
二十世纪后半期,随着集成电路和计算机技术的飞速发展,数字系统也得到了飞速发展,其实现方法经历了由分立元件、SSI、MSI到LSI、VLSI以及UVLSI的过程。
同时为了提高系统的可靠性与通用性,微处理器和专业集成电路(ASIC)逐渐取代了通用全硬件LSI电路,而ASIC以其体积小、重量轻、功耗低、速度快、成本低、保密性好而脱颖而出。
第一章系统设计
1出租车计费系统的概述:
在出租车是城市交通的重要组成部分,行业健康和发展也获得越来越多的关注。
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有一个应用价值的。
2设计的意义
在出租车是城市交通的重要组成部分,行业健康和发展也获得越来越多的关注。
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有一个应用价值的。
出租车计价器是出租车营运收费的专用智能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。
国内出租车计价器已经经历了4个阶段的发展。
从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器。
出租车计价器计费是否准确、出租车司机是否作弊才是乘客最关心的问题,而计价器营运数据的管理是否方便才是出租车司机最关注的。
因此怎样设计出一种既能有效防止司机作弊又能方便司机的计价器尤为重要。
因此,本文以FPGA为核心设计一款多功能出租车计价器,该计价器能实现按时间和里程综合计算车价,能显示时间、里程、单价、总车价等相关信息显示。
它比市场上的一些计价器使用更方便,功能更全,还具有有效防止司机作弊和系统稳定性好的优点。
3设计的要求
设计一个出租车计费器,能按路程计费,具体要求如下所述:
1)实现计费功能,计费标准为:
按行驶里程计费,起步价6.00元,
并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元
时,每km加收50%的车费,车辆停止和暂停时不计费。
2)现场模拟汽车的起动、停止、暂停和换挡等状态。
3)设计数码管动态扫描电路,将车费和路程显示出来,各有两位小
数。
4)系统时钟20MHz。
4设计的原理
设计该出租车有起动键、停止键、暂停键和档位键。
起动键为脉
冲触发信号,当其为一个脉冲时,表示汽车已起动,并根据车速的选
择和基本车速发出响应频率的脉冲(计费脉冲)以此来实现车费和路
程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄
火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电
平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;档
位键用于改变车速,不同的档位对应着不同的车速,同时路程计数的
速度也不同。
出租车计费器可分为两大模块,即控制模块和译码显示模块。
系
统框图如下所示。
控制模块实现了计费和路程的计数,并且通过不同
的档位来控制车速。
译码显示模块实现十进制数到4位二进制数的转
换,以及车费和路程的显示。
第二章系统设计方案
车的状态由传感器传回来当作控制信号,用控制信号来控制计算里程和车费模
块,然后分别将里程和车费送到译码模块译码,输出的数据一起送到动态扫描模块,由片选信号控制哪部分译码模块输出的数据用数码管显示。
当车启动后,计算里程和车费模块就开始计数,起步价为7.00元,并在车行
3Km后按2.20元/Km计费,当计费器达到或超过20元时,每公里回收50%的车费,车停止和暂停时不计费;然后将里程和车费送到译码模块译码和动态显示模块动态显示,最后显示在七段数码管上,动态显示的时间间隔为5秒钟。
运算控制器模块将其他两个进行连接,是本次设计的核心。
它包含计程器、计时器、计价器,同时还有读取外部的拨码开关控制信号,提供当前显示信号与显示位选信号,从而周期性交替显示计价/计时信息、等时信息。
计程器、计时器、计价器根据位选信号,输出相应数据的当前选中数字,由顶层模块根据显示数据类型变换信号进行选择,传输给显示模块。
第三章主要模块
1控制模块taxi:
taxi进行仿真后得到的功能仿真结果如图1所示,时序仿真结果如图2所示。
观察波形可知,当启动键“start”为一个脉冲时,表示汽车己起动,车费money显示起步价6.00元,同时路程distance随着计费脉冲开始计数;当停止键stop为“1”时,表示汽车已经熄火,车费money和路程distance均为0;当暂停键pause为“1”时,车费和路程停止计数;当档位键分别取2和3时,路程的计数逐渐加快,表示车速逐渐加快。
图1Taxi控制模块功能仿真
图2Taxi控制模块时序仿真
代码如下:
//------------taxi模块----------
moduletaxi(money,distance,clk,stop,start,pause,speedup);
inputclk;
inputstop;
inputstart;
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[15:
0]dis;//千米计数器
regd;//千米标志位
always@(posedgeclk)
begin
if(stop)//车停止,路程、车费清零
begin
money_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&&!
stop&&!
pause&&!
speedup)//1档
begin
if(num=='d9)
begin
num<='d0;
distance_reg<=distance_reg+1;
dis<=dis+1;
end
else
begin
num<=num+1;
end
end
elseif(!
start&&!
stop&&!
pause&&speedup=='b01)//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&&!
stop&&!
pause&&speedup=='b10)//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&&!
stop&&!
pause&&speedup=='b11)//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(money_reg>='d2000&&d=='d1)
begin
money_reg<=money_reg+'d180;
end
end
//------------当计费超过20元时,每km加收50%的车费------------
money<=money_reg;
distance<=distance_reg;
end
Endmodule
6译码显示模块Decode:
将扫描数码管的分频系数改小后,对译码显示模块decoder的功能仿真结果如图3所示,时序仿真结果如图4所示。
进行译码的时钟频率必须比汽车的计费时钟高得多,才能实时显示出车费和路程的变化,这里直接采用晶振时钟20MHz即可。
其中comb1和comb2是采用高频时钟控制的计数器,当输入车费和路程数据后,此计数器开始计数,直到与车费和路费的数值相等后才停止,这样就实现了大整数到多位十进制数的转换。
comb1_a、comb1_b、comb1_c、comb1_d为车费的4位十进制数表示;comb2_a、comb2_b、comb2_c、comb2_d为路程的4位十进制数表示。
可以看出,当输入的车费money_in和路程distance_in取不同的值时,用高频计数器转换后均输出对应的4位十进制数。
图3Decode模块功能仿真
图4Decode模块功能仿真
代码如下:
//------------decode模块----------
moduledecode(scan,seg,dp,clk20mhz,money_in,distance_in);
output[7:
0]scan;
output[6:
0]seg;
outputdp;
inputclk20mhz;
input[12:
0]money_in;
input[12:
0]distance_in;
reg[7:
0]scan;
reg[6:
0]seg;
regdp;
regclk1khz;//1khz的分频时钟,用于数码管的位选
reg[3:
0]data;
reg[3:
0]m_one,m_ten,m_hun,m_tho;//钱数的BCD
reg[3:
0]d_one,d_ten,d_hun,d_tho;//路程的BCD
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的分频时钟,用于数码管位选扫描(1ms)----------
always@(posedgeclk20mhz)
begin
if(count=='d10000)
begin
clk1khz<=~clk1khz;
count<='d0;
end
else
begin
count<=count+1;
end
//---------将车费的十进制转化为4位十进制数(BCD)---------
if(comb1begin
if(comb1_a=='d9&&comb1_b=='d9&&comb1_c=='d9)
begin
comb1_a<='b0000;
comb1_b<='b0000;
comb1_c<='b0000;
comb1_d<=comb1_d+1;
comb1<=comb1+1;
end
elseif(comb1_a=='d9&&comb1_b=='d9)
begin
comb1_a<='b0000;
comb1_b<='b0000;
comb1_c<=comb1_c+1;
comb1<=comb1+1;
end
elseif(comb1_a=='d9)
begin
comb1_a<='b0000;
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位十进制数(BCD)---------
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+1;
comb2<=comb2+1;
end
else
begin
comb2_a<=comb2_a+1;
comb2<=comb1+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<='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])
'b0000:
seg[6:
0]=7'b1111110;
'b0001:
seg[6:
0]=7'b0110000;
'b0010:
seg[6:
0]=7'b1101101;
'b0011:
seg[6:
0]=7'b1111001;
'b0100:
seg[6:
0]=7'b0110011;
'b0101:
seg[6:
0]=7'b1011011;
'b0110:
seg[6:
0]=7'b1011111;
'b0111:
seg[6:
0]=7'b1110000;
'b1000:
seg[6:
0]=7'b1111111;