问答题 用VHDL语言设计交通灯控制器,交通灯循环顺序如表8.2.2所示。要求仅有红灯亮或绿灯亮的持续时间都为30秒、黄灯亮的持续时间为5秒。
   
表8.2.2
南北方向 东西方向
绿 绿


















【正确答案】根据题意,该控制电路有时钟输入端(cp)和系统清0输入端(ncr),输出端子有两个方向的红、黄、绿灯共六个(ew,y_ew,g_ew,r_sn,y_sn,g_sn)和东西、南北方向的计数显示(qhew,qlew,qhsn,qlsn)。可以在一个进程中完成设计,在下面的VHDL程序中,信号sn控制南北和东西方向的转换,sn=0表示东西方向通行,否则为南北方向通行,信号i控制绿灯和黄灯的计数转换,i=0表示绿灯计数时间,否则为黄灯计数时间。整个电路的VHDL程序如下:
   LIBRARY ieee;
   USE ieee.Std_logic_1164.ALL;
   USE ieee.Std_logic_arith.ALL;
   USE ieee.Std_logic_unsigned.ALL;
   ENTITY xiti811 IS
   PORT(cp,ncr:IN Std_logic;r_ew,y_ew,g_ew,r_sn,y_sn,g_sn:OUT Std_logic;qhew,qlew,qhsn,qlsn:BUFFER Std_logic_vector(3 downto 0));
   END xiti811:
   ARCHITECTURE xiti811_ar OF xiti811 IS
   SIGNAL sn,i,oc:Std_logic;
   SIGNAL qh,q1:Std_logic_vector(3 downto 0);
   BEGIN
   PROCESS(cp, ner)
   BEGIN
   IF ncr='0' THEN
   qh<="0000";q1<="0000";sn<='0';i<='0';
   ELSIF cp 'EVENT AND cp='1' THEN
   IF sn='0' THEN一一东西方向通行
   IF i='0' THEN——东西方向绿灯亮
   r_ew<='0';y_ew<='0';g_ew<='1';r_sn<='1';y_sn<='0';g_sn<='0';
   IF q1<"1000" THEN
   q1<=q1+"0001";oc<='0';qlew<=q1+"0001";qlsn<=q1+"0001";
   ELSIF q1="1000" THEN
   q1<=q1+"0001";oc<='1';qlew<=q1+"0001";qlsn<=q1+"0001";
   ——东西绿灯和南北红灯的个位计数器达到9
   ELSE
   q1<="0000";oc<='0';qlew<="0000";qlsn<="0000";
   END IF;
   IF oc='1' THEN
   IF qh<"0010" THEN
   qh<=qh+"0001" ;qhew<=qh+"0001";qhsn<=qh+"0001";
   ELSIF qh="0010" THEN
   qh<="0000";i<='1';qhew<="0000";qhsn<="0011";
   ——东西绿灯和南北红灯计数值达到29,东西准备转换到黄灯,南北红灯继续计数
   r_ew<='0';y_ew<='1';g_ew<='0';r_sn<='1';y_sn<='0';g_sn<='0';
                      END IF ;
                  ELSE
                     NULL;
                  END IF ;
                ELSIF ql<"0100" THEN ——东西方向黄灯亮
                        r_ew<='0'; y_ew<='1'; g_ew<='0'; r_sn<='1'; y_sn<='0'; g_sn<='0';
                           ql<= ql+ "0001" ; qlew<= ql+"0001 "; qlsn< = ql+"0001" ;
                     ELSE
                           r_ew<='1'; y_ew<='0'; g_ew<='0'; r_sn<='0'; y_sn<='0'; g_sn<='1';
                              ql<="0000" ; i<='0'; sn<='1'; qlew<="0000"; qlsn<="0000"; qhsn<= "0000" ;
                     END IF;
                ELSIF i='0' THEN ——转换到南北方向,绿灯亮
                     r_ew<='1'; y_ew<='0'; g_ew<='0'; r_sn<='0'; y_sn<='0'; g_sn<='1';
                        IF ql<"1000" THEN
                           ql<=ql+ "0001" ; oc<='0'; qlew<=ql+"0001" ; qlsn<= ql+ "0001" ;
                        ELSIF ql= "1000" THEN
                           ql<= ql+"0001"; oc<='1'; qlew<=ql+"0001" ; qlsn<= ql+"0001";
                        ELSE
                        ql<= "0000" ; oc<='0'; qlew<= "0000" ; qlsn<= "0000" ;
                        END IF;
                        IF oc='1' THEN
                           IF qh<"0010" THEN
                              qh<= qh+ "0001" ; qhew<= qh+ "0001" ; qhsn<= qh+ "0001" ;
                           ELSIF qh="0010" THEN
                              qh<= "0000" ; i<= '1' ; qhew<= "0011" ; qhsn<= "0000" ;
                        r_ew<='1'; y_ew<='0'; g_ew<='0'; r_sn<='0'; y_sn<='1'; g_sn<='0';
                     END IF;
                  ELSE
                     NULL;
                     END IF;
                  ELSIF ql< "0100" THEN ——南北方向黄灯亮,东西红灯继续
                        r_ew<='1'; y_ew<='0'; g__ew<='0 '; r_sn<='0'; y_sn<='1'; g_sn<='0';
                            ql<=ql+"0001" ; qlew<=ql+"0001" ; qlsn<= ql+"0001" ;
                  ELSE
                           r_ew<='0' ; y_ew<='0'; g_ew<='1' ; r_sn<='1'; y_sn<='0'; g_sn<='0';
                            ql<= "0000" ; i<= '0'; sn<='0' ; qlew<= "0000" ; qlsn<= "0000" ; qhew
【答案解析】