1、北邮电子 数电综合实验报告数字电路综合实验设计 简易出租车计价器的设计与实现学院: 电子工程学院 班级: 2011211203 学号: 2011210876 姓名: 孙月鹏 班内序号: 04 摘要 本文介绍了利用Quartus II综合性PLD/FPGA开发软件,在MAXII数字逻辑实验开发板上实现简易出租车计价器功能的设计与实现方法。本方案采用自上而下的设计理念,将整体电路按照功能划分为分频、计数、控制、数码管显示电路、点阵显示电路等若干模块,模块内用VHDL语言完成逻辑设计,模块间用原理图进行连接,使整体可实现计费、计时等功能。关键字:可编程器件 模块化设计 出租车计价器 VHDL语言一、
2、设计任务要求 设计一台出租车计价器,不同情况下具有不同的收费标准。基本要求:1行驶公里:用时钟2秒钟表示出租车匀速行驶1公里。在行车5公里以内,按起步价13元收费,超过5公里部分,以每公里2元收费。燃油附加费每运次1元。2途中等待:用按键控制中途等待,等待少于(包括)5秒不收费,超过5秒后没等待3秒钟加收1元。3用数码管分时显示计费金额、行驶里程和等候时间。字母A表示当前处于显示计费金额状态,字母B表示当前处于显示行驶里程状态,字母C表示当前处于显示等候时间状态。4用按键控制出租车空驶、载客状态。提高要求:1用点阵滚动显示收费单据。2具有夜间模式,基本单价加收20%的费用。出租车收费以元为单位
3、,元以下四舍五入。3出租车行驶速度可调可控。4多人乘车,分段计价。5自拟其他功能。 2、设计思路与结构框图1.设计思路图1 结构框图 由结构框图可以分析得出,该系统的的主体是计数控制器。该系统由外部控制载客控制信号和等待控制信号,以时钟信号的翻转为计数依据,完成对时间、里程和费用的计数,并将结果通过数码管译码电路显示出来。该系统的控制信号可由拨码或按键输入,时钟由开发板内部时钟分频得出,输出有点阵输出和数码管输出。因此,可将系统分为分频器、计数控制器、数码管译码和显示以及点阵显示四部分。并以此得出系统的逻辑框图如下:图2 逻辑框图2.控制器部分的状态转移图 该控制器一共有三个基本状态: 空驶状
4、态、载客状态和等待状态。 分别由v、和w来进行控制。 3、图3 状态转移图分块电路和总体电路设计(1)图4 总体电路设计总体电路设计 整体电路由数码管译码电路、转换电路、点阵译码电路、技术控制电路、分频电路五部分构成。 分频电路将开发板内部的50MHz时钟分为500hz(供给数码管和点阵)、1Hz(控制器计时)、0.5Hz(行驶路程计费)、0.3Hz(等待时间计费)以及用于提高分频效率的其他若按频率。 计数控制电路由四部分构成,整体完成行驶距离的计数、等待时间的计数以及费用的计数。输出为三组十位二进制数。 转换电路有转换数据类型和在数码管上分时显示两个功能。首先将输入的十位二进制数转换为4位十
5、进制数,并且利用除法和取余数的运算提取出个位、十位、百位、千位,并转换为四位二进制BCD码。其次利用0.5hz的时钟,将行驶里程、等待时间、计费金额以2秒为周期依次out14,供给数码管以便分时显示。 数码管译码电路以500HZ实现动态扫描,并将转换电路输出的5组BCD码依次译码,完成显示。 点阵译码器根据载客控制信号,分别显示“O”、“X”静态图案。(2)分块电路设计1.分频器(以100分频为例)1.1 电路模块 1.2 关键代码ENTITY div_100 IS PORT( clk100 : IN STD_LOGIC; -输入时钟 clear: IN STD_LOGIC; clk1: OU
6、T STD_LOGIC); -输出时钟END div_100; ARCHITECTURE a100 OF div_100 IS SIGNAL tmp100: INTEGER RANGE 0 TO 99; -计数信号BEGIN p1:PROCESS(clear,clk100) -p1进行100进制的计数 BEGIN IF clear =0 THEN tmp100=0; ELSIF clk100event AND clk100=1 THEN IF tmp100=99 THEN tmp100=0; ELSE tmp10049 THEN clk1=1; ELSE clk15s)信号outt,contr
7、ol3接收到outt后输出为等待时间的计费cm2,control4为总费用(cm1+cm2+燃油附加费1元)。 设计关键思想是将费用、行驶里程、等待时间三个计数过程分开处理,并且将行驶计费和等待计费也分开处理。通过载客信号v、等待信号w分别触发不用的进程完成计数。因为行驶过程中每两秒1公里,每公里两元,等待过程中每三秒1元,因此分别用1hz、0.5hz、0.33hz的时钟完成计时、计费、记里程。2.2 模块control1 2.2.1 电路模块 行驶里程计数cd和行驶计费cm1 2.2.2 关键代码ENTITY control1 IS PORT( clk2: IN STD_LOGIC; -输入
8、是0.5Hz的时钟 v: IN STD_LOGIC; -载客控制输入信号 w: IN STD_LOGIC; -等待信号 cm1: OUT STD_LOGIC_VECTOR(9 DOWNTO 0); -里程计费 cd: OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); -行驶距离 END control1 ;ARCHITECTURE c OF control1 ISSIGNAL temp1: STD_LOGIC_VECTOR(9 DOWNTO 0) ; SIGNAL temp_cm: STD_LOGIC; BEGIN p1:PROCESS(clk2,v,w) -p1里程计数
9、 BEGIN IF (clk2event and clk2=1) THEN IF v=0 THEN -v=0时重新计数 temp1=0000000000 ; ELSIF w=1 THEN -开始等待时里程保持不变 temp1=temp1; ELSE temp1=temp1 +1; END IF; END IF; END PROCESS p1; p2:PROCESS(clk2,temp1) BEGIN IF (clk2event and clk2=1) THEN IF temp10000000110 THEN -小于5公里起步价13元 cm1=0000001101; cd=temp1; ELSE
10、 cm1=temp1+temp1+0000000011; -大于5公里时的费用 cd5s) 2.3.2关键代码ENTITY control2 IS PORT( clk1: IN STD_LOGIC; -输入是1Hz的时钟 v: IN STD_LOGIC; -载客控制输入信号 w: IN STD_LOGIC; -等待信号 outt: out STD_LOGIC; -若大于5秒,输出1 ct: out STD_LOGIC_VECTOR(9 DOWNTO 0);-等待时间输出 END control2 ;ARCHITECTURE c OF control2 IS SIGNAL tempt: STD_
11、LOGIC_VECTOR(9 DOWNTO 0) ;SIGNAL temp1: INTEGER RANGE 0 TO 999;BEGIN p3:PROCESS(clk1,v,w) -累加等待时间 BEGIN IF (clk1event and clk1=1) THEN IF v=0 THEN tempt=0000000000 ; -v=0清零重置 temp1=0; outt=0; ELSIF w=0 THEN -行驶时保持状态 tempt=tempt; temp1=temp1; ELSE tempt=tempt +1; -等待时技术开始 temp14 THEN -大于5秒时outt=1 out
12、t=1; ELSE outt=0; END IF; END IF; END IF; END PROCESS p3; p4:PROCESS(clk1,tempt) -将信号赋给输出ct BEGIN ct=tempt; END PROCESS p4; END c;2.4 模块control3 2.4.1电路模块 当输入outt为1时,开始计数 cm2为等待时间计费 2.4.2关键代码ENTITY control3 IS PORT( clk3: IN STD_LOGIC; -输入是0.3Hz的时钟 outt: IN STD_LOGIC; -为1时,等待时间大于5s v: IN STD_LOGIC;
13、-载客控制输入信号 w: IN STD_LOGIC; -等待信号 cm2: out STD_LOGIC_VECTOR(9 DOWNTO 0);-等待计费 END control3 ;ARCHITECTURE c OF control3 ISSIGNAL tempm: STD_LOGIC_VECTOR(9 DOWNTO 0) ;BEGINp5:PROCESS(clk3,outt,v,w)BEGINIF outt=1THEN -大于5秒时开始计费 IF (clk3event and clk3=1) THEN IF v=0 THEN tempm=0000000000; -乘客下车等待时间重置 ELS
14、IF w=0 THEN -行驶时保持状态 tempm=tempm; ELSE tempm=tempm+1 ; -等待时开始计费 END IF; END IF; END IF; END PROCESS p5;p6: PROCESS(clk3,tempm)BEGIN IF V=0 THEN cm2=0000000000;ELSE cm2=tempm; -将信号赋给输出:等待计费cm2END IF;END PROCESS p6; END c;2.5 control4 2.5.1 电路模块 将等待计费cm2和行驶计费cm1相加,并加上燃油费1元,得到总费用cm 2.5.2 关键代码ENTITY con
15、trol4 IS PORT( clk2: IN STD_LOGIC; -输入是0.5Hz的时钟 v: IN STD_LOGIC; -载客控制输入信号 cm1: in STD_LOGIC_VECTOR(9 DOWNTO 0);-行驶费用 cm2: in STD_LOGIC_VECTOR(9 DOWNTO 0); -等待费用 cm: out STD_LOGIC_VECTOR(9 DOWNTO 0);-总费用 END control4 ;ARCHITECTURE c OF control4 ISBEGINp5:PROCESS(clk2,v)BEGIN IF (clk2event and clk2=1
16、) THEN IF v=0 THEN cm =0000000000; ELSE cm=cm1+cm2+1; END IF; END IF;END PROCESS p5;END c;2.6控制计数部分的总仿真波形 3.转换器 3.1 电路模块 由三个输入:行驶距离cd、等待时间ct、计费金额cm 输出out1-5为四位二进制BCD码 实现功能:将十位二进制数按照位数转为为BCD码 3.2 关键代码ENTITY transform IS PORT( clk: IN STD_LOGIC; -0.5hz的时钟 v: IN STD_LOGIC; cd: in STD_LOGIC_VECTOR(9 DOW
17、NTO 0);-行驶距离 ct: in STD_LOGIC_VECTOR(9 DOWNTO 0); -等待时间 cm: in STD_LOGIC_VECTOR(9 DOWNTO 0) ;-总费用 out1: out std_logic_vector(3 downto 0) ;-输出个位 out2: out std_logic_vector(3 downto 0); -输出十位 out3: out std_logic_vector(3 downto 0); -输出百位 out4: out std_logic_vector(3 downto 0); -输出千位 out5: out std_logi
18、c_vector(3 downto 0)); -输出ABC END transform ;ARCHITECTURE c OF transform ISsignal cc : integer range 0 to 1023 ; signal t : std_logic_vector(1 downto 0) ; signal q1,q2,q3:integer range 0 to 1000;BEGIN p1:PROCESS(clk,v) -p1进行3进制的计数BEGIN IF (clkevent and clk=1) THEN IF v=0 THEN t=00; elsif t=00 then t
19、=01; elsif t=01 then t=10; elsif t=10 then t=00; else t cc =CONV_INTEGER(cm);out5 cc =CONV_INTEGER(cd);out5 cc =CONV_INTEGER(ct);out5 cc=cc; -将十位2进制转为十进制 END CASE;q1=cc/10; -除法结果为整数部分q2=q1/10;q3=q2/10; out1=conv_std_logic_vector(cc rem 10,4); -取得个位out2=conv_std_logic_vector(q1 rem 10,4); -取得十位out3=c
20、onv_std_logic_vector(q2 rem 10,4); -取得百位out4=conv_std_logic_vector(q3 rem 10,4); -取得千位end if; end process p2; END c;4.数码管译码电路 4.1电路模块 4.2关键代码ENTITY shumaguan ISPORT( clk1: IN STD_LOGIC; -500hz数码管扫描时钟 out5,out4,out3,out2,out1: IN STD_LOGIC_VECTOR(3 DOWNTO 0); g:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat:O
21、UT STD_LOGIC_VECTOR(5 DOWNTO 0);END shumaguan;ARCHITECTURE a OF shumaguan IS SIGNAL tmpg:STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL tmpn:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL tmpc:INTEGER RANGE 0 TO 5; BEGINp1:PROCESS(clk1) -六进制计数 BEGIN if(clk1event and clk1=1)then if tmpc = 5 then tmpc=0; else tmpc tmpn=o
22、ut1;cat tmpn=out2;cat tmpn=out3;cat tmpn=out4;cat tmpn=out5;cat tmpn=1101;cat tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg=ZZZZZZZ; END CASE; END PROCESS p3; g tmp_col=01111111;tmp_row tmp_col=10111111;tmp_row tmp_col=11011111;tmp_row tmp_col=11101111;tmp_row tmp_col=11110111;tmp_row tmp_col=11111011;tmp_row tmp_col=11111101;tmp_row tmp_col=11111110;tmp_row tmp_col=01111111;tmp_row=00000
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1