📄 controller.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 + -