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

📄 huffman_en_full.vhd

📁 huffman code vhdl program
💻 VHD
📖 第 1 页 / 共 5 页
字号:
                                          vlcode_ac1 <= "00000000000100001" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000000111" => --7
                                          vlcode_ac1 <= "00000000000001010" & rl_in(11);    
                                          codelength_ac1 <= "01011";    
                                 WHEN "000000001000" => --8
                                          vlcode_ac1 <= "00000000000011101" & rl_in(11);    
                                          codelength_ac1 <= "01101";    
                                 WHEN "000000001001" => --9
                                          vlcode_ac1 <= "00000000000011000" & rl_in(11);    
                                          codelength_ac1 <= "01101";    
                                 WHEN "000000001010" => --10
                                          vlcode_ac1 <= "00000000000010011" & rl_in(11);    
                                          codelength_ac1 <= "01101";    
                                 WHEN "000000001011" => --11
                                          vlcode_ac1 <= "00000000000010000" & rl_in(11);    
                                          codelength_ac1 <= "01101";    
                                 WHEN "000000001100" => --12
                                          vlcode_ac1 <= "00000000000011010" & rl_in(11);    
                                          codelength_ac1 <= "01110";    
                                 WHEN "000000001101" =>  --13
                                          vlcode_ac1 <= "00000000000011001" & rl_in(11);    
                                          codelength_ac1 <= "01110";    
                                 WHEN "000000001110" => --14
                                          vlcode_ac1 <= "00000000000011000" & rl_in(11);    
                                          codelength_ac1 <= "01110";    
                                 WHEN "000000001111" => --15
                                          vlcode_ac1 <= "00000000000010111" & rl_in(11);    
                                          codelength_ac1 <= "01110";    
                                 WHEN OTHERS => NULL;
                              END CASE;
                     WHEN '1' & "000000" & "XXXXXXXXXXX" => -- scan type = 1, run = 0, level = x
                              CASE temp7 IS --(level)
                                 WHEN "000000000001" => --1
                                          vlcode_ac1 <= "00000000000000010" & rl_in(11);    
                                          codelength_ac1 <= "00011";    
                                 WHEN "000000000010" => --2
                                          vlcode_ac1 <= "00000000000000110" & rl_in(11);    
                                          codelength_ac1 <= "00100";    
                                 WHEN "000000000011" => --3
                                          vlcode_ac1 <= "00000000000000111" & rl_in(11);    
                                          codelength_ac1 <= "00101";    
                                 WHEN "000000000100" => --4
                                          vlcode_ac1 <= "00000000000011100" & rl_in(11);    
                                          codelength_ac1 <= "00110";    
                                 WHEN "000000000101" => --5
                                          vlcode_ac1 <= "00000000000011101" & rl_in(11);    
                                          codelength_ac1 <= "00110";    
                                 WHEN "000000000110" => --6
                                          vlcode_ac1 <= "00000000000000101" & rl_in(11);    
                                          codelength_ac1 <= "00111";    
                                 WHEN "000000000111" => --7
                                          vlcode_ac1 <= "00000000000000100" & rl_in(11);    
                                          codelength_ac1 <= "00111";    
                                 WHEN "000000001000" => --8
                                          vlcode_ac1 <= "00000000001111011" & rl_in(11);    
                                          codelength_ac1 <= "01000";    
                                 WHEN "000000001001" => --9
                                          vlcode_ac1 <= "00000000001111100" & rl_in(11);    
                                          codelength_ac1 <= "01000";    
                                 WHEN "000000001010" => --10
                                          vlcode_ac1 <= "00000000000100011" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000001011" => --11
                                          vlcode_ac1 <= "00000000000100010" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000001100" => --12
                                          vlcode_ac1 <= "00000000011111010" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000001101" => --13
                                          vlcode_ac1 <= "00000000011111011" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000001110" => --14
                                          vlcode_ac1 <= "00000000011111110" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000001111" => --15
                                          vlcode_ac1 <= "00000000011111111" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN OTHERS =>  NULL;
                              END CASE;
                     WHEN '0' & "XXXXXX" & "00000000010" => -- scan type = 0, run = x, level = 2
                              CASE temp8 IS --(level)
                                 WHEN "000000000001" => --1
                                          vlcode_ac1 <=  "00000000000000110" & rl_in(11) ;    
                                          codelength_ac1 <= "00111";    
                                 WHEN "000000000010" => --2
                                          vlcode_ac1 <= "00000000000000100" & rl_in(11);    
                                          codelength_ac1 <= "01000";    
                                 WHEN "000000000011" => --3
                                          vlcode_ac1 <= "00000000000100100" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000000100" => --4
                                          vlcode_ac1 <= "00000000000001111" & rl_in(11);    
                                          codelength_ac1 <= "01011";    
                                 WHEN "000000000101" =>  --5
                                          vlcode_ac1 <= "00000000000001001" & rl_in(11);    
                                          codelength_ac1 <= "01011";    
                                 WHEN OTHERS => NULL;
                              END CASE;
                     WHEN '1' & "XXXXXX" & "00000000010" =>  -- scan type = 1, run = x, level = 2
                              CASE temp9 IS --(level)
                                 WHEN "000000000001" => --1
                                          vlcode_ac1 <= "00000000000000110" & rl_in(11);    
                                          codelength_ac1 <= "00110";    
                                 WHEN "000000000010" => --2
                                          vlcode_ac1 <= "00000000000001110" & rl_in(11);    
                                          codelength_ac1 <= "01000";    
                                 WHEN "000000000011" => --3
                                          vlcode_ac1 <= "00000000000100110" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000000100" => --4
                                          vlcode_ac1 <= "00000000011111101" & rl_in(11);    
                                          codelength_ac1 <= "01001";    
                                 WHEN "000000000101" => --5
                                          vlcode_ac1 <= "00000000000000100" & rl_in(11);    
                                          codelength_ac1 <= "01010";    
                                 WHEN OTHERS => NULL;
                              END CASE;
                     WHEN 'X' & "000010" & "00000000101" => -- scan_type = 0, EOB
                              vlcode_ac1 <= "00000000000010100" & rl_in(11);    
                              codelength_ac1 <= "01110";    
                     WHEN 'X' & "000010" & "00000000101" => -- scan type = x, run = 2, level = 5
                              vlcode_ac1 <= "00000000000010100" & rl_in(11);    
                              codelength_ac1 <= "01110";    
                     WHEN 'X' & "000010" & "00000000101" => -- scan type = x, run = 2, level = 5
                              vlcode_ac1 <= "00000000000010100" & rl_in(11);    
                              codelength_ac1 <= "01110";    
                     WHEN 'X' & "000010" & "00000000101" => -- scan type = x, run = 2, level = 5
                              vlcode_ac1 <= "00000000000010100" & rl_in(11);    
                              codelength_ac1 <= "01110";    
                     WHEN 'X' & "000010" & "00000000101" => -- scan type = x, run = 2, level = 5
                              vlcode_ac1 <= "00000000000010100" & rl_in(11);    
                              codelength_ac1 <= "01110";    
                     WHEN 'X' & "000010" & "00000000101" => -- scan type = x, run = 2, level = 5
                              vlcode_ac1 <= "00000000000010100" & rl_in(11);    
                              codelength_ac1 <= "01110";    
                     WHEN OTHERS =>
                              vlcode_ac1 <= rl_in;    
                              codelength_ac1 <= "10010";    
                     END CASE;
                  END IF;
               END IF;
            END IF;
         END IF;
      END IF;
   END PROCESS;

   --***************************************************************************
   -- pipeline vlcode_ac1 and codelength_ac1 to match the 2 pipe stages of the
   --  pipeline vlcode_ac1 and codelength_ac1 to match the 2 pipe stages of the
   -- corresponding DC values 
   
   PROCESS (CLK)
   BEGIN
      IF (CLK'EVENT AND CLK = '1') THEN
         IF (RST = '1') THEN
            vlcode_ac <= "000000000000000000";    
            codelength_ac <= "00000";    
         ELSE
            vlcode_ac <= vlcode_ac1;    
            codelength_ac <= codelength_ac1;    
         END IF;
      END IF;
   END PROCESS;

   --***************************************************************************
   -- select code and codelength. Counter value set at 2 because of the 2 pipestages
   --  select code and codelength. Counter value set at 2 because of the 2 pipestages
   -- od the AC and DC codelengths and vl codes 
   
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         codelength1 <= "00000";    
         vlcode1 <= "000000000000000000";    
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (rdy_in = '1' AND cntr64 = "0000010") THEN
            codelength1 <= '0' & codelength_dc;    
            vlcode1 <= "00000000" & vlcode_dc;    
         ELSE
            codelength1 <= codelength_ac;    
            vlcode1 <= vlcode_ac;    
         END IF;
      END IF;
   END PROCESS;

   --***************************************************************************
   -- pipeline code and codelength. This is done to match the pipestages with
   --  pipeline code and codelength. This is done to match the pipestages with
   -- cl_sum_prev which is multiplied with vlcode. 
   
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         codelength2 <= "00000";    
         vlcode2 <= "000000000000000000";    
         vlcode3 <= "000000000000000000";    
         vlcode4 <= "000000000000000000";    
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (rdy_in = '1') THEN
            codelength2 <= codelength1;    
            vlcode2 <= vlcode1;    
            vlcode3 <= vlcode2;    
            vlcode4 <= vlcode3;    
         END IF;
      END IF;
   END PROCESS;

   --***************************************************************************
   -- The maximum length of the vlc code can be 18 bits + 6 bits = 24 bits. This happens 
   --  The maximum length of the vlc code can be 18 bits + 6 bits = 24 bits. This happens 
   -- when a run level pair not defined in the table is encountered. In this case , a 6 bit 
   -- escape code followed by 6 bit run code and 12 bit level code is used.  The minimum 
   -- length of the vlc code is 2 bits. This happens when encoding an "EOB" symbol. After 
   -- finding the vlc code for a particular run/level pair, the code is shifted into a 

⌨️ 快捷键说明

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