📄 led4bits7seg.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity led4bits7seg is
port( clk: in std_logic;
keypress: in std_logic;
din: in std_logic_vector(3 downto 0);
RST:IN STD_LOGIC;
ENTER:IN STD_LOGIC;
data:out std_logic_vector(8 downto 0);
e:out std_logic);
end led4bits7seg;
architecture rt1 of led4bits7seg is
signal temp:std_logic_vector(3 downto 0);
signal count:std_logic_vector(1 downto 0);
signal islock:std_logic;
signal num:integer range 0 to 500;
signal QW,BW,SW,W,q,b,s,g:integer range 0 to 31;
signal total:integer;
signal change:std_logic;
signal clr:std_logic;
signal timecount:integer range 0 to 15;
SIGNAL LCDSTATE,STATE:INTEGER RANGE 0 TO 15;
begin
process(keypress,clr)
begin
IF ENTER='0' THEN
TOTAL<=Q*1000+B*100+S*10+G;
QW<=16; BW<=16; SW<=16; W<=16;
Q<=16; B<=16; S<=16; G<=16;
ELSE if clr='1' then change<='0';
ELSE if keypress'event and keypress='1' then
--IF (DIN="1010"OR DIN="1011" OR DIN="1100"
-- OR DIN="1101" OR DIN="1110" OR DIN="1111")
--THEN NULL;
--ELSE
QW<=BW; BW<=SW; SW<=W; W<=Q;
q<=b; b<=s; s<=g;
g<=conv_integer(din);
change<='1';
--END IF;
END IF;
end if;
END IF;
end process;
process(clk,change)
begin
if clk'event and clk = '1' then
IF RST='0' THEN
STATE<=0;
LCDSTATE<=0;
TIMECOUNT<=0;
ELSE
CASE LCDSTATE IS
WHEN 0=>
CASE STATE IS
WHEN 0=> DATA<="000111000"; --38H,显示模示设置
WHEN 1=> DATA<="000111000"; --08h,关闭显示
WHEN 2=> DATA<="000111000"; --01h,显示清屏
WHEN 3=> DATA<="000000001"; --06h,显示光标移动设置
WHEN 4=> DATA<="000111000"; --0001 S/C R/L XX
WHEN 5=> DATA<="000000110";
WHEN 6=> DATA<="000001111";
WHEN OTHERS=> DATA<="000000000";
END CASE;
IF STATE=7 THEN STATE<=0;
LCDSTATE<=1;
ELSE
IF TIMECOUNT=5 THEN E<='1'; END IF;
IF TIMECOUNT=9 THEN E<='0'; END IF;
IF TIMECOUNT=10 THEN
TIMECOUNT<=0;
STATE<=STATE+1;
ELSE TIMECOUNT<=TIMECOUNT+1;
END IF;
END IF;
WHEN 1=>
if change='1' then
CASE STATE IS
WHEN 0=> DATA<="01"&conv_std_logic_vector(16#48#,7); --38H,显示模示设置
WHEN 1=> IF QW=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(qW,8)+16#30#); --08h,关闭显示
END IF;
WHEN 2=> IF BW=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(BW,8)+16#30#); --08h,关闭显示
END IF;
WHEN 3=> IF SW=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(SW,8)+16#30#); --08h,关闭显示
END IF;
WHEN 4=> IF W=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(W,8)+16#30#); --08h,关闭显示
END IF;
WHEN 5=> IF Q=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(Q,8)+16#30#); --08h,关闭显示
END IF;
WHEN 6=> IF B=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(B,8)+16#30#); --08h,关闭显示
END IF;
WHEN 7=> IF S=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(S,8)+16#30#); --08h,关闭显示
END IF;
WHEN 8=> IF G=16 THEN DATA<="100100000";
ELSE DATA<="1"&(conv_std_logic_vector(G,8)+16#30#); --08h,关闭显示
END IF;
when others=> data<=(others=>'0');
END CASE;
IF STATE=9 THEN CLR<='1';
STATE<=0;
ELSE
IF TIMECOUNT=5 THEN E<='1'; END IF;
IF TIMECOUNT=9 THEN E<='0'; END IF;
IF TIMECOUNT=10 THEN
TIMECOUNT<=0;
STATE<=STATE+1;
ELSE TIMECOUNT<=TIMECOUNT+1;
END IF;
END IF;
ELSE CLR<='0';
end if;
WHEN OTHERS=> LCDSTATE<=1;
END CASE;
END IF;
END IF;
end process;
end rt1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -