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

Subversion Repositories djpeg

[/] [djpeg/] [trunk/] [src/] [jpeg_regdata.v] - Rev 5

Go to most recent revision | Compare with Previous | Blame | View Log

//---------------------------------------------------------------------------
// File Name    : jpeg_regdata.v
// Module Name  : jpeg_regdata
// Description  : get Data
// Project              : JPEG Decoder
// Belong to    : 
// Author               : H.Ishihara
// E-Mail               : hidemi@sweetcafe.jp
// HomePage             : http://www.sweetcafe.jp/
// Date                 : 2007/04/11
// Rev.                 : 1.03
//---------------------------------------------------------------------------
// Rev. Date             Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 1.02 2006/10/04 Remove a RegEnd register.
//                                        When reset, clear on OutEnable,PreEnable,DataOut registers.
//                                        Remove some comments.
// 1.03 2007/04/11 Don't OutEnable, ImageEnable == 1 and DataOut == 0xFFD9XXXX
//                 Stop ReadEnable with DataEnd(after 0xFFD9 of ImageData)
//---------------------------------------------------------------------------
// $Id: 
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_regdata(
        rst,
        clk,
 
        // Read Data
        DataIn,                 // 
        DataInEnable,   // Data Enable
        DataInRead,             // Data Read
 
        // DataOut
        DataOut,                // Data Out
        DataOutEnable,  // Data Out Enable
 
        // 
        ImageEnable,
        ProcessIdle,
 
        // UseData
        UseBit,         // Used data bit
        UseWidth,       // Used data bit width
        UseByte,        // Used data byte
        UseWord         // Used data word
        );
 
        input                   rst;
        input                   clk;
 
        input [31:0]    DataIn;
        input                   DataInEnable;
        output                  DataInRead;
 
        output [31:0]   DataOut;
        output                  DataOutEnable;
 
        input                   ImageEnable;
        input                   ProcessIdle;
 
        input                   UseBit;
        input [6:0]             UseWidth;
        input                   UseByte;
        input                   UseWord;
 
        wire                    RegValid;
        reg [95:0]              RegData;
        reg [7:0]               RegWidth;
 
        reg                             DataEnd;
 
        assign                  RegValid        = RegWidth > 64;
        assign                  DataInRead      = RegValid == 1'b0 & DataInEnable == 1'b1;
 
        always @(posedge clk or negedge rst) begin
                if(!rst) begin
                        RegData  <= 96'd0;
                        RegWidth <= 8'h00;
                end else begin
                        if(RegValid == 1'b0 & (DataInEnable == 1'b1 | DataEnd == 1'b1)) begin
                                if(ImageEnable == 1'b1) begin
                                        if(RegData[39: 8] == 32'hFF00FF00) begin
                                                RegWidth                <= RegWidth + 16;
                                                RegData[95:64]  <= {8'h00,RegData[71:48]};
                                                RegData[63:32]  <= {RegData[47:40],16'hFFFF,RegData[7:0]};
                                        end else if(RegData[39:24] == 16'hFF00 &
                                                RegData[15: 0] == 16'hFF00) begin
                                                RegWidth                <= RegWidth + 16;
                                                RegData[95:64]  <= {8'h00,RegData[71:48]};
                                                RegData[63:32]  <= {RegData[47:40],8'hFF,RegData[23:16],8'hFF};
                                        end else if(RegData[31: 0] == 32'hFF00FF00) begin
                                                RegWidth                <= RegWidth + 16;
                                                RegData[95:64]  <= {16'h0000,RegData[71:56]};
                                                RegData[63:32]  <= {RegData[55:40],16'hFFFF};
                                        end else if(RegData[39:24] == 16'hFF00) begin
                                                RegWidth                <= RegWidth + 24;
                                                RegData[95:64]  <= {RegData[71:40]};
                                                RegData[63:32]  <= {8'hFF,RegData[23:0]};
                                        end else if(RegData[31:16] == 16'hFF00) begin
                                                RegWidth                <= RegWidth + 24;
                                                RegData[95:64]  <= {RegData[71:40]};
                                                RegData[63:32]  <= {RegData[39:32],8'hFF,RegData[15:0]};
                                        end else if(RegData[23: 8] == 16'hFF00) begin
                                                RegWidth                <= RegWidth + 24;
                                                RegData[95:64]  <= {RegData[71:40]};
                                                RegData[63:32]  <= {RegData[39:32],RegData[31:24],8'hFF,RegData[7:0]};
                                        end else if(RegData[15: 0] == 16'hFF00) begin
                                                RegWidth                <= RegWidth + 24;
                                                RegData[95:64]  <= {RegData[71:40]};
                                                RegData[63:32]  <= {RegData[39:32],RegData[31:16],8'hFF};
                                        end else begin
                                                RegWidth                <= RegWidth + 32;
                                                RegData[95:64]  <= RegData[63:32];
                                                RegData[63:32]  <= RegData[31:0];
                                        end
                                end else begin
                                        RegWidth                <= RegWidth + 32;
                                        RegData[95:64]  <= RegData[63:32];
                                        RegData[63:32]  <= RegData[31:0];
                                end
                                RegData[31: 0] <= {DataIn[7:0],DataIn[15:8],DataIn[23:16],DataIn[31:24]};
                        end else if(UseBit == 1'b1) begin
                                RegWidth <= RegWidth - UseWidth;
                        end else if(UseByte == 1'b1) begin
                                RegWidth <= RegWidth - 8;
                        end else if(UseWord == 1'b1) begin
                                RegWidth <= RegWidth - 16;
                        end
                end
        end
 
        always @(posedge clk or negedge rst) begin
                if(!rst) begin
                        DataEnd <= 1'b0;
                end else begin
                        if(ProcessIdle) begin
                                DataEnd <= 1'b0;
                        end else if(ImageEnable == 1'b1 & (RegData[39:24] == 16'hFFD9 | RegData[31:16] == 16'hFFD9 | RegData[23: 8] == 16'hFFD9 | RegData[15: 0] == 16'hFFD9)) begin
                                DataEnd <= 1'b1;
                        end
                end
        end
 
        function [31:0] SliceData;
                input [95:0] RegData;
                input [7:0]  RegWidth;
 
                case(RegWidth)
                        8'd65: SliceData = RegData[64:33];
                        8'd66: SliceData = RegData[65:34];
                        8'd67: SliceData = RegData[66:35];
                        8'd68: SliceData = RegData[67:36];
                        8'd69: SliceData = RegData[68:37];
                        8'd70: SliceData = RegData[69:38];
                        8'd71: SliceData = RegData[70:39];
                        8'd72: SliceData = RegData[71:40];
                        8'd73: SliceData = RegData[72:41];
                        8'd74: SliceData = RegData[73:42];
                        8'd75: SliceData = RegData[74:43];
                        8'd76: SliceData = RegData[75:44];
                        8'd77: SliceData = RegData[76:45];
                        8'd78: SliceData = RegData[77:46];
                        8'd79: SliceData = RegData[78:47];
                        8'd80: SliceData = RegData[79:48];
                        8'd81: SliceData = RegData[80:49];
                        8'd82: SliceData = RegData[81:50];
                        8'd83: SliceData = RegData[82:51];
                        8'd84: SliceData = RegData[83:52];
                        8'd85: SliceData = RegData[84:53];
                        8'd86: SliceData = RegData[85:54];
                        8'd87: SliceData = RegData[86:55];
                        8'd88: SliceData = RegData[87:56];
                        8'd89: SliceData = RegData[88:57];
                        8'd90: SliceData = RegData[89:58];
                        8'd91: SliceData = RegData[90:59];
                        8'd92: SliceData = RegData[91:60];
                        8'd93: SliceData = RegData[92:61];
                        8'd94: SliceData = RegData[93:62];
                        8'd95: SliceData = RegData[94:63];
                        8'd96: SliceData = RegData[95:64];
                        default: SliceData = 32'h00000000;
                endcase
        endfunction
 
        reg                     OutEnable;
        reg                     PreEnable;
 
        reg [31:0]              DataOut;
 
        always @(posedge clk or negedge rst) begin
                if(!rst) begin
                        OutEnable       <= 1'b0;
                        PreEnable       <= 1'b0;
                        DataOut         <= 32'h00000000;
                end else begin
                        OutEnable       <= RegWidth >64;
                        PreEnable       <= (UseBit == 1'b1 | UseByte == 1'b1 | UseWord == 1'b1);
                        DataOut         <= SliceData(RegData,RegWidth);
                end
        end
 
        assign DataOutEnable = (PreEnable == 1'b0)?OutEnable:1'b0;
 
endmodule
 
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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