📄 sanjiaoxing.txt
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.all;
ENTITY sanjiaoxing is
PORT(clr,clk,BUSY: IN std_logic;
STOBE : OUT std_logic;
selout : OUT STD_LOGIC_VECTOR (2 downto 0) ;
key : IN STD_LOGIC_VECTOR (3 downto 0) ;
dout: out std_logic_vector(7 downto 0)
);
END sanjiaoxing;
ARCHITECTURE doit OF sanjiaoxing IS
signal counter,addrbegin,addr1: std_logic_vector(7 downto 0);
signal addr: std_logic_vector(7 DOWNTO 0);
signal DAT : std_logic_vector(7 downto 0);
signal counter1 : std_logic_vector(1 downto 0);
signal counte : std_logic_vector(2 downto 0);
signal counter2 : std_logic_vector(4 downto 0);
signal dc0,dc1,dc2,dc3: std_logic_vector(3 downto 0);
signal dcc : std_logic_vector(6 downto 0);
signal d0,d1,d2,d3 : std_logic_vector(0 to 6);
signal clk1,test,koff: std_logic;
signal DCC1 : STD_LOGIC_VECTOR (3 DOWNTO 0);
signal f:std_logic;
BEGIN
p0:process(dcc1)
begin
case dcc1 is
when "0000" => addrbegin<="00000001";
when "0001" => addrbegin<="00000101";
when "0010" => addrbegin<="00001001";
when "0011" => addrbegin<="00001101";
when "0100" => addrbegin<="00010001";
when "0101" => addrbegin<="00010101";
when "0110" => addrbegin<="00011001";
when "0111" => addrbegin<="00011101";
when "1000" => addrbegin<="00100001";
when "1001" => addrbegin<="00100101";
when "1010" => addrbegin<="00101001";
when "1011" => addrbegin<="00101101";
when "1100" => addrbegin<="00110001";
when "1101" => addrbegin<="00110101";
when "1110" => addrbegin<="00111001";
when "1111" => addrbegin<="00111101";
when others => null;
end case;
end process p0;
P1: process(clr,busy)
begin
if(clr='0') then
addr<="00000000";
elsif(busy'event and busy='0') then
addr<=addrbegin+addr1;
end if;
end process P1;
P2: process(clr,busy)
begin
if(clr='0') then
addr1<="00000000";
elsif(busy'event and busy='1') then
if(addr1="00000011") then
addr1<="00000000";
else
addr1<=addr1+1;
end if;
end if;
end process P2;
P3: process(busy, clk)
begin
if(busy='1') then
counter<="00000000";
elsif(clk'event and clk='1') then
counter<=counter+1;
end if;
end process P3;
dout<=DAT;
stobe<='1' when counter>="00000011" else
'0';
--U2:ROM_8 port map(AD=>addr,DAT=>DIN);
test<=key(3) and key(2) and key(1) and key(0);
P4: process(clr,clk) --分频
begin
if(clr='0') then
counter1<="00";
elsif(clk'event and clk='1') then
counter1<=counter1+1;
end if;
end process ;
clk1<='0' when counter1<="01" else
'1';
P5: process(clr,clk1,test) --键盘扫描
begin
if(clr='0') then
counte<="000";
elsif(clk1'event and clk1='1') then
if(test='0') or (koff='0') then
counte<=counte;
else
counte<=counte+1;
end if;
end if;
end process ;
selout<=counte;
dcc<=counte & key;
P6: process(clk,test) --键盘译码
begin
if(clk'event and clk='0') then
if(dcc="0001110") then
dcc1<="0000";
elsif(dcc="0011110") then
dcc1<="0001";
elsif(dcc="0101110") then
dcc1<="0010";
elsif(dcc="0111110") then
dcc1<="0011";
elsif(dcc="1101110") then
dcc1<="0100";
elsif(dcc="1111110") then
dcc1<="0101";
elsif(dcc="0001101") then
dcc1<="0110";
elsif(dcc="0011101") then
dcc1<="0111";
elsif(dcc="1001101") then
dcc1<="1000";
elsif(dcc="1011101") then
dcc1<="1001";
elsif(dcc="1101101") then
dcc1<="1010";
elsif(dcc="1111101") then
dcc1<="1011";
elsif(dcc="0101011") then
dcc1<="1100";
elsif(dcc="0111011") then
dcc1<="1101";
elsif(dcc="1001011") then
dcc1<="1110";
elsif(dcc="1011011") then
dcc1<="1111";
elsif(test='0') then
dcc1<="1111";
end if;
end if;
end process ;
P7: process(test,clk,clr) --消抖
begin
if(clr='0') then
counter2<="00000";
koff<='1';
elsif(clk'event and clk='1') then
if(test='0') then
counter2<="00000";
koff<='0';
elsif(counter2<"11110") then
counter2<=counter2+1;
-- end if;
elsif(counter2="11110") then
koff<='1';
end if;
end if;
end process ;
p8:PROCESS(addr)
BEGIN
CASE addr IS
WHEN "00000000" => DAT<="11110100";
WHEN "00000001" => DAT<="11110011";
WHEN "00000010" => DAT<="00001000";
WHEN "00000011" => DAT<="00001000";
WHEN "00000100" => DAT<="00000001";
WHEN "00000101" => DAT<="11110011";
WHEN "00000110" => DAT<="00001001";
WHEN "00000111" => DAT<="00001000";
WHEN "00001000" => DAT<="00000000";
WHEN "00001001" => DAT<="11110011";
WHEN "00001010" => DAT<="00001000";
WHEN "00001011" => DAT<="00001001";
WHEN "00001100" => DAT<="00000010";
WHEN "00001101" => DAT<="11110011";
WHEN "00001110" => DAT<="00001001";
WHEN "00001111" => DAT<="00001001";
WHEN "00010000" => DAT<="10000000";
WHEN "00010001" => DAT<="11110011";
WHEN "00010010" => DAT<="00001000";
WHEN "00010011" => DAT<="00001010";
WHEN "00010100" => DAT<="00000100";
WHEN "00010101" => DAT<="11110011";
WHEN "00010110" => DAT<="00001001";
WHEN "00010111" => DAT<="00001010";
WHEN "00011000" => DAT<="01000000";
WHEN "00011001" => DAT<="11110011";
WHEN "00011010" => DAT<="00001000";
WHEN "00011011" => DAT<="00001011";
WHEN "00011100" => DAT<="00001000";
WHEN "00011101" => DAT<="11110011";
WHEN "00011110" => DAT<="00001001";
WHEN "00011111" => DAT<="00001011";
WHEN "00100000" => DAT<="00100000";
WHEN "00100001" => DAT<="11110011";
WHEN "00100010" => DAT<="00001000";
WHEN "00100011" => DAT<="00001100";
WHEN "00100100" => DAT<="00010000";
WHEN "00100101" => DAT<="11110011";
WHEN "00100110" => DAT<="00001001";
WHEN "00100111" => DAT<="00001100";
WHEN "00101000" => DAT<="00010000";
WHEN "00101001" => DAT<="11110011";
WHEN "00101010" => DAT<="00001000";
WHEN "00101011" => DAT<="00001101";
WHEN "00101100" => DAT<="00100000";
WHEN "00101101" => DAT<="11110011";
WHEN "00101110" => DAT<="00001001";
WHEN "00101111" => DAT<="00001101";
WHEN "00110000" => DAT<="00001000";
WHEN "00110001" => DAT<="11110011";
WHEN "00110010" => DAT<="00001000";
WHEN "00110011" => DAT<="00001110";
WHEN "00110100" => DAT<="01000000";
WHEN "00110101" => DAT<="11110011";
WHEN "00110110" => DAT<="00001001";
WHEN "00110111" => DAT<="00001110";
WHEN "00111000" => DAT<="00000100";
WHEN "00111001" => DAT<="11110011";
WHEN "00111010" => DAT<="00001000";
WHEN "00111011" => DAT<="00001111";
WHEN "00111100" => DAT<="11111111";
WHEN "00111101" => DAT<="11110011";
WHEN "00111110" => DAT<="00001001";
WHEN "00111111" => DAT<="00001111";
WHEN "01000000" => DAT<="11111110";
WHEN OTHERS => DAT<="00000000";
END CASE;
END PROCESS;
END doit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -