📄 eda7彩灯及键盘抖动的演示.vhd
字号:
library IEEE;
--The IEEE standard 1164 package, declares std_logic, rising_edge(), etc.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
--This package is a version of the Synopsys package and has been
-- optimized for use with the Express compiler.
library SYNOPSYS;
use SYNOPSYS.attributes.all;
entity TEST is
port (
JIL,JIR:IN STD_LOGIC;
LED,SWOUT:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);
SEG: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
BCD: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
IO: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
BEEP,POINT:OUT STD_LOGIC
);
end TEST;
architecture TEST_arch of TEST is
COMPONENT clkhu
PORT (CLKOUT:out STD_LOGIC);
END COMPONENT;
SIGNAL COUNT1:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL COUNTR,COUNTL:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL BCD_T:STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL COUNT2:STD_LOGIC_VECTOR(5 DOWNTO 0);
SIGNAL CLKIN,CLK1,CLK2:STD_LOGIC;
SIGNAL BCD_S,BCD1,BCD2,BCD3,BCD4:STD_LOGIC_VECTOR(3 DOWNTO 0);
begin
-- <<enter your statements here>>
U1:CLKHU PORT MAP (CLKIN);
SWOUT<=COUNT1(9 DOWNTO 2);
P1:PROCESS(CLKIN,COUNT1)
BEGIN
IF(CLKIN='1' AND CLKIN'EVENT)THEN
COUNT1<=COUNT1+1;
END IF;
CLK1<=COUNT1(9);
END PROCESS;
P2:PROCESS(CLK1,COUNT2)
BEGIN
IF(CLK1='1' AND CLK1'EVENT)THEN
COUNT2<=COUNT2+1;
CLK2<=COUNT2(1);
END IF;
END PROCESS;
P3:PROCESS(CLK2,COUNT2,LED)
BEGIN
IF(CLK2='1' AND CLK2'EVENT)THEN
IF(COUNT2( 5 DOWNTO 4)="00")THEN
LED(0)<='0';
LED(1)<=LED(0);
LED(2)<=LED(1);
LED(3)<=LED(2);
ELSIF(COUNT2(5 DOWNTO 4)="01")THEN
LED(0)<='1';
LED(1)<=LED(0);
LED(2)<=LED(1);
LED(3)<=LED(2);
ELSIF(COUNT2(5 DOWNTO 4)="10")THEN
LED(3)<='0';
LED(2)<=LED(3);
LED(1)<=LED(2);
LED(0)<=LED(1);
ELSE
LED(3)<='1';
LED(2)<=LED(3);
LED(1)<=LED(2);
LED(0)<=LED(1);
END IF;
END IF;
END PROCESS;
LED(7)<=LED(0);
LED(6)<=LED(1);
LED(5)<=LED(2);
LED(4)<=LED(3);
BEEP<=JIR AND JIL;
PS:PROCESS(COUNT1)
BEGIN
CASE COUNT1(1 DOWNTO 0) IS
WHEN "00"=>SEG<="1110";BCD_S<=BCD1;IO(1 DOWNTO 0)<="00";
WHEN "01"=>SEG<="1101";BCD_s<=BCD2;IO(1 DOWNTO 0)<="01";
WHEN "10"=>SEG<="1011";BCD_S<=BCD3;IO(1 DOWNTO 0)<="10";
WHEN "11"=>SEG<="0111";BCD_S<=BCD4;IO(1 DOWNTO 0)<="11";
WHEN OTHERS=>NULL;
END CASE;
IF(COUNT2(4 DOWNTO 3)=COUNT1(1 DOWNTO 0) )THEN
POINT<='1';
ELSE
POINT<='0';
END IF;
END PROCESS;
IO(2)<=CLKIN;
PR:PROCESS(JIR,COUNTR)
BEGIN
IF(JIR'EVENT AND JIR='1')THEN
COUNTR<=COUNTR+1;
END IF;
END PROCESS;
BCD1<=COUNTL(3 DOWNTO 0);
BCD2<=COUNTL(7 DOWNTO 4);
PL:PROCESS(JIL,COUNTL)
BEGIN
IF(JIL'EVENT AND JIL='0')THEN
COUNTL<=COUNTL+1;
END IF;
END PROCESS;
BCD3<=COUNTR(3 DOWNTO 0);
BCD4<=COUNTR(7 DOWNTO 4);
--HEX-to-seven-segment decoder
-- HEX: in STD_LOGIC_VECTOR (3 downto 0);
-- LED: out STD_LOGIC_VECTOR (6 downto 0);
--
-- segment encoding
-- 0
-- ---
-- 5 | | 1
-- --- <- 6
-- 4 | | 2
-- ---
-- 3
with BCD_S SELect
BCD_T<= "1111001" when "0001", --1
"0100100" when "0010", --2
"0110000" when "0011", --3
"0011001" when "0100", --4
"0010010" when "0101", --5
"0000010" when "0110", --6
"1111000" when "0111", --7
"0000000" when "1000", --8
"0010000" when "1001", --9
"0001000" when "1010", --A
"0000011" when "1011", --b
"1000110" when "1100", --C
"0100001" when "1101", --d
"0000110" when "1110", --E
"0001110" when "1111", --F
"1000000" when others; --0
BCD<=NOT BCD_T;
End TEST_arch;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -