⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jiao_tong.vhd

📁 本例实现交通灯的控制
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jiao_tong IS
 PORT(clk:IN STD_LOGIC;
      jin:IN STD_LOGIC;
      scan:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
      seg7:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
      ra,ya,ga:OUT STD_LOGIC;
      rb,yb,gb:OUT STD_LOGIC
      );
  END jiao_tong;
ARCHITECTURE one OF jiao_tong IS
 type state is(st1,st2,st3,st4);
 signal clk1khz,clk1hz:STD_LOGIC;
 signal one,ten:STD_LOGIC_VECTOR(3 DOWNTO 0);
 signal cnt:STD_LOGIC_VECTOR(1 DOWNTO 0);
 signal data:STD_LOGIC_VECTOR(3 DOWNTO 0);
 signal seg7_temp:STD_LOGIC_VECTOR(6 DOWNTO 0);
 signal r1,r2,g1,g2,y1,y2:std_logic;
BEGIN

PROCESS(clk)
 variable count:integer range 0 to 24999;
 BEGIN
  IF clk'event and clk='1'THEN
    IF count=24999 THEN
      clk1khz<=not clk1khz;
      count:=0;
    ELSE
       count:=count+1;
    END IF;
  END IF;
END PROCESS;

PROCESS(clk1khz)
variable counter:integer range 0 to 499;
 BEGIN
  IF clk1khz'event and clk1khz='1' THEN
    IF counter=499 THEN
     clk1hz<=not clk1hz;
     counter:=0;
    ELSE 
     counter:=counter+1;
    END IF;
  END IF;
END PROCESS;

PROCESS(clk1hz)
 variable stx:state;
 variable a:std_logic;
 variable qh,q1:std_logic_vector(3 downto 0);
BEGIN
 if clk1hz'event and clk1hz='1'THEN
   CASE stx IS
    WHEN st1=>if jin='0' THEN
                if a='0'THEN
                  qh:="0011";
                  q1:="0100";
                  a:='1';
                  r1<='0';
                  y1<='0';
                  g1<='1';
                  r2<='1';
                  y2<='0';
                  g2<='0'; 
                 else
                  if qh=0 and q1=1 then
                     stx:=st2;
                     a:='0';
                     qh:="0000";
                     q1:="0000";
                   elsif q1=0 then
                     q1:="1001";
                     qh:=qh-1;
                   else
                     q1:=q1-1;
                   end if;
                  end if;
                 end if;
WHEN st2=>if jin='0' THEN
                if a='0'THEN
                  qh:="0000";
                  q1:="0100";
                  a:='1';
                  r1<='0';
                  y1<='1';
                  g1<='0';
                  r2<='1';
                  y2<='0';
                  g2<='0'; 
                 else
                  if q1=1  then
                     stx:=st3;
                     a:='0';
                     qh:="0000";
                     q1:="0000";
                   else
                     q1:=q1-1;
                   end if;
                  end if;
            end if;
WHEN st3=>if jin='0' THEN
                if a='0'THEN
                  qh:="0010";
                  q1:="0100";
                  a:='1';
                  r1<='1';
                  y1<='0';
                  g1<='0';
                  r2<='0';
                  y2<='0';
                  g2<='1'; 
                 else
                  if qh=0 and q1=1 then
                     stx:=st4;
                     a:='0';
                     qh:="0000";
                     q1:="0000";
                   elsif q1=0 then
                     q1:="1001";
                     qh:=qh-1;
                   else
                     q1:=q1-1;
                   end if;
                  end if;
                 end if;
WHEN st4=>if jin='0' THEN
                if a='0'THEN
                  qh:="0000";
                  q1:="0100";
                  a:='1';
                  r1<='1';
                  y1<='0';
                  g1<='0';
                  r2<='1';
                  y2<='1';
                  g2<='0'; 
                 else
                  if  q1=1 then
                     stx:=st1;
                     a:='0';
                     qh:="0000";
                     q1:="0000";
                   else
                     q1:=q1-1;
                   end if;
                  end if;
                 end if;
END CASE;
END IF;
one<=q1;
ten<=qh;
END PROCESS;

PROCESS(jin ,clk1hz,r1,r2,g1,g2,y1,y2,seg7_temp)
BEGIN
 IF jin='1' THEN
   ra<=r1 or jin;
   rb<=r2 or jin;
   ga<=g1 and not jin;
   gb<=g2 and not jin;
   ya<=y1 and not jin;
   yb<=y2 and not jin;
  seg7(0)<=seg7_temp(0) and clk1hz;
  seg7(1)<=seg7_temp(1) and clk1hz;
  seg7(2)<=seg7_temp(2) and clk1hz;
  seg7(3)<=seg7_temp(3) and clk1hz;
  seg7(4)<=seg7_temp(4) and clk1hz;
  seg7(5)<=seg7_temp(5) and clk1hz;
  seg7(6)<=seg7_temp(6) and clk1hz;
 ELSE
   seg7<=seg7_temp;
     ra<=r1;
     rb<=r2;
     ga<=g1;
     gb<=g2;
     ya<=y1;
     yb<=y2;
END IF;
END PROCESS;

PROCESS(clk1khz)
 BEGIN
  IF clk1khz'event and clk1khz='1' THEN
    IF cnt="01" THEN cnt<="00";
    ELSE cnt<=cnt+1;
    END IF;
  END IF;
END PROCESS;

PROCESS(cnt,one,ten)
 BEGIN
  CASE cnt is
    WHEN "00"=>data<=one;scan<="01";
    WHEN "01"=>data<=ten;scan<="10";
    WHEN others=>null;
  END CASE;
END PROCESS;

PROCESS(data)
 BEGIN
 CASE data IS
   WHEN"0000"=>seg7_temp<="1000000";
   WHEN"0001"=>seg7_temp<="1111001";
   WHEN"0010"=>seg7_temp<="0100100";
   WHEN"0011"=>seg7_temp<="0110000";
   WHEN"0100"=>seg7_temp<="0011001";
   WHEN"0101"=>seg7_temp<="0010010";
   WHEN"0110"=>seg7_temp<="0000010";
   WHEN"0111"=>seg7_temp<="1111000";
   WHEN"1000"=>seg7_temp<="0000000";
   WHEN"1001"=>seg7_temp<="0010000";
   WHEN OTHERS=>seg7_temp<="1000000";
 END CASE;
END PROCESS;
END one;
    
  

     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -