EDA课程设计,用VHDL编程做出租车计费器

要求:1、及格:用开关按键表示脉冲,每个脉冲代表100米,10个脉冲1公里,每公里1.4元,能够同步显示里程和费用;
2、中:低于2公里5元计费,高于2公里总费用=起步费用+(里程-2公里)×里程单价+等候时间×等候单价;
3、良:等候时间大于2分钟,安每分钟1.3元计费;
4、优:可以设定起步价和里程单价
至少要实现良以上的,求哪位高手帮帮忙!不要在百度搜的,那样我自己也会,最好是自己现写的,能模拟成功的,采纳后必有重赏!!!谢谢~~
我的邮箱是[email protected]
本来想给300的,但好像最高只能给100,成功后一定重赏!!!
有哪位高手帮帮忙,不要编程,遇到点问题想请教!!在线等,财富值不是问题~~

课程设计内容与要求
1,用开关按键表示脉冲,每个脉冲代表100米,10个脉冲1公里,每公里1.4元,能同步显示里程和费用;
2,低于2公里5元计费,高于2公里总费用=起步费用+(里程-2公里)*里程单价+
等候时间*等后单价;
3,等候时间大于2分钟,按每分钟1.3元计费;
4,可以设定起步价和里程单价。
一、设计原理与技术方法:
包括:电路工作原理分析与原理图、元器件选择与参数计算、电路调试方法与结果说明;
软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。
根据设计要求,系统的输入信号clk,计价开始信号start,等待信号stop,里程脉冲信号fin。系统的输出信号有:总费用数C0—c3,行驶距离k0—k1,等待时间m0—m1等。系统有两个脉冲输入信号clk_750k,fin,其中clk_750k将根据设计要求分频成14hz,15hz和1hz分别作为公里计费和超时计费的脉冲。两个控制输入开关start,stop;控制过程为:start作为计费开始的开关,当start为高电平时,系统开始根据输入的情况计费。当有乘客上车并开始行驶时,fin脉冲到来,进行行驶计费,此时的stop需要置为0;如需停车等待,就把stop变为高电平,
并去除fin输入脉冲,进行等待计费;当乘客下车且不等待时,直接将start置为0,系统停止工作;价格开始归为起步价5.0元。
整个设计由分频模块,计量模块,计费模块,控制模块和显示模块五个部分组成。
其中计量模块是整个系统实现里程计数和时间计数的重要部分;控制模块是实现不同计费方式的选择部分,根据所设计的使能端选择是根据里程计费还是根据等待时间计费,同时设计通过分频模块产生不同频率的脉冲信号来实现系统的计费。计量模块采用1hz的驱动信号,计费模块采用14hz,13hz的驱动信号;计量模块每计数一次,计量模块就实现14次或者13次计数,即为实现计时的1.3元/min,计程时的1.4元/km的收费。组成框图如下所示:

1.百进制模块:
实现百米脉冲的驱动信号,元件框图如图3所示:

图3 百进制模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity baijinzhi is
port(start,clk2: in std_logic; --秒脉冲
a: out std_logic_vector(3 downto 0));
end baijinzhi;
architecture rt1 of baijinzhi is
signal count_1:std_logic_vector(3 downto 0);
begin
a<=count_1;
process(start,clk2)
begin
if(start='0')then
count_1<="0000";
elsif(clk2'event and clk2='1')then
if(count_1="0111")then
count_1<="0000";
else
count_1<=count_1+'1';
end if;
end if;
end process;
end rt1

2.计费模块
; 实现里程和等候时间的计费并输出到显示,元件框图4如下:

图4 计费模块框图

源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --计费驱动信号
start:in std_logic; --计费开始信号
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt1 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3<="0000";c2<="0000";c1<="0101";c0<="0000"; --起步价5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0<="0000";
if c1="1001" then c1<="0000";
if c2="1001" then c2<="0000";
if c3="1001" then c3<="0000";
else c3<=c3+1;
end if;
else c2<=c2+1;
end if;
else c1<=c1+1;
end if;
else c0<=c0+1;
end if;
end if;
end process;
end rt1;

3.公里模块
实现历程的计数和输出计费脉冲,元件框图5如下:

图5 公里模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity gongli is
port(clk1,start: in std_logic; --百米脉冲
k1,k2,k3,k4: out std_logic_vector(3 downto 0); --里程显示
temp2 : out std_logic);
end gongli;

architecture rt1 of gongli is
signal count_1: std_logic_vector(3 downto 0);
signal count_2: std_logic_vector(3 downto 0);
signal count_3: std_logic_vector(3 downto 0);
signal count_4: std_logic_vector(3 downto 0);
begin
k1<=count_1;
k2<=count_2;
k3<=count_3;
k4<=count_4;
process(start,clk1)
begin
if(start='0')then
count_1<="0000";
count_2<="0000";
count_3<="0000";
count_4<="0000"; ---公里清零
elsif(clk1'event and clk1='1')then
if(count_1="1001")then --公里计数器
count_1<="0000";count_2<=count_2+1;temp2<='1';
if(count_2="1001")then
count_2<="0000";count_3<=count_3+'1';
if(count_3="1001")then
count_3<="0000";count_4<=count_4+'1';
end if;
end if;
else
count_1<=count_1+'1';temp2<='0';
end if;
end if;
end process;
end rt1;

4.输出模块
实现所有数据的输出,元件框图6如下:

图6 输出模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity shuchu is
port(y: in std_logic_vector(3 downto 0);
e: out std_logic_vector(6 downto 0));
end shuchu;

architecture rt1of shuchu is
begin
process
begin
case y is
when"0000"=>e<="0111111";
when"0001"=>e<="0000110";
when"0010"=>e<="1011011";
when"0011"=>e<="1001111";
when"0100"=>e<="1100110";
when"0101"=>e<="1101101";
when"0110"=>e<="1111101";
when"0111"=>e<="0000111";
when"1000"=>e<="1111111";
when"1001"=>e<="1100111";
when others=>e<="0000000";
end case;
end process;
end rt1;

5.显示模块
实现所有数据的显示,元件框图7如下:

图7 显示模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xianshi is
port(start: in std_logic;
a:in std_logic_vector(3 downto 0); --选择信号
c1,c2,c3,c4,out1,out2,out3,out4:in std_logic_vector(3 downto 0); --里程显示,时间显示输入
y:out std_logic_vector(3 downto 0)); --里程显示,时间显示输出
end xianshi;
architecture rt1 of xianshi is
begin
process
begin
if(start='0')then
y<="0000";
else case a is
when "0000"=> y<=c1 ;
when "0001"=> y<=c2 ;
when "0010"=> y<=c3 ;
when "0011"=> y<=c4 ;
when "0100"=> y<=out1 ;
when "0101"=> y<=out2;
when "0110"=> y<=out3 ;
when "0111"=> y<=out4;
when others =>y<= "0000";
end case;
end if;
end process;
end rt1;

6.dian模块

图8 dian模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity dian is
port(a: in std_logic_vector(3 downto 0);
e: out std_logic);
end dian;
architecture rt1 of dian is
begin
process
begin
case a is
when "0001"=>e<='1';
when "0101"=>e<='1';
when others=>e<='0';
end case;
end process;
end rt1;

三、中各个模块设计分析
系统总体顶层框图如下:

系统总体顶层框图

程序最终功能实现波形仿真

1. 分频模块
由于实验箱上没有14hz和13hz的整数倍时钟信号,因此采用频率较大的750khz进行分频,以近似得到14hz,13hz和1hz的时钟频率。通过以上三种不同频率的脉冲信号实行出租车行驶,等待两种情况下的不同计费。模块元件如下:

分频模块框图
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity fenpin is
port(clk_750k:in std_logic; --系统时钟
clk_14:buffer std_logic; --14分频
clk_13:buffer std_logic; --13分频
clk_1 : buffer std_logic); --1分频
end fenpin ;
architecture rt1 of fenpin is
signal q_14:integer range 0 to 53570; --定义中间信号量
signal q_13:integer range 0 to 57691;
signal q_1:integer range 0 to 749999;
begin
process(clk_750k)
begin
If(clk_750k' event and clk_750k='1')then
If q_14=53570 then q_14<=0;clk_14<=not clk_14;
else q_14<=q_14+1;
end if; --得14hz频率信号
If q_13=57691 then q_13<=0;clk_13<=not clk_13;
else q_13<=q_13+1;
end if; --得13hz频率信号
If q_1=749999 then q_1<=0;clk_1<=not clk_1;
else q_1<=q_1+1;
end if; --得1hz频率信号
end if;
end process;
end rt1;

2. 计量模块
计量模块主要完成计时和计程功能。
计时部分:计算乘客的等待累积时间,当等待时间大于2min时,本模块中en1使能信号变为1;当clk1每来一个上升沿,计时器就自增1,计时器的量程为59min,满量程后自动归零。
计程部分:计算乘客所行驶的公里数,当行驶里程大于2km时,本模块中en0使能信号变为1;当clk每来一个上升沿,计程器就自增1,计程器的量程为99km,满量程后自动归零。
元件框图为:

计量模块框图

计量模块仿真波形为:

源程序如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity jiliang is
port(start:in std_logic; --计费开始信号
fin:in std_logic; --里程脉冲信号
stop:in std_logic; --行驶中途等待信号
clk1:in std_logic; --驱动脉冲
en1,en0:buffer std_logic; --计费单价使能信号
k1,k0:buffer std_logic_vector(3 downto 0); --行驶公里计数
m1,m0:buffer std_logic_vector(3 downto 0)); --等待时间计数
end jiliang;
architecture rt2 of jiliang is
signal w:integer range 0 to 59; --计时范围0~59
begin
process(clk1)
begin
if(clk1'event and clk1='1')then
if start='0' then
w<=0;en1<='0';en0<='0';m1<="0000";
m0<="0000";k1<="0000";k0<="0000";
elsif stop='1' then --计时开始信号
if w=59 then
w<=0;
else w<=w+1;
end if;
if m0="1001" then
m0<="0000";
if m1="0101" then
m1<="0000";
else m1<=m1+1;
end if;
else m0<=m0+1;
end if;
if stop='1' then en0<='0';
if m1&m0>"00000001" then en1<='1'; --若等待时间大于2min则en1置1
else en1<='0';
end if;
end if;
elsif fin='1' then --里程计数开始
if k0="1001" then k0<="0000";
if k1="1001" then k1<="0000"; --计程范围0~99
else k1<=k1+1;
end if;
else k0<=k0+1;
end if;
if stop='0' then
en1<='0';
if k1&k0>"00000001" then
en0<='1'; --若行使里程大于2km,则en0置1
else en0<='0';
end if;
end if;
end if;
end if;
end process;
end rt2;

3. 控制模块
本模块主要是通过计量模块产生的两个不同的输入使能信号en0,en1,对每个分频模块输出的14hz,13hz的脉冲进行选择输出的过程;本模块实现了双脉冲的二选一;最终目的为了计费模块中对行驶过程中不同的时段进行计价。
模块元件如下:

控制模块框图
控制模块仿真波形为:

源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity kongzhi is
port(en0,en1:in std_logic; --使能选择信号
clk_in1:in std_logic; --14分频输入信号
clk_in2:in std_logic; --13分频输入信号
clk_out:out std_logic); --输出信号
end kongzhi;
architecture rt3 of kongzhi is
begin
process(en0,en1)
begin
if en0='1' then --实现二选一功能
clk_out<=clk_in1;
elsif en1='1' then
clk_out<=clk_in2;
end if;
end process;
end rt3;

4.计费模块
当计费信号start一直处于高电平即计费状态时,本模块根据控制模块选择出的信号从而对不同的单价时段进行计费。即行程在2km内,而且等待累计时间小于2min则为起步价5元;2km外以每公里1.4.元计费,等待累积时间超过2min则按每分钟1.3元计费。c0,c1,c2,c3分别表示费用的显示。
模块元件为:

计费模块框图

计费模块仿真波形为:

源程序如下:

Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --计费驱动信号
start:in std_logic; --计费开始信号
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt4 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3<="0000";c2<="0000";c1<="0101";c0<="0000"; --起步价5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0<="0000";
if c1="1001" then c1<="0000";
if c2="1001" then c2<="0000";
if c3="1001" then c3<="0000"; --计价范围0~999.9
else c3<=c3+1;
end if;
else c2<=c2+1;
end if;
else c1<=c1+1;
end if;
else c0<=c0+1;
end if;
end if;
end process;
end rt4;

5.显示模块
显示模块完成计价,计时和计程数据显示。计费数据送入显示模块进行译码,最后送至以百元,十元,元,角为单位对应的数码管上显示。计时数据送入显示模块进行译码,最后送至以分为单位对应的数码管上显示。计程数据送入显示模块进行译码,最后送至以km为单位的数码管上显示。
模块元件为:

显示模块框图
源程序如下:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; --定义库包

entity xianshi is --定义实体
port(
clk_scan:in std_logic; --扫描时钟信号端口设置
c3,c2,c1,c0:in std_logic_vector(3 downto 0); --总费用输入端口
k0,k1:in std_logic_vector(3 downto 0); --里程输入端口
m0,m1:in std_logic_vector(3 downto 0); --等待时间输入端口
sel:out std_logic_vector(2 downto 0); --控制数码管位选信号的扫描信号输出端口
led:out std_logic_vector(6 downto 0); --数码管的控制端口
led_dp:out std_logic --数码管的小数点输出端口
);
end xianshi;
architecture rt5 of xianshi is
signal duan:std_logic_vector(6 downto 0); --数码显示管中间变量
signal shuju:std_logic_vector(3 downto 0); --选择输入端的中间变量
signal cnt:std_logic_vector(2 downto 0); --控制数码管的中间变量
signal xiaodian:std_logic; --小数点的中间变量
begin
process(clk_scan) --开始进程
begin
if clk_scan'event and clk_scan='1' then
cnt<=cnt+1; --每有一个扫描信号上升沿实现加1扫描
end if;
end process; --结束进程

process(cnt) --开始进程(选择扫描显示数码管)
begin
case cnt is --扫描时给每个数码管赋值
when "000"=>shuju<=c0;
when "001"=>shuju<=c1;
when "010"=>shuju<=c2;
when "011"=>shuju<=c3;
when "100"=>shuju<=k0;
when "101"=>shuju<=k1;
when "110"=>shuju<=m0;
when "111"=>shuju<=m1;
when others=> null;
end case;
if (cnt="001" or cnt="110")
then xiaodian<='1'; --在里程和总费用的个位处显示小数点
else xiaodian<='0';
end if;
end process; --结束进程

process(shuju) --开始进程(译码显示)
begin
case shuju is
when "0000"=>duan<="0111111"; --0
when "0001"=>duan<="0000110"; --1
when "0010"=>duan<="1011011"; --2
when "0011"=>duan<="1001111"; --3
when "0100"=>duan<="1100110"; --4
when "0101"=>duan<="1101101"; --5
when "0110"=>duan<="1111101"; --6
when "0111"=>duan<="0000111"; --7
when "1000"=>duan<="1111111"; --8
when "1001"=>duan<="1101111"; --9
when others=>null;
end case;
end process;
sel<=cnt;
led<=duan;
led_dp<=xiaodian;
end rt5;
二、课程设计工作记录:
包括:设计步骤与时间安排、调试步骤与时间安排、课题完成结果说明
2.课题完成结果说明:
此计费器能实现起步价是5元;实现实验要求的1公里计费一次单价,行驶公里大于2km时每公里按1.4元计费并能显示里程和总共的费用。当行驶了6公里,等待了4分钟时,费用显示为15.8元。与计算公式总费用=起步费用+(里程-2公里)*里程单价+等候时间*等后单价;即15.8=5+(6-2)*1.4+4*1.3。实验结果与理论结果完全一致,实验设计成功。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-30
目录
第一章 引言 1
1.1 设计背景 1
1.2 设计任务与要求 1
1.21 设计任务 1
1.22 设计要求 1
第二章 系统方案设计 2
2.1 出租车计费器工作原理 2
2.2 基本设计思想 2
第三章 主要功能的实现 3
3.1 具体模块功能设计 3
3.2 具体模块实现 4
3.21 车速控制模块 4
3.22 里程计数模块 4
3.23 计费计数模块 4
3.24 动态扫描模块 4
3.3 总模块 4
第四章 程序调试及局部仿真结果 6
4.1 车速控制模块仿真结果 6
4.2 测试结果展示 6
第五章 结束语 8
参考资料 9
附件 10

第一章 引言
1.1 设计背景
随着出租车行业的发展,对出租车计费器的要求也越来越高。最近几年出租车行业发展迅速,在全国有几千家出租车公司。因此出租车计费器市场是庞大的。而出租车计费器成为不可缺少的一部分。
信息社会的现代电子产品,性能越来越高,复杂度越来越大,更新步伐也越来越快。实现这种进步的主要原因就是微电子技术和电子技术的发展。而电子技术的发展后者的核心就是电子设计自动化EDA(Electronic Design Automatic)技术。EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。
由美国国防部提出的VHDL(Very High Speed Integrated CIRCUIT HARDWARE DESCRIPTION Language)即超高速集成电路硬件描述语言,采用高层次的、自顶向下的设计方法来描述硬件,非常适合当前集成化、大规模的需要。
MAX+PLUSⅡ(Multiple Array MATRIX And Programmable Logic User Systems)是电子设计不可缺少的工具,他可以接受多种方式的输入:原理图输入、文本输入(硬件描述语言)、第三方EDA工具提供的接口等。MAX+PLUSⅡ的仿真器具有很强灵活性,可以控制对单器件或多器件的仿真。MAX+PLUSⅡ还提供了丰富的帮助库。  本文采用VHDL语言来设计实现出租车计费系统,源程序经美国ALTERA公司的MAX+PLUSⅡ软件调试优化,下载到特定芯片(MAX系列之一)后,可应用于实际的出租车计费系统中。
1.2 设计任务与要求
1.21 设计任务
设计一个出租车自动计费器,计费包括起步价、行车里程计费、停止和暂停不计费三部分。现场模拟汽车的启动、停止、暂停和换挡状态。分别用四位数码管显示金额和里程,各有两位小数,行程 3公里内,起步费为6元,超过3公里,以每公里1.2元计费。
1.22 设计要求
1、设计正确,方案合理。界面友好,使用方便。程序精炼,结构清晰。
2、有详细的文档。包括设计思路、设计仿真程序、仿真结果及相应的分析与结论。

第二章 系统方案设计
2.1 出租车计费器工作原理  实际中出租车的计费工作原理一般分成3个阶段:
  (1)车起步开始计费。首先显示起步价(本次设计起步费为6.00元),车在行驶3 km以内,只收起步价6.00元。
  (2)车行驶超过3 km后,按每公里1.2元计费(在7.00元基础上每行驶1 km车费加1.2元),车费依次累加。
  (3)行驶路程达到或超过10.5 km后(车费达到20元)�,每公里加收50%的车费,车费变成按每公里1.8元�开始计费。车暂时停止(行驶中遇红灯或中途暂时停车)不计费,车费保持不变。若停止则车费清零,等待下一次计费的开始。
2.2 基本设计思想  (1)根据出租车计费原理,将出租车计费部分由5个计数器来完成分别为counterA,counterB,counterC,counterD,counterE。①计数器A完成车费百位。②计数器B完成车费十位和个位。③计数器C完成车费角和分。④计数器D完成计数到30(完成车费的起步价)。⑤计数器E完成模拟实现车行驶100 m的功能。  (2)行驶过程中车费附加50%的功能:由比较器实现。  (3)车费的显示:由动态扫描电路来完成。用专用模块来实现,完成数据的输入即动态数据的显示。  (4)根据层次化设计理论,该设计问题自顶向下可分为车速控制模块、计数模块、译码和动态扫描显示模块,其系统框图如下图所示:

图1.1 出租车系统框图

第三章 主要功能的实现
3.1 具体模块功能设计
计费器按里程收费,每100 m开始一次计费.图3.1为原理结构图,各模块功能如下:
   图3.1 出租车计费器的结构框图
  (1)计数器E为带预置的可变步长的模100计数器,预置端为车速(每秒),如果预置端接入车速表,就可以实现计费了,这里用于模拟行车速度。例如:假设当计数器E计数到100则E的“CO”端输出一个高电平。此脉冲信号送给计数器D,使D完成车起步里程3 km的功能。在以后的时间里E的“CO”端的脉冲信号送给计数器C,使其完成按每公里收取费用的功能。
  (2)计数器D为带预置模的十进制加法计数器,预置数为车起步里程3 km,计数脉冲为计数器E的进位信号。这样当计数器D计数达到30后,进位输出将为一个高电平,控制计数器A,B,C开始计数,这样就能实现超过3 km后计费器再按每公里加收车费。
  (3)与门为2个8输入的8与门,一端用于预置,一端输入当前计费器收费情况,当计费器计费达到或超过一定收费(如20元)时,每公里加收50%的车费,此时该与门输出一个片选信号送MUX。  (4)MUX为16选8的2选1MUX,2个选择输入端分别为每100 m收费和50%的每100 m收费,片选信号由与门控制。
(5)计数器C为可变步长的模100十进制计数器,带预置端,预置数为计数步长。计数器C主要用于累加,当车行驶达到100 m时,计数器计数一次,计数步长为每100 m的行车收费。进位脉冲信号送到计数器B的“CLK”端,控制计数器B的计数步调。
  (6)计数器B为带预置的模100十进制计数器,预置数为出租车起步价,车费的个位,与数码管的第2位和第3位相连。计数时钟为计数器C的进位脉冲信号。
(7)计数器A为十进制计数器,其结果为车费的十,与4位数码管的最高位相连,计数时钟为进位脉冲。
(8)动态扫描电路将计数器A、B、C的计费状态用数码管显示出来,所连接的数码管共用一个数据端,由片选信号依次选择输出,轮流显示。
3.2 具体模块实现
3.21 车速控制模块
当启停键为启动状态(高电平时),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时,暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
3.22 里程计数模块
里程计数模块实现对于出租车在行驶过程的里程计数功能;当行驶里程大于3KM时,本模块中信号变为1;clk每来一个上升沿,里程计数模块实现一次计数,里程数加1。
计数车速控制模块发出的脉冲,并将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。
3.23 计费计数模块
计费模块启动reset信号,根据输入的clk信号变化,调节费用的计数,用c0、c1、c2、c3显示费用。
其初值为6,当里程数超过3公里后,才接受计数车速控制模块发出的脉冲的驱动,并且将计数显示动态显示出来,每一个脉冲其数值加0.12,当收费超过20时数值加0.18当启停键为启动状态(高电平时),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时,暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
3.24 动态扫描模块
动态扫描电路将计数器A、B、C的计费状态用数码管显示出来,所连接的数码管共用一个数据端,由片选信号依次选择输出,轮流显示。该模块经过8选1选择器将计费数据(4位BCD码)、计程数据(4位BCD码)动态选择输出。其中计费数据送入显示译码模块进行译码,最后送至百元、十元、元、角为单位对应的数码管上显示;计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示。
3.3 总模块
taxi的计费器的原理图:将各模块的原理图对应的端口连接。

图3.2 出租车计数器原理图

第四章 程序调试及局部仿真结果
4.1 车速控制模块仿真结果

图4.1 车速控制模块时序仿真结果
图4.1
clk为基本输入时钟即(基本车速);k为可调车速,通过改变k来模拟车速变化;start为启停开关,当start为‘1’时内部计数器开始计数;reset为复位开关,用于复位车速控制模块中定义的count2计数器;clkout为脉冲输出,当输入车速越大,脉冲输出频率越高,计数周期变短,而clkout输出脉冲的意义为,参照于基本车速所反映的一个相对时间量,一个脉冲代表在该车速下行进了0.1km;
仿真出现的问题:
该车速控制模块中的reset复位端作为整个系统复位的一个环节,配合其他模块的的复位一起使用,做到对计数模块和显示模块的清零和归位。但是在该模块中单独时,效果不能体现,因为在该模块中,它复位的是内部定义的计数器count2,在脉冲输出clkout中不能体现使其为‘0’,只是不在出现状态变换,在全体仿真和硬件测试中,reset可以体现复位和清零。

4.2 测试结果展示

a:起步价格 b:开始行使未超过三公里

c:超过三公里后 d:超过20元后

图4.2 计费和里程测试结果显示

图4.2中a为起始起步价格,6元。b为出租车开始行使,未超出三公里保持起始价格不变。c为超过三公里后按每公里加1.2元计算。d为超出20元后按每公里原价的150%计算,即每公里1.8元。

第五章 结束语
短短一周的EDA课程设计已经接近尾声了,我们从挑选课设题目,查阅资料,到研究出总体设计,详细设计,然后分工合作,再到最后的编程上机调试,修改程序,完善程序,收获颇多。出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动,停止、暂停等功能,并设计动态扫描电路显示车费数目。车暂停时停止计费。若停止清零,等待下一次计费的开始。出租车计费系统设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点。本设计在使用方面居庸一点的价值。由于时间有限和经验是平的欠缺,不足之处还望老师予以指正。
在这一周里我们再次熟悉和增强了对VHDL语言的基本知识,熟悉利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来。VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;更加了解和加深了对编制和调试程序的技巧,进一步提高了上机动手能力,培养了使用设计综合电路的能力,养成了提供文档资料的习惯和规范编程的思想。
本次的课程设计将各个单一的模块实现其功能后,学会通过原理图或顶层文件把各模块连接,从而实现对出租车自动计费。课设注重的不仅是把理论知识巩固,而且应把理论和实际相结合,把知识应用到生活中。在课设过程中,遇到了不少问题,数码管无法正常显示,计费不按要求等。通过的对源代码的修改,发现了一些易忽略的细节。课设考验的是思维逻辑能力,对知识的灵活应用,当然,合作精神是不可或缺的。课设时间不长,要在短时间内完成绝不是个人力量能达到的,要学会集众人之精华,还要善于利用已有的工具为自己服务,开拓思维。课设让我们认识到所学本科知识的真正实用性,只是这门课开始研究的第一步。
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。最后,我们衷心的感谢课设期间一直指导和陪伴着我们的老师。

参考资料
[1] 候伯亨,顾新. VHDL硬件描述语言与数字逻辑电路设计.修订版。西安电子科技大学出版社,1999�[2] 张昌凡,等.可编程逻辑器件及VHDL设计技术.广州:华南理工大学出版社,2001 [3] 曾繁泰,陈美金.VHDL程序设计 .北京:清华大学出版社,2001 [4] 潘松,等.VHDL实用教程 .成都:电子科技大学出版社,2000

附件
1、车速控制模块源程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SPEED IS
PORT(
CLK,RESET,START: IN STD_LOGIC;
K : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
CLKOUT : OUT STD_LOGIC
);
END SPEED;
ARCHITECTURE A OF SPEED IS
SIGNAL COUNT1 :STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL TEMPCLK,CLKS:STD_LOGIC;
SIGNAL KINSIDE :STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
KINSIDE<="00000"-K;
CLKS_LABEL:
PROCESS(RESET,CLK)
VARIABLE COUNT2: STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
IF RESET = '1' THEN
COUNT2:="00000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF START='1' THEN
IF COUNT2=KINSIDE THEN COUNT2:="00000";
END IF;
IF NOT (K="00000") THEN COUNT2:= COUNT2+1;
END IF;
IF COUNT2="00001" THEN TEMPCLK <= NOT TEMPCLK;
END IF;
END IF;
END IF;
END PROCESS CLKS_LABEL;
CLKOUT <= TEMPCLK;
END A;
2、计程源程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CDU99 IS
PORT (CLK,RESET: IN STD_LOGIC;
COUNT1:OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
COUNT2:OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
COUNT3:OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END CDU99;
ARCHITECTURE AA OF CDU99 IS
BEGIN
PROCESS(CLK,RESET)
VARIABLE MM: STD_LOGIC_VECTOR (11 DOWNTO 0);
BEGIN
IF RESET ='1' THEN
MM:="000000000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF MM(3 DOWNTO 0)="1001" THEN
MM:=MM+7; ELSE MM:=MM+1; END IF;
IF MM(7 DOWNTO 4)="1010" THEN
MM:=MM+"01100000"; END IF;
END IF;
COUNT1 <=MM(3 DOWNTO 0);
COUNT2 <=MM(7 DOWNTO 4);
COUNT3 <=MM(11 DOWNTO 8);
END PROCESS;
END AA;
4、计费模块源程序如下
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT99 IS
PORT(CLK,RESET:IN STD_LOGIC;
JUDGE2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
JUDGE3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUNT4:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COUNT99;
ARCHITECTURE AA OF COUNT99 IS
SIGNAL EN :STD_LOGIC;
SIGNAL MONEY :STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL MCOUNT :STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
MONEY<="00011000" WHEN ((MCOUNT(15)='1') OR (MCOUNT(14)='1') OR (MCOUNT(13)='1')) ELSE "00010010";
EN<='0' WHEN JUDGE3="0000" AND JUDGE2(3 DOWNTO 2)="00" AND((JUDGE2(1)='0') OR (JUDGE2(1)='1' AND JUDGE2(0)='0')) ELSE '1';
PROCESS(CLK,RESET)
VARIABLE MM: STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF RESET='1' THEN
MM:="0000011000000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN MM:=MM+MONEY;END IF;
IF MM(3)='1' AND (NOT(MM(2 DOWNTO 1)="00"))THEN
MM:=MM+6;END IF;
IF MM(7)='1' AND (NOT(MM(6 DOWNTO 5)="00"))THEN
MM:=MM+"01100000";END IF;
IF MM(11)='1' AND (NOT(MM(10 DOWNTO 9)="00"))THEN
MM:=MM+"011000000000";END IF;
END IF;
COUNT1<=MM(3 DOWNTO 0);
COUNT2<=MM(7 DOWNTO 4);
COUNT3<=MM(11 DOWNTO 8);
COUNT4<=MM(15 DOWNTO 12);
MCOUNT<=MM;
END PROCESS;
END AA;
5、 译码管片选信号源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SE IS
PORT(CLK: IN STD_LOGIC;
A: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END SE;
ARCHITECTURE RT1 OF SE IS
BEGIN
PROCESS(CLK)
VARIABLE B:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF(B="111")THEN
B:="000";
ELSE
B:=B+1;
END IF;
END IF;
A<=B;
END PROCESS;
END RT1;
6、八选一模块程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY XXX1 IS
PORT(C:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
DP: OUT STD_LOGIC;
A1,A2,A3,A4,B1,B2,B3,B4:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
D:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END XXX1;
ARCHITECTURE RT1 OF XXX1 IS
BEGIN
PROCESS(C,A1,A2,A3,A4,B1,B2,B3,B4)
VARIABLE COMB:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
COMB:=C;
CASE COMB IS
WHEN"000"=>D<=A1;
DP<='0';
WHEN"001"=>D<=A2;
DP<='0';
WHEN"010"=>D<=A3;
DP<='1';
WHEN"011"=>D<=A4;
DP<='0';
WHEN"100"=>D<=B1;
DP<='0';
WHEN"101"=>D<=B2;
DP<='0';
WHEN"110"=>D<=B3;
DP<='1';
WHEN"111"=>D<=B4;
DP<='0';
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END RT1;
7、译码模块源程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DI IS
PORT(D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END DI;
ARCHITECTURE RT1 OF DI IS
BEGIN
PROCESS(D)
BEGIN
CASE D IS
WHEN"0000"=>Q<="0111111";
WHEN"0001"=>Q<="0000110";
WHEN"0010"=>Q<="1011011";
WHEN"0011"=>Q<="1001111";
WHEN"0100"=>Q<="1100110";
WHEN"0101"=>Q<="1101101";
WHEN"0110"=>Q<="1111101";
WHEN"0111"=>Q<="0100111";
WHEN"1000"=>Q<="1111111";
WHEN OTHERS=>Q<="1101111";
END CASE;
END PROCESS;
END RT1;本回答被网友采纳
相似回答