名称:Quartus交通灯控制器VHDL代码仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
交通灯控制器要求能显示十字路口东西、南北两个方向的红、黄、绿灯的指示状态,用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向的红、黄、绿灯。变化规律如下
1)东西绿灯亮、南北红灯亮2)东西黄灯亮、南北红灯亮;3)东西红灯亮、南北绿灯亮4)东西红灯亮、南北黄灯亮5)东西绿灯亮、南北红灯亮6)依次循环执行
南北方向是主干道车道,东西方向是支干道车道,要求两条交叉道路上的车辆交替运行,主干道每次通行时间设为305、支干道每次通行时间设为205,时间可设置修改
在绿灯转为红灯时,要求黄灯先亮5,才能变换运行车道
要求交通灯控制器具有异步复位功能,在复位信号使能时,能够实现交通灯的自动复位,井要求所有交通灯的状态变化在时钟信号上升沿处
1. 工程文件
2. 程序文件
3. 程序编译
4. 管脚分配
5. 仿真图
分频模块
交通灯控制模块
数码管显示模块
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --交通灯控制模块 ENTITY led_ctrl IS PORT ( clk_1Hz : IN STD_LOGIC; clk_1KHz : IN STD_LOGIC; reset : IN STD_LOGIC;--复位 main_red : OUT STD_LOGIC;--红灯 main_green : OUT STD_LOGIC;--绿灯 main_yellow : OUT STD_LOGIC;--黄灯 branch_red : OUT STD_LOGIC;--红灯 branch_green : OUT STD_LOGIC;--绿灯 branch_yellow : OUT STD_LOGIC;--黄灯 down_cnt1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--倒计时1 down_cnt2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--倒计时2 ); END led_ctrl; ARCHITECTURE behave OF led_ctrl IS SIGNAL main_green_num : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL main_yellow_num : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL branch_green_num : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL branch_yellow_num : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL state : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000"; SIGNAL main_green_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL main_yellow_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL branch_green_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL branch_yellow_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000001"; SIGNAL main_red_buf : STD_LOGIC:='0'; SIGNAL main_green_buf : STD_LOGIC:='0'; SIGNAL main_yellow_buf : STD_LOGIC:='0'; SIGNAL branch_red_buf : STD_LOGIC:='0'; SIGNAL branch_green_buf : STD_LOGIC:='0'; SIGNAL branch_yellow_buf : STD_LOGIC:='0'; SIGNAL main_green_data : STD_LOGIC_VECTOR(7 DOWNTO 0);--计时 SIGNAL main_yellow_data : STD_LOGIC_VECTOR(7 DOWNTO 0);--计时 SIGNAL main_red_data : STD_LOGIC_VECTOR(7 DOWNTO 0);--计时 SIGNAL branch_green_data : STD_LOGIC_VECTOR(7 DOWNTO 0);--计时 SIGNAL branch_yellow_data : STD_LOGIC_VECTOR(7 DOWNTO 0);--计时 SIGNAL branch_red_data : STD_LOGIC_VECTOR(7 DOWNTO 0);--计时 BEGIN main_green_num <= "00011110";--主路绿灯30s main_yellow_num <= "00000101";--主路黄灯5s branch_green_num <= "00010100";--支路绿灯20s branch_yellow_num <= "00000101";--支路黄灯5s PROCESS (clk_1Hz,reset) BEGIN IF(reset='1')then state<="001";--异步复位 elsIF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN CASE state IS WHEN "001" =>--主路绿灯 IF (main_green_cnt < main_green_num) THEN state <= "001"; main_green_cnt <= main_green_cnt + "00000001"; ELSE state <= "010";--下一状态 main_green_cnt <= "00000001"; END IF; WHEN "010" =>--主路黄灯 IF (main_yellow_cnt < main_yellow_num) THEN state <= "010"; main_yellow_cnt <= main_yellow_cnt + "00000001"; ELSE state <= "011";--下一状态 main_yellow_cnt <= "00000001"; END IF; WHEN "011" =>--支路绿灯 IF (branch_green_cnt < branch_green_num) THEN state <= "011"; branch_green_cnt <= branch_green_cnt + "00000001"; ELSE state <= "100";--下一状态 branch_green_cnt <= "00000001"; END IF; WHEN "100" =>--支路黄灯 IF (branch_yellow_cnt < branch_yellow_num) THEN state <= "100"; branch_yellow_cnt <= branch_yellow_cnt + "00000001"; ELSE state <= "001";--下一状态 branch_yellow_cnt <= "00000001"; END IF; WHEN OTHERS => state <= "001"; END CASE; END IF; END PROCESS; --主路绿灯 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "001") THEN main_green_buf <= '1'; ELSE main_green_buf <= '0'; END IF; END IF; END PROCESS; --主路黄灯 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "010") THEN main_yellow_buf <= '1'; ELSE main_yellow_buf <= '0'; END IF; END IF; END PROCESS; --主路红灯 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "011" OR state = "100") THEN main_red_buf <= '1'; ELSE main_red_buf <= '0'; END IF; END IF; END PROCESS; --支路绿灯 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "011") THEN branch_green_buf <= '1'; ELSE branch_green_buf <= '0'; END IF; END IF; END PROCESS; --支路黄灯 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "100" ) THEN branch_yellow_buf <= '1'; ELSE branch_yellow_buf <= '0'; END IF; END IF; END PROCESS; --支路红灯 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "001" OR state = "010") THEN branch_red_buf <= '1'; ELSE branch_red_buf <= '0'; END IF; END IF; END PROCESS; --计算主路红灯时间 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "011") THEN main_red_data <= branch_green_cnt;--绿 ELSIF (state = "100") THEN--黄 main_red_data <= branch_yellow_cnt+ branch_green_num; ELSE main_red_data <= "00000000"; END IF; END IF; END PROCESS; --计算支路红灯时间 PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN IF (state = "001") THEN branch_red_data <= main_green_cnt; ELSIF (state = "010") THEN branch_red_data <= main_yellow_cnt + main_green_num; ELSE branch_red_data <= "00000000"; END IF; END IF; END PROCESS; PROCESS (clk_1Hz) BEGIN IF (clk_1Hz'EVENT AND clk_1Hz = '1') THEN main_green_data <= main_green_cnt; main_yellow_data <= main_yellow_cnt; branch_green_data <= branch_green_cnt; branch_yellow_data <= branch_yellow_cnt; END IF; END PROCESS; --倒计时,总时间减去正计时时间 PROCESS (clk_1KHz) BEGIN IF (clk_1KHz'EVENT AND clk_1KHz = '1') THEN IF (main_red_buf = '1') THEN down_cnt1 <= branch_green_num + branch_yellow_num - main_red_data; ELSIF (main_green_buf = '1') THEN down_cnt1 <= main_green_num - main_green_data; ELSIF (main_yellow_buf = '1') THEN down_cnt1 <= main_yellow_num - main_yellow_data; ELSE down_cnt1 <= "00000000"; END IF; END IF; END PROCESS; --倒计时,总时间减去正计时时间 PROCESS (clk_1KHz) BEGIN IF (clk_1KHz'EVENT AND clk_1KHz = '1') THEN IF (branch_red_buf = '1') THEN down_cnt2 <= main_green_num + main_yellow_num - branch_red_data; ELSIF (branch_green_buf = '1') THEN down_cnt2 <= branch_green_num - branch_green_data; ELSIF (branch_yellow_buf = '1') THEN down_cnt2 <= branch_yellow_num - branch_yellow_data; ELSE down_cnt2 <= "00000000"; END IF; END IF; END PROCESS; --输出 main_red <= main_red_buf; main_green <= main_green_buf; main_yellow <= main_yellow_buf; branch_red <= branch_red_buf; branch_green <= branch_green_buf; branch_yellow <= branch_yellow_buf; END behave;
完整代码
扫描文章末尾的公众号二维码