名称:东西,南北两个方向交通灯设计VHDL代码Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
功能需求
该交通灯控制器要求能显示十字路口东西、南北两个方向的红、黄、绿灯的指示状态。用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向的红、黄、绿灯。变化规律如下:
(1)东西绿灯亮、南北红灯亮;
(2)东西黄灯亮、南北红灯亮;
(3)东西红灯亮、南北绿灯亮;
(4)东西红灯亮、南北黄灯亮;
(5)东西绿灯亮、南北红灯亮;
(6)依次循环执行……
南北方向是主干道车道,东西方向是支干道车道,要求两条交叉道路上的车辆交替运行,主干道每次通行时间设为30s、支干道每次通行时间设为20s,时间可设置修改。
在绿灯转为红灯时,要求黄灯先亮5s,才能变换运行车道。
要求交通灯控制器具有异步复位功能,在复位信号使能时,能够实现交通灯的自动复位,并要求所有交通灯的状态变化在时钟信号上升沿处。
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
分频模块
红绿灯控制模块
数码管显示模块
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; USE ieee.std_logic_arith.all; --显示模块 ENTITY display IS PORT ( clk : IN STD_LOGIC;--50MHz SMG1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--倒计时时间 SMG2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--倒计时时间 SEG : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--数码管段选 SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)--数码管位选 ); END display; ARCHITECTURE behavioral OF display IS SIGNAL SMG1_ten : INTEGER := 0; SIGNAL SMG1_one : INTEGER := 0; SIGNAL SMG2_ten : INTEGER := 0; SIGNAL SMG2_one : INTEGER := 0; SIGNAL SMG1_int : INTEGER := 0; SIGNAL SMG2_int : INTEGER := 0; SIGNAL display_data : INTEGER := 0; SIGNAL select_num : STD_LOGIC_VECTOR(31 DOWNTO 0) := "00000000000000000000000000000000"; SIGNAL geshu : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000"; BEGIN SMG1_int<=Conv_Integer(SMG1);--转为int类型 SMG2_int<=Conv_Integer(SMG2);--转为int类型 SMG1_ten <= SMG1_int / 10;--时间十位 SMG1_one <= SMG1_int- SMG1_ten *10;--时间个位 SMG2_ten <= SMG2_int / 10;--时间十位 SMG2_one <= SMG2_int- SMG2_ten *10;--时间个位 PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN geshu <= geshu + "0000000000000001"; --扫描那个管子的指示位 END IF; END PROCESS; PROCESS (geshu)--位选切换 BEGIN CASE geshu(5 downto 4) IS---仿真将geshu(15 downto 14)改为geshu(5 downto 4) WHEN "00" => SEL <= "000"; display_data <= SMG1_ten;--时间个位 WHEN "01" => SEL <= "001"; display_data <= SMG1_one;--时间十位 WHEN "10" => SEL <= "010"; display_data <= SMG2_ten;--时间个位 WHEN "11" => SEL <= "011"; display_data <= SMG2_one;--时间十位 WHEN OTHERS => END CASE; END PROCESS; -------段选输出-- PROCESS (display_data) BEGIN CASE display_data IS--数字显示码 WHEN 0 => SEG <=not"11000000"; WHEN 1 => SEG <= not"11111001"; WHEN 2 => SEG <= not"10100100"; WHEN 3 => SEG <= not"10110000"; WHEN 4 => SEG <= not"10011001"; WHEN 5 => SEG <= not"10010010"; WHEN 6 => SEG <= not"10000010"; WHEN 7 => SEG <= not"11111000"; WHEN 8 => SEG <= not"10000000"; WHEN 9 => SEG <= not"10010000"; WHEN OTHERS => END CASE; END PROCESS; END behavioral;
源代码
扫描文章末尾的公众号二维码