内容发布更新时间 : 2025/1/10 16:15:04星期一 下面是文章的全部内容请认真阅读。
广西科技大学(筹)课程设计 基于VHDL的交通灯控制器设计
八、参考文献
1. 潘松,黄继业. EDA技术实用教程(第二版)[M]. 北京:北京航空航天大学出
版社,1990
2. 刘欲晓,方强,黄宛宁等.EDA技术与VHDL电路开发应用实践[M].北京:
电子工业出版社,2009
3. 谭会生,瞿遂春等.EDA技术综合应用实例与分析[M].西安:西安电子科技
大学出版社.2004.
12
广西科技大学(筹)课程设计 基于VHDL的交通灯控制器设计
九、附录
交通灯控制器的VHDL有限状态机程序如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY traffic_ctrl IS GENERIC(
green1_cnt:INTEGER:=30; yellow1_cnt:INTEGER:=5; green2_cnt:INTEGER:=20; yellow2_cnt:INTEGER:=5 ); PORT(
clk: IN STD_LOGIC; rst: IN STD_LOGIC; lgt1_red: OUT STD_LOGIC; lgt1_yellow: OUT STD_LOGIC; lgt1_green: OUT STD_LOGIC; lgt2_red: OUT STD_LOGIC; lgt2_yellow: OUT STD_LOGIC; lgt2_green: OUT STD_LOGIC );
END ENTITY traffic_ctrl;
ARCHITECTURE rtl OF traffic_ctrl IS TYPE states IS (st0,st1,st2,st3);
SIGNAL state:states:=st0;
SIGNAL cnt:integer range 0 to 30:=1; SIGNAL cnt_enb:std_logic:='0';
13
广西科技大学(筹)课程设计 基于VHDL的交通灯控制器设计
BEGIN
PROCESS(clk,rst) BEGIN
IF(rst='1')THEN state<=st0; cnt<=1;
ELSIF(rising_edge(clk))THEN IF(cnt_enb='1')THEN cnt<=cnt+1; ELSE cnt<=1; END IF; CASE state IS WHEN st0=>
IF(cnt=green1_cnt) THEN state<=st1; ELSE state<=st0; END IF; WHEN st1=>
IF(cnt=yellow1_cnt) THEN state<=st2; ELSE state<=st1; END IF; WHEN st2=>
IF(cnt=green2_cnt)THEN state<=st3; ELSE state<=st2; END IF; WHEN st3=>
14
广西科技大学(筹)课程设计 基于VHDL的交通灯控制器设计
IF(cnt=yellow2_cnt) THEN state<=st0; ELSE state<=st3; END IF; END CASE; END IF; END PROCESS;
PROCESS(state) BEGIN
CASE state IS WHEN st0=> lgt1_red<='0'; lgt1_yellow<='0'; lgt1_green<='1'; lgt2_red<='1'; lgt2_yellow<='0'; lgt2_green<='0'; cnt_enb<='1';
IF(cnt=green1_cnt)THEN cnt_enb<='0'; END IF; WHEN st1=> lgt1_red<='0'; lgt1_yellow<='1'; lgt1_green<='0'; lgt2_red<='1'; lgt2_yellow<='0'; lgt2_green<='0'; cnt_enb<='1';
IF(cnt=yellow1_cnt)THEN
15
广西科技大学(筹)课程设计 基于VHDL的交通灯控制器设计
cnt_enb<='0'; END IF; WHEN st2=> lgt1_red<='1'; lgt1_yellow<='0'; lgt1_green<='0'; lgt2_red<='0'; lgt2_yellow<='0'; lgt2_green<='1'; cnt_enb<='1';
IF(cnt=green2_cnt)THEN cnt_enb<='0'; END IF; WHEN st3=> lgt1_red<='1'; lgt1_yellow<='0'; lgt1_green<='0'; lgt2_red<='0'; lgt2_yellow<='1'; lgt2_green<='0'; cnt_enb<='1';
IF(cnt=yellow2_cnt)THEN cnt_enb<='0'; END IF; END CASE; END PROCESS;
END rtl;
16