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

📄 quant_vhd.vhd

📁 IDCT - xlinix design in vhdl
💻 VHD
📖 第 1 页 / 共 4 页
字号:
         WHEN "100011000" => def_q_mem <= "00010110";    
         WHEN "100011001" => def_q_mem <= "00010110";    
         WHEN "100011010" => def_q_mem <= "00011010";    
         WHEN "100011011" => def_q_mem <= "00011011";    
         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  
   --  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";    

⌨️ 快捷键说明

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