当前位置:文档之家› 出租车计价器代码VHDL

出租车计价器代码VHDL

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY TAXI IS
PORT(
SA,SB:IN STD_LOGIC;
CLK:IN STD_LOGIC;
RST:IN STD_LOGIC; --复位信号;RST置为1时,计时清零、里程、费用均清零。
CAT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ; --数码管共阴极端的使能控制
A:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --数码管8个端输入端控制
ROW:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵行输出端控制
COLR:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --点阵列输出端控制,红
COLG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ; --点阵列输出端控制,绿
TIMING:IN STD_LOGIC; --用于是否夜间计费 TIME=0表示夜间行驶。
SPEED:IN STD_LOGIC --变速行驶。speed=‘1’时加速行驶,一秒行驶一公里

);
END TAXI;

ARCHITECTURE PAY OF TAXI IS

TYPE ALL_STATE IS (IDLE,GO,WAITTING);
SIGNAL STATE: ALL_STATE;
SIGNAL CLK1HZ:STD_LOGIC; --1Hz分频信号
SIGNAL CLK3S:STD_LOGIC; --产生一个以3s周期的信号,用于等待时间的计时.
SIGNAL COUNT1HZ:INTEGER RANGE 0 TO 24999999; --5OM分频计数
SIGNAL COUNT3S:INTEGER RANGE 0 TO 2; --3S信号的分频计数
SIGNAL W2,W1,W0:STD_LOGIC_VECTOR(3 DOWNTO 0); --WATI状态的计时。三位数W2W1W0。
SIGNAL K2,K1,K0:STD_LOGIC_VECTOR(3 DOWNTO 0); --里程计数。999秒约束了里程的最大值,所以设三位即可。
SIGNAL X:integer range 0 to 1:=0; --记录是否加了燃油费。x=0表示没加,x=1表示已加。在复位以及idle状态时对x进行清零操作;
SIGNAL I:INTEGER RANGE 0 TO 5 :=0; --当状态从go/wait转到idle时,希望将价格等持续显示5秒。
SIGNAL FIN:STD_LOGIC; --每行驶两秒记录一公里,用fin计数,当fin翻转至1时公里数加1。
SIGNAL C2,C1,C0,CX:STD_LOGIC_VECTOR(3 DOWNTO 0); --C2C1C0代表费用。C用于夜间计价时的小数点位。
SIGNAL SS:STD_LOGIC_VECTOR(1 DOWNTO 0); --SS代表数码管的三个状态:A、B、C
SIGNAL B:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL C,D:STD_LOGIC_VECTOR(1 DOWNTO 0); --分别代表状态A、B、C内不同的显示状态
SIGNAL COUNT1,COUNT2,COUNT3,COUNT4:INTEGER RANGE 0 TO 500000 :=0; --代表5s的计数,五秒转换一次SS的状态。
SIGNAL CLKDZ,CLKSM:STD_LOGIC; --点阵、数码管所用时钟信号
SIGNAL COUNTDZ,COUNTSM:INTEGER RANGE 0 TO 250;
SIGNAL N,N1,N2:INTEGER RANGE 0 TO 7 :=7;
SIGNAL N1:INTEGER RANGE 0 TO 9 :=9;

BEGIN
U1:PROCESS(CLK) --50M分频模块,
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
IF COUNT1HZ=24999999 THEN
COUNT1HZ<=0;
CLK1HZ<= NOT CLK1HZ;
ELSE
COUNT1HZ<=COUNT1HZ+1;
END IF;
END IF;
END PROCESS U1;

U2:PROCESS(CLK1HZ) --有限状态机设计模块

BEGIN
IF RST='1' THEN W2<="0000"; W1<="0000"; W0<="0000"; K2<="0000"; K1<="0000"; K0<="0000"; I<=0; FIN<='0';
ELSE --复位信号为0,此时程序正常执行
IF CLK1HZ'EVENT AND CLK1HZ='1' THEN
CASE STATE IS
WHEN IDLE =>
IF SA='0' THEN
STATE<=IDLE;
W2<="0000"; W1<="0000"; W0<="0000"; K2<="0000"; K1<="0000"; K0<="0000"; I<=0; FIN<='0';CLK3S<='0';COUNT3S<=0;
ELSIF (SA='1' AND SB='0') THEN STATE<=GO;
W2<="0000"; W1<="0000"; W0<="0000"; K2<="0000"; K1<="0000"; K0<="0000"; I<=0; FIN<='1'; CLK3S<='0';COUNT3S<=0; --此刻进入go状态已经一秒。
ELSIF (SA='1' AND SB='1') THEN STATE<=WAITTING;
W2<="0000"; W1<="0000"; W0<="0001"; K2<="0000"; K1<="0000"; K0<="0000"; I<=0; FIN<='0';
END IF;
WHEN GO =>
IF SA='0' THEN
IF I=5 THEN STATE<=IDLE;
W2<="0000"; W1<="0000"; W0<="0000"; K2<="0000"; K1<="0000"; K0<="0000"; I<=0; FIN<='0'; CLK3S<='0';COUNT3S<=0; --相关信号清零
ELSE
STATE<=GO;
W2<=W2; W1<=W1; W0<=W0; K2<=K2; K1<=K1; K0<=K0;I<=I+1;
END IF;
ELSIF (SA='1' AND SB='0') THEN STATE<= GO;
IF(SPEED='0') THEN
FIN<= NOT FIN; W2<=W2; W1<=W1; W0<=W0; I<=0; CLK3S<='0';COUNT3S<=0;
IF FIN='0' THEN --里程计数
IF K0="1001" THEN K0<="0000";
IF K1="1001" THEN K1<="0000";
IF K2="1001" THEN K2<="0000";
ELSE K2<=K2+1;
END IF;
ELSE K1<=K1+1;
END IF;
ELSE K0<=K0+1;
END IF;
END IF;
ELSE
W2<=W2; W1<=W1; W0<=W0; I<=0; CLK3S<='0';COUNT3S<=0;
IF K0="1001" THEN K0<="0000"; --加速情况下一秒一公里
IF K1="1001" THEN K1<="0000";
IF K2="1001" THEN K2<="0000";
ELSE K2<=K2+1;
END IF;
ELSE K1<=K1+1;
END IF;
ELSE K0<=K0+1;
END IF;
END IF;
ELSIF (SA='1' AND SB<='1') THEN STATE<=WAITTING; --每次重新进入wait状态时,等待时间累积,里程数不能变。
K2<=K2; K1<=K1; K0<=K0;
IF W0="1001" THEN W0<="0000"; --等待计时+1
IF W1="1001" THEN W1<="0000";
IF W2="1001" THEN W2<="0000";
ELSE W2<=W2+1;
END IF;
ELSE W1<=W1+1;
END IF;
ELSE W0<=W0+1;
END IF;
END IF;
WHEN WAITTING =>
IF

SA='0' THEN --将等待时间、价格持续显示5秒。
IF I=5 THEN STATE<=IDLE;
W2<="0000"; W1<="0000"; W0<="0000"; K2<="0000"; K1<="0000"; K0<="0000";I<=0; CLK3S<='0';COUNT3S<=0;
ELSE
STATE<=WAITTING;
W2<=W2; W1<=W1; W0<=W0; K2<=K2; K1<=K1; K0<=K0;I<=I+1;
END IF;
ELSIF (SA='1' AND SB='0') THEN STATE<=GO;
IF(SPEED='0') THEN --由等待进入行驶的第一秒
FIN<= NOT FIN; W2<=W2; W1<=W1; W0<=W0; I<=0; CLK3S<='0';COUNT3S<=0;
IF FIN='0' THEN --里程计数
IF K0="1001" THEN K0<="0000";
IF K1="1001" THEN K1<="0000";
IF K2="1001" THEN K2<="0000";
ELSE K2<=K2+1;
END IF;
ELSE K1<=K1+1;
END IF;
ELSE K0<=K0+1;
END IF;
END IF;
ELSE
W2<=W2; W1<=W1; W0<=W0; I<=0; CLK3S<='0';COUNT3S<=0;
IF K0="1001" THEN K0<="0000"; --加速情况下一秒一公里
IF K1="1001" THEN K1<="0000";
IF K2="1001" THEN K2<="0000";
ELSE K2<=K2+1;
END IF;
ELSE K1<=K1+1;
END IF;
ELSE K0<=K0+1;
END IF;
END IF;
ELSIF SA='1' AND SB='1' THEN STATE<=WAITTING;
K2<=K2; K1<=K1; K0<=K0;I<=0;
IF W0="1001" THEN W0<="0000"; --等待计时
IF W1="1001" THEN W1<="0000";
IF W2="1001" THEN W2<="0000";
ELSE W2<=W2+1;
END IF;
ELSE W1<=W1+1;
END IF;
ELSE W0<=W0+1;
END IF;
IF (W2>="0000" AND W1>="0000" AND W0>="0101") OR (W2>="0001") OR (W1>="0001")THEN --若等待时间超过5秒,开始启动3秒等待时间计时。每三秒clk3s有一个上升沿,用于后面等待时间计费。
IF COUNT3S=2 THEN
COUNT3S<=0; CLK3S<='1';
ELSE
COUNT3S<=COUNT3S+1; CLK3S<='0';
END IF;
END IF;
END IF;
WHEN OTHERS => NULL;
END CASE;
END IF;
END IF;
END PROCESS U2;

U3:PROCESS(CLK1HZ,CLK3S,RST) --费用计算模块
BEGIN
IF RST='1' THEN C2<="0000"; C1<="0000"; C0<="0000";CX<="0000"; X<=0;
ELSE
IF CLK1HZ'EVENT AND CLK1HZ='1' THEN
IF SA='1' AND SB='0' THEN --go状态下才会有里程的变化,价格才会变化
IF K1="0000" AND K0<"0110" THEN
C2<="0000"; C1<="0001"; C0<="0011"; X<=0; --五公里以

内13元
ELSE
IF TIMING='1'AND SPEED='0' THEN --白天、正常速度
-- CX<="0000"; -- 白天计价为整数,小数位不会变化。
IF C0="1001" THEN C0<="0000";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
ELSIF TIMING='0' AND SPEED='0' THEN --夜间、正常速度 1秒1.2元
IF CX="1000" THEN CX<="0000"; --CX=CX+2
ELSIF CX="1001" THEN CX<="0001";
IF C0="1001" THEN C0<="0000";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
ELSE CX<=CX+2;
END IF;
IF C0="1001" THEN C0<="0000"; --C0<=C0+1
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
ELSIF TIMING='1' AND SPEED='1' THEN --白天、加速。1秒两元
CX<=CX; -- 白天计价为整数,小数位不会变化。
IF C0="1000" THEN C0<="0000"; -- C0=C0+2
ELSIF C0="1001" THEN C0<="0001";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+2;
END IF;

ELSIF TIMING='0' AND SPEED='1' THEN --夜间、加速。1秒2.4元
IF CX="1001" THEN CX<="0011";
ELSIF CX="1000" THEN CX<="0010";
ELSIF CX="0111" THEN CX<="0001";
ELSIF CX="0110" THEN CX<="0000";
IF C0="1001" THEN C0<="0000";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
ELSE CX<=CX+4;
END IF;
IF C0="1000" THEN C0<="0000";
ELSIF C0="1001" THEN C0<="0001";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+2;
END IF;
END IF;
END IF;
ELSIF

SA='1' AND SB='1' THEN
IF CLK3S='1' THEN --当3s信号一变为1,代表等待时间已超过五秒,并且已另外过了三秒,所以价格上升一元或1.2元。
IF TIMING='1' THEN
IF C0="1001" THEN C0<="0000";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
ELSE
IF CX="1000" THEN CX<="0000"; --CX+2
ELSIF CX="1001" THEN CX<="0001"
IF C0="1001" THEN C0<="0000";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
ELSE CX<=CX+2;
END IF;
IF C0="1001" THEN C0<="0000"; --C0+1
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
end if;
END IF;
ELSIF (SA='0'AND STATE=GO) OR (SA='0' AND STATE=WAITTING) THEN --判断是否加燃油费
IF X=0 THEN
IF C0="1001" THEN C0<="0000";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
X<=1;
END IF;
IF(CX>="0101") THEN --最终显示价格时需要将小数点四舍五入到个位
IF C0="1001" THEN C0<="0000";
IF C1="1001" THEN C1<="0000";
IF C2="1001" THEN C2<="0000";
ELSE C2<=C2+1;
END IF;
ELSE C1<=C1+1;
END IF;
ELSE C0<=C0+1;
END IF;
ELSE CX<="0000";
END IF;

ELSIF (SA='0' AND STATE=IDLE) THEN
C2<="0000"; C1<="0000"; C0<="0000"; CX<="0000";
END IF;
END IF;
END IF;
END PROCESS U3;

U4:PROCESS(CLK,RST) --数码管显示模块
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF COUNTSM=250 THEN --将50M信号分频为100KHZ,防止因频率过高导致数码管亮度不稳。
COUNTSM<=0; CLKSM<=NOT CLKSM;
ELSE
COUNTSM<=COUNTSM+1;
END IF;
END IF;
IF CLKSM'EVENT AND CLKSM='1' THEN
IF RST='1' THEN CAT<="000000"; A<="00111111"; --复位信号有效时,数码管输出显示0,表示复位信号有效。
ELSE
IF SA='1' THEN
IF SS="00" THEN

--A状态:价格显示
IF COUNT1=500000 THEN COUNT1<=0; SS<=SS+1; --A状态显示够5s时状态才会加一。
ELSE
IF B="000" THEN CAT<="011111"; A<="01110111"; B<=B+1; --显示A
ELSIF B="001" THEN CAT<="110111"; B<=B+1;
IF C2="0000" THEN A<="00111111"; --C2=0
ELSIF
C2="0001" THEN A<="00000110"; --C2=1
ELSIF
C2="0010" THEN A<="01011011"; --C2=2
ELSIF
C2="0011" THEN A<="01001111"; --C2=3
ELSIF
C2="0100" THEN A<="01100110"; --C2=4
ELSIF
C2="0101" THEN A<="01101101"; --C2=5
ELSIF
C2="0110" THEN A<="01111101"; --C2=6
ELSIF
C2="0111" THEN A<="00000111"; --C2=7
ELSIF
C2="1000" THEN A<="01111111"; --C2=8
ELSIF
C2="1001" THEN A<="01101111"; --C2=9
END IF;
ELSIF B="010" THEN CAT<="111011"; B<=B+1;
IF C1="0000" THEN A<="00111111"; --C1=0
ELSIF
C1="0001" THEN A<="00000110"; --C1=1
ELSIF
C1="0010" THEN A<="01011011"; --C1=2
ELSIF
C1="0011" THEN A<="01001111"; --C1=3
ELSIF
C1="0100" THEN A<="01100110"; --C1=4
ELSIF
C1="0101" THEN A<="01101101"; --C1=5
ELSIF
C1="0110" THEN A<="01111101"; --C1=6
ELSIF
C1="0111" THEN A<="00000111"; --C1=7
ELSIF
C1="1000" THEN A<="01111111"; --C1=8
ELSIF
C1="1001" THEN A<="01101111"; --C1=9
END IF;
ELSIF B="011" THEN CAT<="111101"; B<=B+1;
IF C0="0000" THEN A<="10111111"; --C0=0.
ELSIF
C0="0001" THEN A<="10000110"; --C0=1.
ELSIF
C0="0010" THEN A<="11011011"; --C0=2.
ELSIF
C0="0011" THEN A<="11001111"; --C0=3.
ELSIF
C0="0100" THEN A<="11100110"; --C0=4.
ELSIF
C0="0101" THEN A<="11101101"; --C0=5.
ELSIF
C0="0110" THEN A<="11111101"; --C0=6.
ELSIF
C0="0111" THEN A<="10000111"; --C0=7.
ELSIF
C0="1000" THEN A<="11111111"; --C0=8.
ELSIF
C0="1001" THEN A<="11101111"; --C0=9.
END IF;
ELSIF B="100" THEN CAT<="111110"; B<="000";
IF CX="0000" THEN A<="00111111"; --C0=0
ELSIF

CX="0001" THEN A<="00000110"; --C0=1
ELSIF
CX="0010" THEN A<="01011011"; --C0=2
ELSIF
CX="0011" THEN A<="01001111"; --C0=3
ELSIF
CX="0100" THEN A<="01100110"; --C0=4
ELSIF
CX="0101" THEN A<="01101101"; --C0=5
ELSIF
CX="0110" THEN A<="01111101"; --C0=6
ELSIF
CX="0111" THEN A<="00000111"; --C0=7
ELSIF
CX="1000" THEN A<="01111111"; --C0=8
ELSIF
CX="1001" THEN A<="01101111"; --C0=9
END IF;
END IF;
COUNT1<=COUNT1+1;
END IF;
ELSIF SS="01" THEN --B状态:里程显示
IF COUNT2=500000 THEN COUNT2<=0; SS<=SS+1; --B状态显示够4s时状态才会加一,转向ss=10的C状态。
ELSE
IF C="00" THEN CAT<="011111"; A<="01111111"; C<=C+1; --显示B
ELSIF C="01" THEN CAT<="111101"; C<=C+1;
IF K1="0000" THEN A<="00111111"; --K1=0
ELSIF
K1="0001" THEN A<="00000110"; --K1=1
ELSIF
K1="0010" THEN A<="01011011"; --K1=2
ELSIF
K1="0011" THEN A<="01001111"; --K1=3
ELSIF
K1="0100" THEN A<="01100110"; --K1=4
ELSIF
K1="0101" THEN A<="01101101"; --K1=5
ELSIF
K1="0110" THEN A<="01111101"; --K1=6
ELSIF
K1="0111" THEN A<="00000111"; --K1=7
ELSIF
K1="1000" THEN A<="01111111"; --K1=8
ELSIF
K1="1001" THEN A<="01101111"; --K1=9
END IF;
ELSIF C="10" THEN CAT<="111110"; C<="00";
IF K0="0000" THEN A<="00111111"; --K0=0
ELSIF
K0="0001" THEN A<="00000110"; --K0=1
ELSIF
K0="0010" THEN A<="01011011"; --K0=2
ELSIF
K0="0011" THEN A<="01001111"; --K0=3
ELSIF
K0="0100" THEN A<="01100110"; --K0=4
ELSIF
K0="0101" THEN A<="01101101"; --K0=5
ELSIF
K0="0110" THEN A<="01111101"; --K0=6
ELSIF
K0="0111" THEN A<="00000111"; --K0=7
ELSIF
K0="1000" THEN A<="01111111"; --K0=8
ELSIF
K0="1001" THEN A<="01101111"; --K0=9
END IF;
END IF;
COUNT2<=COUNT2+1;
END IF;
ELSIF SS="10" THEN --C状态:等待时间显示
IF COUNT3=500000 THEN COUNT3<=0; SS<="

00"; --C状态显示够3s时状态转向ss=“00”,即A状态
ELSE
IF D="00" THEN CAT<="011111"; A<="00111001"; D<=D+1; --显示C
ELSIF D="01" THEN CAT<="111011"; D<=D+1;
IF W2="0000" THEN A<="00111111"; --W2=0
ELSIF
W2="0001" THEN A<="00000110"; --W2=1
ELSIF
W2="0010" THEN A<="01011011"; --W2=2
ELSIF
W2="0011" THEN A<="01001111"; --W2=3
ELSIF
W2="0100" THEN A<="01100110"; --W2=4
ELSIF
W2="0101" THEN A<="01101101"; --W2=5
ELSIF
W2="0110" THEN A<="01111101"; --W2=6
ELSIF
W2="0111" THEN A<="00000111"; --W2=7
ELSIF
W2="1000" THEN A<="01111111"; --W2=8
ELSIF
W2="1001" THEN A<="01101111"; --W2=9
END IF;
ELSIF D="10" THEN CAT<="111101"; D<=D+1;
IF W1="0000" THEN A<="00111111"; --W1=0
ELSIF
W1="0001" THEN A<="00000110"; --W1=1
ELSIF
W1="0010" THEN A<="01011011"; --W1=2
ELSIF
W1="0011" THEN A<="01001111"; --W1=3
ELSIF
W1="0100" THEN A<="01100110"; --W1=4
ELSIF
W1="0101" THEN A<="01101101"; --W1=5
ELSIF
W1="0110" THEN A<="01111101"; --W1=6
ELSIF
W1="0111" THEN A<="00000111"; --W1=7
ELSIF
W1="1000" THEN A<="01111111"; --W1=8
ELSIF
W1="1001" THEN A<="01101111"; --W1=9
END IF;
ELSIF D="11" THEN CAT<="111110"; D<=D+1;
IF W0="0000" THEN A<="00111111"; --W0=0
ELSIF
W0="0001" THEN A<="00000110"; --W0=1
ELSIF
W0="0010" THEN A<="01011011"; --W0=2
ELSIF
W0="0011" THEN A<="01001111"; --W0=3
ELSIF
W0="0100" THEN A<="01100110"; --W0=4
ELSIF
W0="0101" THEN A<="01101101"; --W0=5
ELSIF
W0="0110" THEN A<="01111101"; --W0=6
ELSIF
W0="0111" THEN A<="00000111"; --W0=7
ELSIF
W0="1000" THEN A<="01111111"; --W0=8
ELSIF
W0="1001" THEN A<="01101111"; --W0=9
END IF;
END IF;
COUNT3<=COUNT3+1;
END IF;
END IF;
ELSIF (SA='0' AND STATE=GO) OR (SA='0' AND STATE=WAITTING) THEN --在乘客付款时,数码管只显示价格。
I

F B="000" THEN CAT<="011111"; A<="00110111"; B<=B+1; --显示价格
ELSIF B="001" THEN CAT<="110111"; B<=B+1;
IF C2="0000" THEN A<="00111111"; --C2=0
ELSIF
C2="0001" THEN A<="00000110"; --C2=1
ELSIF
C2="0010" THEN A<="01011011"; --C2=2
ELSIF
C2="0011" THEN A<="01001111"; --C2=3
ELSIF
C2="0100" THEN A<="01100110"; --C2=4
ELSIF
C2="0101" THEN A<="01101101"; --C2=5
ELSIF
C2="0110" THEN A<="01111101"; --C2=6
ELSIF
C2="0111" THEN A<="00000111"; --C2=7
ELSIF
C2="1000" THEN A<="01111111"; --C2=8
ELSIF
C2="1001" THEN A<="01101111"; --C2=9
END IF;
ELSIF B="010" THEN CAT<="111011"; B<=B+1;
IF C1="0000" THEN A<="00111111"; --C1=0
ELSIF
C1="0001" THEN A<="00000110"; --C1=1
ELSIF
C1="0010" THEN A<="01011011"; --C1=2
ELSIF
C1="0011" THEN A<="01001111"; --C1=3
ELSIF
C1="0100" THEN A<="01100110"; --C1=4
ELSIF
C1="0101" THEN A<="01101101"; --C1=5
ELSIF
C1="0110" THEN A<="01111101"; --C1=6
ELSIF
C1="0111" THEN A<="00000111"; --C1=7
ELSIF
C1="1000" THEN A<="01111111"; --C1=8
ELSIF
C1="1001" THEN A<="01101111"; --C1=9
END IF;
ELSIF B="011" THEN CAT<="111101"; B<=B+1;
IF C0="0000" THEN A<="10111111"; --C0=0
ELSIF
C0="0001" THEN A<="10000110"; --C0=1
ELSIF
C0="0010" THEN A<="11011011"; --C0=2
ELSIF
C0="0011" THEN A<="11001111"; --C0=3
ELSIF
C0="0100" THEN A<="11100110"; --C0=4
ELSIF
C0="0101" THEN A<="11101101"; --C0=5
ELSIF
C0="0110" THEN A<="11111101"; --C0=6
ELSIF
C0="0111" THEN A<="10000111"; --C0=7
ELSIF
C0="1000" THEN A<="11111111"; --C0=8
ELSIF
C0="1001" THEN A<="11101111"; --C0=9
END IF;
ELSIF B="100" THEN CAT<="111110"; B<="000";
IF CX="0000" THEN A<="00111111"; --C1=0
ELSIF
CX="0001" THEN A<="00000110"; --C1=1
ELSIF
CX="0010" THEN A<="01011011"; --C1=2
ELSIF

CX="0011" THEN A<="01001111"; --C1=3
ELSIF
CX="0100" THEN A<="01100110"; --C1=4
ELSIF
CX="0101" THEN A<="01101101"; --C1=5
ELSIF
CX="0110" THEN A<="01111101"; --C1=6
ELSIF
CX="0111" THEN A<="00000111"; --C1=7
ELSIF
CX="1000" THEN A<="01111111"; --C1=8
ELSIF
CX="1001" THEN A<="01101111"; --C1=9
END IF;
END IF;
ELSIF SA='0' AND STATE=IDLE THEN
CAT<="111000"; A<="00111111" ;
END IF;
END IF;
END IF;
END PROCESS ;

U5: PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF COUNTDZ=250 THEN --将50M信号分频为100KHZ,防止因频率过高导致点阵亮度下降。
COUNTDZ<=0; CLKDZ<=NOT CLKDZ;
ELSE
COUNTDZ<=COUNTDZ+1;
END IF;
END IF;
IF CLKDZ'EVENT AND CLKDZ='1' THEN
IF RST='1' THEN --复位时点阵显示红色
COLG<="00000000";
IF N=7 THEN ROW<="01111111"; COLR<="11111111"; N<=N-1; --第七行显示
ELSIF N=6 THEN ROW<="10111111"; COLR<="11111111"; N<=N-1;
ELSIF N=5 THEN ROW<="11011111"; COLR<="11111111"; N<=N-1;
ELSIF N=4 THEN ROW<="11101111"; COLR<="11111111"; N<=N-1;
ELSIF N=3 THEN ROW<="11110111"; COLR<="11111111"; N<=N-1;
ELSIF N=2 THEN ROW<="11111011"; COLR<="11111111"; N<=N-1;
ELSIF N=1 THEN ROW<="11111101"; COLR<="11111111"; N<=N-1;
ELSIF N=0 THEN ROW<="11111110"; COLR<="11111111"; N<=N-1;
END IF;
IF N=0 THEN N<=7;
END IF;
ELSE
IF SA='1' THEN --有客时显示红色的“有”字
-- COLG<="00000000";
IF N1=9 THEN ROW<="01111111"; COLR<="00001000"; N1<=N1-1; --第七行显示
ELSIF N1=8 THEN ROW<="10111111"; COLR<="01111110"; N1<=N1-1;
ELSIF N1=7 THEN ROW<="11011111"; COLR<="00000100"; N1<=N1-1;
ELSIF N1=6 THEN ROW<="11101111"; COLR<="00111110";N1<=N1-1;
ELSIF N1=5 THEN ROW<="11110111"; COLR<="00111101"; N1<=N1-1;
ELSIF N1=4 THEN ROW<="11111011"; COLR<="00111100"; N1<=N1-1;
ELSIF N1=3 THEN ROW<="11111101"; COLR<="00110100"; N1<=N1-1;
ELSIF N1=2 THEN ROW<="11111110"; COLR<="00100100"; N1<=N1-1;
ELSIF N1=1 THEN
IF SPEED='1' THEN --若加速,则点阵右上角会出现两格橙色标志
ROW<="01111111";COLR<="11001000"; COLG<="11000000";
ELSE --若正常速度行驶,则点阵右上角会出现一格橙色标志
ROW<="01111111";COLR<="10001000"; COLG<="10000000";
END IF; N1<=N1-1;
ELSIF N1=0 THEN
IF TIMING='0' THEN --若开启夜间行驶,点阵右下角会出现一格橙色标志

ROW<="11111110";COLR<="00000001";COLG<="00000001";
END IF;
END IF;
IF N1=0 THEN N1<=9;
END IF;
ELSIF SA='0' THEN --无客时显示橙色的“无”字
IF N2=7 THEN ROW<="01111111"; COLG<="00000000"; COLR<="00000000";N2<=N2-1; --第七行显示
ELSIF N2=6 THEN ROW<="10111111"; COLG<="01111110";COLR<="01111110"; N2<=N2-1;
ELSIF N2=5 THEN ROW<="11011111"; COLG<="00011000";COLR<="00011000"; N2<=N2-1;
ELSIF N2=4 THEN ROW<="11101111"; COLG<="11111111"; COLR<="11111111";N2<=N2-1;
ELSIF N2=3 THEN ROW<="11110111"; COLG<="00011000";COLR<="00011000"; N2<=N2-1;
ELSIF N2=2 THEN ROW<="11111011"; COLG<="00011100";COLR<="00011100"; N2<=N2-1;
ELSIF N2=1 THEN ROW<="11111101"; COLG<="10011010";COLR<="10011010"; N2<=N2-1;
ELSIF N2=0 THEN ROW<="11111110"; COLG<="11111001"; COLR<="11111001";N2<=N2-1;
END IF;
IF N2=0 THEN N2<=7;
END IF;
END IF;
END IF;
END IF;
END PROCESS U5;

END PAY;


相关主题
文本预览
相关文档 最新文档