📄 huffman_en_full.vhd
字号:
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 + -