OpenCores
URL https://opencores.org/ocsvn/djpeg/djpeg/trunk

Subversion Repositories djpeg

[/] [djpeg/] [trunk/] [src/] [jpeg_decode_fsm.v] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 hidemi
//---------------------------------------------------------------------------
2 9 hidemi
// File Name    : jpeg_decode_fsm.v
3
// Module Name  : jpeg_decode_fsm
4
// Description  : Decode Maker
5
// Project      : JPEG Decoder
6
// Belong to    : 
7
// Author       : H.Ishihara
8
// E-Mail       : hidemi@sweetcafe.jp
9
// HomePage     : http://www.sweetcafe.jp/
10
// Date         : 2008/02/27
11
// Rev.         : 2.00
12 3 hidemi
//---------------------------------------------------------------------------
13 9 hidemi
// Rev. Date             Description
14 3 hidemi
//---------------------------------------------------------------------------
15
// 1.01 2006/10/01 1st Release
16
// 1.02 2006/10/04 Remove a HmOldData register.
17 9 hidemi
//                                              When reset, clear a ReadDqtTable register.
18 5 hidemi
// 1.03 2007/04/11 Remove JpegDecodeStart
19
//                 Exchange StateMachine(Add ImageData)
20
//                 Remove JpegDecodeStart
21 9 hidemi
// 2.00 2008/02/27 Exchange State Machine
22 3 hidemi
//---------------------------------------------------------------------------
23
`timescale 1ps / 1ps
24 9 hidemi
 
25
module jpeg_decode_fsm(
26
    rst,
27
    clk,
28 3 hidemi
 
29 9 hidemi
    // From FIFO
30
    DataInEnable,
31
    DataIn,
32
 
33
    JpegDecodeIdle,         // Deocder Process Idle(1:Idle, 0:Run)
34
 
35
    OutWidth,
36
    OutHeight,
37
    OutBlockWidth,
38
    OutEnable,
39
    OutPixelX,
40
    OutPixelY,
41
 
42
    //
43
    DqtEnable,
44
    DqtTable,
45
    DqtCount,
46
    DqtData,
47
 
48
    //
49
    DhtEnable,
50
    DhtTable,
51
    DhtCount,
52
    DhtData,
53
 
54
    //
55
    HuffmanEnable,
56
    HuffmanTable,
57
    HuffmanCount,
58
    HuffmanData,
59
    HuffmanStart,
60
 
61
    //
62
    ImageEnable,
63
 
64
    //
65
    UseByte,
66
    UseWord
67
);
68
 
69
    input           rst;
70
    input           clk;
71
 
72
    input           DataInEnable;
73
    input [31:0]    DataIn;
74
 
75
    output          JpegDecodeIdle;
76
 
77
    output [15:0]   OutWidth;
78
    output [15:0]   OutHeight;
79
    output [11:0]   OutBlockWidth;
80
    input           OutEnable;
81
    input [15:0]    OutPixelX;
82
    input [15:0]    OutPixelY;
83
 
84
    output          DqtEnable;
85
    output          DqtTable;
86
    output [5:0]    DqtCount;
87
    output [7:0]    DqtData;
88
 
89
    output          DhtEnable;
90
    output [1:0]    DhtTable;
91
    output [7:0]    DhtCount;
92
    output [7:0]    DhtData;
93
 
94
    //
95
    output          HuffmanEnable;
96
    output [1:0]    HuffmanTable;
97
    output [3:0]    HuffmanCount;
98
    output [15:0]   HuffmanData;
99
    output [7:0]    HuffmanStart;
100
 
101
    //
102
    output          ImageEnable;
103
 
104
    //
105
    output          UseByte;
106
    output          UseWord;
107
 
108
    //--------------------------------------------------------------------------
109
    // Read Maker from Jpeg Data
110
    //--------------------------------------------------------------------------
111
    // State Machine Parameter
112
    parameter S_Idle            = 5'd0;
113
    parameter S_GetMarker       = 5'd1;
114
    parameter S_ImageData       = 5'd2;
115
    // APP Segment
116
    parameter S_APPLength       = 5'd3;
117
    parameter S_APPRead         = 5'd4;
118
    // DQT Segment
119
    parameter S_DQTLength       = 5'd5;
120
    parameter S_DQTTable        = 5'd6;
121
    parameter S_DQTRead         = 5'd7;
122
    // DHT Segmen
123
    parameter S_DHTLength       = 5'd8;
124
    parameter S_DHTTable        = 5'd9;
125
    parameter S_DHTMakeHm0      = 5'd10;
126
    parameter S_DHTMakeHm1      = 5'd11;
127
    parameter S_DHTMakeHm2      = 5'd12;
128
    parameter S_DHTReadTable    = 5'd13;
129
    // SOS Segment
130
    parameter S_SOSLength       = 5'd14;
131
    parameter S_SOSRead0        = 5'd15;
132
    parameter S_SOSRead1        = 5'd16;
133
    parameter S_SOSRead2        = 5'd17;
134
    parameter S_SOSRead3        = 5'd18;
135
    parameter S_SOSRead4        = 5'd19;
136
    parameter S_SOFLength       = 5'd20;
137
    parameter S_SOFRead0        = 5'd21;
138
    parameter S_SOFReadY        = 5'd22;
139
    parameter S_SOFReadX        = 5'd23;
140
    parameter S_SOFReadComp     = 5'd24;
141
    parameter S_SOFMakeBlock0   = 5'd25;
142
    parameter S_SOFMakeBlock1   = 5'd26;
143
 
144
    reg [4:0]       State;
145
    //wire            ImageEnable;
146
    reg [15:0]      ReadCount;
147 3 hidemi
 
148 9 hidemi
    reg [15:0]      JpegWidth;
149
    reg [15:0]      JpegHeight;
150 3 hidemi
 
151 9 hidemi
    reg             ReadDqtTable;
152
    reg [1:0]       ReadDhtTable;
153 3 hidemi
 
154 9 hidemi
    reg [15:0]      HmShift;
155
    reg [15:0]      HmData;
156
    reg [7:0]       HmMax;
157
    reg [7:0]       HmCount;
158
    reg             HmEnable;
159 3 hidemi
 
160 9 hidemi
    reg [15:0]      JpegBlockWidth;
161
    reg [15:0]      JpegBlockHeight;
162
 
163
    reg             ImageEnable;
164 3 hidemi
 
165 9 hidemi
    always @(posedge clk or negedge rst) begin
166
        if(!rst) begin
167
            State           <= S_Idle;
168
            ReadCount       <= 16'd0;
169
            JpegWidth       <= 16'd0;
170
            JpegHeight      <= 16'd0;
171
            ReadDqtTable    <= 1'b0;
172
            ReadDhtTable    <= 2'd0;
173
            HmShift         <= 16'd0;
174
            HmData          <= 16'd0;
175
            HmMax           <= 8'd0;
176
            HmCount         <= 8'd0;
177
            HmEnable        <= 1'b0;
178
            JpegBlockWidth  <= 16'd0;
179
            JpegBlockHeight <= 16'd0;
180
            ImageEnable     <= 1'b0;
181
        end else begin
182
            case(State)
183
                S_Idle: begin
184
                    if(DataInEnable == 1'b1) begin
185
                        State   <= S_GetMarker;
186
                    end
187
                end
188
                // Get Marker(with Header)
189
                S_GetMarker: begin
190
                    if(DataInEnable == 1'b1) begin
191
                        case(DataIn[31:16])
192
                            16'hFFD8: begin         // SOI Segment
193
                                State <= S_GetMarker;
194
                            end
195
                            16'hFFE0: begin         // APP0 Segment
196
                                State <= S_APPLength;
197
                            end
198
                            16'hFFDB: begin         // DQT Segment
199
                                State <= S_DQTLength;
200
                            end
201
                            16'hFFC4: begin         // DHT Segment
202
                                State <= S_DHTLength;
203
                            end
204
                            16'hFFC0: begin         // SOF0 Segment
205
                                State <= S_SOFLength;
206
                            end
207
                            16'hFFDA: begin         // SOS Segment
208
                                State <= S_SOSLength;
209
                            end
210
                            //16'hFFDD: begin       // DRI Segment
211
                            //      State <= S_DRI;
212
                            //end
213
                            //16'hFFDx: begin       // RSTn Segment
214
                            //      State <= S_RST;
215
                            //end
216
                            //16'hFFD9: begin       // EOI Segment
217
                            //      State <= S_EOI;
218
                            //end
219
                            default: begin
220
                                State <= S_APPLength;
221
                            end
222
                        endcase
223
                    end
224
                end
225
                // APP Segment
226
                S_APPLength: begin
227
                    if(DataInEnable == 1'b1) begin
228
                        ReadCount <= DataIn[31:16] -16'd2;
229
                        State     <= S_APPRead;
230
                    end
231
                end
232
                S_APPRead: begin
233
                    if(DataInEnable == 1'b1) begin
234
                        if(ReadCount == 16'd1) begin
235
                            State <= S_GetMarker;
236
                        end else begin
237
                            ReadCount <= ReadCount -16'd1;
238
                        end
239
                    end
240
                end
241
                // DQT Segment
242
                S_DQTLength: begin
243
                    if(DataInEnable == 1'b1) begin
244
                        State     <= S_DQTTable;
245
                        ReadCount <= DataIn[31:16] -16'd2;
246
                    end
247
                end
248
                S_DQTTable: begin
249
                    if(DataInEnable == 1'b1) begin
250
                        State         <= S_DQTRead;
251
                        ReadDqtTable  <= DataIn[24];
252
                        ReadCount     <= 16'd0;
253
                    end
254
                end
255
                S_DQTRead: begin
256
                    if(DataInEnable == 1'b1) begin
257
                        if(ReadCount ==63) begin
258
                            State     <= S_GetMarker;
259
                        end
260
                        ReadCount     <= ReadCount +16'd1;
261
                    end
262
                end
263
                // DHT Segment
264
                S_DHTLength: begin
265
                    if(DataInEnable == 1'b1) begin
266
                        State       <= S_DHTTable;
267
                        ReadCount   <= DataIn[31:16];
268
                    end
269
                end
270
                S_DHTTable: begin
271
                    if(DataInEnable == 1'b1) begin
272
                        State <= S_DHTMakeHm0;
273
                        case(DataIn[31:24])
274
                            8'h00: ReadDhtTable <= 2'b00;
275
                            8'h10: ReadDhtTable <= 2'b01;
276
                            8'h01: ReadDhtTable <= 2'b10;
277
                            8'h11: ReadDhtTable <= 2'b11;
278
                        endcase
279
                    end
280
                    HmShift     <= 16'h8000;
281
                    HmData      <= 16'h0000;
282
                    HmMax       <= 8'h00;
283
                    ReadCount   <= 16'd0;
284
                end
285
                S_DHTMakeHm0: begin
286
                    if(DataInEnable == 1'b1) begin
287
                        State   <= S_DHTMakeHm1;
288
                        HmCount <= DataIn[31:24];
289
                    end
290
                    HmEnable    <= 1'b0;
291
                end
292
                S_DHTMakeHm1: begin
293
                    State   <= S_DHTMakeHm2;
294
                    HmMax   <= HmMax + HmCount;
295
                end
296
                S_DHTMakeHm2: begin
297
                    if(HmCount != 0) begin
298
                        HmData  <= HmData + HmShift;
299
                        HmCount <= HmCount -8'd1;
300
                    end else begin
301
                        if(ReadCount == 15) begin
302
                            State       <= S_DHTReadTable;
303
                            HmCount     <= 8'h00;
304
                        end else begin
305
                            HmEnable    <= 1'b1;
306
                            State       <= S_DHTMakeHm0;
307
                            ReadCount   <= ReadCount +16'd1;
308
                        end
309
                        HmShift <= HmShift >> 1;
310
                    end
311
                end
312
                S_DHTReadTable: begin
313
                    HmEnable    <= 1'b0;
314
                    if(DataInEnable == 1'b1) begin
315
                        if(HmMax == HmCount +1) begin
316
                            State <= S_GetMarker;
317
                        end
318
                        HmCount <= HmCount +8'd1;
319
                    end
320
                end
321
                // SOS Segment            
322
                S_SOSLength: begin
323
                    if(DataInEnable == 1'b1) begin
324
                        State       <= S_SOSRead0;
325
                        ReadCount   <= DataIn[31:16];
326
                    end
327
                end
328
                S_SOSRead0: begin
329
                    if(DataInEnable == 1'b1) begin
330
                        State       <= S_SOSRead1;
331
                        ReadCount   <= {8'h00,DataIn[31:24]};
332
                    end
333
                end
334
                S_SOSRead1: begin
335
                    if(DataInEnable == 1'b1) begin
336
                        if(ReadCount == 1) begin
337
                            State       <= S_SOSRead2;
338
                        end else begin
339
                            ReadCount   <= ReadCount -16'd1;
340
                        end
341
                    end
342
                end
343
                S_SOSRead2: begin
344
                    if(DataInEnable == 1'b1) begin
345
                        State <= S_SOSRead3;
346
                    end
347
                end
348
                S_SOSRead3: begin
349
                    if(DataInEnable == 1'b1) begin
350
                        State <= S_SOSRead4;
351
                    end
352
                end
353
                S_SOSRead4: begin
354
                    if(DataInEnable == 1'b1) begin
355
                        State       <= S_ImageData;
356
                        ImageEnable <= 1'b1;
357
                    end
358
                end
359
                // SOF0 Segment
360
                S_SOFLength: begin
361
                    if(DataInEnable == 1'b1) begin
362
                        State       <= S_SOFRead0;
363
                        ReadCount   <= DataIn[31:16];
364
                    end
365
                end
366
                S_SOFRead0: begin
367
                    if(DataInEnable == 1'b1) begin
368
                        State   <= S_SOFReadY;
369
                    end
370
                end
371
                S_SOFReadY: begin
372
                    if(DataInEnable == 1'b1) begin
373
                        State           <= S_SOFReadX;
374
                        JpegHeight      <= DataIn[31:16];
375
                        JpegBlockHeight <= DataIn[31:16];
376
                    end
377
                end
378
                S_SOFReadX: begin
379
                    if(DataInEnable == 1'b1) begin
380
                        State           <= S_SOFReadComp;
381
                        JpegWidth       <= DataIn[31:16];
382
                        JpegBlockWidth  <= DataIn[31:16];
383
                        ReadCount       <= 16'd0;
384
                    end
385
                end
386
                S_SOFReadComp: begin
387
                    if(DataInEnable == 1'b1) begin
388
                        if(ReadCount == 9) begin
389
                            State       <= S_SOFMakeBlock0;
390
                        end else begin
391
                            ReadCount   <= ReadCount +16'd1;
392
                        end
393
                    end
394
                end
395
                S_SOFMakeBlock0:begin
396
                    State           <= S_SOFMakeBlock1;
397
                    JpegBlockWidth  <= JpegBlockWidth  +16'd15;
398
                    JpegBlockHeight <= JpegBlockHeight +16'd15;
399
                end
400
                S_SOFMakeBlock1:begin
401
                    State           <= S_GetMarker;
402
                    JpegBlockWidth  <= JpegBlockWidth  >> 4;
403
                    JpegBlockHeight <= JpegBlockHeight >> 4;
404
                end
405
 
406
                // Image Process
407
                S_ImageData: begin
408
                    if(OutEnable & (JpegWidth == (OutPixelX +1)) & (JpegHeight == (OutPixelY +1))) begin
409
                        State       <= S_Idle;
410
                        ImageEnable <= 1'b0;
411
                    end
412
                end
413
            endcase
414
        end
415
    end
416
 
417
    assign UseByte = (DataInEnable == 1'b1) & ((State == S_APPRead) |
418
                                               (State == S_DQTRead) | (State == S_DQTTable) |
419
                                               (State == S_DHTTable) | (State == S_DHTMakeHm0) | (State == S_DHTReadTable) |
420
                                               (State == S_SOSRead0) | (State == S_SOSRead2) | (State == S_SOSRead3) | (State == S_SOSRead4) |
421
                                               (State == S_SOFRead0) | (State == S_SOFReadComp)
422
                                              );
423
    assign UseWord = (DataInEnable == 1'b1) & ((State == S_GetMarker) |
424
                                               (State == S_APPLength) |
425
                                               (State == S_DQTLength) |
426
                                               (State == S_DHTLength) |
427
                                               (State == S_SOSLength) | (State == S_SOSRead1) |
428
                                               (State == S_SOFLength) | (State == S_SOFReadX) | (State == S_SOFReadY)
429
                                              );
430 3 hidemi
 
431 9 hidemi
    assign JpegDecodeIdle   = (State == S_Idle);
432
    //assign ImageEnable      = (State == S_ImageData);
433 3 hidemi
 
434 9 hidemi
    assign OutWidth         = JpegWidth;
435
    assign OutHeight        = JpegHeight;
436
    assign OutBlockWidth    = JpegBlockWidth[11:0];
437
 
438
    assign DqtEnable        = (State == S_DQTRead);
439
    assign DqtTable         = ReadDqtTable;
440
    assign DqtCount         = ReadCount[5:0];
441
    assign DqtData          = DataIn[31:24];
442
 
443
    assign DhtEnable        = (State == S_DHTReadTable);
444
    assign DhtTable         = ReadDhtTable;
445
    assign DhtCount         = HmCount;
446
    assign DhtData          = DataIn[31:24];
447
 
448
    assign HuffmanEnable    = HmEnable;
449
    assign HuffmanTable     = ReadDhtTable;
450
    assign HuffmanCount     = ReadCount[3:0];
451
    assign HuffmanData      = HmData;
452
    assign HuffmanStart     = HmMax;
453 3 hidemi
 
454 5 hidemi
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.