📄 jpeg_hm_decode.v
字号:
HaffumanTable[4] <= HaffumanTable3r[4]; HaffumanNumber[4] <= HaffumanNumber3r[4]; HaffumanTable[5] <= HaffumanTable3r[5]; HaffumanNumber[5] <= HaffumanNumber3r[5]; HaffumanTable[6] <= HaffumanTable3r[6]; HaffumanNumber[6] <= HaffumanNumber3r[6]; HaffumanTable[7] <= HaffumanTable3r[7]; HaffumanNumber[7] <= HaffumanNumber3r[7]; HaffumanTable[8] <= HaffumanTable3r[8]; HaffumanNumber[8] <= HaffumanNumber3r[8]; HaffumanTable[9] <= HaffumanTable3r[9]; HaffumanNumber[9] <= HaffumanNumber3r[9]; HaffumanTable[10] <= HaffumanTable3r[10]; HaffumanNumber[10] <= HaffumanNumber3r[10]; HaffumanTable[11] <= HaffumanTable3r[11]; HaffumanNumber[11] <= HaffumanNumber3r[11]; HaffumanTable[12] <= HaffumanTable3r[12]; HaffumanNumber[12] <= HaffumanNumber3r[12]; HaffumanTable[13] <= HaffumanTable3r[13]; HaffumanNumber[13] <= HaffumanNumber3r[13]; HaffumanTable[14] <= HaffumanTable3r[14]; HaffumanNumber[14] <= HaffumanNumber3r[14]; HaffumanTable[15] <= HaffumanTable3r[15]; HaffumanNumber[15] <= HaffumanNumber3r[15]; end // else: !if(ProcessCount == 0) end // else: !if(ProcessColor[2] == 1'b0) end // case: Phase1 // compare table Phase2: begin Process <= Phase4; if(ProcessData[31:16] >= HaffumanTable[0]) Place[0] <= 1'b1; else Place[0] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[1]) Place[1] <= 1'b1; else Place[1] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[2]) Place[2] <= 1'b1; else Place[2] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[3]) Place[3] <= 1'b1; else Place[3] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[4]) Place[4] <= 1'b1; else Place[4] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[5]) Place[5] <= 1'b1; else Place[5] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[6]) Place[6] <= 1'b1; else Place[6] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[7]) Place[7] <= 1'b1; else Place[7] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[8]) Place[8] <= 1'b1; else Place[8] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[9]) Place[9] <= 1'b1; else Place[9] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[10]) Place[10] <= 1'b1; else Place[10] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[11]) Place[11] <= 1'b1; else Place[11] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[12]) Place[12] <= 1'b1; else Place[12] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[13]) Place[13] <= 1'b1; else Place[13] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[14]) Place[14] <= 1'b1; else Place[14] <= 1'b0; if(ProcessData[31:16] >= HaffumanTable[15]) Place[15] <= 1'b1; else Place[15] <= 1'b0; end // shift code Phase4: begin Process <= Phase6; case (Place) 16'b0000000000000001: begin TableCode <= {15'h0000,HaffumanTable[0][15]}; NumberCode <= HaffumanNumber[0]; CodeNumber <= 4'h0; DataNumber <= {15'h0000,ProcessData[31]}; ProcessData <= {ProcessData[30:0],1'b0}; end 16'b0000000000000011: begin TableCode <= {14'h0000,HaffumanTable[1][15:14]}; NumberCode <= HaffumanNumber[1]; CodeNumber <= 4'h1; DataNumber <= {14'h0000,ProcessData[31:30]}; ProcessData <= {ProcessData[29:0],2'b00}; end 16'b0000000000000111: begin TableCode <= {13'h0000,HaffumanTable[2][15:13]}; NumberCode <= HaffumanNumber[2]; CodeNumber <= 4'h2; DataNumber <= {13'h0000,ProcessData[31:29]}; ProcessData <= {ProcessData[28:0],3'b000}; end 16'b0000000000001111: begin TableCode <= {12'h000,HaffumanTable[3][15:12]}; NumberCode <= HaffumanNumber[3]; CodeNumber <= 4'h3; DataNumber <= {12'h000,ProcessData[31:28]}; ProcessData <= {ProcessData[27:0],4'h0}; end 16'b0000000000011111: begin TableCode <= {11'h000,HaffumanTable[4][15:11]}; NumberCode <= HaffumanNumber[4]; CodeNumber <= 4'h4; DataNumber <= {11'h000,ProcessData[31:27]}; ProcessData <= {ProcessData[26:0],5'h00}; end 16'b0000000000111111: begin TableCode <= {10'h000,HaffumanTable[5][15:10]}; NumberCode <= HaffumanNumber[5]; CodeNumber <= 4'h5; DataNumber <= {10'h000,ProcessData[31:26]}; ProcessData <= {ProcessData[25:0],6'h00}; end 16'b0000000001111111: begin TableCode <= {9'h000,HaffumanTable[6][15:9]}; NumberCode <= HaffumanNumber[6]; CodeNumber <= 4'h6; DataNumber <= {9'h000,ProcessData[31:25]}; ProcessData <= {ProcessData[24:0],7'h00}; end 16'b0000000011111111: begin TableCode <= {8'h00,HaffumanTable[7][15:8]}; NumberCode <= HaffumanNumber[7]; CodeNumber <= 4'h7; DataNumber <= {8'h00,ProcessData[31:24]}; ProcessData <= {ProcessData[23:0],8'h00}; end 16'b0000000111111111: begin TableCode <= {7'h00,HaffumanTable[8][15:7]}; NumberCode <= HaffumanNumber[8]; CodeNumber <= 4'h8; DataNumber <= {7'h00,ProcessData[31:23]}; ProcessData <= {ProcessData[22:0],9'h000}; end 16'b0000001111111111: begin TableCode <= {6'h00,HaffumanTable[9][15:6]}; NumberCode <= HaffumanNumber[9]; CodeNumber <= 4'h9; DataNumber <= {6'h00,ProcessData[31:22]}; ProcessData <= {ProcessData[21:0],10'h000}; end 16'b0000011111111111: begin TableCode <= {5'h00,HaffumanTable[10][15:5]}; NumberCode <= HaffumanNumber[10]; CodeNumber <= 4'hA; DataNumber <= {5'h00,ProcessData[31:21]}; ProcessData <= {ProcessData[20:0],11'h000}; end 16'b0000111111111111: begin TableCode <= {4'h0,HaffumanTable[11][15:4]}; NumberCode <= HaffumanNumber[11]; CodeNumber <= 4'hB; DataNumber <= {4'h0,ProcessData[31:20]}; ProcessData <= {ProcessData[19:0],12'h000}; end 16'b0001111111111111: begin TableCode <= {3'h0,HaffumanTable[12][15:3]}; NumberCode <= HaffumanNumber[12]; CodeNumber <= 4'hC; DataNumber <= {3'h0,ProcessData[31:19]}; ProcessData <= {ProcessData[18:0],13'h0000}; end 16'b0011111111111111: begin TableCode <= {2'h0,HaffumanTable[13][15:2]}; NumberCode <= HaffumanNumber[13]; CodeNumber <= 4'hD; DataNumber <= {2'h0,ProcessData[31:18]}; ProcessData <= {ProcessData[17:0],14'h0000}; end 16'b0111111111111111: begin TableCode <= {1'h0,HaffumanTable[14][15:1]}; NumberCode <= HaffumanNumber[14]; CodeNumber <= 4'hE; DataNumber <= {1'h0,ProcessData[31:17]}; ProcessData <= {ProcessData[16:0],15'h0000}; end 16'b1111111111111111: begin TableCode <= HaffumanTable[15]; NumberCode <= HaffumanNumber[15]; CodeNumber <= 4'hF; DataNumber <= ProcessData[31:16] ; ProcessData <= {ProcessData[15:0],16'h0000}; end endcase // case(Place) end // case: Phase4 Phase5: begin Process <= Phase6; //SubData <= DataNumber - TableCode; //OutDhtNumber <= DataNumber - TableCode + NumberCode; end Phase6: begin if(DataOutIdle == 1'b1) Process <= Phase7; //DhtNumber <= SubData[7:0] + NumberCode; end Phase7: begin Process <= Phase9; OutZero <= DhtZero; UseWidth <= CodeNumber + DhtWidth +1; if(ProcessCount == 0) begin NextProcessCount <= 7'd1; OutEnable <= 1'b1; end else begin if(DhtZero == 4'h0 & DhtWidth == 4'h0) begin ProcessCount <= 7'd64; NextProcessCount <= 7'd64; OutEnable <= 1'b0; end else if(DhtZero == 4'hF & DhtWidth == 4'h0) begin ProcessCount <= ProcessCount + 4'hF; NextProcessCount <= ProcessCount + 4'hF; OutEnable <= 1'b0; end else begin ProcessCount <= ProcessCount + DhtZero; NextProcessCount <= ProcessCount + DhtZero +1; OutEnable <= 1'b1; end end // else: !if(ProcessCount == 0) if(ProcessData[31] == 1'b0 & DhtWidth != 0) begin OutCode <= (OutCodeP | SubCode) + 16'h0001; end else begin OutCode <= OutCodeP; end end // case: Phase7 Phase8: begin Process <= Phase9; end Phase9: begin Process <= Phase11; if(ProcessCount == 0) begin if(ProcessColor[2] == 1'b0) begin OutCode <= OutCode + PreData[0]; PreData[0] <= OutCode + PreData[0]; end else begin if(ProcessColor[0] == 1'b0) begin OutCode <= OutCode + PreData[1]; PreData[1] <= OutCode + PreData[1]; end else begin OutCode <= OutCode + PreData[2]; PreData[2] <= OutCode + PreData[2]; end end // else: !if(ProcessColor[2] == 1'b0) end // if (ProcessCount == 0) end // case: Phase9 Phase10: begin Process <= Phase11; //OutData <= DqtData * OutCode; end Phase11: begin OutEnable <= 1'b0; if(NextProcessCount <64) begin Process <= Phase1; ProcessCount <= NextProcessCount; end else begin ProcessCount <= 7'd0; DataOutEnable <= 1'b1; DataOutColor <= ProcessColor; if(ProcessColor == 5) begin ProcessColor <= 3'b000; if(DataInRun == 1'b0) Process <= ProcIdle; else Process <= Phase1; end else begin Process <= Phase1; ProcessColor <= ProcessColor +1; end end // else: !if(NextProcessCount <64) end // case: Phase11 endcase // case(Process) end // else: !if(!rst) end // always @ (posedge clk or negedge rst) assign DhtColor[1] = ProcessColor[2]; assign DhtColor[0] = ProcessCount != 0; //assign DhtNumber = OutDhtNumber[7:0]; assign DhtNumber = DataNumber - TableCode + NumberCode; assign DqtColor = ProcessColor[2]; assign DqtNumber = ProcessCount[5:0]; //assign DecodeUseBit = Process == Phase8; assign DecodeUseBit = Process == Phase9; assign DecodeUseWidth = UseWidth; assign DecodeEnable = OutEnable == 1'b1 & Process == Phase11; assign DecodeColor = ProcessColor; assign DecodeCount = ProcessCount[5:0]; assign DecodeZero = OutZero; //assign DecodeCode = OutData[15:0]; assign DecodeCode = DqtData * OutCode;endmodule // jpeg_hm_decode
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -