能发一下出租车计价器设计的总体思路吗

能发一下出租车计价器设计的总体思路吗,第1张

实验任务及要求1.能实现计费功能,计费标准为:按行驶里程收费,起步费为10.00元,并在车行3公里后再按1.6元/公里,车暂停时,停车一分钟之后开始加价,每分钟增加2.5元。2. 实现预置功能:能预置起步费、每公里收费、车行加费里程。3. 实现模拟功能:能模拟汽车启动、停止、暂停等状态。4. 设计动态扫描电路:将车费及暂停时间显示出来。5. 用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。6. 综合仿真验证,并通过有关波形确认电路设计是否正确。7. 完成电路全部设计后,通过GW48系统实验箱下载验证设计的正确性。二、实验原理图1出租车计价器流程图 图2系统结构图接口部分定义如下:输入:clk_240,系统时钟,频率为240Hz Start,启动信号,当start=1时,汽车启动,开始计价当start=0时,清零 Stop,暂时计时信号,当stop-1时,中途暂停,开始计时当stop=0时,再次出发 Fin,汽车车速脉冲信号,是一个与随着车速变化而变化的脉冲信号。输出:cha2,cha1,cha0,分别为价钱的十位,个位和角位 Km1,km0,分别为行驶公里数的十位,个位 Min0,暂时分钟数输出。接口部分源程序如下:port ( clk_240 :in std_logic --频率为240Hz的时钟start :in std_logic --计价使能信号 stop:in std_logic --等待信号 fin:in std_logic--公里脉冲信号 cha2,cha1,cha0:out std_logic_vector(3 downto 0)--费用数据 km1,km0:out std_logic_vector(3 downto 0) --公里数据 min0: out std_logic_vector(3 downto 0)) --等待时间 计价部分原理如下: 起步价10元,3公里内10元,超出3公里部分,每公里1.6元,车暂停时,2分钟内不加价,超出2分钟部分,每分钟2.5元计费部分源程序如下:feipin:process(clk_240,start)begin if clk_240'event and clk_240='1' then if start='0' then q_15<=0q_16<=0f_15<='0'f_16<='0'f_1<='0'f<='0'else if q_15=15 then q_15<=0f_15<='1' --此IF语句得到频率为15Hz的信号 else q_15<=q_15+1f_15<='0'end ifif q_16=14 then q_16<=0f_16<='1' --此IF语句得到频率为16Hz的信号else q_16<=q_16+1f_16<='0'end if if q_1=239 then q_1<=0f_1<='1' --此IF语句得到频率为1Hz的信号else q_1<=q_1+1f_1<='0' end if if en1='1' then f<=f_15 --此IF语句得到计费脉冲felsif en0='1' then f<=f_16 else f<='0' end if end if end ifend process

process(f_1)begin if f_1'event and f_1='1' then if start='0' then w<=0en1<='0'en0<='0'm1<="000"m0<="0000"k1<="0000"k0<="0000"elsif stop='1' then if w=59 then w<=0--此IF语句完成等待计时 if m0="1001" then m0<="0000" --此IF语句完成分计数 if m1<="101" then m1<="000" else m1<=m1+1 end if else m0<=m0+1 end if if m1&m0>"0000001"then en1<='1'--此IF语句得到en1使能信号 else en1<='0' end if else w<=w+1en1<='0' end ifelsif fin='1' then if k0="1001" then k0<="0000" --此IF语句完成公里脉冲计数 if k1="1001" then k1<="0000" else k1<=k1+1 end if else k0<=k0+1 end if if k1&k0>"00000010" then en0<='1' --此IF语句得到en0使能信号else en0<='0' end ifelse en1<='0'en0<='0'end ifcha3<=c3cha2<=c2cha1<=c1cha0<=c0 --费用数据输出km1<=k1km0<=k0min1<='0'&m1min0<=m0 --公里数据、分钟数据输出 end ifend processprocess(f,start)begin if start='0' then c3<="0000"c2<="0001"c1<="0000"c0<="0000" elsif f'event and f='1' then if c0="1001" then c0<="0000" --此IF语句完成对费用的计数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 ifelse c0<=c0+1end if end ifend processend behav

注:百度知道上找到,希望采纳

大体模块如下,以前用过的,你再改一改就可以了、、、、

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<=0clk_14<=not clk_14

else q_14<=q_14+1

end if --得14hz频率信号

If q_13=57691 then q_13<=0clk_13<=not clk_13

else q_13<=q_13+1

end if --得13hz频率信号

If q_1=749999 then q_1<=0clk_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<=0en1<='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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11420557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存