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

📄 controller.vhd

📁 自己做的vhdl课程设计
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity controller is
port(clk,sa,sb:in std_logic;
Num1h: out std_logic_vector(3 downto 0);
Num1l: out std_logic_vector(3 downto 0);
Num2h: out std_logic_vector(3 downto 0);
Num2l: out std_logic_vector(3 downto 0);
Num3l: out std_logic_vector(3 downto 0);
ra,ya,ga,yb,rb,gb:out std_logic );
end controller;
architecture control of controller is
type states is(s0,s1,s2,s3);
signal state:states;
signal leda:std_logic_vector(2 downto 0);
signal ledb:std_logic_vector(2 downto 0);
signal counter:integer range 0 to 29;
signal Num1:integer range 0 to 30;
signal Num2:integer range 0 to 20;
signal Num3:integer range 0 to 5;
begin
process(clk)

variable cr,cnt:std_logic;
begin
if(clk'event and clk='1')then
if cr='0'then
counter<=0;
ELSIF cnt='0' THEN
       counter<=counter;
   ELSE
       counter<=counter+1;
	   
   END IF;
CASE state IS
WHEN s0 =>leda <= "001";
                      ledb <= "100";
Num1<=29-counter;num2<=0;num3<=0;
      IF (Sa AND Sb )='1' THEN
		
            IF counter = 29 THEN
                   state <= s1;
                   cr:= '0';
                   cnt:= '0';
            ELSE
                   state <= s0;
                   cr:= '1';
                   cnt:= '1';
            END IF;
      ELSIF (Sb AND (NOT Sa) ) ='1' THEN
                   state <= s1;
                   cr:= '0';
                   cnt:= '0';
      ELSE
                   state <= s0;
                   cr:= '1';
                   cnt:= '1';
      END IF;
 
WHEN s1 => leda <= "010";
                       ledb <= "100";
Num3<=5-counter;num1<=0;num2<=0;
      IF counter = 4 THEN

                   state <= s2;counter<=0;
                   cr:= '0';
                   cnt:= '0';
      ELSE
                   state <= s1;
                   cr:= '1';
                   cnt:= '1';
      END IF;

WHEN s2 =>leda <= "100";
                      ledb <= "001";
Num2<=20-counter;num1<=0;num3<=0;
      IF (Sa AND Sb )='1' THEN

            IF counter = 19 THEN
                      state <= s3;counter<=0;
                      cr:= '0';
                      cnt:= '0';
            ELSE
                      state <= s2;
                      cr:= '1';
                      cnt:= '1';
           END IF;
      ELSIF Sb = '0' THEN
                     state <= s3;counter<=0;
                     cr:= '0';
                     cnt:= '0';
      ELSE
                     state <= s2;
                     cr:= '1';
                     cnt:= '1';
      END IF;

WHEN s3 => leda <= "100";
                       ledb <= "010";
num2<=0;num1<=0;Num3<=5-counter;
      IF counter = 4 THEN

                  state <= s0;counter<=0;
                  cr:= '0';
                  cnt:= '0';
      ELSE
                  state <= s3;
                  cr:= '1';
                  cnt:= '1';
      END IF;

END CASE;
          END IF;
 ra<= leda(2);  ya<= leda(1); ga<= leda(0); 
 rb<= ledb(2);  yb<= ledb(1); gb<= ledb(0);
		if(Num1>=20) then 
				Num1H<="0010";
			   		if(Num1=29) then Num1L<="1001";
					elsif(Num1=28) then Num1L<="1000";
					elsif(Num1=27) then Num1L<="0111";
					elsif(Num1=26) then Num1L<="0110";
					elsif(Num1=25) then Num1L<="0101";
					elsif(Num1=24) then Num1L<="0100";
					elsif(Num1=23) then Num1L<="0011";
					elsif(Num1=22) then Num1L<="0010";
					elsif(Num1=21) then Num1L<="0001";
					else Num1L<="0000";
                    end if;
		elsif(Num1>=10 and Num1<20) then
				Num1H<="0001";
					if(Num1=19) then Num1L<="1001";
					elsif(Num1=18) then Num1L<="1000";
					elsif(Num1=17) then Num1L<="0111";
					elsif(Num1=16) then Num1L<="0110";				
					elsif(Num1=15) then Num1l<="0101";
					elsif(Num1=14) then Num1L<="0100";
					elsif(Num1=13) then Num1L<="0011";
					elsif(Num1=12) then Num1L<="0010";
					elsif(Num1=11) then Num1L<="0001";
					else Num1L<="0000";
					end if;
		else 
			Num1H<="0000";			
					if(Num1=9) then Num1L<="1001";
					elsif(Num1=8) then Num1L<="1000";
					elsif(Num1=7) then Num1L<="0111";
					elsif(Num1=6) then Num1L<="0110";				
					elsif(Num1=5) then Num1l<="0101";
					elsif(Num1=4) then Num1L<="0100";
					elsif(Num1=3) then Num1L<="0011";
					elsif(Num1=2) then Num1L<="0010";
					elsif(Num1=1) then Num1L<="0001";
					else Num1L<="0000";
					end if;  
	 end if;
if(Num2=20) then 
				Num2H<="0010";Num2L<="0000";
elsif(Num2>=10 and  Num2<20 ) then
				Num2H<="0001";
					if(Num2=19) then Num2L<="1001";
					elsif(Num2=18) then Num2L<="1000";
					elsif(Num2=17) then Num2L<="0111";
					elsif(Num2=16) then Num2L<="0110";				
					elsif(Num2=15) then Num2l<="0101";
					elsif(Num2=14) then Num2L<="0100";
					elsif(Num2=13) then Num2L<="0011";
					elsif(Num2=12) then Num2L<="0010";
					elsif(Num2=11) then Num2L<="0001";
					else Num2L<="0000";
					end if;
else 
			Num2H<="0000";			
					if(Num2=9) then Num2L<="1001";
					elsif(Num2=8) then Num2L<="1000";
					elsif(Num2=7) then Num2L<="0111";
					elsif(Num2=6) then Num2L<="0110";				
					elsif(Num2=5) then Num2l<="0101";
					elsif(Num2=4) then Num2L<="0100";
					elsif(Num2=3) then Num2L<="0011";
					elsif(Num2=2) then Num2l<="0010";
					elsif(Num2=1) then Num2L<="0001";
					else Num2L<="0000";
					end if;  
end if; 
				if(Num3=5) then Num3l<="0101";
				elsif(Num3=4) then Num3l<="0100";
				elsif(Num3=3) then Num3l<="0011";
				elsif(Num3=2) then Num3l<="0010";
				elsif(Num3=1) then Num3l<="0001";
				else Num3l<="0000";
			end if;  

END PROCESS;
END control;


⌨️ 快捷键说明

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