十字路口交通灯控制器VHDL代码Quartus仿真
代码功能:十字路口交通灯控制器的VHDL设计(每班21号以后的单号)设计要求:利用硬件描述语言和FPGA器件,设计实现一个由一条主干道和一条支干道的汇合点形成的十字交叉路口的交通灯控制器,具体要求如下(1)主、支干道各设有一个绿、黄、红指示灯,两个显示数码管(2)在主干道和支干道的两个方向上各设有一组绿、黄、红交通灯,其中一个方向是绿灯、黄灯、红灯,另一个方向是红灯、绿灯、黄灯(3)数码管以倒计时
名称:十字路口交通灯控制器VHDL代码Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
十字路口交通灯控制器的VHDL设计(每班21号以后的单号)
设计要求:利用硬件描述语言和FPGA器件,设计实现一个由一条主干道和一条支
干道的汇合点形成的十字交叉路口的交通灯控制器,具体要求如下
(1)主、支干道各设有一个绿、黄、红指示灯,两个显示数码管
(2)在主干道和支干道的两个方向上各设有一组绿、黄、红交通灯,其中一个方向是绿灯、黄灯、红灯,另一个方向是红灯、绿灯、黄灯
(3)数码管以倒计时的方式显示允许通行或禁止通行的时间,主干道每次放行40ss60s70s,支干道每次放行20s30s40s50s,在每次由亮绿灯变成亮红灯的转换过程中要亮5s的黄灯作为过渡,并进行减计时显示,时钟信号由实验箱上50MHz分频得到1H
(4)设置交主干道优先通行电路(选做
各放行定时器的实体名为:XXX放行时间,XXX为自己姓名的首字母
任务学号对应:21、23、25号选(70150);27、29、31选(60140)33、35、37-选(5030);39、41、43选(40120)。
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
分频模块
红绿灯控制模块
上图显示了主路和支路的红绿灯以及对应的倒计时
数码管显示模块
上图仿真了主路数码管显示10,支路数码管显示18
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --控制模块 ENTITY QJP_6040_RGY IS PORT ( clk_1 : IN STD_LOGIC; clk : IN STD_LOGIC; reset : IN STD_LOGIC;--复位 --主路 R1 : OUT STD_LOGIC;--红绿灯信号 G1 : OUT STD_LOGIC;--红绿灯信号 Y1 : OUT STD_LOGIC;--红绿灯信号 --支路 R2 : OUT STD_LOGIC;--红绿灯信号 G2 : OUT STD_LOGIC;--红绿灯信号 Y2 : OUT STD_LOGIC;--红绿灯信号 SMG1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--输出数码管显示数 SMG2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--输出数码管显示数 ); END QJP_6040_RGY; ARCHITECTURE behave OF QJP_6040_RGY IS SIGNAL G1_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL Y1_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL G2_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL Y2_time : STD_LOGIC_VECTOR(7 DOWNTO 0);--对应灯时间 SIGNAL state : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000"; SIGNAL G1_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL Y1_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL G2_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL Y2_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; -- Declare intermediate signals for referenced outputs SIGNAL R1_temp : STD_LOGIC:='0'; SIGNAL G1_temp : STD_LOGIC:='0'; SIGNAL Y1_temp : STD_LOGIC:='0'; SIGNAL R2_temp : STD_LOGIC:='0'; SIGNAL G2_temp : STD_LOGIC:='0'; SIGNAL Y2_temp : STD_LOGIC:='0'; SIGNAL G1_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL Y1_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL R1_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL G2_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL Y2_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 SIGNAL R2_BCD : STD_LOGIC_VECTOR(7 DOWNTO 0);--正计时 BEGIN --设置时间,可自行修改时间, --主路红灯时间等于支路绿灯加黄灯 --支路红灯时间等于主路绿灯加黄灯 G1_time <= "00111100";--主路绿灯60s Y1_time <= "00000101";--主路黄灯5s G2_time <= "00101000";--支路绿灯40s Y2_time <= "00000101";--支路黄灯5s -- Drive referenced outputs R1 <= R1_temp;--红 G1 <= G1_temp;--绿 Y1 <= Y1_temp;--黄灯 R2 <= R2_temp;--红 G2 <= G2_temp;--绿 Y2 <= Y2_temp;--黄灯 PROCESS (clk_1,reset) BEGIN if(reset='1')THEN state <= "001";--异步复位 elsIF (clk_1'EVENT AND clk_1 = '1') THEN CASE state IS WHEN "001" =>--主路绿灯 IF (G1_cnt < G1_time) THEN state <= "001"; G1_cnt <= G1_cnt + "00000001"; ELSE state <= "010";--//计时到后切换下一状态 G1_cnt <= "00000001"; END IF; WHEN "010" =>--主路黄灯 IF (Y1_cnt < Y1_time) THEN state <= "010"; Y1_cnt <= Y1_cnt + "00000001"; ELSE state <= "011";--计时到后切换下一状态 Y1_cnt <= "00000001"; END IF; WHEN "011" =>--支路绿灯 IF (G2_cnt < G2_time) THEN state <= "011"; G2_cnt <= G2_cnt + "00000001"; ELSE state <= "100";--计时到后切换下一状态 G2_cnt <= "00000001"; END IF; WHEN "100" =>--支路黄灯 IF (Y2_cnt < Y2_time) THEN state <= "100"; Y2_cnt <= Y2_cnt + "00000001"; ELSE state <= "001";--计时到后切换下一状态 Y2_cnt <= "00000001"; END IF; WHEN OTHERS => state <= "001"; END CASE; END IF; END PROCESS; --控制东西方向交通灯 PROCESS (clk_1) BEGIN IF (clk_1'EVENT AND clk_1 = '1') THEN IF (state = "001") THEN G1_temp <= '1'; ELSE G1_temp <= '0'; END IF; IF (state = "010") THEN Y1_temp <= '1'; ELSE Y1_temp <= '0'; END IF; IF (state = "011" OR state = "100") THEN R1_temp <= '1'; ELSE R1_temp <= '0'; END IF; END IF; END PROCESS; --控制南北方向交通灯 PROCESS (clk_1) BEGIN IF (clk_1'EVENT AND clk_1 = '1') THEN IF (state = "011") THEN G2_temp <= '1'; ELSE G2_temp <= '0'; END IF; IF (state = "100" ) THEN Y2_temp <= '1'; ELSE Y2_temp <= '0'; END IF; IF (state = "001" OR state = "010") THEN R2_temp <= '1'; ELSE R2_temp <= '0'; END IF; END IF; END PROCESS;
源代码
扫描文章末尾的公众号二维码
更多推荐
所有评论(0)