软件:ISE
语言:VHDL
代码功能:
交通灯控制器设计要求
1.控制对象为单个十字路口的南北向交通灯,具体包含一个左转箭头灯(可以显示红色,绿色)和一个圆形指示灯(可以显示红色,绿色,以及黄色);
2.圆形指示灯:当接收到东西向左转箭头灯的左转完成信号(外界输入)后,经过3次黄灯闪烁(一秒闪烁一次)后由原本的红灯跳转为绿灯,绿灯维持24秒,经过3次黄灯闪烁跳转回红灯,并输出一个左转允许信号;
3.左转箭头灯:当接收到圆形指示灯的左转允许信号后,由红色跳转为绿色,维持15秒后跳转回红色,并输出一个左转完成信号;
4.设置一个交通管制按钮,该按钮按下后,所有信号灯亮起红色;
5.需要分别完成以下两个模块的VHDL设计并分别进行仿真测试:圆灯控制器和箭头灯控制器;
6.按照合理逻辑将上述两个模块进行连接,必要时适当添加周边电路,完成整体的VHDL设计,再进行仿真测试。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
圆灯控制模块
箭头灯控制模块
整体模块
3. 程序编译
4. Testbench
5. 仿真图
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --箭头灯控制模块 ENTITY left_ctrl IS PORT ( clk : IN STD_LOGIC;--1Hz时钟 reset : IN STD_LOGIC;--复位 critical_key : IN STD_LOGIC;--交通管制按键 round_left_done : IN STD_LOGIC;--圆灯左转允许 left_red : OUT STD_LOGIC;--左转箭头红色 left_green : OUT STD_LOGIC;--左转箭头绿色 left_left_done : OUT STD_LOGIC--南北方向输出左转完成信号 ); END left_ctrl; ARCHITECTURE behave OF left_ctrl IS TYPE State_type IS (s_red, s_green, s_critical); -- 定义状态 SIGNAL state : State_Type; -- 创建信号 SIGNAL green_cnt : STD_LOGIC_VECTOR(4 DOWNTO 0) := "00000"; BEGIN PROCESS (clk, reset) BEGIN IF (reset = '1') THEN state <= s_red;--复位 ELSIF (clk'EVENT AND clk = '1') THEN IF (critical_key = '1') THEN--交通管制按键 state <= s_red;--红灯 ELSE CASE state IS WHEN s_red =>--红灯状态 IF (round_left_done = '1') THEN--圆灯左转允许 state <= s_green; ELSE state <= s_red; END IF; WHEN s_green =>--绿灯状态 IF (green_cnt >= "01110") THEN--绿灯计时 state <= s_red; ELSE state <= s_green; END IF; WHEN OTHERS => state <= s_red;--红灯状态 END CASE; END IF; END IF; END PROCESS; --绿灯状态计时 PROCESS (clk, reset) BEGIN IF (reset = '1') THEN green_cnt <= "00000"; ELSIF (clk'EVENT AND clk = '1') THEN IF (state = s_green) THEN green_cnt <= green_cnt + "00001";--绿灯计时 ELSE green_cnt <= "00000"; END IF; END IF; END PROCESS; --红灯状态 PROCESS (state) BEGIN IF (state = s_red) THEN left_red <= '1';--输出左转红灯 ELSE left_red <= '0'; END IF; END PROCESS; --绿灯状态 PROCESS (state) BEGIN IF (state = s_green) THEN left_green <= '1';--输出左转绿灯 ELSE left_green <= '0'; END IF; END PROCESS; ----南北方向输出左转完成信号 PROCESS (clk, reset) BEGIN IF (reset = '1') THEN left_left_done <= '0'; ELSIF (clk'EVENT AND clk = '1') THEN IF (state = s_green AND green_cnt >= "01110") THEN left_left_done <= '1'; ELSE left_left_done <= '0'; END IF; END IF; END PROCESS; END behave;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=785
658