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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)