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

📄 led_scan.vhd

📁 用DE2板子实现的控制64乘64点阵LED的点亮,硬件需要de2板及led点阵
💻 VHD
字号:
--BIT SCAN CLK 1M    
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY LED_SCAN IS
  PORT(
       CLK_50M    :IN STD_LOGIC;
---TO RAM
       DGIN       :IN STD_LOGIC_VECTOR(7 DOWNTO 0);
       DRIN       :IN STD_LOGIC_VECTOR(7 DOWNTO 0);
       READCLK_RAM:OUT STD_LOGIC;
       READADDR_RAM:OUT STD_LOGIC_VECTOR(13 DOWNTO 0);
---LED DISPLAY BOARD
       OE        :OUT STD_LOGIC;
 --      OER        :OUT STD_LOGIC;
       DG         :OUT STD_LOGIC;
       DR         :OUT STD_LOGIC;
       CLK        :OUT STD_LOGIC; --移位时钟
       STB        :OUT STD_LOGIC; --595锁存
       SC         :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
      ----addr         :OUT STD_LOGIC_VECTOR(10 DOWNTO 0));
   
END; 
ARCHITECTURE LIN OF LED_SCAN IS
  SIGNAL iSC       :STD_LOGIC_VECTOR(3 DOWNTO 0);
  SIGNAL iDG       :STD_LOGIC;
  SIGNAL iDR       :STD_LOGIC;
  SIGNAL BIT_SHIFT_COUNT :INTEGER RANGE 0 TO 260;
  SIGNAL DIV_COUNT :INTEGER RANGE 0 TO 24;
  SIGNAL CLK_1M    :STD_LOGIC;
  SIGNAL CLK_SHIFT_EN:STD_LOGIC;
  SIGNAL GRAY_COUNT:STD_LOGIC_VECTOR(7 DOWNTO 0);
  SIGNAL addcon    :INTEGER range 0 to 1024:=0;
  signal zhen      :STD_LOGIC_VECTOR(1 DOWNTO 0);       
---------  signal zhenadd   :INTEGER range 0 to 16384:=0;
BEGIN
DG<=iDG;
DR<=iDR;
SC<=iSC;
READCLK_RAM<=CLK_50M;
----位移位时钟生成----------------------------------------------------
PROCESS(CLK_50M,DIV_COUNT,CLK_1M)              
   BEGIN
     IF  CLK_50M'EVENT AND CLK_50M='1' THEN
        IF DIV_COUNT>=1 THEN 
         DIV_COUNT<=0;
         CLK_1M<=NOT CLK_1M;                          
        ELSE
         DIV_COUNT<=DIV_COUNT+1;              
        END IF;      
     END IF; 
 END PROCESS;
----图象数据读取------------------------------------------------------
  process(zhen)
  begin
  READADDR_RAM(13 downto 12)<=zhen;
  ----case zhen is
  -----when"00"=> READADDR_RAM(13 downto 12)<="00";
  -----when"01"=> READADDR_RAM(13 downto 12)<="01";
  -----when"10"=> READADDR_RAM(13 downto 12)<="10";
  -----when"11"=> READADDR_RAM(13 downto 12)<="11";
  -----end case;
 end process;
  PROCESS(CLK_1M,BIT_SHIFT_COUNT)

   BEGIN
    IF  CLK_1M'EVENT AND CLK_1M='1' THEN
      if isc="1111" then
        if BIT_SHIFT_COUNT>=192 THEN
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-192+3072,12);   
        ELSif BIT_SHIFT_COUNT>=128 THEN
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-128+2048,12);
        elsIF BIT_SHIFT_COUNT>=64 THEN
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-64+1024,12);
        else  
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT+4096,12);
        end if;
      end if;
      if isc<="1110" then
        if BIT_SHIFT_COUNT>=192 THEN
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-192+3072+addcon+64,12);   
        ELSif BIT_SHIFT_COUNT>=128 THEN
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-128+2048+addcon+64,12);
        elsIF BIT_SHIFT_COUNT>=64 THEN
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-64+1024+addcon+64,12);
        else  
        READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT+addcon+64,12);
        END IF; 
      END IF; 
    END IF; 
 END PROCESS;
----位移输出----------------------------------------------------------
 ----process(clk_1m,gray_count,BIT_SHIFT_COUNT)
---- begin
 -----IF  CLK_1M'EVENT AND CLK_1M='0' THEN
   -----if gray_count="11111111"and BIT_SHIFT_COUNT=258 then
   ----zhen<=zhen+1;
   ----end if;
 ----end if;
-----end process;
 PROCESS(CLK_1M,BIT_SHIFT_COUNT)
   BEGIN
     IF  CLK_1M'EVENT AND CLK_1M='0' THEN
      IF BIT_SHIFT_COUNT>=258 THEN
       BIT_SHIFT_COUNT<=0;
       CLK_SHIFT_EN<='0';
       iSC<=iSC+1;
       addcon<=addcon+64;
        IF iSC="1111" THEN 
        GRAY_COUNT<=GRAY_COUNT+1;
        addcon<=0;
        if gray_count="11111111"then
        zhen<=zhen+1;
        end if;
        END IF;
      ELSIF BIT_SHIFT_COUNT=257 THEN
       BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
       CLK_SHIFT_EN<='0';
      ELSIF BIT_SHIFT_COUNT=256 THEN 
       BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
       STB<='1';
       CLK_SHIFT_EN<='0';
      ELSIF BIT_SHIFT_COUNT>=255 THEN
       OE<='1';
       --OER<='1';
       BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
       ELSIF BIT_SHIFT_COUNT=0 THEn
       CLK_SHIFT_EN<='1';
         BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
       ELSE
       STB<='0';
       OE<='0';
       --OER<='0';
       BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
       CLK_SHIFT_EN<='1';
      END IF;    
     END IF; 
 END PROCESS;
-----位移时钟给出-----------------------------------------
 PROCESS(CLK_SHIFT_EN,CLK_1M)
   BEGIN
     IF  CLK_SHIFT_EN='1' THEN
       CLK<=CLK_1M;  
     ELSE 
       CLK<='0'; 
     END IF; 
 END PROCESS;
----位移数据给出------------------------------------------------------
 PROCESS(CLK_1M,BIT_SHIFT_COUNT)
   BEGIN
    IF  CLK_1M'EVENT AND CLK_1M='0' THEN
      IF DGIN>GRAY_COUNT THEN 
         iDG<='0';
      ELSE  
         iDG<='1';
      END IF; 
      IF DrIN>GRAY_COUNT THEN 
         iDR<='0';
      ELSE  
         iDR<='1';
      END IF; 
    END IF; 
 END PROCESS;


 ----addr<=CONV_STD_LOGIC_VECTOR(addcon,11);
--完---------------------------------------------------------------
END LIN;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -