📄 quant.vhd
字号:
WHEN "100011100" => def_q_mem <= "00011101";
WHEN "100011101" => def_q_mem <= "00100010";
WHEN "100011110" => def_q_mem <= "00100101";
WHEN "100011111" => def_q_mem <= "00101000";
WHEN "100100000" => def_q_mem <= "00010110";
WHEN "100100001" => def_q_mem <= "00011010";
WHEN "100100010" => def_q_mem <= "00011011";
WHEN "100100011" => def_q_mem <= "00011101";
WHEN "100100100" => def_q_mem <= "00100000";
WHEN "100100101" => def_q_mem <= "00100011";
WHEN "100100110" => def_q_mem <= "00101000";
WHEN "100100111" => def_q_mem <= "00110000";
WHEN "100101000" => def_q_mem <= "00011010";
WHEN "100101001" => def_q_mem <= "00011011";
WHEN "100101010" => def_q_mem <= "00011101";
WHEN "100101011" => def_q_mem <= "00100000";
WHEN "100101100" => def_q_mem <= "00100011";
WHEN "100101101" => def_q_mem <= "00101000";
WHEN "100101110" => def_q_mem <= "00110000";
WHEN "100101111" => def_q_mem <= "00111010";
WHEN "100110000" => def_q_mem <= "00011010";
WHEN "100110001" => def_q_mem <= "00011011";
WHEN "100110010" => def_q_mem <= "00011101";
WHEN "100110011" => def_q_mem <= "00100010";
WHEN "100110100" => def_q_mem <= "00100110";
WHEN "100110101" => def_q_mem <= "00101110";
WHEN "100110110" => def_q_mem <= "00111000";
WHEN "100110111" => def_q_mem <= "01000101";
WHEN "100111000" => def_q_mem <= "00011011";
WHEN "100111001" => def_q_mem <= "00011101";
WHEN "100111010" => def_q_mem <= "00100011";
WHEN "100111011" => def_q_mem <= "00100110";
WHEN "100111100" => def_q_mem <= "00101110";
WHEN "100111101" => def_q_mem <= "00111000";
WHEN "100111110" => def_q_mem <= "01000101";
WHEN "100111111" => def_q_mem <= "01010011";
WHEN "11-------" => def_q_mem <= "00010000";
WHEN OTHERS => def_q_mem <= "00000000";
END CASE;
END IF;
END PROCESS;
--***************************************************************************
-- q_value_select uses q_value_new_out,def_q_mem and load_intra and load_non_intra
-- q_value_select uses q_value_new_out,def_q_mem and load_intra and load_non_intra
-- signals. q_value_new_out has 2 clk stages,def_q_mem has 2 clk stages, load_intra_reg2
-- and load_non_intra_reg2 has 2 clk stages
-- register def_q_mem . This is done to match the pipeline stage with that of
-- register def_q_mem . This is done to match the pipeline stage with that of
-- qscale code and the user defined Q matrix which has 3 pipe stages before the
-- first multiplier : pipe2
PROCESS (CLK, RST)
BEGIN
IF (RST = '1') THEN
def_q_mem_reg1 <= "00000000";
def_q_mem_reg2 <= "00000000";
def_q_mem_reg3 <= "00000000";
ELSIF (CLK'EVENT AND CLK = '1') THEN
def_q_mem_reg1 <= def_q_mem;
def_q_mem_reg2 <= def_q_mem_reg1;
def_q_mem_reg3 <= def_q_mem_reg2;
END IF;
END PROCESS;
--***************************************************************************
-- Two 64x8 memories to store the user defined intra and non-intra Qmatrix
-- (q_value_new). A 68x12 memory is used to store the input dct values
-- read in new intra Q value: pipe2
P_ram1: PROCESS (RST,CLK)
BEGIN
IF (RST = '1') THEN
q_value_new_intra(64 DOWNTO 1) <= (OTHERS => "00000000");
ELSIF (CLK'EVENT AND CLK = '1') THEN
IF (rdy_in = '1' AND load_intra_qmatrix = '1') THEN
q_value_new_intra(CONV_INTEGER (cnt64)) <= q_value;
END IF;
END IF;
END PROCESS P_ram1;
-- read in new non intra Q values:pipe2
P_ram2: PROCESS (RST,CLK)
BEGIN
IF (RST = '1') THEN
q_value_new_non_intra(64 DOWNTO 1) <= (OTHERS => "00000000");
ELSIF (CLK'EVENT AND CLK = '1') THEN
IF (rdy_in = '1' AND load_non_intra_qmatrix = '1') THEN
q_value_new_non_intra(CONV_INTEGER (cnt64)) <= q_value;
END IF;
END IF;
END PROCESS P_ram2;
P_ramout: PROCESS (RST,CLK)
BEGIN
IF (RST = '1') THEN
q_value_new_out <= (OTHERS => '0');
ELSIF (CLK'EVENT AND CLK = '1') THEN
IF (rdy_in = '1' AND macroblock_type_reg1 = '0') THEN
q_value_new_out <= q_value_new_intra(CONV_INTEGER (cnt64c));
ELSIF (rdy_in = '1' AND macroblock_type_reg1 = '1') THEN
q_value_new_out <= q_value_new_non_intra(CONV_INTEGER (cnt64c));
ELSE
q_value_new_out <= "00000000";
END IF;
END IF;
END PROCESS P_ramout;
PROCESS (CLK, RST)
BEGIN
IF (RST = '1') THEN
q_value_new_out_reg1 <= "00000000";
ELSIF (CLK'EVENT AND CLK = '1') THEN
q_value_new_out_reg1 <= q_value_new_out;
END IF;
END PROCESS;
temp5 <= def_q_mem WHEN (load_intra_qmatrix_reg2 = '0' AND
load_non_intra_qmatrix_reg2 = '0') ELSE q_value_new_out;
-- END MEMORY SECTION
--***************************************************************************
-- q_value_new_out has 3 pipe stages. def_q_mem and q_value_new_out has 2 pipe
-- q_value_new_out has 3 pipe stages. def_q_mem and q_value_new_out has 2 pipe
-- stages each
PROCESS (CLK, RST)
BEGIN
IF (RST = '1') THEN
q_value_select <= "000000000";
ELSIF (CLK'EVENT AND CLK = '1') THEN
q_value_select <= "0" & temp5;
END IF;
END PROCESS;
--***************************************************************************
-- store 1/Qmatrix coefficient values . All the possible 256 values are inverted
-- store 1/Qmatrix coefficient values . All the possible 256 values are inverted
-- and stored in q_value_mem. Q_value_select is the output of the mux that chooses
-- between default matrix and user defined matrix.
-- q value select has 3 pipe stages. So memoryQ has 4 pipe stages.
PROCESS (CLK, RST)
BEGIN
IF (RST = '1') THEN
memoryQ <= "00000000000";
ELSIF (CLK'EVENT AND CLK = '1') THEN
CASE q_value_select IS
WHEN "000000001" => memoryQ <= "10000000000";
WHEN "000000010" => memoryQ <= "01000000000";
WHEN "000000011" => memoryQ <= "00101010101";
WHEN "000000100" => memoryQ <= "00100000000";
WHEN "000000101" => memoryQ <= "00011001100";
WHEN "000000110" => memoryQ <= "00010101010";
WHEN "000000111" => memoryQ <= "00010010010";
WHEN "000001000" => memoryQ <= "00010000000";
WHEN "000001001" => memoryQ <= "00001110001";
WHEN "000001010" => memoryQ <= "00001100110";
WHEN "000001011" => memoryQ <= "00001011101";
WHEN "000001100" => memoryQ <= "00001010101";
WHEN "000001101" => memoryQ <= "00001001110";
WHEN "000001110" => memoryQ <= "00001001001";
WHEN "000001111" => memoryQ <= "00001000100";
WHEN "000010000" => memoryQ <= "00001000000";
WHEN "000010001" => memoryQ <= "00000111100";
WHEN "000010010" => memoryQ <= "00000111000";
WHEN "000010011" => memoryQ <= "00000110101";
WHEN "000010100" => memoryQ <= "00000110011";
WHEN "000010101" => memoryQ <= "00000110000";
WHEN "000010110" => memoryQ <= "00000101110";
WHEN "000010111" => memoryQ <= "00000101100";
WHEN "000011000" => memoryQ <= "00000101010";
WHEN "000011001" => memoryQ <= "00000101000";
WHEN "000011010" => memoryQ <= "00000100111";
WHEN "000011011" => memoryQ <= "00000100101";
WHEN "000011100" => memoryQ <= "00000100100";
WHEN "000011101" => memoryQ <= "00000100011";
WHEN "000011110" => memoryQ <= "00000100010";
WHEN "000011111" => memoryQ <= "00000100001";
WHEN "000100000" => memoryQ <= "00000100000";
------------------------------------------------------------------------------
WHEN "000100001" => memoryQ <= "00000011111";
WHEN "000100010" => memoryQ <= "00000011110";
WHEN "000100011" => memoryQ <= "00000011101";
WHEN "000100100" => memoryQ <= "00000011100";
WHEN "000100101" => memoryQ <= "00000011011";
WHEN "000100110" => memoryQ <= "00000011010";
WHEN "000100111" => memoryQ <= "00000011010";
WHEN "000101000" => memoryQ <= "00000011001";
WHEN "000101001" => memoryQ <= "00000011001";
WHEN "000101010" => memoryQ <= "00000011000";
WHEN "000101011" => memoryQ <= "00000010111";
WHEN "000101100" => memoryQ <= "00000010111";
WHEN "000101101" => memoryQ <= "00000010110";
WHEN "000101110" => memoryQ <= "00000010110";
WHEN "000101111" => memoryQ <= "00000010101";
WHEN "000110000" => memoryQ <= "00000010101";
WHEN "000110001" => memoryQ <= "00000010100";
WHEN "000110010" => memoryQ <= "00000010100";
WHEN "000110011" => memoryQ <= "00000010100";
WHEN "000110100" => memoryQ <= "00000010011";
WHEN "000110101" => memoryQ <= "00000010011";
WHEN "000110110" => memoryQ <= "00000010010";
WHEN "000110111" => memoryQ <= "00000010010";
WHEN "000111000" => memoryQ <= "00000010010";
WHEN "000111001" => memoryQ <= "00000010001";
WHEN "000111010" => memoryQ <= "00000010001";
WHEN "000111011" => memoryQ <= "00000010001";
WHEN "000111100" => memoryQ <= "00000010001";
WHEN "000111101" => memoryQ <= "00000010000";
WHEN "000111110" => memoryQ <= "00000010000";
WHEN "000111111" => memoryQ <= "00000010000";
WHEN "001000000" => memoryQ <= "00000010000";
------------------------------------------------------------------------------
WHEN "001000001" => memoryQ <= "00000001111";
WHEN "001000010" => memoryQ <= "00000001111";
WHEN "001000011" => memoryQ <= "00000001111";
WHEN "001000100" => memoryQ <= "00000001111";
WHEN "001000101" => memoryQ <= "00000001110";
WHEN "001000110" => memoryQ <= "00000001110";
WHEN "001000111" => memoryQ <= "00000001110";
WHEN "001001000" => memoryQ <= "00000001110";
WHEN "001001001" => memoryQ <= "00000001110";
WHEN "001001010" => memoryQ <= "00000001101";
WHEN "001001011" => memoryQ <= "00000001101";
WHEN "001001100" => memoryQ <= "00000001101";
WHEN "001001101" => memoryQ <= "00000001101";
WHEN "001001110" => memoryQ <= "00000001101";
WHEN "001001111" => memoryQ <= "00000001100";
WHEN "001010000" => memoryQ <= "00000001100";
WHEN "001010001" => memoryQ <= "00000001100";
WHEN "001010010" => memoryQ <= "00000001100";
WHEN "001010011" => memoryQ <= "00000001100";
WHEN "001010100" => memoryQ <= "00000001100";
WHEN "001010101" => memoryQ <= "00000001100";
WHEN "001010110" => memoryQ <= "00000001011";
------------------------------------------------------------------------------
WHEN "001010111" => memoryQ <= "00000001011";
WHEN "001011000" => memoryQ <= "00000001011";
WHEN "001011001" => memoryQ <= "00000001011";
WHEN "001011010" => memoryQ <= "00000001011";
WHEN "001011011" => memoryQ <= "00000001011";
WHEN "001011100" => memoryQ <= "00000001011";
WHEN "001011101" => memoryQ <= "00000001011";
WHEN "001011110" => memoryQ <= "00000001010";
WHEN "001011111" => memoryQ <= "00000001010";
WHEN "001100000" => memoryQ <= "00000001010";
WHEN "001100001" => memoryQ <= "00000001010";
WHEN "001100010" => memoryQ <= "00000001010";
WHEN "001100011" => memoryQ <= "00000001010";
WHEN "001100100" => memoryQ <= "00000001010";
WHEN "001100101" => memoryQ <= "00000001010";
WHEN "001100110" => memoryQ <= "00000001010";
------------------------------------------------------------------------------
WHEN "001100111" => memoryQ <= "00000001001";
WHEN "001101000" => memoryQ <= "00000001001";
WHEN "001101001" => memoryQ <= "00000001001";
WHEN "001101010" => memoryQ <= "00000001001";
WHEN "001101011" => memoryQ <= "00000001001";
WHEN "001101100" => memoryQ <= "00000001001";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -