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

📄 quant_vhd.vhd

📁 IDCT - xlinix design in vhdl
💻 VHD
📖 第 1 页 / 共 4 页
字号:
            WHEN "001101100" => memoryQ <= "00000001001";    
            WHEN "001101101" => memoryQ <= "00000001001";    
            WHEN "001101110" => memoryQ <= "00000001001";    
            WHEN "001101111" => memoryQ <= "00000001001";    
            WHEN "001110000" => memoryQ <= "00000001001";    
            WHEN "001110001" => memoryQ <= "00000001001";    
            WHEN "001110010" => memoryQ <= "00000001001";    
            WHEN "001110011" => memoryQ <= "00000001000";    
            WHEN "001110100" => memoryQ <= "00000001000";    
            WHEN "001110101" => memoryQ <= "00000001000";    
            WHEN "001110110" => memoryQ <= "00000001000";    
            WHEN "001110111" => memoryQ <= "00000001000";    
            WHEN "001111000" => memoryQ <= "00000001000";    
            WHEN "001111001" => memoryQ <= "00000001000";    
            WHEN "001111010" => memoryQ <= "00000001000";    
            WHEN "001111011" => memoryQ <= "00000001000";    
            WHEN "001111100" => memoryQ <= "00000001000";    
            WHEN "001111101" => memoryQ <= "00000001000";    
            WHEN "001111110" => memoryQ <= "00000001000";    
            WHEN "001111111" => memoryQ <= "00000001000";    
            WHEN "010000000" => memoryQ <= "00000001000";    
            ------------------------------------------------------------------------------
            WHEN "010000001" => memoryQ <= "00000000111";    
            WHEN "010000010" => memoryQ <= "00000000111";    
            WHEN "010000011" => memoryQ <= "00000000111";    
            WHEN "010000100" => memoryQ <= "00000000111";    
            WHEN "010000101" => memoryQ <= "00000000111";    
            WHEN "010000110" => memoryQ <= "00000000111";    
            WHEN "010000111" => memoryQ <= "00000000111";    
            WHEN "010001000" => memoryQ <= "00000000111";    
            WHEN "010001001" => memoryQ <= "00000000111";    
            WHEN "010001010" => memoryQ <= "00000000111";    
            WHEN "010001011" => memoryQ <= "00000000111";    
            WHEN "010001100" => memoryQ <= "00000000111";    
            WHEN "010001101" => memoryQ <= "00000000111";    
            WHEN "010001110" => memoryQ <= "00000000111";    
            WHEN "010001111" => memoryQ <= "00000000111";    
            WHEN "010010000" => memoryQ <= "00000000111";    
            WHEN "010010001" => memoryQ <= "00000000111";    
            WHEN "010010010" => memoryQ <= "00000000111";    
            ------------------------------------------------------------------------------
            WHEN "010010011" => memoryQ <= "00000000110";    
            WHEN "010010100" => memoryQ <= "00000000110";    
            WHEN "010010101" => memoryQ <= "00000000110";    
            WHEN "010010110" => memoryQ <= "00000000110";    
            WHEN "010010111" => memoryQ <= "00000000110";    
            WHEN "010011000" => memoryQ <= "00000000110";    
            WHEN "010011001" => memoryQ <= "00000000110";    
            WHEN "010011010" => memoryQ <= "00000000110";    
            WHEN "010011011" => memoryQ <= "00000000110";    
            WHEN "010011100" => memoryQ <= "00000000110";    
            WHEN "010011101" => memoryQ <= "00000000110";    
            WHEN "010011110" => memoryQ <= "00000000110";    
            WHEN "010011111" => memoryQ <= "00000000110";    
            WHEN "010100000" => memoryQ <= "00000000110";    
            WHEN "010100001" => memoryQ <= "00000000110";    
            WHEN "010100010" => memoryQ <= "00000000110";    
            WHEN "010100011" => memoryQ <= "00000000110";    
            WHEN "010100100" => memoryQ <= "00000000110";    
            WHEN "010100101" => memoryQ <= "00000000110";    
            WHEN "010100110" => memoryQ <= "00000000110";    
            WHEN "010100111" => memoryQ <= "00000000110";    
            WHEN "010101000" => memoryQ <= "00000000110";    
            WHEN "010101001" => memoryQ <= "00000000110";    
            WHEN "010101010" => memoryQ <= "00000000110";    
            WHEN "010101011" => memoryQ <= "00000000110";    
            WHEN "010101100" => memoryQ <= "00000000101";    
            ------------------------------------------------------------------------------
            WHEN "010101101" => memoryQ <= "00000000101";    
            WHEN "010101110" => memoryQ <= "00000000101";    
            WHEN "010101111" => memoryQ <= "00000000101";    
            WHEN "010110000" => memoryQ <= "00000000101";    
            WHEN "010110001" => memoryQ <= "00000000101";    
            WHEN "010110010" => memoryQ <= "00000000101";    
            WHEN "010110011" => memoryQ <= "00000000101";    
            WHEN "010110100" => memoryQ <= "00000000101";    
            WHEN "010110101" => memoryQ <= "00000000101";    
            WHEN "010110110" => memoryQ <= "00000000101";    
            WHEN "010110111" => memoryQ <= "00000000101";    
            WHEN "010111000" => memoryQ <= "00000000101";    
            WHEN "010111001" => memoryQ <= "00000000101";    
            WHEN "010111010" => memoryQ <= "00000000101";    
            WHEN "010111011" => memoryQ <= "00000000101";    
            WHEN "010111100" => memoryQ <= "00000000101";    
            WHEN "010111101" => memoryQ <= "00000000101";    
            WHEN "010111110" => memoryQ <= "00000000101";    
            WHEN "010111111" => memoryQ <= "00000000101";    
            WHEN "011000000" => memoryQ <= "00000000101";    
            WHEN "011000001" => memoryQ <= "00000000101";    
            WHEN "011000010" => memoryQ <= "00000000101";    
            WHEN "011000011" => memoryQ <= "00000000101";    
            WHEN "011000100" => memoryQ <= "00000000101";    
            WHEN "011000101" => memoryQ <= "00000000101";    
            WHEN "011000110" => memoryQ <= "00000000101";    
            WHEN "011000111" => memoryQ <= "00000000101";    
            WHEN "011001000" => memoryQ <= "00000000101";    
            WHEN "011001001" => memoryQ <= "00000000101";    
            WHEN "011001010" => memoryQ <= "00000000101";    
            WHEN "011001011" => memoryQ <= "00000000101";    
            WHEN "011001100" => memoryQ <= "00000000101";    
            WHEN "011001101" => memoryQ <= "00000000101";    
            WHEN "011001110" => memoryQ <= "00000000101";    
            ------------------------------------------------------------------------------
            WHEN "011001111" => memoryQ <= "00000000100";    
            WHEN "011010000" => memoryQ <= "00000000100";    
            WHEN "011010001" => memoryQ <= "00000000100";    
            WHEN "011010010" => memoryQ <= "00000000100";    
            WHEN "011010011" => memoryQ <= "00000000100";    
            WHEN "011010100" => memoryQ <= "00000000100";    
            WHEN "011010101" => memoryQ <= "00000000100";    
            WHEN "011010110" => memoryQ <= "00000000100";    
            WHEN "011010111" => memoryQ <= "00000000100";    
            WHEN "011011000" => memoryQ <= "00000000100";    
            WHEN "011011001" => memoryQ <= "00000000100";    
            WHEN "011011010" => memoryQ <= "00000000100";    
            WHEN "011011011" => memoryQ <= "00000000100";    
            WHEN "011011100" => memoryQ <= "00000000100";    
            WHEN "011011101" => memoryQ <= "00000000100";    
            WHEN "011011110" => memoryQ <= "00000000100";    
            WHEN "011011111" => memoryQ <= "00000000100";    
            WHEN "011100000" => memoryQ <= "00000000100";    
            WHEN "011100001" => memoryQ <= "00000000100";    
            WHEN "011100010" => memoryQ <= "00000000100";    
            WHEN "011100011" => memoryQ <= "00000000100";    
            WHEN "011100100" => memoryQ <= "00000000100";    
            WHEN "011100101" => memoryQ <= "00000000100";    
            WHEN "011100110" => memoryQ <= "00000000100";    
            WHEN "011100111" => memoryQ <= "00000000100";    
            WHEN "011101000" => memoryQ <= "00000000100";    
            WHEN "011101001" => memoryQ <= "00000000100";    
            WHEN "011101010" => memoryQ <= "00000000100";    
            WHEN "011101011" => memoryQ <= "00000000100";    
            WHEN "011101100" => memoryQ <= "00000000100";    
            WHEN "011101101" => memoryQ <= "00000000100";    
            WHEN "011101110" => memoryQ <= "00000000100";    
            WHEN "011101111" => memoryQ <= "00000000100";    
            WHEN "011110000" => memoryQ <= "00000000100";    
            WHEN "011110001" => memoryQ <= "00000000100";    
            WHEN "011110010" => memoryQ <= "00000000100";    
            WHEN "011110011" => memoryQ <= "00000000100";    
            WHEN "011110100" => memoryQ <= "00000000100";    
            WHEN "011110101" => memoryQ <= "00000000100";    
            WHEN "011110110" => memoryQ <= "00000000100";    
            WHEN "011110111" => memoryQ <= "00000000100";    
            WHEN "011111000" => memoryQ <= "00000000100";    
            WHEN "011111001" => memoryQ <= "00000000100";    
            WHEN "011111010" => memoryQ <= "00000000100";    
            WHEN "011111011" => memoryQ <= "00000000100";    
            WHEN "011111100" => memoryQ <= "00000000100";    
            WHEN "011111101" => memoryQ <= "00000000100";    
            WHEN "011111110" => memoryQ <= "00000000100";    
            WHEN "011111111" => memoryQ <= "00000000100";    
            WHEN "100000000" => memoryQ <= "00000000100";    
            WHEN OTHERS  => memoryQ <= "00000000000";    
            
         END CASE;
      END IF;
   END PROCESS;

   --***************************************************************************
   -- [(1/Qmatrix)*(16/qscale)] => 11bits(1 + 10 decimal) * 13bits(5.8) = 24bits 
   --  [(1/Qmatrix)*(16/qscale)] => 11bits(1 + 10 decimal) * 13bits(5.8) = 24bits 
   -- (last 18 bits being decimal plus 5 msb). Rounding off is done here and of the 
   -- 24   bits only 17 msbs are used(ie., 6 + 11 decimal). This will also enable the 
   -- use of the multiplier in Virtex2 devices. Inputs to prod1 has 4 pipe stages each. 
   -- Prod1 valid after 5 clk. (4 pipe stages before mult. plus 1 pipe after mult)
   
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         prod1 <= (OTHERS => '0');    
         prod1_reg <= (OTHERS => '0');    
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (rdy_in = '1') THEN
            prod1 <= (memoryQ * qscale_reg1);    
         ELSE
            
         END IF;
      END IF;
   END PROCESS;

   --***************************************************************************
   -- prod1 (17 bits with 6.11 decimal bits) 
   --  prod1 (17 bits with 6.11 decimal bits) 
   --    dct_out_reg (12 bits) = 17 bits. Input data is 12 bits with 1 sign and 11 data
   --    bits, sign extended to 17. So out of these 17 bits, only the 11 lsbs are 
   --    real data, the 6 msbs are sign information.
   --    prod2 = 17bits + 17 bits (6 + 11 decimal) = 34 bits. Of this, 11 lsbs are decimal and
   --    6 msbs are sign extensions. The valid output would be [27:11] = 16 bits
   --    after 6 clks  
   
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         prod2 <= (OTHERS => '0');    
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (rdy_in = '1') THEN
            prod2 <= (dct_in_pipe5 * prod1(23 DOWNTO 7));    -- 27 bits, with 12 decimal 
         ELSE
            
         END IF;
      END IF;
   END PROCESS;
   temp6 <= (prod2(27 DOWNTO 9) - "0000000000000000010") WHEN 
             dct_in_pipe6_sign = '1' ELSE (prod2(27 DOWNTO 9) + 
             "0000000000000000010");

    
   --***************************************************************************
   -- compare sign magnitude of input DCT values. To match the pipeline, 
   --  compare sign magnitude of input DCT values. To match the pipeline, 
   -- dct_out_reg should be registered once more . The section is used to calculate
   -- k/2. k/2 = 0 for '0' dct input, k/2 =  .5 for +ve dct input and k/2 = -.5
   -- for -ve dct input. For intra block, macroblock type = 1'b0 and k = '0'.
   -- Prod2 has 6 pipe stages. Prod2_k occurs at the 7th clk
   
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         prod2_k <= (OTHERS => '0');    
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (rdy_in = '1' AND macroblock_type_pipe6 = '1') THEN
            IF (dct_in_pipe6 = "00000000000") THEN
               prod2_k <= prod2(27 DOWNTO 9);    --  2 decimal places 
            ELSE
               prod2_k <= temp6;    
            END IF;
         ELSE
            IF (rdy_in = '1' AND macroblock_type_pipe6 = '0') THEN
               prod2_k <= prod2(27 DOWNTO 9);    --  2 decimal places 
            END IF;
         END IF;
      END IF;
   END PROCESS;

   temp7 <= (prod2_k(18 DOWNTO 2) + "00000000000000001") WHEN 
             prod2_k(1) = '1' ELSE prod2_k(18 DOWNTO 2);
   prod2_round <= temp7 ;
   temp8 <= ( not(prod2_round(11 DOWNTO 0)) + 1)  WHEN (dct_in_pipe7_sign) = 
            '1' ELSE (prod2_round(11 DOWNTO 0));

   --***************************************************************************
   -- sign correction. prod2_round has 6 clk stages 
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         quant_dct_out <= "000000000000";    
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (rdy_in = '1') THEN
            quant_dct_out <= temp8;    
         END IF;
      END IF;
   END PROCESS;

   --***************************************************************************
   -- Ist valid ouput occurs after 6 clks
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         quant_rdy_out <= '0';    
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (cnt6 = "0111") THEN
              quant_rdy_out <= '1';    
         END IF;
      END IF;
   END PROCESS;

END translated;

⌨️ 快捷键说明

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