交通灯VHDL
目 录 一、题目要求 1 二、原理分析与方案设计 2 2.1 原理分析. 2 2.2 方案设计. 2 三、系统设计 4 3.1 系统框图. 4 3.2 模块设计. 4 3.2.1 分频模块. 4 3.2.2 计数模块. 5 3.2.3 译码模块. 7 3.2.4 显示模块. 8 3.2.5 控制模块. 9 3.3 系统顶层文件. 9 四、仿真及结果分析 11 4.1 软件仿真. 11 4.1.1 计数器仿真. 11 4.1.2 分频器仿真. 11 4.1.3 显示模块仿真. 11 4.2 硬件仿真结果. 12 4.2.1 东西方向通行、南北方向禁行 . 12 4.2.2 南北方向通行、东西方向禁行 . 12 4.2.3 东西方向转弯. 13 4.2.4 南北方向转弯. 13 4.2.5 暂停状态. 13 4.3 结果分析. 14 五、总结与体会 15 参考文献 16 附录 17 1 一、题目要求 有一个实际的十字路口设置有东西、南北两个方向的干道, 为确保车辆安全 通行, 在每条干道的每个入口设置了一组两位数码管显示装置和四组红、绿、黄 信号灯, 分别用来指示东西方向直行、南北方向直行、东西方向转弯和南北方向 转弯;同时设有紧急处理状态,数码管显示可有人工控制,并设有初始化功能。 具体设计要求如下: (1) LED灯周期性的循环显示通车或禁行状态; (2) 具有稳定的周期性的循环显示状态规律,红灯45秒,绿灯40秒,黄灯5秒,循 环周期为90 秒; (3) 具有转弯指示功能,转弯时间为20秒; (4) 能够实现正常的倒计时显示功能; (5) 具有复位控制功能,复位后能快速进入系统初始化状态; (6) 实现特殊状态的功能显示控制,所有路口都显示红灯,直到人为解除该状态。 2 二、原理分析与方案设计 2.1 原理分析 十字路口交通灯具有指示通车、禁行和转弯的功能。东西方向通车,南北方 向禁行时,东西方向的绿灯亮 40 秒,然后 5 秒黄灯闪烁,红灯常灭,南北方向 红灯亮 45 秒;南北方向通车,东西方向禁行时,南北方向的绿灯亮 40 秒,最后 5 秒黄灯闪烁,红灯熄灭,东西方向红灯亮45 秒,东西、南北方向各禁行、通 车循环一周期 90 秒后进行 20 秒的转弯控制;利用红灯、绿灯发光、黄灯闪烁代 表转弯指示。由人工控制紧急状态,东西、南北方向全为红灯禁止通行,数码管 暂停计时,恢复通车时数码管正常计数。由人工禁行复位操作,进入初始倒计时 状态。其基本显示流程如图 2.1 所示[1]。 红灯45秒 绿灯40秒黄灯5秒转弯20秒 绿灯20秒 红灯45秒 绿灯40秒 黄灯5秒 EW SN 图 2.1 交通等工作流程 2.2 方案设计 十字路口交通灯控制系统主要有分频模块、计数模块、控制模块、译码模块 和显示模块构成。分频模块用于产生标准的 1HZ 的频率做计数器的时钟信号, 计数模块使用四个数码管作为十字路口两个方向的交通灯倒计时显示, 每个方向 使用两个数码管, 控制模块用于数码管发光二极管的显示控制和倒计时控制, 译 码模块用于将两位的十进制数转换为一位的十进制数便于数码管显示, 显示模块 使用红、 黄、 绿发光二极管显示通行、 禁行或转弯, 用四个数码管显示倒计时[2]。 交通灯的状态真值表如表一所示。 表 1 交通灯状态真值表 RESET RED ERED EGREEN EYELLOW SRED SGREEN SYELLOW 时间 状态 1 X 0 1 0 1 0 0 X 复位 3 0 1 1 0 0 1 0 0 X 暂停 0 0 0 1 0+1 1 0 0 45 秒 东西通车 0 0 1 0 0 0 1 0+1 45 秒 南北通车 0 0 1 1 0/1 0 1 0 20 秒 东西转向 0 0 0 1 0 1 1 0/1 20 秒 南北转向 4 三、系统设计 3.1系统框图 十字路口交通灯控制系统主要有分频模块、计数模块、控制模块、译码模块 和显示模块构成。其系统框图如图 3.1 所示。 分频模块 计数模块 显示模块 控 制 模 块 分位译码模块 分位译码模块 图 3.1 系统框图 3.2 模块设计 3.2.1 分频模块 分频模块将实验板输入的标准频率进行分频得到1HZ 的频率, 作为计数模块 的时钟频率,设计中输入频率为 3MHZ,此频率同时作为数码管动态显示的扫描 时钟频率,对 3MHZ 进行 30 万分频得到 1HZ 的时钟频率。分频模块程序如下: Library ieee; use ieee.std_logic_1164.all; ENTITY divder IS PORT(clk: IN STD_LOGIC; newclk: buffer STD_LOGIC); END divder; ARCHITECTURE art OF divder IS SIGNAL num : integer range 0 to 10#2999999#; signal a:std_logic; BEGIN process(clk) is begin 5 if(clk event and clk= 1 )then if(num=10#2999999#)then num=0; else num=num+1; end if; end if; end process; process(num)is begin if(num=10#2999999#)then a= 1 ; else a= 0 ; end if; end process; newclk=a; END art; 3.2.2 计数模块 设计中通行是绿灯亮四十秒,接着黄灯闪烁 5 秒,禁行时红灯亮 45 秒。转 弯实间则为 20 秒,若采用分别计数的方法则需要四个计数器,会使顶层文件过 于复杂,因为十字路口通行禁行的一个周期为 90 秒,可以设计一个模位 90 的 计数器,在控制模块中通过相应的运算得到45 秒、40 秒、5 秒、20 秒倒计时。 计数模块中设置一个高电平有效的异步复位控制端, 用于恢复初始状态, 同时设 置一个高电平有效的紧急状态控制端用于暂停计数,禁止所有方向通行[3]。计 数模块电路如图3.2 所示。 图 3.2 计数器模块 计数器模块程序: LIBRARY IEEE; 6 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; ENTITY CNT_90 IS PORT (clk:IN STD_LOGIC; reset:in std_logic; red:in std_logic; Num:buffer INTEGER RANGE 0 TO 90; flag:out std_logic_vector(1 downto 0)); END; ARCHITECTURE art OF cnt_90 IS signal Q:std_logic_vector(1 downto 0):=“00“; BEGIN process(reset,clk,red) BEGIN if reset= 1 then---复位到初始值,即 45 秒 Num=0; el