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

📄 quant.v

📁 用于FPGA的量化算法的HDL编码
💻 V
📖 第 1 页 / 共 4 页
字号:
       macroblock_type_pipe6 <= 1'b0;macroblock_type_pipe7 <= 1'b0;
       macroblock_type_pipe8 <= 1'b0;
       end
     else 
       begin
       macroblock_type_pipe2 <= macroblock_type_reg1;
       macroblock_type_pipe3 <= macroblock_type_pipe2;
       macroblock_type_pipe4 <= macroblock_type_pipe3;
       macroblock_type_pipe5 <= macroblock_type_pipe4;
       macroblock_type_pipe6 <= macroblock_type_pipe5;
       macroblock_type_pipe7 <= macroblock_type_pipe6;
       macroblock_type_pipe8 <= macroblock_type_pipe7;
       end
   end

/*****************************************************************************/

/* read in dct values: pipe1 */
always @ (posedge CLK or posedge RST)
   begin
   if (RST)
       begin
       dct_in_pipe1 <= 12'b0; 
       end
   else if (rdy_in == 1'b1)
       begin
       dct_in_pipe1 <= dct_in;
       end
   end
/* register dct_out_reg . This is done to match the pipeline stage with that of 
   prod1 which has 4 pipe stages at the output of first multiplier . the 11th  
   bit is registered once more to match the pipe stage in the calculation of  
   prod2_sign */

always @ (posedge CLK or posedge RST)
   begin
   if (RST)
       begin
       dct_in_pipe2 <= 11'b0; dct_in_pipe2_sign <= 1'b0;
       dct_in_pipe3 <= 11'b0; dct_in_pipe3_sign <= 1'b0;
       dct_in_pipe4 <= 11'b0; dct_in_pipe4_sign <= 1'b0;
       dct_in_pipe5 <= 11'b0; dct_in_pipe5_sign <= 1'b0;
       dct_in_pipe6 <= 11'b0; dct_in_pipe6_sign <= 1'b0;
       dct_in_pipe7 <= 11'b0; dct_in_pipe7_sign <= 1'b0;
       dct_in_pipe8_sign <= 1'b0; dct_in_pipe9_sign <= 1'b0;
       end
   else 
       begin
       dct_in_pipe2 <= dct_in_pipe1[11] ? (-dct_in_pipe1[10:0]) : dct_in_pipe1[10:0];
       dct_in_pipe2_sign <= dct_in_pipe1[11];
       dct_in_pipe3 <= dct_in_pipe2;
       dct_in_pipe3_sign <= dct_in_pipe2_sign;
       dct_in_pipe4 <= dct_in_pipe3;
       dct_in_pipe4_sign <= dct_in_pipe3_sign;
       dct_in_pipe5 <= dct_in_pipe4;
       dct_in_pipe5_sign <= dct_in_pipe4_sign;
       dct_in_pipe6 <= dct_in_pipe5;
       dct_in_pipe6_sign <= dct_in_pipe5_sign;
       dct_in_pipe7 <= dct_in_pipe6;
       dct_in_pipe7_sign <= dct_in_pipe6_sign;
       dct_in_pipe8_sign <= dct_in_pipe7_sign;
       dct_in_pipe9_sign <= dct_in_pipe8_sign;
       end
   end
/*****************************************************************************/

/* store 32/(2*quant_scale_code) in q_scale_mem1 and q_scale_mem2. Q_scale_type is 
used to choose between the 2 memories. q_scale_mem output active after 3 clks
2clk pipe stages for the qscale_mem_sel signal, 1 more clk for the q_scale_mem
output signal */

assign qscale_mem_sel = {cnt_start,quant_scale_type_reg2,quant_scale_code_reg2};

always @ (posedge CLK)
  // begin
  // if (RST)
  //     begin
  //     q_scale_mem <= 13'b0; 
  //     end
   //else if (cnt_start == 1'b1 && quant_scale_type_reg1 == 1'b0) 
       begin
	   case (qscale_mem_sel)
        7'b1000001 : begin q_scale_mem <= 13'b100000000000; end /* 2; 8      */    
        7'b1000010 : begin q_scale_mem <= 13'b010000000000; end /* 4; 4      */
        7'b1000011 : begin q_scale_mem <= 13'b001010101010; end /* 6; 2.667  */   
        7'b1000100 : begin q_scale_mem <= 13'b001000000000; end /* 8; 2      */
        7'b1000101 : begin q_scale_mem <= 13'b000110011001; end /* 10; 1.6   */ 
        7'b1000110 : begin q_scale_mem <= 13'b000101010111; end /* 12; 1.334 */
        7'b1000111 : begin q_scale_mem <= 13'b000100100011; end /* 14; 1.142 */
        7'b1001000 : begin q_scale_mem <= 13'b000100000000; end /* 16; 1     */
        7'b1001001 : begin q_scale_mem <= 13'b000011100011; end /* 18; 0.889 */ 
        7'b1001010 : begin q_scale_mem <= 13'b000011001100; end /* 20; 0.8   */
        7'b1001011 : begin q_scale_mem <= 13'b000010111010; end /* 22; 0.727 */
        7'b1001100 : begin q_scale_mem <= 13'b000010101010; end /* 24; 0.667 */
        7'b1001101 : begin q_scale_mem <= 13'b000010011101; end /* 26; 0.615 */
        7'b1001110 : begin q_scale_mem <= 13'b000010010010; end /* 28; 0.571 */
        7'b1001111 : begin q_scale_mem <= 13'b000010001000; end /* 30; 0.534 */
        7'b1010000 : begin q_scale_mem <= 13'b000010000000; end /* 32; 0.5   */
        7'b1010001 : begin q_scale_mem <= 13'b000001111000; end /* 34; 0.470 */
        7'b1010010 : begin q_scale_mem <= 13'b000001110001; end /* 36; 0.445 */
        7'b1010011 : begin q_scale_mem <= 13'b000001101011; end /* 38; 0.421 */
        7'b1010100 : begin q_scale_mem <= 13'b000001100110; end /* 40; 0.4   */
        7'b1010101 : begin q_scale_mem <= 13'b000001100001; end /* 42; 0.380 */
        7'b1010110 : begin q_scale_mem <= 13'b000001011101; end /* 44; 0.364 */
        7'b1010111 : begin q_scale_mem <= 13'b000001011001; end /* 46; 0.348 */
        7'b1011000 : begin q_scale_mem <= 13'b000001010101; end /* 48; 0.334 */
        7'b1011001 : begin q_scale_mem <= 13'b000001010001; end /* 50; 0.32  */
        7'b1011010 : begin q_scale_mem <= 13'b000001001110; end /* 52; 0.308 */
        7'b1011011 : begin q_scale_mem <= 13'b000001001011; end /* 54; 0.296 */
        7'b1011100 : begin q_scale_mem <= 13'b000001001001; end /* 56; 0.286 */
        7'b1011101 : begin q_scale_mem <= 13'b000001000110; end /* 58; 0.276 */
        7'b1011110 : begin q_scale_mem <= 13'b000001000100; end /* 60; 0.267 */
        7'b1011111 : begin q_scale_mem <= 13'b000001000010; end /* 62; 0.258 */

        7'b1100001 : begin q_scale_mem <= 13'b1000000000000; end /* 1; 16 */ 
        7'b1100010 : begin q_scale_mem <= 13'b100000000000; end /* 2; 8 */ 
        7'b1100011 : begin q_scale_mem <= 13'b000001010101; end /* 3; 5.334 */ 
        7'b1100100 : begin q_scale_mem <= 13'b010000000000; end /* 4; 4 */ 
        7'b1100101 : begin q_scale_mem <= 13'b000000110011; end /* 5; 3.2 */ 
        7'b1100110 : begin q_scale_mem <= 13'b001010101010; end /* 6; 2.667 */ 
        7'b1100111 : begin q_scale_mem <= 13'b000001001001; end /* 7; 2.286 */ 
        7'b1101000 : begin q_scale_mem <= 13'b001000000000; end /* 8; 2 */ 
        7'b1101001 : begin q_scale_mem <= 13'b000110011001; end /* 10; 1.6 */ 
        7'b1101010 : begin q_scale_mem <= 13'b000101010111; end /* 12; 1.334 */ 
        7'b1101011 : begin q_scale_mem <= 13'b000100100011; end /* 14; 1.143 */ 
        7'b1101100 : begin q_scale_mem <= 13'b000100000000; end /* 16; 1 */ 
        7'b1101101 : begin q_scale_mem <= 13'b000011100011; end /* 18; 0.889 */ 
        7'b1101110 : begin q_scale_mem <= 13'b000011001100; end /* 20; 0.8 */ 
        7'b1101111 : begin q_scale_mem <= 13'b000010111010; end /* 22; 0.727 */ 
        7'b1110000 : begin q_scale_mem <= 13'b000010101010; end /* 24; 0.667 */ 
        7'b1110001 : begin q_scale_mem <= 13'b000010010010; end /* 28; 0.571 */ 
        7'b1110010 : begin q_scale_mem <= 13'b000010000000; end /* 32; 0.5 */ 
        7'b1110011 : begin q_scale_mem <= 13'b000001110001; end /* 36; 0.445 */ 
        7'b1110100 : begin q_scale_mem <= 13'b000001100110; end /* 40; 0.4 */ 
        7'b1110101 : begin q_scale_mem <= 13'b000001011101; end /* 44; 0.364 */ 
        7'b1110110 : begin q_scale_mem <= 13'b000001010101; end /* 48; 0.334 */ 
        7'b1110111 : begin q_scale_mem <= 13'b000001001110; end /* 52; 0.308 */ 
        7'b1111000 : begin q_scale_mem <= 13'b000001001001; end /* 56; 0.286 */ 
        7'b1111001 : begin q_scale_mem <= 13'b000001000000; end /* 64; 0.25 */ 
        7'b1111010 : begin q_scale_mem <= 13'b000000111000; end /* 72; 0.222 */ 
        7'b1111011 : begin q_scale_mem <= 13'b000000110011; end /* 80; 0.2 */ 
        7'b1111100 : begin q_scale_mem <= 13'b000000101110; end /* 88; 0.182 */ 
        7'b1111101 : begin q_scale_mem <= 13'b000000101010; end /* 96; 0.167 */ 
        7'b1111110 : begin q_scale_mem <= 13'b000000100111; end /* 104; 0.154 */ 
        7'b1111111 : begin q_scale_mem <= 13'b000000100100; end /* 112; 0.143 */ 

          default: begin q_scale_mem <= 13'b000000000000; end
        endcase
	 end
//end

/*qscale_reg1 active after 4 clks */

always @ (posedge CLK or posedge RST)
   begin
   if (RST)
       begin
       qscale_reg1 <= 13'b0; 
       end
   else if (rdy_in == 1'b1)
       begin
       qscale_reg1 <= q_scale_mem;
       end
   end


/* qscale_reg2 active after 5 clks */
always @ (posedge CLK or posedge RST)
   begin
     if (RST)
       begin
       qscale_reg2 <= 13'b0; 
       end
     else 
       begin
       qscale_reg2 <= qscale_reg1; 
       end
   end



/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/* Two 64x8 memories to store the default intra and non-intra Qmatrix. 1clk for
the def_qmem_sel signal, 2nd clk for the def_q_mem signal. */

assign def_qmem_sel = {cnt_start,macroblock_type_reg1,cnt64b};

always @ (posedge CLK)
   begin
	   casex (def_qmem_sel) //(cnt64b)
        9'b101000000: begin def_q_mem <= /* 8'b 00001000; end */ 8'd8;  end     
        9'b100000001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd16; end 
        9'b100000010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd19; end     
        9'b100000011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd22; end 
        9'b100000100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd26; end     
        9'b100000101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end 
        9'b100000110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end    
        9'b100000111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd34; end 
        9'b100001000: begin def_q_mem <= /* 8'b 00000000; end */ 8'd16; end    
        9'b100001001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd16; end 
        9'b100001010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd22; end    
        9'b100001011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd24; end 
        9'b100001100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end   
        9'b100001101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end 
        9'b100001110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd34; end    
        9'b100001111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd37; end 
        9'b100010000: begin def_q_mem <= /* 8'b 00000000; end */ 8'd19;  end     
        9'b100010001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd22; end 
        9'b100010010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd26; end     
        9'b100010011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end 
        9'b100010100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end     
        9'b100010101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd34; end 
        9'b100010110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd34; end    
        9'b100010111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd38; end 
        9'b100011000: begin def_q_mem <= /* 8'b 00000000; end */ 8'd22; end    
        9'b100011001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd22; end 
        9'b100011010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd26; end    
        9'b100011011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end 
        9'b100011100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end   
        9'b100011101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd34; end 
        9'b100011110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd37; end    
        9'b100011111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd40; end 
        9'b100100000: begin def_q_mem <= /* 8'b 00000000; end */ 8'd22; end   
        9'b100100001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd26; end 
        9'b100100010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end    
        9'b100100011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end 
        9'b100100100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd32;  end     
        9'b100100101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd35; end 
        9'b100100110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd40; end     
        9'b100100111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd48; end 
        9'b100101000: begin def_q_mem <= /* 8'b 00000000; end */ 8'd26; end     
        9'b100101001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end 
        9'b100101010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end    
        9'b100101011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd32; end 
        9'b100101100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd35; end    
        9'b100101101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd40; end 
        9'b100101110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd48; end    
        9'b100101111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd58; end 
        9'b100110000: begin def_q_mem <= /* 8'b 00000000; end */ 8'd26; end   
        9'b100110001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end 
        9'b100110010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end    
        9'b100110011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd34; end 
        9'b100110100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd38; end   
        9'b100110101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd46; end 
        9'b100110110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd56; end    
        9'b100110111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd69; end 
        9'b100111000: begin def_q_mem <= /* 8'b 00000000; end */ 8'd27; end     
        9'b100111001: begin def_q_mem <= /* 8'b 00000000; end */ 8'd29; end 
        9'b100111010: begin def_q_mem <= /* 8'b 00000000; end */ 8'd35; end     
        9'b100111011: begin def_q_mem <= /* 8'b 00000000; end */ 8'd38; end 
        9'b100111100: begin def_q_mem <= /* 8'b 00000000; end */ 8'd46; end     
        9'b100111101: begin def_q_mem <= /* 8'b 00000000; end */ 8'd56; end 
        9'b100111110: begin def_q_mem <= /* 8'b 00000000; end */ 8'd69; end    
        9'b100111111: begin def_q_mem <= /* 8'b 00000000; end */ 8'd83; end 
		   9'b11xxxxxxx: begin def_q_mem <= /* 8'b 00000000; end */ 8'd16; end
  	       default: begin def_q_mem <= 8'd0; end
		   endcase
end


/*****************************************************************************/
/* 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*/
/* DELETE */
/* 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*/

always @ (posedge CLK or posedge RST)
   begin
   if (RST)
       begin
       def_q_mem_reg1 <= 7'b0; def_q_mem_reg2 <= 7'b0;
       def_q_mem_reg3 <= 7'b0;
       end
   else 
       begin
       def_q_mem_reg1 <= def_q_mem; 
       def_q_mem_reg2 <= def_q_mem_reg1;

⌨️ 快捷键说明

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