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

📄 rb2_decoder.v

📁 H.264的CABAC的常规码的另一个解码过程
💻 V
字号:
module RB2_decoder(rangeOut, offsetOut, bin_1, used_bins_num, modelValue_out, current_totalUsed_bins, samectxIdx_rLPS,
	               last_pStateIdx, modelValue_in, RB1_used_binNum, range_in, offset_in, readReg,
	               dec_mode, IsNotB0, bin_0);
		output [8:0] 	rangeOut;
		output [8:0] 	offsetOut;		
		output 			bin_1;
		output [3:0] 	used_bins_num;
		output [6:0] 	modelValue_out;
		output [3:0]	current_totalUsed_bins;
		
		reg [8:0]		rangeOut;
		reg [8:0]		offsetOut;
		reg 			bin_1;
		reg [3:0]		used_bins_num;
		reg [6:0]		modelValue_out;
		reg [3:0]		current_totalUsed_bins;
		
		input [31:0]	samectxIdx_rLPS;
		input [5:0]		last_pStateIdx;
		input [6:0]		modelValue_in;
		input [3:0]		RB1_used_binNum;
		input [8:0]		range_in;
		input [8:0]		offset_in;
		input [15:0]  	readReg;
		input [2:0]		dec_mode;
		input 			IsNotB0;  
		input 			bin_0;
		
		wire [2:0]		qCodIRangeIdx;
		reg [8:0] 		rangeNew;   	 
		reg [8:0]		offsetNew;	
		reg [5:0]		pStateIdx;
		reg [7:0] 		FODValue;				//FOD input value (8 bits);
		reg [2:0] 		FODNum;				//FOD output value (3 bits);
		reg [7:0] 		codIRangeLPS;
			
		assign qCodIRangeIdx = range_in[7:6];  
		//assign current_totalUsed_bins = (used_bins_num + RB1_used_binNum);
		
		always @(range_in or offset_in or IsNotB0 or bin_0 or readReg or RB1_used_binNum
				 or samectxIdx_rLPS or last_pStateIdx or modelValue_in or dec_mode or qCodIRangeIdx)
			begin
				if((dec_mode == 3'b000) && IsNotB0 && bin_0)
					begin
						rangeNew = range_in;
						offsetNew = offset_in;
						case(qCodIRangeIdx)
							0:
							begin
								codIRangeLPS = samectxIdx_rLPS[7:0];								
							end										
							
							1:
							begin
								codIRangeLPS = samectxIdx_rLPS[15:8];								
							end	
							
							2:
							begin
								codIRangeLPS = samectxIdx_rLPS[23:16];								
							end	
							
							3:
							begin
								codIRangeLPS = samectxIdx_rLPS[31:24];								
							end								
						endcase
						mainOperation;
						rangeOut = rangeNew;
						offsetOut = offsetNew;
					end	
				 else
				 	begin
					//	rangeOut = rangeOut;
					//	offsetOut = offsetOut;
					//	bin_1 = bin_1;
						used_bins_num = 0;
						current_totalUsed_bins = RB1_used_binNum;
					end
			end	
	
		task mainOperation;
		begin
			rangeNew = rangeNew - codIRangeLPS;
			if(offsetNew < rangeNew)		//valMPS
				begin	
				//	IsValMPS = 1; 	  
					pStateIdx = modelValue_in[5:0];
					if(pStateIdx < 62)
						begin
							pStateIdx = pStateIdx + 1;
							modelValue_out[5:0] = pStateIdx;
						end	
						
					if(!rangeNew[8])		//codIRange < 0x100 need left shift one time
						begin  
							rangeNew = rangeNew << 1;
							offsetNew = offsetNew << 1;
							offsetNew[0] = readReg[RB1_used_binNum]; 
							used_bins_num = 1;		
						end	 
					else
						begin
							used_bins_num = 0;
						end					  
					current_totalUsed_bins = used_bins_num + RB1_used_binNum;	
					bin_1 = modelValue_in[6];
				end							  
			else							//valLPS
				begin									
				//	IsValMPS = 0;
					offsetNew = offsetNew - rangeNew;
					rangeNew = codIRangeLPS;
					pStateIdx = modelValue_in[5:0];
					if(pStateIdx == 0)
						begin
						 	modelValue_out[6] = !modelValue_in[6]; //valMPS = 1 - valMPS
						end		
					pStateIdx = last_pStateIdx;		
					modelValue_out[5:0] = pStateIdx;		//renew pStateIdx;	
					FODValue = rangeNew[7:0];	
					firstOneDetect;
					case(FODNum)		//FODNum = 1--7
						1:	
						begin
							rangeNew = rangeNew << 1;
							offsetNew = offsetNew << 1;	
							offsetNew[0] = readReg[RB1_used_binNum];
						end							   
						
						2:	
						begin
							rangeNew = rangeNew << 2;
							offsetNew = offsetNew << 2;
							//offsetNew[1:0] = readReg[1:0];
							offsetNew[1:0] = {readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
						end							   
						
						3:	
						begin
							rangeNew = rangeNew << 3;
							offsetNew = offsetNew << 3;	
							//offsetNew[2:0] = readReg[2:0];
							offsetNew[2:0] = {readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
						end							   
						
						4:	
						begin
							rangeNew = rangeNew << 4;
							offsetNew = offsetNew << 4;	
							//offsetNew[3:0] = readReg[3:0];
							offsetNew[3:0] = {readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
						end							   
						
						5:	
						begin
							rangeNew = rangeNew << 5;
							offsetNew = offsetNew << 5;	
							//offsetNew[4:0] = readReg[4:0];
							offsetNew[4:0] = {readReg[RB1_used_binNum + 4], readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
						end							   
						
						6:	
						begin
							rangeNew = rangeNew << 6;
							offsetNew = offsetNew << 6;	
							//offsetNew = readReg[5:0];
							offsetNew[5:0] = {readReg[RB1_used_binNum + 5], readReg[RB1_used_binNum + 4], readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
						end							   
						
						7:	
						begin
							rangeNew = rangeNew << 7;
							offsetNew = offsetNew << 7;
							//offsetNew = readReg[6:0];
							offsetNew[5:0] = {readReg[RB1_used_binNum + 6], readReg[RB1_used_binNum + 5], readReg[RB1_used_binNum + 4], readReg[RB1_used_binNum + 3], readReg[RB1_used_binNum + 2], readReg[RB1_used_binNum + 1], readReg[RB1_used_binNum]};
						end							   
						
						default:
						begin
							rangeNew = rangeNew << 1;  		//this should never be reached!
							offsetNew = offsetNew << 1;
							offsetNew = readReg[RB1_used_binNum];
						end							
					endcase	 
					bin_1 = !modelValue_in[6];  //valure of LPS
					used_bins_num = FODNum;
					current_totalUsed_bins = used_bins_num + RB1_used_binNum;
				end	
			end	
		endtask	 
		
		task firstOneDetect;
		reg out1;
		begin
			out1 = |FODValue[7:4];	
			
			if(out1)
			begin
				if(FODValue[7])
					FODNum = 0;
				else if(FODValue[6])
					FODNum = 1;
				else if(FODValue[5])
					FODNum = 2;
				else
					FODNum = 3; 
			end
			else
				begin
					if(FODValue[3])
						FODNum = 0;
					else if(FODValue[2])
						FODNum = 1;
					else if(FODValue[1])
						FODNum = 2;
					else
						FODNum = 3;
						
					FODNum = FODNum + 4;
				end		
		end	
	endtask
			
endmodule	

⌨️ 快捷键说明

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