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

📄 huffman_en.v

📁 用于FPGA的huffman算法的HDL编码
💻 V
📖 第 1 页 / 共 3 页
字号:
/**********************************************************************/ 
//scale factor --- how many bits ?
`timescale 1ns/1ps

module huffman_en   (CLK, RST, rdy_in, rl_in, dc_in, scan_type, luma,
                   huffman_out, eob, rdy_out);

output [15:0] huffman_out;     
output rdy_out;
input CLK, RST, eob;
input [11:0] dc_in;
input rdy_in,  luma;               
input scan_type;           /* used to choose b/n intra(0) & non-intra(1) 
                                   blocks */
input[17:0] rl_in;   /* run[5:0] + value[11:0] */
/* signals */

reg[6:0] cntr64;   
reg  rdy_out,cl_sum_rdy;
reg[3:0] size/* synthesis syn_romstyle = "select_rom" */;
reg[5:0] cl_sum, cl_sum_prev;
reg[15:0] huffman_out;
reg[3:0] codelength_dc  /* synthesis syn_romstyle = "block_rom" */; 
reg[4:0] codelength_ac,codelength1,codelength2;  
reg[4:0] codelength_ac1;
reg[9:0] vlcode_dc  /* synthesis syn_romstyle = "block_rom" */;
reg[17:0] vlcode1, vlcode2,vlcode3,vlcode4;
reg[17:0] vlcode_ac1,vlcode_ac;
reg[38:0] cl_sum_shift;
reg full_flag1,half_flag1,half_flag2,full_flag2,half_flag3,full_flag3;
reg full_flag4,half_flag4,full_flag5,full_flag6,half_flag5;
reg[38:0] mult_out;
reg[16:1] upper_reg1,middle_reg1,lower_reg1;
reg[16:1] upper_reg2, middle_reg2, middle_reg3;
/*****************************************************************************/

/* Find the size for the "Differential_DC" value. The differential_dc_size gives the number of 
bits to be used to denote the DC_difference value. ram_dc_diff . Table 1 in document*/

always @ (posedge CLK)
    begin
	   casex (dc_in) 
         12'b111111111111 :  size = 4'd1;    
         12'b11111111110x :   size = 4'd2;     
         12'b1111111110xx :   size = 4'd3;     
         12'b111111110xxx :   size = 4'd4;     
         12'b11111110xxxx :   size = 4'd5;     
         12'b1111110xxxxx :   size = 4'd6;     
         12'b111110xxxxxx :   size = 4'd7;     
         12'b11110xxxxxxx :   size = 4'd8;     
         12'b1110xxxxxxxx :   size = 4'd9;     
         12'b110xxxxxxxxx :   size = 4'd10;     
         12'b10xxxxxxxxxx :   size = 4'd11;     
         12'b000000000000 :   size = 4'd0;     
         12'b000000000001 :   size = 4'd1;     
         12'b00000000001x :   size = 4'd2;     
         12'b0000000001xx :   size = 4'd3;     
         12'b000000001xxx :   size = 4'd4;     
         12'b00000001xxxx :   size = 4'd5;     
         12'b0000001xxxxx :   size = 4'd6;     
         12'b000001xxxxxx :   size = 4'd7;     
         12'b00001xxxxxxx :   size = 4'd8;     
         12'b0001xxxxxxxx :   size = 4'd9;     
         12'b001xxxxxxxxx :   size = 4'd10;   
         12'b01xxxxxxxxxx :  size = 4'd11; 
		 default: size = 4'd0;
         endcase
     end

/*****************************************************************************/
/* variable length code and the corresponding code length for DC_Differential */
/* After finding the size of the DC_Differential, the variable length code used to denote it is found. 
For example, if the size is 10, 10 bits are used to denote the dc_differential value and a variable 
length code prefix of "111111110" is used along with the 10 bit value. */

/* luma = 1'b1 denotes a luminance block and lume = 1'b0 denotes a chrominance block */

always @ (posedge CLK)
   begin
   if (RST)
       begin
       vlcode_dc <= 10'b0; codelength_dc <= 4'd0;  
       end
  else if (cntr64 == 1'b1)
    begin
    case (luma)
     1'b1: begin
	   case (size) //ram_dc_size1
       4'd0 : begin vlcode_dc <= 10'b0000000100; codelength_dc <= 4'd3; end   
       4'd1 : begin vlcode_dc <= 10'b0000000000; codelength_dc <= 4'd2; end   
       4'd2 : begin vlcode_dc <= 10'b0000000001; codelength_dc <= 4'd2; end   
       4'd3 : begin vlcode_dc <= 10'b0000000101; codelength_dc <= 4'd3; end   
       4'd4 : begin vlcode_dc <= 10'b0000000110; codelength_dc <= 4'd3; end   
       4'd5 : begin vlcode_dc <= 10'b0000001110; codelength_dc <= 4'd4; end   
       4'd6 : begin vlcode_dc <= 10'b0000011110; codelength_dc <= 4'd5; end   
       4'd7 : begin vlcode_dc <= 10'b0000111110; codelength_dc <= 4'd6; end   
       4'd8 : begin vlcode_dc <= 10'b0001111110; codelength_dc <= 4'd7; end   
       4'd9 : begin vlcode_dc <= 10'b0011111110; codelength_dc <= 4'd8; end   
       4'd10 : begin vlcode_dc <= 10'b0111111110; codelength_dc <= 4'd9; end   
       4'd11 : begin vlcode_dc <= 10'b0111111111; codelength_dc <= 4'd9; end 
  	   default: begin vlcode_dc <= 10'b0; codelength_dc <= 4'd0; end
       endcase
       end
	 //always @(size)
     1'b0: begin
	   case (size) //ram_dc_size2
       4'd0 : begin vlcode_dc <= 10'b0000000000; codelength_dc <= 4'd2; end   
       4'd1 : begin vlcode_dc <= 10'b0000000001; codelength_dc <= 4'd2; end   
       4'd2 : begin vlcode_dc <= 10'b0000000010; codelength_dc <= 4'd2; end   
       4'd3 : begin vlcode_dc <= 10'b0000000110; codelength_dc <= 4'd3; end   
       4'd4 : begin vlcode_dc <= 10'b0000001110; codelength_dc <= 4'd4; end   
       4'd5 : begin vlcode_dc <= 10'b0000011110; codelength_dc <= 4'd5; end   
       4'd6 : begin vlcode_dc <= 10'b0000111110; codelength_dc <= 4'd6; end   
       4'd7 : begin vlcode_dc <= 10'b0001111110; codelength_dc <= 4'd7; end   
       4'd8 : begin vlcode_dc <= 10'b0011111110; codelength_dc <= 4'd8; end   
       4'd9 : begin vlcode_dc <= 10'b0111111110; codelength_dc <= 4'd9; end   
       4'd10 : begin vlcode_dc <= 10'b1111111110; codelength_dc <= 4'd10; end   
       4'd11 : begin vlcode_dc <= 10'b1111111111; codelength_dc <= 4'd10; end   
       default: begin vlcode_dc <= 10'b0; codelength_dc <= 4'd0; end

       endcase
       end 
	 endcase
     end
end

/*****************************************************************************/
/* variable length code and corresponding code length for AC coefficients.
   Table zero is used for intra blocks anf table one is used for non-intra     
   blocks.  For a run/level pair not defined in table zero or one, an escape
   code followed by a 6 bit run symbol and 12 bit level is used.*/
//assign run_level_pair <= {run_in,level_in};

/*always @ (posedge CLK)
begin
  if (RST)
     begin vlcode_ac1 <= {18'b0}; codelength_ac1 <= 5'd0; end
  else
begin if (rdy_in == 1'b1)
begin
case(rl_in) 
		18'b000000000000000001: 
		   begin  vlcode_ac1 <= {17'b00000000000001010,rl_in[11]}; codelength_ac1 <= 5'd5; end
		18'b000000000000000101: 
		   begin  vlcode_ac1 <= {17'b00000000000000111,rl_in[11]}; codelength_ac1 <= 5'd4; end
		18'b000000000000001010: 
		   begin  vlcode_ac1 <= {17'b00000000000001110,rl_in[11]}; codelength_ac1 <= 5'd5; end
		18'b000001000000000101: 
		   begin  vlcode_ac1 <= {18'b111100001111001101}; codelength_ac1 <= 5'd18; end
		18'b000011000000000111: 
		   begin  vlcode_ac1 <= {17'b00000000000010111,rl_in[11]}; codelength_ac1 <= 5'd6; end
	  18'b000111000000001001: 
		   begin  vlcode_ac1 <= {17'b00000000000000000,rl_in[11]}; codelength_ac1 <= 5'd5; end
	  18'b010000000000010000: 
		   begin  vlcode_ac1 <= {17'b10000000000010110,rl_in[11]}; codelength_ac1 <= 5'd7; end
	  18'b010101000000001001: 
		   begin  vlcode_ac1 <= {17'b00000000000010110,rl_in[11]}; codelength_ac1 <= 5'd7; end
    default: 
		   begin  vlcode_ac1 <= {18'b111111111111111111}; codelength_ac1 <= 5'd18; end
endcase
end
end
end*/

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

always @ (posedge CLK)
  if (RST)
     begin vlcode_ac1 <= {18'b0}; codelength_ac1 <= 5'd0; end
  else
begin
	 if (eob == 1'b1 && scan_type == 1'b1)
		begin  vlcode_ac1 <= 000000000000000010; codelength_ac1 <= 5'd2; end // NOTE 2
	 else if (eob == 1'b1 && scan_type == 1'b0)
		begin  vlcode_ac1 <= 000000000000000110; codelength_ac1 <= 5'd4; end // NOTE 2
   else if (cntr64 == 7'b0000001 && ({rl_in[17:12],rl_in[10:0]}) == 17'b00000000000000001) 
     begin vlcode_ac1 <= {17'b00000000000000001,rl_in[11]}; 
           codelength_ac1 <= 5'd2; end // note3, DC coeff 
   else 
    begin

	/******************** scan type = x, run = x, level = 1 ********/

    casex ({scan_type,rl_in[17:12],rl_in[10:0]})//(check)

    {1'bx,6'bx,11'b00000000001}: // level = 1
	    begin
        case({rl_in[17:12]}) //run
		6'b010001: //17
		   begin  vlcode_ac1 <= {17'b00000000000011111,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b010010: //18
		   begin  vlcode_ac1 <= {17'b00000000000011010,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b010011: //19
		   begin  vlcode_ac1 <= {17'b00000000000011001,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b010100: //20
		   begin  vlcode_ac1 <= {17'b00000000000010111,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b010101: //21
		   begin  vlcode_ac1 <= {17'b00000000000010110,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b010110: //22
		   begin  vlcode_ac1 <= {17'b00000000000011111,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b010111: //23
		   begin  vlcode_ac1 <= {17'b00000000000011110,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b011000: //24
		   begin  vlcode_ac1 <= {17'b00000000000011101,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b011001: //25
		   begin  vlcode_ac1 <= {17'b00000000000011100,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b011010: //26
		   begin  vlcode_ac1 <= {17'b00000000000011011,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b011011: //27
		   begin  vlcode_ac1 <= {17'b00000000000011111,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b011100: //28
		   begin  vlcode_ac1 <= {17'b00000000000011110,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b011101: //29
		   begin  vlcode_ac1 <= {17'b00000000000011101,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b011110: //30
		   begin  vlcode_ac1 <= {17'b00000000000011100,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b011111: //31
		   begin  vlcode_ac1 <= {17'b00000000000011011,rl_in[11]}; codelength_ac1 <= 5'd17; end
        endcase
		end
/******************** scan type = x, run = x, level = 2 ********/
    {1'bx,6'bx,11'b00000000010}: //level = 2
	    begin
        case({rl_in[17:12]}) //(run)
		6'b000110: //6
		   begin  vlcode_ac1 <= {17'b00000000000011110,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b000111: //7
		   begin  vlcode_ac1 <= {17'b00000000000010101,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b001000: //8
		   begin  vlcode_ac1 <= {17'b00000000000010001,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b001001: //9
		   begin  vlcode_ac1 <= {17'b00000000000010001,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b001010: //10
		   begin  vlcode_ac1 <= {17'b00000000000010000,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b001011: //11
		   begin  vlcode_ac1 <= {17'b00000000000011010,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b001100: //12
		   begin  vlcode_ac1 <= {17'b00000000000011001,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b001101: //13
		   begin  vlcode_ac1 <= {17'b00000000000011000,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b001110: //14
		   begin  vlcode_ac1 <= {17'b00000000000010111,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b001111: //15
		   begin  vlcode_ac1 <= {17'b00000000000010110,rl_in[11]}; codelength_ac1 <= 5'd17; end
		6'b010000: //16
		   begin  vlcode_ac1 <= {17'b00000000000010101,rl_in[11]}; codelength_ac1 <= 5'd17; end
        endcase
		end		
	/******************** scan type = x, run = x, level = 3 ********/
    {1'bx,6'bx,11'b00000000011}: //level = 3
	    begin
        case ({rl_in[17:12]}) //(run)
		6'b000011: //3
		   begin  vlcode_ac1 <= {17'b00000000000011100,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b000100: //4
		   begin  vlcode_ac1 <= {17'b00000000000010010,rl_in[11]}; codelength_ac1 <= 5'd13; end
		6'b000101: //5
		   begin  vlcode_ac1 <= {17'b00000000000010010,rl_in[11]}; codelength_ac1 <= 5'd14; end
		6'b000110: //6
		   begin  vlcode_ac1 <= {17'b00000000000010100,rl_in[11]}; codelength_ac1 <= 5'd17; end
        endcase
		end
	/******************** scan type = x, run = 0, level = x ********/
    {1'bx,6'b000000,11'bx}: //run = 0
	    begin
        case ({1'b0,rl_in[10:0]}) //(level)
		12'b000000010000: //16
		   begin  vlcode_ac1 <= {17'b00000000000011111,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000010001: //17
		   begin  vlcode_ac1 <= {17'b00000000000011110,rl_in[11]}; codelength_ac1 <= 5'd15; end		
		12'b000000010010: //18
		   begin  vlcode_ac1 <= {17'b00000000000011101,rl_in[11]}; codelength_ac1 <= 5'd15; end		
		12'b000000010011: //19
		   begin  vlcode_ac1 <= {17'b00000000000011100,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000010100: //20
		   begin  vlcode_ac1 <= {17'b00000000000011011,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000010101: //21
		   begin  vlcode_ac1 <= {17'b00000000000011010,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000010110: //22
		   begin  vlcode_ac1 <= {17'b00000000000011001,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000010111: //23
		   begin  vlcode_ac1 <= {17'b00000000000011000,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000011000: //24
		   begin  vlcode_ac1 <= {17'b00000000000010111,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000011001: //25
		   begin  vlcode_ac1 <= {17'b00000000000010110,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000011010: //26
		   begin  vlcode_ac1 <= {17'b00000000000010101,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000011011: //27
		   begin  vlcode_ac1 <= {17'b00000000000010100,rl_in[11]}; codelength_ac1 <= 5'd15; end		
		12'b000000011100: //28
		   begin  vlcode_ac1 <= {17'b00000000000010011,rl_in[11]}; codelength_ac1 <= 5'd15; end		
		12'b000000011101: //29
		   begin  vlcode_ac1 <= {17'b00000000000010010,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000011110: //30
		   begin  vlcode_ac1 <= {17'b00000000000010001,rl_in[11]}; codelength_ac1 <= 5'd15; end
		12'b000000011111: //31
		   begin  vlcode_ac1 <= {17'b00000000000010000,rl_in[11]}; codelength_ac1 <= 5'd15; end

⌨️ 快捷键说明

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