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

📄 sanjiaoxing.txt

📁 用FPGA编写程序
💻 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 + -