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

📄 data_manage.vhd

📁 酒吧灯光控制工程在FPGA中的实现源代码
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DATA_MANAGE IS
  PORT(
           VS:IN  STD_LOGIC;
         DATA:IN  STD_LOGIC_VECTOR(23 DOWNTO 0);
       CLK50M:IN  STD_LOGIC;
     MCU_DATA:IN  STD_LOGIC;
    MCU_LATCH:IN  STD_LOGIC;
      MCU_CLK:IN  STD_LOGIC;
         ADDR:OUT STD_LOGIC_VECTOR(13 DOWNTO 0);
           OE:OUT STD_LOGIC;
           WE:OUT STD_LOGIC;
           EN:OUT STD_LOGIC;
    LATCH_OUT:OUT STD_LOGIC;
      CLK_OUT:OUT STD_LOGIC;
        RDATA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
        GDATA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
        BDATA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
      );
  END DATA_MANAGE;
--****************************************
ARCHITECTURE A OF DATA_MANAGE IS
   SIGNAL CLK_COUNTER:STD_LOGIC_VECTOR(2 DOWNTO 0);
   SIGNAL CLK_T:STD_LOGIC;
   SIGNAL CHUNNEL_COUNTER:STD_LOGIC_VECTOR(1 DOWNTO 0);
   SIGNAL CHUNNEL_T:STD_LOGIC;
   SIGNAL SECT_COUNTER:STD_LOGIC_VECTOR(2 DOWNTO 0);
   SIGNAL SECT_T:STD_LOGIC;
   SIGNAL L_COUNTER:STD_LOGIC_VECTOR(1 DOWNTO 0);
   SIGNAL L_T:STD_LOGIC;
   SIGNAL BLOCK_COUNTER:STD_LOGIC_VECTOR(5 DOWNTO 0);
   SIGNAL BLOCK_T:STD_LOGIC;
   SIGNAL SCAN_COUNTER:STD_LOGIC_VECTOR(4 DOWNTO 0);
   SIGNAL RED_BIT:STD_LOGIC;
   SIGNAL GREEN_BIT:STD_LOGIC;
   SIGNAL BLUE_BIT:STD_LOGIC;
   SIGNAL R_BIT:STD_LOGIC_VECTOR(3 DOWNTO 0);
   SIGNAL G_BIT:STD_LOGIC_VECTOR(3 DOWNTO 0);
   SIGNAL B_BIT:STD_LOGIC_VECTOR(3 DOWNTO 0);
   SIGNAL CONTROL_B:STD_LOGIC_VECTOR(7 DOWNTO 0);
   SIGNAL CONTROL_T:STD_LOGIC_VECTOR(7 DOWNTO 0);
--**********************************************
 BEGIN
  PROCESS(MCU_CLK)
   BEGIN
     IF MCU_CLK'EVENT AND MCU_CLK='1'THEN
        LOOP2: FOR I IN 7 DOWNTO 1 LOOP
            CONTROL_B(I)<=CONTROL_B(I-1);
              END LOOP LOOP2;
         CONTROL_B(0)<=MCU_DATA;
      END IF;
    END PROCESS;
--***********************************************
  PROCESS(MCU_LATCH)
     BEGIN
        IF MCU_LATCH'EVENT AND MCU_LATCH='1'THEN
            CONTROL_T<=CONTROL_B;
        END IF;
     END PROCESS;
--************************************************   
   PROCESS(CLK50M)
      BEGIN
        IF CLK50M'EVENT AND CLK50M='1'THEN
           CLK_COUNTER<=CLK_COUNTER+1;
        END IF;
        END PROCESS;
  CLK_T<='1'WHEN CLK_COUNTER="111"ELSE
        '0';
 --***********************************   
    PROCESS(CLK50M)
      BEGIN
       IF VS='0'THEN
         CHUNNEL_COUNTER<="00";
       ELSIF CLK50M'EVENT AND CLK50M='1'THEN
       IF CLK_T='1'THEN         
         CHUNNEL_COUNTER<=CHUNNEL_COUNTER+1;         
        END IF;
       END IF;
      END PROCESS;
     CHUNNEL_T<='1'WHEN CHUNNEL_COUNTER="11" AND CLK_T='1' ELSE
                '0';
--*****************************
    PROCESS(CLK50M)
      BEGIN 
       IF VS='0'THEN
         SECT_COUNTER<="000";
       ELSIF CLK50M'EVENT AND CLK50M='1'THEN
         IF CHUNNEL_T='1'THEN
          SECT_COUNTER<=SECT_COUNTER+1;
         END IF;
       END IF;
      END PROCESS;
    SECT_T<='1'WHEN CHUNNEL_T='1'AND SECT_COUNTER="111"ELSE
             '0';
    --*************************
    PROCESS(CLK50M)
      BEGIN
        IF VS='0'THEN
          L_COUNTER<="00";
        ELSIF CLK50M'EVENT AND CLK50M='1'THEN
          IF SECT_T='1'THEN  
          L_COUNTER<=L_COUNTER+1;
          END IF;
        END IF;
      END PROCESS;
     L_T<='1'WHEN SECT_T='1' AND L_COUNTER="11"ELSE
          '0';
   --************************       
    PROCESS(CLK50M)
      BEGIN
       IF VS='0'THEN
         BLOCK_COUNTER<="000000";
       ELSIF CLK50M'EVENT AND CLK50M='1'THEN
          IF L_T='1'THEN
             IF BLOCK_COUNTER="100001"THEN
               BLOCK_COUNTER<="000000"; 
             ELSE
               BLOCK_COUNTER<=BLOCK_COUNTER+1;
              END IF;
          END IF;
       END IF;
      END PROCESS;
    BLOCK_T<='1'WHEN L_T='1'AND BLOCK_COUNTER="100001"ELSE
             '0';
     --********************
    PROCESS (CLK50M)
      BEGIN
        IF VS='0'THEN
          SCAN_COUNTER<="00000";  
        ELSIF CLK50M'EVENT AND CLK50M='1'THEN
          IF BLOCK_T='1'THEN
            SCAN_COUNTER<=SCAN_COUNTER+1;
          END IF;
        END IF;
      END PROCESS; 
           RED_BIT<='0' WHEN SCAN_COUNTER(4)='1'ELSE
                DATA(23) WHEN SCAN_COUNTER(3)='1'ELSE
                DATA(22) WHEN SCAN_COUNTER(2)='1'ELSE
                DATA(21) WHEN SCAN_COUNTER(1)='1'ELSE
                DATA(20) WHEN SCAN_COUNTER(0)='1'ELSE
                    '0';
          GREEN_BIT<='0' WHEN SCAN_COUNTER(4)='1'ELSE
                DATA(15) WHEN SCAN_COUNTER(3)='1'ELSE
                DATA(14) WHEN SCAN_COUNTER(2)='1'ELSE
                DATA(13) WHEN SCAN_COUNTER(1)='1'ELSE
                DATA(12) WHEN SCAN_COUNTER(0)='1'ELSE
                     '0';
           BLUE_BIT<='0' WHEN SCAN_COUNTER(4)='1'ELSE
                DATA(7) WHEN SCAN_COUNTER(3)='1'ELSE
                DATA(6) WHEN SCAN_COUNTER(2)='1'ELSE
                DATA(5) WHEN SCAN_COUNTER(1)='1'ELSE
                DATA(4) WHEN SCAN_COUNTER(0)='1'ELSE
                 '0';

      
   --************************
    PROCESS(CLK50M)
      BEGIN
        IF CLK50M'EVENT AND CLK50M='1'THEN
           IF CLK_COUNTER="100"THEN
           LOOP1:FOR I IN 3 DOWNTO 1 LOOP
                 R_BIT(I)<=R_BIT(I-1);
                 B_BIT(I)<=B_BIT(I-1);
                 G_BIT(I)<=G_BIT(I-1);
               END LOOP LOOP1;
                 R_BIT(0)<=RED_BIT;
                 G_BIT(0)<=GREEN_BIT;
                 B_BIT(0)<=BLUE_BIT;
            END IF;
            END IF;
       END PROCESS;
    --*****************************
   PROCESS(CLK50M)
     BEGIN 
      IF CLK50M'EVENT AND CLK50M='1'THEN
         IF CHUNNEL_COUNTER="00" AND CLK_COUNTER="001" THEN
            RDATA<=R_BIT;
            GDATA<=G_BIT;
            BDATA<=B_BIT;
          END IF;
       END IF;
     END PROCESS;
    --******************************
 CLK_OUT<=CHUNNEL_COUNTER(1);
 LATCH_OUT<='1'WHEN CHUNNEL_COUNTER="01"AND L_COUNTER="00" AND BLOCK_COUNTER="000000" AND SECT_COUNTER="001" ELSE
            '0';
 EN<='0'WHEN CONTROL_T="00000000"ELSE
     '1';
 WE<='1';
 OE<='0';
 ADDR<='0'& CHUNNEL_COUNTER &  L_COUNTER   & ( BLOCK_COUNTER ) & ( SECT_COUNTER);

END A;

 
           

  
      
   

⌨️ 快捷键说明

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