基于FPGA的数字电子技术课程设计(以VHDL语言实现)
课题:交通信号灯
设计题目:
1.由主干道A和支干道B的汇合点形成十字交叉路口,在交叉路口处设有红绿黄三色信号灯。红灯亮禁止通行;绿灯亮允许通行;黄灯亮则让行驶到路口的车辆有时间停靠到禁止线外。用两位数码管显示当前主支干道所处的状态。红黄绿分别用R,Y,G表示。
2.主干道车辆较多,所以绿灯亮灯时间为50S;支干道亮绿灯时间设为30S。当主干道允许通行亮绿灯时则支干道亮红灯;支干道亮绿灯时也相反。每次由绿灯转变为红灯时,期间要亮5S的黄灯。
3.交通灯正常运行时,用四位数码管显示主干道和支干道的倒计时时间。
4.能实现系统总清0,清0后计数器由初始状态开始计数。 5.具有一定的扩展功能。
一.设计思路
1.根据设计题目要求可以得出交通信号灯控制器的设计用“状态法”来实现较好,因此先划分出交通灯显示时的几个较大的状态。设状态用S表示。
S0:主干道亮黄灯 支干道亮红灯 亮灯5S S1:主干道亮红灯 支干道亮绿灯 亮灯30S S2:主干道亮红灯 支干道亮黄灯 亮灯5S S3:主干道亮绿灯 支干道亮红灯 亮灯50S
状态之间应该要能实现循环: S0=>S1=>S2=>S3=>S0
2.然后再考虑在每个状态下要能够实现的功能。根据题目可知在每个状态下要能实现将交通灯的颜色变换以字母的形式显示在两位数码管上,每位各表示一条道路。在交通灯颜色输出的同时还要能够实现计数的输出,也就是各路灯转换前剩余的时间量。
3.在实现了各个状态下的功能后就要考虑加上清0功能与紧急功能,清0也就是复位功能。在复位时实现系统清0,并且清0后计数器从初始状态开始计时,在此将S0状态视为初始状态。也就是清0完毕后系统进入S0状态。课题中将紧急功能设为两
条路都显示红灯,并且计数器全置0。
4.这些实现的功能都加入后就可以对所写的VHDL语言进行测试与仿真了。在其中实现对所写语言的改进和完善,并得到仿真图结合仿真图再进行修改。在得到合理的仿真图后就可以进行分频语言的添加和设计电路图的绘制了。
5.根据所用的电路板的输入频率合理地设置分频数,完成分频语言的编写。然后根据语言生成器件,再按要求连接电路图。完成后按要求添加约束文件后就可以进行下载演示了。
二.VHDL语言及注释
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;--取库
ENTITY JTD IS
PORT(CPIN,R,JJ:IN STD_LOGIC;
SGL,SZL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
ST1C,ST2C:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --建立输入输出端口 );
END ENTITY;
ARCHITECTURE JGT OF JTD IS
TYPE STATES IS(S0,S1,S2,S3); SIGNAL S:STATES;
SIGNAL CP:STD_LOGIC;
SIGNAL CPCT:INTEGER RANGE 0 TO 10000000;
SIGNAL C:STD_LOGIC_VECTOR(7 DOWNTO 0);--辅助用十六进制计数 SIGNAL GL,ZL:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL T1C,T2C:STD_LOGIC_VECTOR(7 DOWNTO 0);--建立影子端口
FUNCTION SAM (BIN:STD_LOGIC_VECTOR(7 DOWNTO 0)) —十六进制与BCD码转换函数 RETURN STD_LOGIC_VECTOR IS
VARIABLE SBCD,ADDBCD :STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE N:INTEGER RANGE 0 TO 8; BEGIN
N:=0;SBCD:=\
IF BIN<\ --当输入BIN大于十进制100时,输出为0 LOOP
IF BIN(N)='1' THEN --根据BIN的每一位选择加上对应的压缩型BCD码 CASE N IS
WHEN 0=> ADDBCD:=\ WHEN 1=> ADDBCD:=\ WHEN 2=> ADDBCD:=\ WHEN 3=> ADDBCD:=\ WHEN 4=> ADDBCD:=\ WHEN 5=> ADDBCD:=\ WHEN 6=> ADDBCD:=\
WHEN OTHERS=> ADDBCD:=\ END CASE;
SBCD:=SBCD+ADDBCD;
IF SBCD(3 DOWNTO 0)>\ --进行BCD码加法调整 SBCD:=SBCD+\ END IF; END IF; N:=N+1;
EXIT WHEN N=8; END LOOP; RETURN SBCD; ELSE
RETURN \END IF;
END FUNCTION SAM;
BEGIN
PROCESS(CP,R) BEGIN
IF R='1' THEN S<=S0;C<=X\