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

Subversion Repositories djpeg

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 8 to Rev 9
    Reverse comparison

Rev 8 → Rev 9

/djpeg/trunk/testbench/convbtoh File deleted \ No newline at end of file
djpeg/trunk/testbench/convbtoh Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: djpeg/trunk/testbench/convsim =================================================================== --- djpeg/trunk/testbench/convsim (revision 8) +++ djpeg/trunk/testbench/convsim (nonexistent) @@ -1,22 +0,0 @@ -ELFЄ4 4 (44€4€àà€€ü -ü -ü -üšüš(, ››ÈÈ((( Qåtd/lib/ld-linux.so.2GNU   - -;ˆ4‹@~.rGFvŸNÎ\ñˆ¤a2gìŠU[  _Jv_RegisterClasses__gmon_start__libc.so.6fgetsperrorfeofmallocstrtolfclosefwriteexitfopen_IO_stdin_used__libc_start_mainfreeGLIBC_2.1GLIBC_2.0$ii -ii -—Ø›è›ì›ð›ô›ø›ü›œœœ œ -œ œU‰åƒìè è`è«ÉÃÿ5à›ÿ%ä›ÿ%è›héàÿÿÿÿ%ì›héÐÿÿÿÿ%ð›héÀÿÿÿÿ%ô›hé°ÿÿÿÿ%ø›h é ÿÿÿÿ%ü›h(éÿÿÿÿ%œh0é€ÿÿÿÿ%œh8épÿÿÿÿ%œh@é`ÿÿÿÿ% œhHéPÿÿÿÿ%œhPé@ÿÿÿÿ%œhXé0ÿÿÿ1í^‰áƒäðPTRh8Šh@ŠQVht…ègÿÿÿôU‰åSƒìè[ÃÜ‹“üÿÿÿ…Òtè¢ÿÿÿX[ÉÃU‰åƒì€=$œt ëƒÀ£ œÿÒ¡ œ‹…ÒuëÆ$œÉÃU‰åƒì¡ ›…Àt¸…Àt Ç$ ›ÿÐÉÃL$ƒäðÿqüU‰åQìd‰¨þÿÿ‹•¨þÿÿ‹BƒÀ‹ÇD$ðŠ‰$èìþÿÿ‰Eàƒ}àuÇ$èWþÿÿÇ$è«þÿÿ‹¨þÿÿ‹AƒÀ‹ÇD$óŠ‰$è­þÿÿ‰Eäƒ}äuÇ$èþÿÿÇ$èlþÿÿ‹Eà‰D$ÇD$…Üþÿÿ‰$èþÿÿÇD$ -ÇD$…Üþÿÿ‰$èþÿÿ‰Eè‹Eà‰D$ÇD$…Üþÿÿ‰$èÑýÿÿÇD$ -ÇD$…Üþÿÿ‰$èÃýÿÿ‰Eì‹Eì‰Â¯Uè‰ÐÀЉ$è‰ýÿÿ‰EôÆ…ØþÿÿBÆ…ÙþÿÿM‹Eä‰D$ ÇD$ÇD$…Øþÿÿ‰$èÓýÿÿ‹Eè‰Â¯Uì‰ÐÀЃÀ6Á舅Ûþÿÿ‹Eè‰Â¯Uì‰ÐÀЃÀ6Á舅Úþÿÿ‹Eè‰Â¯Uì‰ÐÀЃÀ6Á舅Ùþÿÿ‹Eè‰Â¯Uì‰ÐÀЃÀ6ˆ…Øþÿÿ‹Eä‰D$ ÇD$ÇD$…Øþÿÿ‰$èEýÿÿÆ…ÙþÿÿÆ…Øþÿÿ‹Eä‰D$ ÇD$ÇD$…Øþÿÿ‰$èýÿÿ‹Eä‰D$ ÇD$ÇD$…Øþÿÿ‰$èíüÿÿÆ…ÛþÿÿÆ…ÚþÿÿÆ…ÙþÿÿÆ…Øþÿÿ6‹Eä‰D$ ÇD$ÇD$…Øþÿÿ‰$è¬üÿÿÇ…°þÿÿ(‹E艅´þÿÿ‹E쉅¸þÿÿfÇ…¼þÿÿfÇ…¾þÿÿÇ…Àþÿÿ‹Eè‰Â¯Uì‰ÐÀЉ…ÄþÿÿÇ…Èþÿÿ,Ç…Ìþÿÿ,Ç…ÐþÿÿÇ…Ôþÿÿ‹Eä‰D$ ÇD$(ÇD$…°þÿÿ‰$èüÿÿÇEøé#‹Eè¯Eì;Eø†&‹Eà‰D$ÇD$…Üþÿÿ‰$èiûÿÿÇD$ÇD$…Üþÿÿ‰$è[ûÿÿ‰Eð‹Eøº÷uè‰Â‹Eì‰Á)щʉÐÀЃè‰Á¯Mè‹Eøº÷uè‰ÐÀЉÂUô‹Eðˆ‹Eøº÷uè‰Â‹Eì‰Á)щʉÐÀЃè‰Á¯Mè‹Eøº÷uè‰ÐÀÐEôP‹EðÁ舋Eøº÷uè‰Â‹Eì‰Á)щʉÐÀЃè‰Á¯Mè‹Eøº÷uè‰ÐÀÐEôP‹EðÁ舃Eø‹Eà‰$è8úÿÿ…À„Êþÿÿ‹Eè‰Â¯Uì‰ÐÀ‹Eä‰D$ ‰T$ÇD$‹Eô‰$è¢úÿÿ‹Eà‰$èWúÿÿ‹Eä‰$èLúÿÿ‹Eô‰$èaúÿÿ¸ÄdY]aüÃU‰åÉÃvU‰åWVSƒì è[ÃŽè†ùÿÿƒ ÿÿÿ“ ÿÿÿ)ÐÁø‰Eðt1ÿ‰ÖPÿuÿu ÿuÿGƒÆƒÄ9}ðuèeô[^_ÉÃU‰åSƒì¡üšƒøÿt1ÛÿЋƒøšƒëƒøÿuðƒÄ[]ÃU‰åSƒìè[Ãè<úÿÿY[ÉÃrbwbÿÿÿÿÿÿÿÿ$ àƒ -ÌŠHˆ‚˜ -¡ Ü›`€ƒxƒþÿÿoHƒÿÿÿoðÿÿo*ƒ›„„.„>„N„^„n„~„Ž„ž„®„¾„›GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-2)GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-2)GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-3)GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-3)GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-3)GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-2).symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment#(( 1HHP7 ˜˜ð?ˆ‚ˆ¡Gÿÿÿo*ƒ*TþÿÿoHƒH0c xƒxl €ƒ€` uàƒàpøƒøÐ{ЄÐüÌŠÌ -‡èŠè -øŠø -™üšü - › § › ¬› 鵯ݯ ºÜ›Ü <Ãœ É$œ$ Î$ 2 -×lð4 \Ù(H˜ˆ‚*ƒHƒxƒ€ƒ àƒ -øƒ Є ÌŠ -èŠøŠüš› ››Ø›Ü›œ$œô„ ñÿüš*›8 ›E$œT œ[ … qP… ñÿ}›Š›—øŠ¥ ›± Š ÇñÿÑ›Úüšñÿëüšñÿþüšñÿüšñÿ#Ü›9üšñÿLüšñÿbˆrèŠy‹‹œ˜8Š ¨àƒ -®~ÀЄ ÇrØFê@ŠT ú$œñÿt…Ä Ÿ(œ 3ÌŠ -9ÎKñ[$œñÿb¤r(œñÿw2ˆìŠ—[©œ¶ Ê call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST__completed.5751p.5749__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxconvsim.c_DYNAMIC__fini_array_end__fini_array_start__init_array_end__preinit_array_end_GLOBAL_OFFSET_TABLE___init_array_start__preinit_array_startfeof@@GLIBC_2.0_fp_hwperror@@GLIBC_2.0__dso_handle__libc_csu_fini_initmalloc@@GLIBC_2.0_startfgets@@GLIBC_2.0strtol@@GLIBC_2.0__libc_csu_init__bss_startmain__libc_start_main@@GLIBC_2.0data_start_finifclose@@GLIBC_2.1exit@@GLIBC_2.0_edatafree@@GLIBC_2.0_endfopen@@GLIBC_2.1_IO_stdin_usedfwrite@@GLIBC_2.0__data_start_Jv_RegisterClasses__gmon_start__ \ No newline at end of file
djpeg/trunk/testbench/convsim Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: djpeg/trunk/testbench/convbtoh.c =================================================================== --- djpeg/trunk/testbench/convbtoh.c (revision 8) +++ djpeg/trunk/testbench/convbtoh.c (nonexistent) @@ -1,31 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -#include -#include - -////////////////////////////////////////////////////////////////////////////// -// ƒƒCƒ“ŠÖ” -////////////////////////////////////////////////////////////////////////////// -int main(int argc, char *argv[]) -{ - unsigned char buff[4]; - char data[256]; - FILE *rfp,*wfp; - - if((rfp = fopen(argv[1],"rb")) == NULL){ - perror(0); - exit(0); - } - if((wfp = fopen(argv[2],"wb")) == NULL){ - perror(0); - exit(0); - } - while(!feof(rfp)){ - fread(buff,1,4,rfp); - sprintf(data,"%02X%02X%02X%02X\n",buff[3],buff[2],buff[1],buff[0]); - fwrite(data,1,9,wfp); - } - fclose(rfp); - fclose(wfp); - - return 0; -}
djpeg/trunk/testbench/convbtoh.c Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: djpeg/trunk/testbench/convsim.c =================================================================== --- djpeg/trunk/testbench/convsim.c (revision 8) +++ djpeg/trunk/testbench/convsim.c (nonexistent) @@ -1,108 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -#include -#include - -typedef unsigned short WORD; -typedef unsigned long DWORD; -typedef long LONG; - -typedef struct tagBITMAPINFOHEADER{ - DWORD biSize; - LONG biWidth; - LONG biHeight; - WORD biPlanes; - WORD biBitCount; - DWORD biCompression; - DWORD biSizeImage; - LONG biXPelsPerMeter; - LONG biYPelsPerMeter; - DWORD biClrUsed; - DWORD biClrImportant; -} BITMAPINFOHEADER, *PBITMAPINFOHEADER; - -////////////////////////////////////////////////////////////////////////////// -// ƒƒCƒ“ŠÖ” -////////////////////////////////////////////////////////////////////////////// -int main(int argc, char *argv[]) -{ - unsigned char buff[4]; - char data[256]; - FILE *rfp,*wfp; - - unsigned long width; - unsigned long height; - unsigned long bitdata; - unsigned char tbuff[4]; - BITMAPINFOHEADER lpBi; - - unsigned char *image; - unsigned int i; - - if((rfp = fopen(argv[1],"rb")) == NULL){ - perror(0); - exit(0); - } - - if((wfp = fopen(argv[2],"wb")) == NULL){ - perror(0); - exit(0); - } - - - fgets(data,256,rfp); - width = (unsigned int)strtol(data,NULL,10); - fgets(data,256,rfp); - height = (unsigned int)strtol(data,NULL,10); - - image = (unsigned char *)malloc(height*width*3); - - // ƒtƒ@ƒCƒ‹ƒwƒbƒ_‚ÌÝ’è - tbuff[0] = 'B'; - tbuff[1] = 'M'; - fwrite(tbuff,2,1,wfp); - tbuff[3] = ((14 +40 +width * height * 3) >> 24) & 0xff; - tbuff[2] = ((14 +40 +width * height * 3) >> 16) & 0xff; - tbuff[1] = ((14 +40 +width * height * 3) >> 8) & 0xff; - tbuff[0] = ((14 +40 +width * height * 3) >> 0) & 0xff; - fwrite(tbuff,4,1,wfp); - tbuff[1] = 0; - tbuff[0] = 0; - fwrite(tbuff,2,1,wfp); - fwrite(tbuff,2,1,wfp); - tbuff[3] = 0; - tbuff[2] = 0; - tbuff[1] = 0; - tbuff[0] = 54; - fwrite(tbuff,4,1,wfp); - - // ƒCƒ“ƒtƒHƒ[ƒVƒ‡ƒ“‚ÌÝ’è - lpBi.biSize = 40; - lpBi.biWidth = width; - lpBi.biHeight = height; - lpBi.biPlanes = 1; - lpBi.biBitCount = 3*8; - lpBi.biCompression = 0; - lpBi.biSizeImage = width*height*3; - lpBi.biXPelsPerMeter = 300; - lpBi.biYPelsPerMeter = 300; - lpBi.biClrUsed = 0; - lpBi.biClrImportant = 0; - fwrite(&lpBi,1,40,wfp); - - i = 0; - while(!feof(rfp)){ - if(i>=width*height) break; - fgets(data,256,rfp); - bitdata=strtol(data,NULL,16); - image[((height-i/width-1)*width*3)+(i%width)*3+0] = (bitdata >> 0) & 0xff; - image[((height-i/width-1)*width*3)+(i%width)*3+1] = (bitdata >> 8) & 0xff; - image[((height-i/width-1)*width*3)+(i%width)*3+2] = (bitdata >> 16) & 0xff; - i++; - } - fwrite(image,1,width*height*3,wfp); - fclose(rfp); - fclose(wfp); - free(image); - - return 0; -}
djpeg/trunk/testbench/convsim.c Property changes : Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Index: djpeg/trunk/c_model/djpeg.c =================================================================== --- djpeg/trunk/c_model/djpeg.c (revision 8) +++ djpeg/trunk/c_model/djpeg.c (revision 9) @@ -78,7 +78,7 @@ // b: ƒoƒCƒgƒJƒEƒ“ƒg(1ƒhƒbƒg•Ó‚è‚̃oƒCƒg”) ////////////////////////////////////////////////////////////////////////////// void BmpSave(unsigned char *file,unsigned char *buff, - unsigned int x,unsigned int y,unsigned int b){ + unsigned int x,unsigned int y,unsigned int b){ BITMAPFILEHEADER lpBf; BITMAPINFOHEADER lpBi; unsigned char tbuff[4]; @@ -409,17 +409,17 @@ count ++; }else{ if(ZeroCount == 0x0 && DataCount == 0x0){ - // AC¬•ª‚ÅEOB•„†‚ª—ˆ‚½ê‡‚ÍI—¹‚·‚é - break; + // AC¬•ª‚ÅEOB•„†‚ª—ˆ‚½ê‡‚ÍI—¹‚·‚é + break; }else if(ZeroCount ==0xF && DataCount == 0x0){ - // ZRL•„†‚ª—ˆ‚½ê‡A15ŒÂ‚̃[ƒƒf[ƒ^‚Æ‚Ý‚È‚· - count += 15; + // ZRL•„†‚ª—ˆ‚½ê‡A15ŒÂ‚̃[ƒƒf[ƒ^‚Æ‚Ý‚È‚· + count += 15; }else{ - count += ZeroCount; - // ‹t—ÊŽq‰»{ƒWƒOƒUƒO - BlockData[zigzag_table[count]] = DataCode * TableDQT[tabledqt][count]; - count ++; + count += ZeroCount; + // ‹t—ÊŽq‰»{ƒWƒOƒUƒO + BlockData[zigzag_table[count]] = DataCode * TableDQT[tabledqt][count]; } + count ++; } } } @@ -661,8 +661,8 @@ rgb[i*3+2] = r; /* printf("[RGB]%3d: %3x,%3x,%3x = %2x,%2x,%2x\n",i, - y[i]&0x1FF,cr[p]&0x1FF,cb[p]&0x1FF, - rgb[i*3+2],rgb[i*3+1],rgb[i*3+0]); + y[i]&0x1FF,cr[p]&0x1FF,cb[p]&0x1FF, + rgb[i*3+2],rgb[i*3+1],rgb[i*3+0]); */ } } @@ -680,16 +680,16 @@ Decode411(buff,BlockY,BlockCb,BlockCr); // 4:1:1‚̃fƒR[ƒh DecodeYUV(BlockY,BlockCb,BlockCr,rgb); // YUV¨RGB•ÏŠ· for(i=0;i<256;i++){ - if((x*16+(i%16)> 8: - (Phase5Count == 3'd2)?Phase4R1r >> 8: - (Phase5Count == 3'd3)?Phase3Reg[4]: - 32'd0; - - reg signed [31:0] Phase5R0r; - reg signed [31:0] Phase5R1r; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase5R0r <= 0; - Phase5R1r <= 0; - end else begin - Phase5R0r <= Phase5R0w + Phase5R1w; - Phase5R1r <= Phase5R0w - Phase5R1w; - end - end - - assign DataOutEnable = Phase5EnableD == 1'b1 & Phase5CountD[2] == 1'b0; - assign DataOutPage = Phase5PageD; - assign DataOutCount = Phase5CountD[1:0]; - - assign Data0Out = Phase5R0r[30:15]; - assign Data1Out = Phase5R1r[30:15]; - -endmodule // jpeg_idcty Index: djpeg/trunk/src/jpeg_idctx.v =================================================================== --- djpeg/trunk/src/jpeg_idctx.v (revision 8) +++ djpeg/trunk/src/jpeg_idctx.v (nonexistent) @@ -1,1241 +0,0 @@ -//--------------------------------------------------------------------------- -// File Name : jpeg_idctx.v -// Module Name : jpeg_idctx -// Description : iDCT-X -// Project : JPEG Decoder -// Belong to : -// Author : H.Ishihara -// E-Mail : hidemi@sweetcafe.jp -// HomePage : http://www.sweetcafe.jp/ -// Date : 2006/10/01 -// Rev. : 1.1 -//--------------------------------------------------------------------------- -// Rev. Date Description -//--------------------------------------------------------------------------- -// 1.01 2006/09/01 1st Release -//--------------------------------------------------------------------------- -// $Id: -//--------------------------------------------------------------------------- -`timescale 1ps / 1ps - -module jpeg_idctx - ( - rst, - clk, - - DataInEnable, - DataInSel, - Data00In, - Data01In, - Data02In, - Data03In, - Data04In, - Data05In, - Data06In, - Data07In, - Data08In, - Data09In, - Data10In, - Data11In, - Data12In, - Data13In, - Data14In, - Data15In, - Data16In, - Data17In, - Data18In, - Data19In, - Data20In, - Data21In, - Data22In, - Data23In, - Data24In, - Data25In, - Data26In, - Data27In, - Data28In, - Data29In, - Data30In, - Data31In, - Data32In, - Data33In, - Data34In, - Data35In, - Data36In, - Data37In, - Data38In, - Data39In, - Data40In, - Data41In, - Data42In, - Data43In, - Data44In, - Data45In, - Data46In, - Data47In, - Data48In, - Data49In, - Data50In, - Data51In, - Data52In, - Data53In, - Data54In, - Data55In, - Data56In, - Data57In, - Data58In, - Data59In, - Data60In, - Data61In, - Data62In, - Data63In, - DataInIdle, - DataInRelease, - - DataOutIdle, - DataOutEnable, - DataOutPage, - DataOutCount, - Data0Out, - Data1Out - ); - - input clk; - input rst; - - input DataInEnable; - output DataInSel; - input [15:0] Data00In; - input [15:0] Data01In; - input [15:0] Data02In; - input [15:0] Data03In; - input [15:0] Data04In; - input [15:0] Data05In; - input [15:0] Data06In; - input [15:0] Data07In; - input [15:0] Data08In; - input [15:0] Data09In; - input [15:0] Data10In; - input [15:0] Data11In; - input [15:0] Data12In; - input [15:0] Data13In; - input [15:0] Data14In; - input [15:0] Data15In; - input [15:0] Data16In; - input [15:0] Data17In; - input [15:0] Data18In; - input [15:0] Data19In; - input [15:0] Data20In; - input [15:0] Data21In; - input [15:0] Data22In; - input [15:0] Data23In; - input [15:0] Data24In; - input [15:0] Data25In; - input [15:0] Data26In; - input [15:0] Data27In; - input [15:0] Data28In; - input [15:0] Data29In; - input [15:0] Data30In; - input [15:0] Data31In; - input [15:0] Data32In; - input [15:0] Data33In; - input [15:0] Data34In; - input [15:0] Data35In; - input [15:0] Data36In; - input [15:0] Data37In; - input [15:0] Data38In; - input [15:0] Data39In; - input [15:0] Data40In; - input [15:0] Data41In; - input [15:0] Data42In; - input [15:0] Data43In; - input [15:0] Data44In; - input [15:0] Data45In; - input [15:0] Data46In; - input [15:0] Data47In; - input [15:0] Data48In; - input [15:0] Data49In; - input [15:0] Data50In; - input [15:0] Data51In; - input [15:0] Data52In; - input [15:0] Data53In; - input [15:0] Data54In; - input [15:0] Data55In; - input [15:0] Data56In; - input [15:0] Data57In; - input [15:0] Data58In; - input [15:0] Data59In; - input [15:0] Data60In; - input [15:0] Data61In; - input [15:0] Data62In; - input [15:0] Data63In; - output DataInIdle; - output DataInRelease; - - input DataOutIdle; - output DataOutEnable; - output [2:0] DataOutPage; - output [1:0] DataOutCount; - output [15:0] Data0Out; - output [15:0] Data1Out; - - //------------------------------------------------------------------------- - // Phase1 - //------------------------------------------------------------------------- - reg Phase1Enable; - reg [2:0] Phase1Page; - reg [2:0] Phase1Count; - //reg Phase1EnableD; - //reg [2:0] Phase1PageD; - //reg [2:0] Phase1CountD; - reg DataInBank; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase1Enable <= 1'b0; - Phase1Page <= 3'd0; - Phase1Count <= 3'd0; - //Phase1EnableD <= 1'b0; - //Phase1PageD <= 3'd0; - //Phase1CountD <= 3'd0; - DataInBank <= 1'b0; - end else begin - if(Phase1Enable == 1'b0) begin - if(DataInEnable == 1'b1) begin - Phase1Enable <= 1'b1; - Phase1Page <= 3'd0; - Phase1Count <= 3'd0; - end - end else begin - if(Phase1Count == 3'd6) begin - if(Phase1Page == 3'd7) begin - Phase1Enable <= 1'b0; - Phase1Page <= 3'd0; - DataInBank <= ~DataInBank; - end else begin - Phase1Page <= Phase1Page + 3'd1; - end - Phase1Count <= 3'd0; - end else begin - Phase1Count <= Phase1Count + 3'd1; - end // else: !if(Phase1Count == 3'd6) - end // else: !if(Phase1Enable == 1'b0) - //Phase1EnableD <= Phase1Enable; - //Phase1PageD <= Phase1Page; - //Phase1CountD <= Phase1Count; - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - assign DataInSel = DataInBank; - assign DataInIdle = Phase1Enable == 1'b0 & DataOutIdle == 1'b1; - assign DataInRelease = Phase1Enable == 1'b1 & Phase1Count == 3'd6 & Phase1Page == 3'd7; - - wire signed [15:0] Phase1R0w; - wire signed [15:0] Phase1R1w; - wire signed [15:0] Phase1C0w; - wire signed [15:0] Phase1C1w; - wire signed [15:0] Phase1C2w; - wire signed [15:0] Phase1C3w; - -/* - always @(*) begin - case(Phase1Page) - 3'd0:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data00In; - Phase1R1w <= Data04In; - end - 3'd1: begin - Phase1R0w <= Data02In; - Phase1R1w <= Data06In; - end - 3'd2: begin - Phase1R0w <= Data01In; - Phase1R1w <= Data07In; - end - 3'd3: begin - Phase1R0w <= Data05In; - Phase1R1w <= Data03In; - end - endcase // case(Phase1Count) - end // case: 3'd0 - 3'd1:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data08In; - Phase1R1w <= Data12In; - end - 3'd1: begin - Phase1R0w <= Data10In; - Phase1R1w <= Data14In; - end - 3'd2: begin - Phase1R0w <= Data09In; - Phase1R1w <= Data15In; - end - 3'd3: begin - Phase1R0w <= Data13In; - Phase1R1w <= Data11In; - end - endcase // case(Phase1Count) - end // case: 3'd1 - 3'd2:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data16In; - Phase1R1w <= Data20In; - end - 3'd1: begin - Phase1R0w <= Data18In; - Phase1R1w <= Data22In; - end - 3'd2: begin - Phase1R0w <= Data17In; - Phase1R1w <= Data23In; - end - 3'd3: begin - Phase1R0w <= Data21In; - Phase1R1w <= Data19In; - end - endcase // case(Phase1Count) - end // case: 3'd2 - 3'd3:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data24In; - Phase1R1w <= Data28In; - end - 3'd1: begin - Phase1R0w <= Data26In; - Phase1R1w <= Data30In; - end - 3'd2: begin - Phase1R0w <= Data25In; - Phase1R1w <= Data31In; - end - 3'd3: begin - Phase1R0w <= Data29In; - Phase1R1w <= Data27In; - end - endcase // case(Phase1Count) - end // case: 3'd3 - 3'd4:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data32In; - Phase1R1w <= Data36In; - end - 3'd1: begin - Phase1R0w <= Data34In; - Phase1R1w <= Data38In; - end - 3'd2: begin - Phase1R0w <= Data33In; - Phase1R1w <= Data39In; - end - 3'd3: begin - Phase1R0w <= Data37In; - Phase1R1w <= Data35In; - end - endcase // case(Phase1Count) - end // case: 3'd4 - 3'd5:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data40In; - Phase1R1w <= Data44In; - end - 3'd1: begin - Phase1R0w <= Data42In; - Phase1R1w <= Data46In; - end - 3'd2: begin - Phase1R0w <= Data41In; - Phase1R1w <= Data47In; - end - 3'd3: begin - Phase1R0w <= Data45In; - Phase1R1w <= Data43In; - end - endcase // case(Phase1Count) - end // case: 3'd5 - 3'd6:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data48In; - Phase1R1w <= Data52In; - end - 3'd1: begin - Phase1R0w <= Data50In; - Phase1R1w <= Data54In; - end - 3'd2: begin - Phase1R0w <= Data49In; - Phase1R1w <= Data55In; - end - 3'd3: begin - Phase1R0w <= Data53In; - Phase1R1w <= Data51In; - end - endcase // case(Phase1Count) - end // case: 3'd6 - 3'd7:begin - case(Phase1Count) - 3'd0: begin - Phase1R0w <= Data56In; - Phase1R1w <= Data60In; - end - 3'd1: begin - Phase1R0w <= Data58In; - Phase1R1w <= Data62In; - end - 3'd2: begin - Phase1R0w <= Data57In; - Phase1R1w <= Data63In; - end - 3'd3: begin - Phase1R0w <= Data61In; - Phase1R1w <= Data59In; - end - endcase // case(Phase1Count) - end // case: 3'd7 - endcase // case(Phase1Page) - end // always @ (*) -*/ - function [15:0] Phase1R0wSel; - input [2:0] Phase1Page; - input [2:0] Phase1Count; - input [15:0] Data00In; - input [15:0] Data01In; - input [15:0] Data02In; - input [15:0] Data03In; - input [15:0] Data04In; - input [15:0] Data05In; - input [15:0] Data06In; - input [15:0] Data07In; - input [15:0] Data08In; - input [15:0] Data09In; - input [15:0] Data10In; - input [15:0] Data11In; - input [15:0] Data12In; - input [15:0] Data13In; - input [15:0] Data14In; - input [15:0] Data15In; - input [15:0] Data16In; - input [15:0] Data17In; - input [15:0] Data18In; - input [15:0] Data19In; - input [15:0] Data20In; - input [15:0] Data21In; - input [15:0] Data22In; - input [15:0] Data23In; - input [15:0] Data24In; - input [15:0] Data25In; - input [15:0] Data26In; - input [15:0] Data27In; - input [15:0] Data28In; - input [15:0] Data29In; - input [15:0] Data30In; - input [15:0] Data31In; - input [15:0] Data32In; - input [15:0] Data33In; - input [15:0] Data34In; - input [15:0] Data35In; - input [15:0] Data36In; - input [15:0] Data37In; - input [15:0] Data38In; - input [15:0] Data39In; - input [15:0] Data40In; - input [15:0] Data41In; - input [15:0] Data42In; - input [15:0] Data43In; - input [15:0] Data44In; - input [15:0] Data45In; - input [15:0] Data46In; - input [15:0] Data47In; - input [15:0] Data48In; - input [15:0] Data49In; - input [15:0] Data50In; - input [15:0] Data51In; - input [15:0] Data52In; - input [15:0] Data53In; - input [15:0] Data54In; - input [15:0] Data55In; - input [15:0] Data56In; - input [15:0] Data57In; - input [15:0] Data58In; - input [15:0] Data59In; - input [15:0] Data60In; - input [15:0] Data61In; - input [15:0] Data62In; - input [15:0] Data63In; - begin - case(Phase1Page) - 3'd0:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data00In; - end - 3'd1: begin - Phase1R0wSel = Data02In; - end - 3'd2: begin - Phase1R0wSel = Data01In; - end - 3'd3: begin - Phase1R0wSel = Data05In; - end - endcase // case(Phase1Count) - end // case: 3'd0 - 3'd1:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data08In; - end - 3'd1: begin - Phase1R0wSel = Data10In; - end - 3'd2: begin - Phase1R0wSel = Data09In; - end - 3'd3: begin - Phase1R0wSel = Data13In; - end - endcase // case(Phase1Count) - end // case: 3'd1 - 3'd2:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data16In; - end - 3'd1: begin - Phase1R0wSel = Data18In; - end - 3'd2: begin - Phase1R0wSel = Data17In; - end - 3'd3: begin - Phase1R0wSel = Data21In; - end - endcase // case(Phase1Count) - end // case: 3'd2 - 3'd3:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data24In; - end - 3'd1: begin - Phase1R0wSel = Data26In; - end - 3'd2: begin - Phase1R0wSel = Data25In; - end - 3'd3: begin - Phase1R0wSel = Data29In; - end - endcase // case(Phase1Count) - end // case: 3'd3 - 3'd4:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data32In; - end - 3'd1: begin - Phase1R0wSel = Data34In; - end - 3'd2: begin - Phase1R0wSel = Data33In; - end - 3'd3: begin - Phase1R0wSel = Data37In; - end - endcase // case(Phase1Count) - end // case: 3'd4 - 3'd5:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data40In; - end - 3'd1: begin - Phase1R0wSel = Data42In; - end - 3'd2: begin - Phase1R0wSel = Data41In; - end - 3'd3: begin - Phase1R0wSel = Data45In; - end - endcase // case(Phase1Count) - end // case: 3'd5 - 3'd6:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data48In; - end - 3'd1: begin - Phase1R0wSel = Data50In; - end - 3'd2: begin - Phase1R0wSel = Data49In; - end - 3'd3: begin - Phase1R0wSel = Data53In; - end - endcase // case(Phase1Count) - end // case: 3'd6 - 3'd7:begin - case(Phase1Count) - 3'd0: begin - Phase1R0wSel = Data56In; - end - 3'd1: begin - Phase1R0wSel = Data58In; - end - 3'd2: begin - Phase1R0wSel = Data57In; - end - 3'd3: begin - Phase1R0wSel = Data61In; - end - endcase // case(Phase1Count) - end // case: 3'd7 - endcase // case(Phase1Page) - end - endfunction - function [15:0] Phase1R1wSel; - input [2:0] Phase1Page; - input [2:0] Phase1Count; - input [15:0] Data00In; - input [15:0] Data01In; - input [15:0] Data02In; - input [15:0] Data03In; - input [15:0] Data04In; - input [15:0] Data05In; - input [15:0] Data06In; - input [15:0] Data07In; - input [15:0] Data08In; - input [15:0] Data09In; - input [15:0] Data10In; - input [15:0] Data11In; - input [15:0] Data12In; - input [15:0] Data13In; - input [15:0] Data14In; - input [15:0] Data15In; - input [15:0] Data16In; - input [15:0] Data17In; - input [15:0] Data18In; - input [15:0] Data19In; - input [15:0] Data20In; - input [15:0] Data21In; - input [15:0] Data22In; - input [15:0] Data23In; - input [15:0] Data24In; - input [15:0] Data25In; - input [15:0] Data26In; - input [15:0] Data27In; - input [15:0] Data28In; - input [15:0] Data29In; - input [15:0] Data30In; - input [15:0] Data31In; - input [15:0] Data32In; - input [15:0] Data33In; - input [15:0] Data34In; - input [15:0] Data35In; - input [15:0] Data36In; - input [15:0] Data37In; - input [15:0] Data38In; - input [15:0] Data39In; - input [15:0] Data40In; - input [15:0] Data41In; - input [15:0] Data42In; - input [15:0] Data43In; - input [15:0] Data44In; - input [15:0] Data45In; - input [15:0] Data46In; - input [15:0] Data47In; - input [15:0] Data48In; - input [15:0] Data49In; - input [15:0] Data50In; - input [15:0] Data51In; - input [15:0] Data52In; - input [15:0] Data53In; - input [15:0] Data54In; - input [15:0] Data55In; - input [15:0] Data56In; - input [15:0] Data57In; - input [15:0] Data58In; - input [15:0] Data59In; - input [15:0] Data60In; - input [15:0] Data61In; - input [15:0] Data62In; - input [15:0] Data63In; - begin - case(Phase1Page) - 3'd0:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data04In; - end - 3'd1: begin - Phase1R1wSel = Data06In; - end - 3'd2: begin - Phase1R1wSel = Data07In; - end - 3'd3: begin - Phase1R1wSel = Data03In; - end - endcase // case(Phase1Count) - end // case: 3'd0 - 3'd1:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data12In; - end - 3'd1: begin - Phase1R1wSel = Data14In; - end - 3'd2: begin - Phase1R1wSel = Data15In; - end - 3'd3: begin - Phase1R1wSel = Data11In; - end - endcase // case(Phase1Count) - end // case: 3'd1 - 3'd2:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data20In; - end - 3'd1: begin - Phase1R1wSel = Data22In; - end - 3'd2: begin - Phase1R1wSel = Data23In; - end - 3'd3: begin - Phase1R1wSel = Data19In; - end - endcase // case(Phase1Count) - end // case: 3'd2 - 3'd3:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data28In; - end - 3'd1: begin - Phase1R1wSel = Data30In; - end - 3'd2: begin - Phase1R1wSel = Data31In; - end - 3'd3: begin - Phase1R1wSel = Data27In; - end - endcase // case(Phase1Count) - end // case: 3'd3 - 3'd4:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data36In; - end - 3'd1: begin - Phase1R1wSel = Data38In; - end - 3'd2: begin - Phase1R1wSel = Data39In; - end - 3'd3: begin - Phase1R1wSel = Data35In; - end - endcase // case(Phase1Count) - end // case: 3'd4 - 3'd5:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data44In; - end - 3'd1: begin - Phase1R1wSel = Data46In; - end - 3'd2: begin - Phase1R1wSel = Data47In; - end - 3'd3: begin - Phase1R1wSel = Data43In; - end - endcase // case(Phase1Count) - end // case: 3'd5 - 3'd6:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data52In; - end - 3'd1: begin - Phase1R1wSel = Data54In; - end - 3'd2: begin - Phase1R1wSel = Data55In; - end - 3'd3: begin - Phase1R1wSel = Data51In; - end - endcase // case(Phase1Count) - end // case: 3'd6 - 3'd7:begin - case(Phase1Count) - 3'd0: begin - Phase1R1wSel = Data60In; - end - 3'd1: begin - Phase1R1wSel = Data62In; - end - 3'd2: begin - Phase1R1wSel = Data63In; - end - 3'd3: begin - Phase1R1wSel = Data59In; - end - endcase // case(Phase1Count) - end // case: 3'd7 - endcase // case(Phase1Page) - end - endfunction - - assign Phase1R0w = Phase1R0wSel(Phase1Page, Phase1Count, - Data00In, Data01In, Data02In, Data03In, Data04In, Data05In, Data06In, Data07In, Data08In, Data09In, - Data10In, Data11In, Data12In, Data13In, Data14In, Data15In, Data16In, Data17In, Data18In, Data19In, - Data20In, Data21In, Data22In, Data23In, Data24In, Data25In, Data26In, Data27In, Data28In, Data29In, - Data30In, Data31In, Data32In, Data33In, Data34In, Data35In, Data36In, Data37In, Data38In, Data39In, - Data40In, Data41In, Data42In, Data43In, Data44In, Data45In, Data46In, Data47In, Data48In, Data49In, - Data50In, Data51In, Data52In, Data53In, Data54In, Data55In, Data56In, Data57In, Data58In, Data59In, - Data60In, Data61In, Data62In, Data63In - ); - assign Phase1R1w = Phase1R1wSel(Phase1Page, Phase1Count, - Data00In, Data01In, Data02In, Data03In, Data04In, Data05In, Data06In, Data07In, Data08In, Data09In, - Data10In, Data11In, Data12In, Data13In, Data14In, Data15In, Data16In, Data17In, Data18In, Data19In, - Data20In, Data21In, Data22In, Data23In, Data24In, Data25In, Data26In, Data27In, Data28In, Data29In, - Data30In, Data31In, Data32In, Data33In, Data34In, Data35In, Data36In, Data37In, Data38In, Data39In, - Data40In, Data41In, Data42In, Data43In, Data44In, Data45In, Data46In, Data47In, Data48In, Data49In, - Data50In, Data51In, Data52In, Data53In, Data54In, Data55In, Data56In, Data57In, Data58In, Data59In, - Data60In, Data61In, Data62In, Data63In - ); -/* - always @(*) begin - case(Phase1Count) - 3'd0: begin - Phase1C0w <= 16'd2896; // C4_16 - Phase1C1w <= 16'd2896; // C4_16 - Phase1C2w <= 16'd2896; // C4_16 - Phase1C3w <= 16'd2896; // C4_16 - end - 3'd1: begin - Phase1C0w <= 16'd3784; // C2_16 - Phase1C1w <= 16'd1567; // C6_16 - Phase1C2w <= 16'd1567; // C6_16 - Phase1C3w <= 16'd3784; // C2_16 - end - 3'd2: begin - Phase1C0w <= 16'd4017; // C1_16 - Phase1C1w <= 16'd799; // C7_16 - Phase1C2w <= 16'd799; // C7_16 - Phase1C3w <= 16'd4017; // C1_16 - end - 3'd3: begin - Phase1C0w <= 16'd2276; // C5_16 - Phase1C1w <= 16'd3406; // C3_16 - Phase1C2w <= 16'd3406; // C3_16 - Phase1C3w <= 16'd2276; // C5_16 - end - endcase // case(Phase1Count) - end // always @ (*) -*/ - function [15:0] Phase1C0wSel; - input [2:0] Phase1Count; - begin - case(Phase1Count) - 3'd0: begin - Phase1C0wSel = 16'd2896; // C4_16 - end - 3'd1: begin - Phase1C0wSel = 16'd3784; // C2_16 - end - 3'd2: begin - Phase1C0wSel = 16'd4017; // C1_16 - end - 3'd3: begin - Phase1C0wSel = 16'd2276; // C5_16 - end - endcase // case(Phase1Count) - end - endfunction - - function [15:0] Phase1C1wSel; - input [2:0] Phase1Count; - begin - case(Phase1Count) - 3'd0: begin - Phase1C1wSel = 16'd2896; // C4_16 - end - 3'd1: begin - Phase1C1wSel = 16'd1567; // C6_16 - end - 3'd2: begin - Phase1C1wSel = 16'd799; // C7_16 - end - 3'd3: begin - Phase1C1wSel = 16'd3406; // C3_16 - end - endcase // case(Phase1Count) - end - endfunction - - function [15:0] Phase1C2wSel; - input [2:0] Phase1Count; - begin - case(Phase1Count) - 3'd0: begin - Phase1C2wSel = 16'd2896; // C4_16 - end - 3'd1: begin - Phase1C2wSel = 16'd1567; // C6_16 - end - 3'd2: begin - Phase1C2wSel = 16'd799; // C7_16 - end - 3'd3: begin - Phase1C2wSel = 16'd3406; // C3_16 - end - endcase // case(Phase1Count) - end - endfunction - - function [15:0] Phase1C3wSel; - input [2:0] Phase1Count; - begin - case(Phase1Count) - 3'd0: begin - Phase1C3wSel = 16'd2896; // C4_16 - end - 3'd1: begin - Phase1C3wSel = 16'd3784; // C2_16 - end - 3'd2: begin - Phase1C3wSel = 16'd4017; // C1_16 - end - 3'd3: begin - Phase1C3wSel = 16'd2276; // C5_16 - end - endcase // case(Phase1Count) - end - endfunction - - assign Phase1C0w = Phase1C0wSel(Phase1Count); - assign Phase1C1w = Phase1C1wSel(Phase1Count); - assign Phase1C2w = Phase1C2wSel(Phase1Count); - assign Phase1C3w = Phase1C3wSel(Phase1Count); - - reg signed [31:0] Phase1R0r; - reg signed [31:0] Phase1R1r; - reg signed [31:0] Phase1R2r; - reg signed [31:0] Phase1R3r; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase1R0r <= 0; - Phase1R1r <= 0; - Phase1R2r <= 0; - Phase1R3r <= 0; - end else begin - Phase1R0r <= Phase1R0w * Phase1C0w; - Phase1R1r <= Phase1R1w * Phase1C1w; - Phase1R2r <= Phase1R0w * Phase1C2w; - Phase1R3r <= Phase1R1w * Phase1C3w; - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - //------------------------------------------------------------------------- - // Phase2 - // R0: s0,s3,s7,s6 - // R1: s1,s2,s4,s5 - //------------------------------------------------------------------------- - reg Phase2Enable; - reg signed [2:0] Phase2Page; - reg signed [2:0] Phase2Count; - reg Phase2EnableD; - reg signed [2:0] Phase2PageD; - reg signed [2:0] Phase2CountD; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase2Enable <= 1'b0; - Phase2Page <= 3'd0; - Phase2Count <= 3'd0; - Phase2EnableD <= 1'b0; - Phase2PageD <= 3'd0; - Phase2CountD <= 3'd0; - end else begin - Phase2Enable <= Phase1Enable; - Phase2Page <= Phase1Page; - Phase2Count <= Phase1Count; - Phase2EnableD <= Phase2Enable; - Phase2PageD <= Phase2Page; - Phase2CountD <= Phase2Count; - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - wire signed [31:0] Phase2A0w; - wire signed [31:0] Phase2A1w; -/* - always @(*) begin - Phase2A0w <= Phase1R0r + Phase1R1r; - Phase2A1w <= Phase1R2r - Phase1R3r; - end -*/ - assign Phase2A0w = Phase1R0r + Phase1R1r; - assign Phase2A1w = Phase1R2r - Phase1R3r; - - reg signed [31:0] Phase2Reg [0:7]; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase2Reg[0] <= 0; - Phase2Reg[1] <= 0; - Phase2Reg[2] <= 0; - Phase2Reg[3] <= 0; - Phase2Reg[4] <= 0; - Phase2Reg[5] <= 0; - Phase2Reg[6] <= 0; - Phase2Reg[7] <= 0; - end else begin - case(Phase2Count) - 3'd0: begin - Phase2Reg[0] <= Phase2A0w; - Phase2Reg[1] <= Phase2A1w; - end - 3'd1: begin - Phase2Reg[3] <= Phase2A0w; - Phase2Reg[2] <= Phase2A1w; - end - 3'd2: begin - Phase2Reg[7] <= Phase2A0w; - Phase2Reg[4] <= Phase2A1w; - end - 3'd3: begin - Phase2Reg[6] <= Phase2A0w; - Phase2Reg[5] <= Phase2A1w; - end - endcase // case(Phase2Count) - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - //------------------------------------------------------------------------- - // Phase3 - // R0: t0,t1,t4,t7 - // R1: t3,t2,t5,t6 - //------------------------------------------------------------------------- - reg Phase3Enable; - reg [2:0] Phase3Page; - reg [2:0] Phase3Count; - reg Phase3EnableD; - reg [2:0] Phase3PageD; - reg [2:0] Phase3CountD; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase3Enable <= 1'b0; - Phase3Page <= 3'd0; - Phase3Count <= 3'd0; - Phase3EnableD <= 1'b0; - Phase3PageD <= 3'd0; - Phase3CountD <= 3'd0; - end else begin - Phase3Enable <= Phase2EnableD; - Phase3Page <= Phase2PageD; - Phase3Count <= Phase2CountD; - Phase3EnableD <= Phase3Enable; - Phase3PageD <= Phase3Page; - Phase3CountD <= Phase3Count; - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - //reg signed [31:0] Phase3R0w; - //reg signed [31:0] Phase3R1w; - wire signed [31:0] Phase3R0w; - wire signed [31:0] Phase3R1w; - - assign Phase3R0w = (Phase3Count == 3'd0)?Phase2Reg[0]: - (Phase3Count == 3'd1)?Phase2Reg[1]: - (Phase3Count == 3'd2)?Phase2Reg[4]: - (Phase3Count == 3'd3)?Phase2Reg[7]: - 32'd0; - assign Phase3R1w = (Phase3Count == 3'd0)?Phase2Reg[3]: - (Phase3Count == 3'd1)?Phase2Reg[2]: - (Phase3Count == 3'd2)?Phase2Reg[5]: - (Phase3Count == 3'd3)?Phase2Reg[6]: - 32'd0; - - - - wire signed [31:0] Phase3A0w; - wire signed [31:0] Phase3A1w; -/* - always @(*) begin - Phase3A0w <= Phase3R0w + Phase3R1w; - Phase3A1w <= Phase3R0w - Phase3R1w; - end -*/ - assign Phase3A0w = Phase3R0w + Phase3R1w; - assign Phase3A1w = Phase3R0w - Phase3R1w; - - reg signed [31:0] Phase3Reg [0:7]; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase3Reg[0] <= 0; - Phase3Reg[1] <= 0; - Phase3Reg[2] <= 0; - Phase3Reg[3] <= 0; - Phase3Reg[4] <= 0; - Phase3Reg[5] <= 0; - Phase3Reg[6] <= 0; - Phase3Reg[7] <= 0; - end else begin - case(Phase3Count) - 3'd0: begin - Phase3Reg[0] <= Phase3A0w; - Phase3Reg[3] <= Phase3A1w; - end - 3'd1: begin - Phase3Reg[1] <= Phase3A0w; - Phase3Reg[2] <= Phase3A1w; - end - 3'd2: begin - Phase3Reg[4] <= Phase3A0w; - Phase3Reg[5] <= Phase3A1w; - end - 3'd3: begin - Phase3Reg[7] <= Phase3A0w; - Phase3Reg[6] <= Phase3A1w; - end - endcase // case(Phase3Count) - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - //------------------------------------------------------------------------- - // Phase4 - // R0: s6 - // R1: s5 - //------------------------------------------------------------------------- - reg Phase4Enable; - reg [2:0] Phase4Page; - reg [2:0] Phase4Count; - reg Phase4EnableD; - reg [2:0] Phase4PageD; - reg [2:0] Phase4CountD; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase4Enable <= 1'b0; - Phase4Page <= 3'd0; - Phase4Count <= 3'd0; - Phase4EnableD <= 1'b0; - Phase4PageD <= 3'd0; - Phase4CountD <= 3'd0; - end else begin - Phase4Enable <= Phase3EnableD; - Phase4Page <= Phase3PageD; - Phase4Count <= Phase3CountD; - Phase4EnableD <= Phase4Enable; - Phase4PageD <= Phase4Page; - Phase4CountD <= Phase4Count; - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - reg signed [42:0] Phase4R0r; - reg signed [42:0] Phase4R1r; - - wire signed [8:0] C_181; - assign C_181 = 9'h0B5; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase4R0r <= 0; - Phase4R1r <= 0; - end else begin - case(Phase4Count) - 3'd2: begin - Phase4R0r <= (Phase3Reg[6] + Phase3Reg[5]) * C_181; - Phase4R1r <= (Phase3Reg[6] - Phase3Reg[5]) * C_181; - end - endcase // case(Phase4Count) - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - //------------------------------------------------------------------------- - // Phase5 - // R0: B0,B1,B2,B3 - // R1: B7,B6,B5,B4 - //------------------------------------------------------------------------- - reg Phase5Enable; - reg [2:0] Phase5Page; - reg [2:0] Phase5Count; - reg Phase5EnableD; - reg [2:0] Phase5PageD; - reg [2:0] Phase5CountD; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase5Enable <= 1'b0; - Phase5Page <= 3'd0; - Phase5Count <= 3'd0; - Phase5EnableD <= 1'b0; - Phase5PageD <= 3'd0; - Phase5CountD <= 3'd0; - end else begin - Phase5Enable <= Phase4EnableD; - Phase5Page <= Phase4PageD; - Phase5Count <= Phase4CountD; - Phase5EnableD <= Phase5Enable; - Phase5PageD <= Phase5Page; - Phase5CountD <= Phase5Count; - end // else: !if(!rst) - end // always @ (posedge clk or negedge rst) - - wire signed [31:0] Phase5R0w; - wire signed [31:0] Phase5R1w; - assign Phase5R0w = (Phase5Count == 3'd0)?Phase3Reg[0]: - (Phase5Count == 3'd1)?Phase3Reg[1]: - (Phase5Count == 3'd2)?Phase3Reg[2]: - (Phase5Count == 3'd3)?Phase3Reg[3]: - 32'd0; - assign Phase5R1w = (Phase5Count == 3'd0)?Phase3Reg[7]: - (Phase5Count == 3'd1)?Phase4R0r >> 8: - (Phase5Count == 3'd2)?Phase4R1r >> 8: - (Phase5Count == 3'd3)?Phase3Reg[4]: - 32'd0; - - - reg signed [31:0] Phase5R0r; - reg signed [31:0] Phase5R1r; - - always @(posedge clk or negedge rst) begin - if(!rst) begin - Phase5R0r <= 0; - Phase5R1r <= 0; - end else begin - Phase5R0r <= Phase5R0w + Phase5R1w; - Phase5R1r <= Phase5R0w - Phase5R1w; - end - end - - assign DataOutEnable = Phase5EnableD == 1'b1 & Phase5CountD[2] == 1'b0; - assign DataOutPage = Phase5PageD; - assign DataOutCount = Phase5CountD[1:0]; - - assign Data0Out = Phase5R0r[26:11]; - assign Data1Out = Phase5R1r[26:11]; - -endmodule // jpeg_idctx Index: djpeg/trunk/src/jpeg_haffuman.v =================================================================== --- djpeg/trunk/src/jpeg_haffuman.v (revision 8) +++ djpeg/trunk/src/jpeg_haffuman.v (nonexistent) @@ -1,404 +0,0 @@ -//--------------------------------------------------------------------------- -// File Name : jpeg_haffuman.v -// Module Name : jpeg_haffuman -// Description : Haffuam top module -// Project : JPEG Decoder -// Belong to : -// Author : H.Ishihara -// E-Mail : hidemi@sweetcafe.jp -// HomePage : http://www.sweetcafe.jp/ -// Date : 2006/10/01 -// Rev. : 1.1 -//--------------------------------------------------------------------------- -// Rev. Date Description -//--------------------------------------------------------------------------- -// 1.01 2006/10/01 1st Release -//--------------------------------------------------------------------------- -// $Id: -//--------------------------------------------------------------------------- -`timescale 1ps / 1ps - -module jpeg_haffuman - ( - rst, - clk, - - // DQT Table - DqtInEnable, - DqtInColor, - DqtInCount, - DqtInData, - - // DHT Table - DhtInEnable, - DhtInColor, - DhtInCount, - DhtInData, - - // Haffuman Table - HaffumanTableEnable, // Table Data In Enable - HaffumanTableColor, // Haffuman Table Color Number - HaffumanTableCount, // Table Number - HaffumanTableCode, // Haffuman Table Code - HaffumanTableStart, // Haffuman Table Start Number - - // Haffuman Decode - DataInRun, // Data In Start - DataInEnable, // Data In Enable - DataIn, // Data In - - DecodeUseBit, // Used Data Bit - DecodeUseWidth, // Used Data Width - - // Data Out - DataOutIdle, - DataOutEnable, - DataOutColor, - DataOutSel, - Data00Reg, - Data01Reg, - Data02Reg, - Data03Reg, - Data04Reg, - Data05Reg, - Data06Reg, - Data07Reg, - Data08Reg, - Data09Reg, - Data10Reg, - Data11Reg, - Data12Reg, - Data13Reg, - Data14Reg, - Data15Reg, - Data16Reg, - Data17Reg, - Data18Reg, - Data19Reg, - Data20Reg, - Data21Reg, - Data22Reg, - Data23Reg, - Data24Reg, - Data25Reg, - Data26Reg, - Data27Reg, - Data28Reg, - Data29Reg, - Data30Reg, - Data31Reg, - Data32Reg, - Data33Reg, - Data34Reg, - Data35Reg, - Data36Reg, - Data37Reg, - Data38Reg, - Data39Reg, - Data40Reg, - Data41Reg, - Data42Reg, - Data43Reg, - Data44Reg, - Data45Reg, - Data46Reg, - Data47Reg, - Data48Reg, - Data49Reg, - Data50Reg, - Data51Reg, - Data52Reg, - Data53Reg, - Data54Reg, - Data55Reg, - Data56Reg, - Data57Reg, - Data58Reg, - Data59Reg, - Data60Reg, - Data61Reg, - Data62Reg, - Data63Reg, - DataOutRelease - - ); - - input rst; - input clk; - - // DQT Table - input DqtInEnable; - input DqtInColor; - input [5:0] DqtInCount; - input [7:0] DqtInData; - - // DHT Table - input DhtInEnable; - input [1:0] DhtInColor; - input [7:0] DhtInCount; - input [7:0] DhtInData; - - input HaffumanTableEnable; // Table Data In Enable - input [1:0] HaffumanTableColor; - input [3:0] HaffumanTableCount; // Table Number - input [15:0] HaffumanTableCode; // Haffuman Table Data - input [7:0] HaffumanTableStart; // Haffuman Table Start Number - - input DataInRun; - input DataInEnable; // Data In Enable - input [31:0] DataIn; // Data In - - output DecodeUseBit; - output [6:0] DecodeUseWidth; - - // Data Out - input DataOutIdle; - output DataOutEnable; - output [2:0] DataOutColor; - input DataOutSel; - output [15:0] Data00Reg; - output [15:0] Data01Reg; - output [15:0] Data02Reg; - output [15:0] Data03Reg; - output [15:0] Data04Reg; - output [15:0] Data05Reg; - output [15:0] Data06Reg; - output [15:0] Data07Reg; - output [15:0] Data08Reg; - output [15:0] Data09Reg; - output [15:0] Data10Reg; - output [15:0] Data11Reg; - output [15:0] Data12Reg; - output [15:0] Data13Reg; - output [15:0] Data14Reg; - output [15:0] Data15Reg; - output [15:0] Data16Reg; - output [15:0] Data17Reg; - output [15:0] Data18Reg; - output [15:0] Data19Reg; - output [15:0] Data20Reg; - output [15:0] Data21Reg; - output [15:0] Data22Reg; - output [15:0] Data23Reg; - output [15:0] Data24Reg; - output [15:0] Data25Reg; - output [15:0] Data26Reg; - output [15:0] Data27Reg; - output [15:0] Data28Reg; - output [15:0] Data29Reg; - output [15:0] Data30Reg; - output [15:0] Data31Reg; - output [15:0] Data32Reg; - output [15:0] Data33Reg; - output [15:0] Data34Reg; - output [15:0] Data35Reg; - output [15:0] Data36Reg; - output [15:0] Data37Reg; - output [15:0] Data38Reg; - output [15:0] Data39Reg; - output [15:0] Data40Reg; - output [15:0] Data41Reg; - output [15:0] Data42Reg; - output [15:0] Data43Reg; - output [15:0] Data44Reg; - output [15:0] Data45Reg; - output [15:0] Data46Reg; - output [15:0] Data47Reg; - output [15:0] Data48Reg; - output [15:0] Data49Reg; - output [15:0] Data50Reg; - output [15:0] Data51Reg; - output [15:0] Data52Reg; - output [15:0] Data53Reg; - output [15:0] Data54Reg; - output [15:0] Data55Reg; - output [15:0] Data56Reg; - output [15:0] Data57Reg; - output [15:0] Data58Reg; - output [15:0] Data59Reg; - output [15:0] Data60Reg; - output [15:0] Data61Reg; - output [15:0] Data62Reg; - output [15:0] Data63Reg; - input DataOutRelease; - - wire HmDqtColor; - wire [5:0] HmDqtNumber; - wire [7:0] HmDqtData; - - // DQT Table - jpeg_dqt u_jpeg_dqt( - .rst(rst), - .clk(clk), - - .DataInEnable ( DqtInEnable ), - .DataInColor ( DqtInColor ), - .DataInCount ( DqtInCount[5:0] ), - .DataIn ( DqtInData ), - - .TableColor ( HmDqtColor ), - .TableNumber ( HmDqtNumber ), - .TableData ( HmDqtData ) - ); - - wire [1:0] HmDhtColor; - wire [7:0] HmDhtNumber; - wire [3:0] HmDhtZero; - wire [3:0] HmDhtWidth; - - jpeg_dht u_jpeg_dht( - .rst(rst), - .clk(clk), - - .DataInEnable ( DhtInEnable ), - .DataInColor ( DhtInColor ), - .DataInCount ( DhtInCount ), - .DataIn ( DhtInData ), - - .ColorNumber ( HmDhtColor ), - .TableNumber ( HmDhtNumber ), - .ZeroTable ( HmDhtZero ), - .WidhtTable ( HmDhtWidth ) - ); - - //wire [2:0] HmDecColor; - wire [5:0] HmDecCount; - wire [15:0] HmDecData; - - wire HmOutEnable; - wire [2:0] HmOutColor; - - jpeg_hm_decode u_jpeg_hm_decode( - .rst(rst), - .clk(clk), - - // Haffuman Table - .HaffumanTableEnable ( HaffumanTableEnable ), - .HaffumanTableColor ( HaffumanTableColor ), - .HaffumanTableCount ( HaffumanTableCount ), - .HaffumanTableCode ( HaffumanTableCode ), - .HaffumanTableStart ( HaffumanTableStart ), - - // Haffuman Decode - .DataInRun ( DataInRun ), - .DataInEnable ( DataInEnable ), - .DataIn ( DataIn ), - - // Haffuman Table List - .DhtColor ( HmDhtColor ), - .DhtNumber ( HmDhtNumber ), - .DhtZero ( HmDhtZero ), - .DhtWidth ( HmDhtWidth ), - - // DQT Table - .DqtColor ( HmDqtColor ), - .DqtNumber ( HmDqtNumber ), - .DqtData ( HmDqtData ), - - .DataOutIdle ( HmOutIdle ), - .DataOutEnable ( HmOutEnable ), - .DataOutColor ( HmOutColor ), - - // Output decode data - .DecodeUseBit ( DecodeUseBit ), - .DecodeUseWidth ( DecodeUseWidth ), - - .DecodeEnable ( HmDecEnable ), - .DecodeColor ( ), - .DecodeCount ( HmDecCount ), - .DecodeZero ( ), - .DecodeCode ( HmDecData ) - ); - - wire BankARelease; - wire BankBRelease; - - assign BankARelease = DataOutSel == 1'b0 & DataOutRelease; - assign BankBRelease = DataOutSel == 1'b1 & DataOutRelease; - - - jpeg_ziguzagu u_jpeg_ziguzagu( - .rst(rst), - .clk(clk), - - .DataInEnable ( HmDecEnable ), - .DataInAddress ( HmDecCount ), - .DataInColor ( HmOutColor ), - .DataInIdle ( HmOutIdle ), - .DataIn ( HmDecData ), - - .HaffumanEndEnable(HmOutEnable), - - .DataOutEnable( DataOutEnable), - .DataOutColor ( DataOutColor), - .DataOutSel(DataOutSel), - .Data00Reg( Data00Reg ), - .Data01Reg( Data01Reg ), - .Data02Reg( Data02Reg ), - .Data03Reg( Data03Reg ), - .Data04Reg( Data04Reg ), - .Data05Reg( Data05Reg ), - .Data06Reg( Data06Reg ), - .Data07Reg( Data07Reg ), - .Data08Reg( Data08Reg ), - .Data09Reg( Data09Reg ), - .Data10Reg( Data10Reg ), - .Data11Reg( Data11Reg ), - .Data12Reg( Data12Reg ), - .Data13Reg( Data13Reg ), - .Data14Reg( Data14Reg ), - .Data15Reg( Data15Reg ), - .Data16Reg( Data16Reg ), - .Data17Reg( Data17Reg ), - .Data18Reg( Data18Reg ), - .Data19Reg( Data19Reg ), - .Data20Reg( Data20Reg ), - .Data21Reg( Data21Reg ), - .Data22Reg( Data22Reg ), - .Data23Reg( Data23Reg ), - .Data24Reg( Data24Reg ), - .Data25Reg( Data25Reg ), - .Data26Reg( Data26Reg ), - .Data27Reg( Data27Reg ), - .Data28Reg( Data28Reg ), - .Data29Reg( Data29Reg ), - .Data30Reg( Data30Reg ), - .Data31Reg( Data31Reg ), - .Data32Reg( Data32Reg ), - .Data33Reg( Data33Reg ), - .Data34Reg( Data34Reg ), - .Data35Reg( Data35Reg ), - .Data36Reg( Data36Reg ), - .Data37Reg( Data37Reg ), - .Data38Reg( Data38Reg ), - .Data39Reg( Data39Reg ), - .Data40Reg( Data40Reg ), - .Data41Reg( Data41Reg ), - .Data42Reg( Data42Reg ), - .Data43Reg( Data43Reg ), - .Data44Reg( Data44Reg ), - .Data45Reg( Data45Reg ), - .Data46Reg( Data46Reg ), - .Data47Reg( Data47Reg ), - .Data48Reg( Data48Reg ), - .Data49Reg( Data49Reg ), - .Data50Reg( Data50Reg ), - .Data51Reg( Data51Reg ), - .Data52Reg( Data52Reg ), - .Data53Reg( Data53Reg ), - .Data54Reg( Data54Reg ), - .Data55Reg( Data55Reg ), - .Data56Reg( Data56Reg ), - .Data57Reg( Data57Reg ), - .Data58Reg( Data58Reg ), - .Data59Reg( Data59Reg ), - .Data60Reg( Data60Reg ), - .Data61Reg( Data61Reg ), - .Data62Reg( Data62Reg ), - .Data63Reg( Data63Reg ), - - .BankARelease(BankARelease), - .BankBRelease(BankBRelease) - ); - -endmodule // jpeg_haffuman Index: djpeg/trunk/src/jpeg_regdata.v =================================================================== --- djpeg/trunk/src/jpeg_regdata.v (revision 8) +++ djpeg/trunk/src/jpeg_regdata.v (revision 9) @@ -1,209 +1,260 @@ //--------------------------------------------------------------------------- // File Name : jpeg_regdata.v // Module Name : jpeg_regdata -// Description : get Data -// Project : JPEG Decoder +// 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 +// Author : H.Ishihara +// E-Mail : hidemi@sweetcafe.jp +// HomePage : http://www.sweetcafe.jp/ +// Date : 2008/02/27 +// Rev. : 2.00 //--------------------------------------------------------------------------- -// Rev. Date Description +// 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. +// 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) +// 1.04 2007/10/16 Modify (RegData[31:0] == 0xFF00FF00) process +// not convert 0xFF00 -> 0xFF after convert [7:0] == 0xFF +// 2.00 2008/02/27 Modify RegValid, when ImageEnable == 1 then RegWidth > 64 +// when ImageEnable == 0 then RegWidth > 32 +// Add SliceData Pattern //--------------------------------------------------------------------------- -// $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; + 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 [6:0] RegWidth; + reg CheckMode; + reg DataEnd; + + assign RegValid = (ImageEnable)?(RegWidth > 7'd64):(RegWidth > 7'd32); + assign DataInRead = ((RegValid == 1'b0) & (DataInEnable == 1'b1) & (DataEnd == 1'b0)); + + always @(posedge clk or negedge rst) begin + if(!rst) begin + RegData <= 96'd0; + RegWidth <= 7'd0; + CheckMode <= 1'b0; + end else begin + if(DataEnd == 1'b1 & ProcessIdle == 1'b1) begin + RegData <= 96'd0; + RegWidth <= 7'd0; + CheckMode <= 1'b0; + end else if(RegValid == 1'b0 & (DataInEnable == 1'b1 | DataEnd == 1'b1)) begin + if(ImageEnable == 1'b1) begin + if(RegData[39: 8] == 32'hFF00FF00 & CheckMode != 1'b1) begin + RegWidth <= RegWidth + 7'd16; + RegData[95:64] <= {8'h00,RegData[71:48]}; + RegData[63:32] <= {RegData[47:40],16'hFFFF,RegData[7:0]}; + CheckMode <= 1'b0; + end else if(RegData[39:24] == 16'hFF00 & RegData[15: 0] == 16'hFF00 & CheckMode != 1'b1) begin + RegWidth <= RegWidth + 7'd16; + RegData[95:64] <= {8'h00,RegData[71:48]}; + RegData[63:32] <= {RegData[47:40],8'hFF,RegData[23:16],8'hFF}; + CheckMode <= 1'b1; + end else if(RegData[31: 0] == 32'hFF00FF00) begin + RegWidth <= RegWidth + 7'd16; + RegData[95:64] <= {16'h0000,RegData[63:48]}; + RegData[63:32] <= {RegData[47:32],16'hFFFF}; + CheckMode <= 1'b1; + end else if(RegData[39:24] == 16'hFF00 & CheckMode != 1'b1) begin + RegWidth <= RegWidth + 7'd24; + RegData[95:64] <= {RegData[71:40]}; + RegData[63:32] <= {8'hFF,RegData[23:0]}; + CheckMode <= 1'b0; + end else if(RegData[31:16] == 16'hFF00) begin + RegWidth <= RegWidth + 7'd24; + RegData[95:64] <= {RegData[71:40]}; + RegData[63:32] <= {RegData[39:32],8'hFF,RegData[15:0]}; + CheckMode <= 1'b0; + end else if(RegData[23: 8] == 16'hFF00) begin + RegWidth <= RegWidth + 7'd24; + RegData[95:64] <= {RegData[71:40]}; + RegData[63:32] <= {RegData[39:32],RegData[31:24],8'hFF,RegData[7:0]}; + CheckMode <= 1'b0; + end else if(RegData[15: 0] == 16'hFF00) begin + RegWidth <= RegWidth + 7'd24; + RegData[95:64] <= {RegData[71:40]}; + RegData[63:32] <= {RegData[39:32],RegData[31:16],8'hFF}; + CheckMode <= 1'b1; + end else begin + RegWidth <= RegWidth + 7'd32; + RegData[95:64] <= RegData[63:32]; + RegData[63:32] <= RegData[31:0]; + CheckMode <= 1'b0; + end 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 + RegWidth <= RegWidth + 7'd32; + RegData[95:64] <= RegData[63:32]; + RegData[63:32] <= RegData[31:0]; + CheckMode <= 1'b0; 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 - 7'd8; + end else if(UseWord == 1'b1) begin + RegWidth <= RegWidth - 7'd16; + 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 + + // PickUp with End of Jpeg Data + 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 & CheckMode != 1'b1) | 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'd33: SliceData = RegData[32: 1]; + //8'd34: SliceData = RegData[33: 2]; + //8'd35: SliceData = RegData[34: 3]; + //8'd36: SliceData = RegData[35: 4]; + //8'd37: SliceData = RegData[36: 5]; + //8'd38: SliceData = RegData[37: 6]; + //8'd39: SliceData = RegData[38: 7]; + 8'd40: SliceData = RegData[39: 8]; + //8'd41: SliceData = RegData[40: 9]; + //8'd42: SliceData = RegData[41:10]; + //8'd43: SliceData = RegData[42:11]; + //8'd44: SliceData = RegData[43:12]; + //8'd45: SliceData = RegData[44:13]; + //8'd46: SliceData = RegData[45:14]; + //8'd47: SliceData = RegData[46:15]; + 8'd48: SliceData = RegData[47:16]; + //8'd49: SliceData = RegData[48:17]; + //8'd50: SliceData = RegData[49:18]; + //8'd51: SliceData = RegData[50:19]; + //8'd52: SliceData = RegData[51:20]; + //8'd53: SliceData = RegData[52:21]; + //8'd54: SliceData = RegData[53:22]; + //8'd55: SliceData = RegData[54:23]; + 8'd56: SliceData = RegData[55:24]; + //8'd57: SliceData = RegData[56:25]; + //8'd58: SliceData = RegData[57:26]; + //8'd59: SliceData = RegData[58:27]; + //8'd60: SliceData = RegData[59:28]; + //8'd61: SliceData = RegData[60:29]; + //8'd62: SliceData = RegData[61:30]; + //8'd63: SliceData = RegData[62:31]; + 8'd64: SliceData = RegData[63:32]; + 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 - function [31:0] SliceData; - input [95:0] RegData; - input [7:0] RegWidth; + reg OutEnable; + reg PreEnable; + reg [31:0] DataOut; - 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 + always @(posedge clk or negedge rst) begin + if(!rst) begin + OutEnable <= 1'b0; + PreEnable <= 1'b0; + DataOut <= 32'h00000000; + end else begin + if(DataEnd == 1'b1 & ProcessIdle == 1'b1) begin + OutEnable <= 1'b0; + PreEnable <= 1'b0; + DataOut <= 32'h00000000; + end else begin + OutEnable <= RegValid; + PreEnable <= (UseBit == 1'b1 | UseByte == 1'b1 | UseWord == 1'b1); + DataOut <= SliceData(RegData,RegWidth); + end end + end + + assign DataOutEnable = (PreEnable == 1'b0)?OutEnable:1'b0; - assign DataOutEnable = (PreEnable == 1'b0)?OutEnable:1'b0; - endmodule - - - \ No newline at end of file
/djpeg/trunk/src/jpeg_hm_decode.v
1,860 → 1,790
//---------------------------------------------------------------------------
// File Name : jpeg_hm_decode.v
// Module Name : jpeg_hm_decode
// Description : Decode of Haffuman data
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_hm_decode.v
// Module Name : jpeg_hm_decode
// Description : Decode of Huffman data
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2008/03/23
// Rev. : 2.0
//---------------------------------------------------------------------------
// Rev. Date Description
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 1.02 2006/10/04 move for a comment widh OutData,OutDhtNumber register.
// remove a ProcessColorNumber,tempPlace register.
// remove a ProcessColorNumber,tempPlace register.
// 2.00 2008/03/23 Replace Space.
// ReTiming DataOutEnable
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_hm_decode
(
rst, // Reset
clk, // Clock
module jpeg_hm_decode(
rst, // Reset
clk, // Clock
 
// Haffuman Table
HaffumanTableEnable, // Table Data In Enable
HaffumanTableColor, // Haffuman Table Color Number
HaffumanTableCount, // Table Number
HaffumanTableCode, // Haffuman Table Code
HaffumanTableStart, // Haffuman Table Start Number
// Huffman Table
HuffmanTableEnable, // Table Data In Enable
HuffmanTableColor, // Huffman Table Color Number
HuffmanTableCount, // Table Number
HuffmanTableCode, // Huffman Table Code
HuffmanTableStart, // Huffman Table Start Number
 
// Haffuman Decode
DataInRun, // Data In Start
DataInEnable, // Data In Enable
DataIn, // Data In
// Huffman Decode
DataInRun, // Data In Start
DataInEnable, // Data In Enable
DataIn, // Data In
 
// DHT table
DhtColor, // Color Number
DhtNumber, // Decode Dht Number
DhtZero, // Zero Count of Dht Number
DhtWidth, // Data Width of Dht Number
// DHT table
DhtColor, // Color Number
DhtNumber, // Decode Dht Number
DhtZero, // Zero Count of Dht Number
DhtWidth, // Data Width of Dht Number
 
// DQT Table
DqtColor, // Color Number
DqtNumber, // Dqt Number
DqtData, // Dqt Data
// DQT Table
DqtColor, // Color Number
DqtNumber, // Dqt Number
DqtData, // Dqt Data
 
//
DataOutIdle,
DataOutEnable,
DataOutColor,
// Output decode data
DecodeUseBit, // Used Data Bit
DecodeUseWidth, // Used Data Width
DecodeEnable, // Data Out Enable
DecodeColor, // Data Out Enable
DecodeCount, // Data Out Enable
DecodeZero, // Data Out with Zero Count
DecodeCode // Data Out with Code
);
//
DataOutIdle,
DataOutEnable,
DataOutColor,
// Output decode data
DecodeUseBit, // Used Data Bit
DecodeUseWidth, // Used Data Width
DecodeEnable, // Data Out Enable
DecodeColor, // Data Out Enable
DecodeCount, // Data Out Enable
DecodeZero, // Data Out with Zero Count
DecodeCode // Data Out with Code
);
 
//--------------------------------------------------------------------------
// Input/Output
//--------------------------------------------------------------------------
input rst,clk; // Reset and Clock
input HaffumanTableEnable; // Table Data In Enable
input [1:0] HaffumanTableColor;
input [3:0] HaffumanTableCount; // Table Number
input [15:0] HaffumanTableCode; // Haffuman Table Data
input [7:0] HaffumanTableStart; // Haffuman Table Start Number
//--------------------------------------------------------------------------
// Input/Output
//--------------------------------------------------------------------------
input rst,clk; // Reset and Clock
input HuffmanTableEnable; // Table Data In Enable
input [1:0] HuffmanTableColor;
input [3:0] HuffmanTableCount; // Table Number
input [15:0] HuffmanTableCode; // Huffman Table Data
input [7:0] HuffmanTableStart; // Huffman Table Start Number
 
input DataInRun;
input DataInEnable; // Data In Enable
input [31:0] DataIn; // Data In
input DataInRun;
input DataInEnable; // Data In Enable
input [31:0] DataIn; // Data In
 
output [1:0] DhtColor;
output [7:0] DhtNumber; // Decode Dht Number
input [3:0] DhtZero; // Zero Count of Dht Number
input [3:0] DhtWidth; // Data Width of Dht Number
output [1:0] DhtColor;
output [7:0] DhtNumber; // Decode Dht Number
input [3:0] DhtZero; // Zero Count of Dht Number
input [3:0] DhtWidth; // Data Width of Dht Number
 
output DqtColor;
output [5:0] DqtNumber;
input [7:0] DqtData;
output DqtColor;
output [5:0] DqtNumber;
input [7:0] DqtData;
 
input DataOutIdle;
output DataOutEnable;
output [2:0] DataOutColor;
output DecodeUseBit;
output [6:0] DecodeUseWidth; // Used Data Width
output DecodeEnable; // Data Out Enable
output [2:0] DecodeColor;
output [5:0] DecodeCount;
output [3:0] DecodeZero; // Data Out with Zero Count
output [15:0] DecodeCode; // Data Out with Code
input DataOutIdle;
output DataOutEnable;
output [2:0] DataOutColor;
output DecodeUseBit;
output [6:0] DecodeUseWidth; // Used Data Width
output DecodeEnable; // Data Out Enable
output [2:0] DecodeColor;
output [5:0] DecodeCount;
output [3:0] DecodeZero; // Data Out with Zero Count
output [15:0] DecodeCode; // Data Out with Code
 
//--------------------------------------------------------------------------
// Register Haffuman Table(YCbCr)
//--------------------------------------------------------------------------
// Y-DC Haffuman Table
reg [15:0] HaffumanTable0r [0:15]; // Y-DC Haffuman Table
reg [15:0] HaffumanTable1r [0:15]; // Y-AC Haffuman Table
reg [15:0] HaffumanTable2r [0:15]; // C-DC Haffuman Table
reg [15:0] HaffumanTable3r [0:15]; // C-AC Haffuman Table
//--------------------------------------------------------------------------
// Register Huffman Table(YCbCr)
//--------------------------------------------------------------------------
// Y-DC Huffman Table
reg [15:0] HuffmanTable0r [0:15]; // Y-DC Huffman Table
reg [15:0] HuffmanTable1r [0:15]; // Y-AC Huffman Table
reg [15:0] HuffmanTable2r [0:15]; // C-DC Huffman Table
reg [15:0] HuffmanTable3r [0:15]; // C-AC Huffman Table
 
reg [15:0] HaffumanNumber0r [0:15]; // Y-DC Haffuman Number
reg [15:0] HaffumanNumber1r [0:15]; // Y-AC Haffuman Number
reg [15:0] HaffumanNumber2r [0:15]; // C-DC Haffuman Number
reg [15:0] HaffumanNumber3r [0:15]; // C-AC Haffuman Number
reg [7:0] HuffmanNumber0r [0:15]; // Y-DC Huffman Number
reg [7:0] HuffmanNumber1r [0:15]; // Y-AC Huffman Number
reg [7:0] HuffmanNumber2r [0:15]; // C-DC Huffman Number
reg [7:0] HuffmanNumber3r [0:15]; // C-AC Huffman Number
 
integer i;
always @(posedge clk or negedge rst) begin
if(!rst) begin
HaffumanTable0r[0] <= 16'h0000;
HaffumanNumber0r[0] <= 8'h00;
HaffumanTable1r[0] <= 16'h0000;
HaffumanNumber1r[0] <= 8'h00;
HaffumanTable2r[0] <= 16'h0000;
HaffumanNumber2r[0] <= 8'h00;
HaffumanTable3r[0] <= 16'h0000;
HaffumanNumber3r[0] <= 8'h00;
always @(posedge clk or negedge rst) begin
if(!rst) begin
HuffmanTable0r[0] <= 16'h0000;
HuffmanNumber0r[0] <= 8'h00;
HuffmanTable1r[0] <= 16'h0000;
HuffmanNumber1r[0] <= 8'h00;
HuffmanTable2r[0] <= 16'h0000;
HuffmanNumber2r[0] <= 8'h00;
HuffmanTable3r[0] <= 16'h0000;
HuffmanNumber3r[0] <= 8'h00;
 
HaffumanTable0r[1] <= 16'h0000;
HaffumanNumber0r[1] <= 8'h00;
HaffumanTable1r[1] <= 16'h0000;
HaffumanNumber1r[1] <= 8'h00;
HaffumanTable2r[1] <= 16'h0000;
HaffumanNumber2r[1] <= 8'h00;
HaffumanTable3r[1] <= 16'h0000;
HaffumanNumber3r[1] <= 8'h00;
HuffmanTable0r[1] <= 16'h0000;
HuffmanNumber0r[1] <= 8'h00;
HuffmanTable1r[1] <= 16'h0000;
HuffmanNumber1r[1] <= 8'h00;
HuffmanTable2r[1] <= 16'h0000;
HuffmanNumber2r[1] <= 8'h00;
HuffmanTable3r[1] <= 16'h0000;
HuffmanNumber3r[1] <= 8'h00;
 
HaffumanTable0r[2] <= 16'h0000;
HaffumanNumber0r[2] <= 8'h00;
HaffumanTable1r[2] <= 16'h0000;
HaffumanNumber1r[2] <= 8'h00;
HaffumanTable2r[2] <= 16'h0000;
HaffumanNumber2r[2] <= 8'h00;
HaffumanTable3r[2] <= 16'h0000;
HaffumanNumber3r[2] <= 8'h00;
HuffmanTable0r[2] <= 16'h0000;
HuffmanNumber0r[2] <= 8'h00;
HuffmanTable1r[2] <= 16'h0000;
HuffmanNumber1r[2] <= 8'h00;
HuffmanTable2r[2] <= 16'h0000;
HuffmanNumber2r[2] <= 8'h00;
HuffmanTable3r[2] <= 16'h0000;
HuffmanNumber3r[2] <= 8'h00;
 
HaffumanTable0r[3] <= 16'h0000;
HaffumanNumber0r[3] <= 8'h00;
HaffumanTable1r[3] <= 16'h0000;
HaffumanNumber1r[3] <= 8'h00;
HaffumanTable2r[3] <= 16'h0000;
HaffumanNumber2r[3] <= 8'h00;
HaffumanTable3r[3] <= 16'h0000;
HaffumanNumber3r[3] <= 8'h00;
HuffmanTable0r[3] <= 16'h0000;
HuffmanNumber0r[3] <= 8'h00;
HuffmanTable1r[3] <= 16'h0000;
HuffmanNumber1r[3] <= 8'h00;
HuffmanTable2r[3] <= 16'h0000;
HuffmanNumber2r[3] <= 8'h00;
HuffmanTable3r[3] <= 16'h0000;
HuffmanNumber3r[3] <= 8'h00;
 
HaffumanTable0r[4] <= 16'h0000;
HaffumanNumber0r[4] <= 8'h00;
HaffumanTable1r[4] <= 16'h0000;
HaffumanNumber1r[4] <= 8'h00;
HaffumanTable2r[4] <= 16'h0000;
HaffumanNumber2r[4] <= 8'h00;
HaffumanTable3r[4] <= 16'h0000;
HaffumanNumber3r[4] <= 8'h00;
HuffmanTable0r[4] <= 16'h0000;
HuffmanNumber0r[4] <= 8'h00;
HuffmanTable1r[4] <= 16'h0000;
HuffmanNumber1r[4] <= 8'h00;
HuffmanTable2r[4] <= 16'h0000;
HuffmanNumber2r[4] <= 8'h00;
HuffmanTable3r[4] <= 16'h0000;
HuffmanNumber3r[4] <= 8'h00;
 
HaffumanTable0r[5] <= 16'h0000;
HaffumanNumber0r[5] <= 8'h00;
HaffumanTable1r[5] <= 16'h0000;
HaffumanNumber1r[5] <= 8'h00;
HaffumanTable2r[5] <= 16'h0000;
HaffumanNumber2r[5] <= 8'h00;
HaffumanTable3r[5] <= 16'h0000;
HaffumanNumber3r[5] <= 8'h00;
HuffmanTable0r[5] <= 16'h0000;
HuffmanNumber0r[5] <= 8'h00;
HuffmanTable1r[5] <= 16'h0000;
HuffmanNumber1r[5] <= 8'h00;
HuffmanTable2r[5] <= 16'h0000;
HuffmanNumber2r[5] <= 8'h00;
HuffmanTable3r[5] <= 16'h0000;
HuffmanNumber3r[5] <= 8'h00;
 
HaffumanTable0r[6] <= 16'h0000;
HaffumanNumber0r[6] <= 8'h00;
HaffumanTable1r[6] <= 16'h0000;
HaffumanNumber1r[6] <= 8'h00;
HaffumanTable2r[6] <= 16'h0000;
HaffumanNumber2r[6] <= 8'h00;
HaffumanTable3r[6] <= 16'h0000;
HaffumanNumber3r[6] <= 8'h00;
HuffmanTable0r[6] <= 16'h0000;
HuffmanNumber0r[6] <= 8'h00;
HuffmanTable1r[6] <= 16'h0000;
HuffmanNumber1r[6] <= 8'h00;
HuffmanTable2r[6] <= 16'h0000;
HuffmanNumber2r[6] <= 8'h00;
HuffmanTable3r[6] <= 16'h0000;
HuffmanNumber3r[6] <= 8'h00;
 
HaffumanTable0r[7] <= 16'h0000;
HaffumanNumber0r[7] <= 8'h00;
HaffumanTable1r[7] <= 16'h0000;
HaffumanNumber1r[7] <= 8'h00;
HaffumanTable2r[7] <= 16'h0000;
HaffumanNumber2r[7] <= 8'h00;
HaffumanTable3r[7] <= 16'h0000;
HaffumanNumber3r[7] <= 8'h00;
HuffmanTable0r[7] <= 16'h0000;
HuffmanNumber0r[7] <= 8'h00;
HuffmanTable1r[7] <= 16'h0000;
HuffmanNumber1r[7] <= 8'h00;
HuffmanTable2r[7] <= 16'h0000;
HuffmanNumber2r[7] <= 8'h00;
HuffmanTable3r[7] <= 16'h0000;
HuffmanNumber3r[7] <= 8'h00;
 
HaffumanTable0r[8] <= 16'h0000;
HaffumanNumber0r[8] <= 8'h00;
HaffumanTable1r[8] <= 16'h0000;
HaffumanNumber1r[8] <= 8'h00;
HaffumanTable2r[8] <= 16'h0000;
HaffumanNumber2r[8] <= 8'h00;
HaffumanTable3r[8] <= 16'h0000;
HaffumanNumber3r[8] <= 8'h00;
HuffmanTable0r[8] <= 16'h0000;
HuffmanNumber0r[8] <= 8'h00;
HuffmanTable1r[8] <= 16'h0000;
HuffmanNumber1r[8] <= 8'h00;
HuffmanTable2r[8] <= 16'h0000;
HuffmanNumber2r[8] <= 8'h00;
HuffmanTable3r[8] <= 16'h0000;
HuffmanNumber3r[8] <= 8'h00;
 
HaffumanTable0r[9] <= 16'h0000;
HaffumanNumber0r[9] <= 8'h00;
HaffumanTable1r[9] <= 16'h0000;
HaffumanNumber1r[9] <= 8'h00;
HaffumanTable2r[9] <= 16'h0000;
HaffumanNumber2r[9] <= 8'h00;
HaffumanTable3r[9] <= 16'h0000;
HaffumanNumber3r[9] <= 8'h00;
HuffmanTable0r[9] <= 16'h0000;
HuffmanNumber0r[9] <= 8'h00;
HuffmanTable1r[9] <= 16'h0000;
HuffmanNumber1r[9] <= 8'h00;
HuffmanTable2r[9] <= 16'h0000;
HuffmanNumber2r[9] <= 8'h00;
HuffmanTable3r[9] <= 16'h0000;
HuffmanNumber3r[9] <= 8'h00;
 
HaffumanTable0r[10] <= 16'h0000;
HaffumanNumber0r[10] <= 8'h00;
HaffumanTable1r[10] <= 16'h0000;
HaffumanNumber1r[10] <= 8'h00;
HaffumanTable2r[10] <= 16'h0000;
HaffumanNumber2r[10] <= 8'h00;
HaffumanTable3r[10] <= 16'h0000;
HaffumanNumber3r[10] <= 8'h00;
HuffmanTable0r[10] <= 16'h0000;
HuffmanNumber0r[10] <= 8'h00;
HuffmanTable1r[10] <= 16'h0000;
HuffmanNumber1r[10] <= 8'h00;
HuffmanTable2r[10] <= 16'h0000;
HuffmanNumber2r[10] <= 8'h00;
HuffmanTable3r[10] <= 16'h0000;
HuffmanNumber3r[10] <= 8'h00;
 
HaffumanTable0r[11] <= 16'h0000;
HaffumanNumber0r[11] <= 8'h00;
HaffumanTable1r[11] <= 16'h0000;
HaffumanNumber1r[11] <= 8'h00;
HaffumanTable2r[11] <= 16'h0000;
HaffumanNumber2r[11] <= 8'h00;
HaffumanTable3r[11] <= 16'h0000;
HaffumanNumber3r[11] <= 8'h00;
HuffmanTable0r[11] <= 16'h0000;
HuffmanNumber0r[11] <= 8'h00;
HuffmanTable1r[11] <= 16'h0000;
HuffmanNumber1r[11] <= 8'h00;
HuffmanTable2r[11] <= 16'h0000;
HuffmanNumber2r[11] <= 8'h00;
HuffmanTable3r[11] <= 16'h0000;
HuffmanNumber3r[11] <= 8'h00;
 
HaffumanTable0r[12] <= 16'h0000;
HaffumanNumber0r[12] <= 8'h00;
HaffumanTable1r[12] <= 16'h0000;
HaffumanNumber1r[12] <= 8'h00;
HaffumanTable2r[12] <= 16'h0000;
HaffumanNumber2r[12] <= 8'h00;
HaffumanTable3r[12] <= 16'h0000;
HaffumanNumber3r[12] <= 8'h00;
HuffmanTable0r[12] <= 16'h0000;
HuffmanNumber0r[12] <= 8'h00;
HuffmanTable1r[12] <= 16'h0000;
HuffmanNumber1r[12] <= 8'h00;
HuffmanTable2r[12] <= 16'h0000;
HuffmanNumber2r[12] <= 8'h00;
HuffmanTable3r[12] <= 16'h0000;
HuffmanNumber3r[12] <= 8'h00;
 
HaffumanTable0r[13] <= 16'h0000;
HaffumanNumber0r[13] <= 8'h00;
HaffumanTable1r[13] <= 16'h0000;
HaffumanNumber1r[13] <= 8'h00;
HaffumanTable2r[13] <= 16'h0000;
HaffumanNumber2r[13] <= 8'h00;
HaffumanTable3r[13] <= 16'h0000;
HaffumanNumber3r[13] <= 8'h00;
HuffmanTable0r[13] <= 16'h0000;
HuffmanNumber0r[13] <= 8'h00;
HuffmanTable1r[13] <= 16'h0000;
HuffmanNumber1r[13] <= 8'h00;
HuffmanTable2r[13] <= 16'h0000;
HuffmanNumber2r[13] <= 8'h00;
HuffmanTable3r[13] <= 16'h0000;
HuffmanNumber3r[13] <= 8'h00;
 
HaffumanTable0r[14] <= 16'h0000;
HaffumanNumber0r[14] <= 8'h00;
HaffumanTable1r[14] <= 16'h0000;
HaffumanNumber1r[14] <= 8'h00;
HaffumanTable2r[14] <= 16'h0000;
HaffumanNumber2r[14] <= 8'h00;
HaffumanTable3r[14] <= 16'h0000;
HaffumanNumber3r[14] <= 8'h00;
HuffmanTable0r[14] <= 16'h0000;
HuffmanNumber0r[14] <= 8'h00;
HuffmanTable1r[14] <= 16'h0000;
HuffmanNumber1r[14] <= 8'h00;
HuffmanTable2r[14] <= 16'h0000;
HuffmanNumber2r[14] <= 8'h00;
HuffmanTable3r[14] <= 16'h0000;
HuffmanNumber3r[14] <= 8'h00;
 
HaffumanTable0r[15] <= 16'h0000;
HaffumanNumber0r[15] <= 8'h00;
HaffumanTable1r[15] <= 16'h0000;
HaffumanNumber1r[15] <= 8'h00;
HaffumanTable2r[15] <= 16'h0000;
HaffumanNumber2r[15] <= 8'h00;
HaffumanTable3r[15] <= 16'h0000;
HaffumanNumber3r[15] <= 8'h00;
end else begin // if (!rst)
if(HaffumanTableEnable ==2'b1) begin
if(HaffumanTableColor ==2'b00) begin
HaffumanTable0r[HaffumanTableCount] <= HaffumanTableCode;
HaffumanNumber0r[HaffumanTableCount] <= HaffumanTableStart;
end else if(HaffumanTableColor ==2'b01) begin
HaffumanTable1r[HaffumanTableCount] <= HaffumanTableCode;
HaffumanNumber1r[HaffumanTableCount] <= HaffumanTableStart;
end else if(HaffumanTableColor ==2'b10) begin
HaffumanTable2r[HaffumanTableCount] <= HaffumanTableCode;
HaffumanNumber2r[HaffumanTableCount] <= HaffumanTableStart;
end else begin
HaffumanTable3r[HaffumanTableCount] <= HaffumanTableCode;
HaffumanNumber3r[HaffumanTableCount] <= HaffumanTableStart;
HuffmanTable0r[15] <= 16'h0000;
HuffmanNumber0r[15] <= 8'h00;
HuffmanTable1r[15] <= 16'h0000;
HuffmanNumber1r[15] <= 8'h00;
HuffmanTable2r[15] <= 16'h0000;
HuffmanNumber2r[15] <= 8'h00;
HuffmanTable3r[15] <= 16'h0000;
HuffmanNumber3r[15] <= 8'h00;
end else begin
if(HuffmanTableEnable ==2'b1) begin
if(HuffmanTableColor ==2'b00) begin
HuffmanTable0r[HuffmanTableCount] <= HuffmanTableCode;
HuffmanNumber0r[HuffmanTableCount] <= HuffmanTableStart;
end else if(HuffmanTableColor ==2'b01) begin
HuffmanTable1r[HuffmanTableCount] <= HuffmanTableCode;
HuffmanNumber1r[HuffmanTableCount] <= HuffmanTableStart;
end else if(HuffmanTableColor ==2'b10) begin
HuffmanTable2r[HuffmanTableCount] <= HuffmanTableCode;
HuffmanNumber2r[HuffmanTableCount] <= HuffmanTableStart;
end else begin
HuffmanTable3r[HuffmanTableCount] <= HuffmanTableCode;
HuffmanNumber3r[HuffmanTableCount] <= HuffmanTableStart;
end
end
end // if (HaffumanTableEnable ==2'b1)
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
//--------------------------------------------------------------------------
// Decode Process
//--------------------------------------------------------------------------
reg [3:0] Process; // Process State
reg [31:0] ProcessData; // Data
// Haffuman Table
reg [15:0] HaffumanTable [0:15];
// Haffuman Table Number
reg [7:0] HaffumanNumber [0:15];
reg [15:0] Place; // Place bit
reg [15:0] TableCode; // Table Code
reg [7:0] NumberCode; // Start Number of Table Code
reg [3:0] CodeNumber; // Haffuman code width
reg [15:0] DataNumber; // Haffuman code
//reg [15:0] SubData; // Haffuman Dht Number
end
end
//--------------------------------------------------------------------------
// Decode Process
//--------------------------------------------------------------------------
reg [3:0] Process; // Process State
reg [31:0] ProcessData; // Data
// Huffman Table
reg [15:0] HuffmanTable [0:15];
// Huffman Table Number
reg [7:0] HuffmanNumber [0:15];
reg [15:0] Place; // Place bit
reg [15:0] TableCode; // Table Code
reg [7:0] NumberCode; // Start Number of Table Code
reg [3:0] CodeNumber; // Huffman code width
reg [15:0] DataNumber; // Huffman code
reg [2:0] ProcessColor;
reg [5:0] ProcessCount;
reg OutEnable; // Output Enable
reg [3:0] OutZero; // Output Zero Count
reg [15:0] OutCode; // Output Data Code
wire [15:0] OutCodeP; // Output Data Code
reg [4:0] UseWidth; // Output used width
// reg DataOutEnable;
reg [2:0] DataOutColor;
reg signed [31:0] PreData [0:2];
wire [15:0] SubCode;
parameter ProcIdle = 4'h0;
parameter Phase1 = 4'h1;
parameter Phase2 = 4'h2;
parameter Phase3 = 4'h3;
parameter Phase4 = 4'h4;
parameter Phase5 = 4'h5;
parameter Phase6 = 4'h6;
parameter Phase7 = 4'h7;
parameter Phase8 = 4'h8;
 
//reg [7:0] OutDhtNumber; // Output Dht Number
reg [2:0] ProcessColor;
reg [6:0] ProcessCount;
reg [6:0] NextProcessCount;
reg OutEnable; // Output Enable
reg [3:0] OutZero; // Output Zero Count
reg [15:0] OutCode; // Output Data Code
wire [15:0] OutCodeP; // Output Data Code
reg [4:0] UseWidth; // Output used width
//reg [23:0] OutData;
reg DataOutEnable;
reg [2:0] DataOutColor;
reg signed [31:0] PreData [0:2];
wire [15:0] SubCode;
parameter ProcIdle = 4'h0;
parameter Phase1 = 4'h1;
parameter Phase2 = 4'h2;
parameter Phase3 = 4'h3;
parameter Phase4 = 4'h4;
parameter Phase5 = 4'h5;
parameter Phase6 = 4'h6;
parameter Phase7 = 4'h7;
parameter Phase8 = 4'h8;
parameter Phase9 = 4'h9;
parameter Phase10 = 4'hA;
parameter Phase11 = 4'hB;
 
/*
always @(*) begin
case (DhtWidth)
4'h0: OutCodeP <= 16'h0000;
4'h1: OutCodeP <= {15'h0000,ProcessData[31]};
4'h2: OutCodeP <= {14'h0000,ProcessData[31:30]};
4'h3: OutCodeP <= {13'h0000,ProcessData[31:29]};
4'h4: OutCodeP <= {12'h000, ProcessData[31:28]};
4'h5: OutCodeP <= {11'h000, ProcessData[31:27]};
4'h6: OutCodeP <= {10'h000, ProcessData[31:26]};
4'h7: OutCodeP <= {9'h000, ProcessData[31:25]};
4'h8: OutCodeP <= {8'h00, ProcessData[31:24]};
4'h9: OutCodeP <= {7'h00, ProcessData[31:23]};
4'hA: OutCodeP <= {6'h00, ProcessData[31:22]};
4'hB: OutCodeP <= {5'h00, ProcessData[31:21]};
4'hC: OutCodeP <= {4'h0, ProcessData[31:20]};
4'hD: OutCodeP <= {3'h0, ProcessData[31:19]};
4'hE: OutCodeP <= {2'h0, ProcessData[31:18]};
4'hF: OutCodeP <= {1'h0, ProcessData[31:17]};
endcase // case(DhtWidth)
case (DhtWidth)
4'h0: SubCode <= 16'hFFFF;
4'h1: SubCode <= 16'hFFFE;
4'h2: SubCode <= 16'hFFFC;
4'h3: SubCode <= 16'hFFF8;
4'h4: SubCode <= 16'hFFF0;
4'h5: SubCode <= 16'hFFE0;
4'h6: SubCode <= 16'hFFC0;
4'h7: SubCode <= 16'hFF80;
4'h8: SubCode <= 16'hFF00;
4'h9: SubCode <= 16'hFE00;
4'hA: SubCode <= 16'hFC00;
4'hB: SubCode <= 16'hF800;
4'hC: SubCode <= 16'hF000;
4'hD: SubCode <= 16'hE000;
4'hE: SubCode <= 16'hC000;
4'hF: SubCode <= 16'h8000;
endcase // case(DhtWidth)
end // always @ (*)
*/
 
function [15:0] OutCodePSel;
input [3:0] DhtWidth;
input [31:0] ProcessData;
begin
case (DhtWidth)
4'h0: OutCodePSel = 16'h0000;
4'h1: OutCodePSel = {15'h0000,ProcessData[31]};
4'h2: OutCodePSel = {14'h0000,ProcessData[31:30]};
4'h3: OutCodePSel = {13'h0000,ProcessData[31:29]};
4'h4: OutCodePSel = {12'h000, ProcessData[31:28]};
4'h5: OutCodePSel = {11'h000, ProcessData[31:27]};
4'h6: OutCodePSel = {10'h000, ProcessData[31:26]};
4'h7: OutCodePSel = {9'h000, ProcessData[31:25]};
4'h8: OutCodePSel = {8'h00, ProcessData[31:24]};
4'h9: OutCodePSel = {7'h00, ProcessData[31:23]};
4'hA: OutCodePSel = {6'h00, ProcessData[31:22]};
4'hB: OutCodePSel = {5'h00, ProcessData[31:21]};
4'hC: OutCodePSel = {4'h0, ProcessData[31:20]};
4'hD: OutCodePSel = {3'h0, ProcessData[31:19]};
4'hE: OutCodePSel = {2'h0, ProcessData[31:18]};
4'hF: OutCodePSel = {1'h0, ProcessData[31:17]};
endcase // case(DhtWidth)
end
endfunction
assign OutCodeP = OutCodePSel(DhtWidth, ProcessData);
function [15:0] SubCodeSel;
input [3:0] DhtWidth;
begin
case (DhtWidth)
4'h0: SubCodeSel = 16'hFFFF;
4'h1: SubCodeSel = 16'hFFFE;
4'h2: SubCodeSel = 16'hFFFC;
4'h3: SubCodeSel = 16'hFFF8;
4'h4: SubCodeSel = 16'hFFF0;
4'h5: SubCodeSel = 16'hFFE0;
4'h6: SubCodeSel = 16'hFFC0;
4'h7: SubCodeSel = 16'hFF80;
4'h8: SubCodeSel = 16'hFF00;
4'h9: SubCodeSel = 16'hFE00;
4'hA: SubCodeSel = 16'hFC00;
4'hB: SubCodeSel = 16'hF800;
4'hC: SubCodeSel = 16'hF000;
4'hD: SubCodeSel = 16'hE000;
4'hE: SubCodeSel = 16'hC000;
4'hF: SubCodeSel = 16'h8000;
endcase // case(DhtWidth)
end
endfunction
assign SubCode = SubCodeSel(DhtWidth);
always @(posedge clk or negedge rst) begin
if(!rst) begin
Process <= ProcIdle;
ProcessData <= 32'h00000000;
OutEnable <= 1'b0;
DataOutEnable <= 1'b0;
DataOutColor <= 3'b000;
PreData[0] <= 32'h00000000;
PreData[1] <= 32'h00000000;
PreData[2] <= 32'h00000000;
UseWidth <= 7'h00;
CodeNumber <= 4'd0;
end else begin // if (!rst)
case (Process)
ProcIdle: begin
if(DataInRun == 1'b1) begin
Process <= Phase1;
end else begin
// Reset DC code
PreData[0] <= 32'h00000000;
PreData[1] <= 32'h00000000;
PreData[2] <= 32'h00000000;
end
OutEnable <= 1'b0;
ProcessColor <= 3'b000;
ProcessCount <= 0;
DataOutEnable <= 1'b0;
DataOutColor <= 3'b000;
end // case: ProcIdle
// get a table-data and table-number
Phase1: begin
if(DataInEnable ==1'b1 & DataOutIdle == 1'b1) begin
Process <= Phase2;
ProcessData <= DataIn;
end
OutEnable <= 1'b0;
DataOutEnable <= 1'b0;
if(ProcessColor[2] == 1'b0) begin
if(ProcessCount == 0) begin
HaffumanTable[0] <= HaffumanTable0r[0];
HaffumanNumber[0] <= HaffumanNumber0r[0];
HaffumanTable[1] <= HaffumanTable0r[1];
HaffumanNumber[1] <= HaffumanNumber0r[1];
HaffumanTable[2] <= HaffumanTable0r[2];
HaffumanNumber[2] <= HaffumanNumber0r[2];
HaffumanTable[3] <= HaffumanTable0r[3];
HaffumanNumber[3] <= HaffumanNumber0r[3];
HaffumanTable[4] <= HaffumanTable0r[4];
HaffumanNumber[4] <= HaffumanNumber0r[4];
HaffumanTable[5] <= HaffumanTable0r[5];
HaffumanNumber[5] <= HaffumanNumber0r[5];
HaffumanTable[6] <= HaffumanTable0r[6];
HaffumanNumber[6] <= HaffumanNumber0r[6];
HaffumanTable[7] <= HaffumanTable0r[7];
HaffumanNumber[7] <= HaffumanNumber0r[7];
HaffumanTable[8] <= HaffumanTable0r[8];
HaffumanNumber[8] <= HaffumanNumber0r[8];
HaffumanTable[9] <= HaffumanTable0r[9];
HaffumanNumber[9] <= HaffumanNumber0r[9];
HaffumanTable[10] <= HaffumanTable0r[10];
HaffumanNumber[10] <= HaffumanNumber0r[10];
HaffumanTable[11] <= HaffumanTable0r[11];
HaffumanNumber[11] <= HaffumanNumber0r[11];
HaffumanTable[12] <= HaffumanTable0r[12];
HaffumanNumber[12] <= HaffumanNumber0r[12];
HaffumanTable[13] <= HaffumanTable0r[13];
HaffumanNumber[13] <= HaffumanNumber0r[13];
HaffumanTable[14] <= HaffumanTable0r[14];
HaffumanNumber[14] <= HaffumanNumber0r[14];
HaffumanTable[15] <= HaffumanTable0r[15];
HaffumanNumber[15] <= HaffumanNumber0r[15];
end else begin
HaffumanTable[0] <= HaffumanTable1r[0];
HaffumanNumber[0] <= HaffumanNumber1r[0];
HaffumanTable[1] <= HaffumanTable1r[1];
HaffumanNumber[1] <= HaffumanNumber1r[1];
HaffumanTable[2] <= HaffumanTable1r[2];
HaffumanNumber[2] <= HaffumanNumber1r[2];
HaffumanTable[3] <= HaffumanTable1r[3];
HaffumanNumber[3] <= HaffumanNumber1r[3];
HaffumanTable[4] <= HaffumanTable1r[4];
HaffumanNumber[4] <= HaffumanNumber1r[4];
HaffumanTable[5] <= HaffumanTable1r[5];
HaffumanNumber[5] <= HaffumanNumber1r[5];
HaffumanTable[6] <= HaffumanTable1r[6];
HaffumanNumber[6] <= HaffumanNumber1r[6];
HaffumanTable[7] <= HaffumanTable1r[7];
HaffumanNumber[7] <= HaffumanNumber1r[7];
HaffumanTable[8] <= HaffumanTable1r[8];
HaffumanNumber[8] <= HaffumanNumber1r[8];
HaffumanTable[9] <= HaffumanTable1r[9];
HaffumanNumber[9] <= HaffumanNumber1r[9];
HaffumanTable[10] <= HaffumanTable1r[10];
HaffumanNumber[10] <= HaffumanNumber1r[10];
HaffumanTable[11] <= HaffumanTable1r[11];
HaffumanNumber[11] <= HaffumanNumber1r[11];
HaffumanTable[12] <= HaffumanTable1r[12];
HaffumanNumber[12] <= HaffumanNumber1r[12];
HaffumanTable[13] <= HaffumanTable1r[13];
HaffumanNumber[13] <= HaffumanNumber1r[13];
HaffumanTable[14] <= HaffumanTable1r[14];
HaffumanNumber[14] <= HaffumanNumber1r[14];
HaffumanTable[15] <= HaffumanTable1r[15];
HaffumanNumber[15] <= HaffumanNumber1r[15];
end // else: !if(ProcessCount == 0)
end else begin // if (ProcessColor[2] == 1'b0)
if(ProcessCount == 0) begin
HaffumanTable[0] <= HaffumanTable2r[0];
HaffumanNumber[0] <= HaffumanNumber2r[0];
HaffumanTable[1] <= HaffumanTable2r[1];
HaffumanNumber[1] <= HaffumanNumber2r[1];
HaffumanTable[2] <= HaffumanTable2r[2];
HaffumanNumber[2] <= HaffumanNumber2r[2];
HaffumanTable[3] <= HaffumanTable2r[3];
HaffumanNumber[3] <= HaffumanNumber2r[3];
HaffumanTable[4] <= HaffumanTable2r[4];
HaffumanNumber[4] <= HaffumanNumber2r[4];
HaffumanTable[5] <= HaffumanTable2r[5];
HaffumanNumber[5] <= HaffumanNumber2r[5];
HaffumanTable[6] <= HaffumanTable2r[6];
HaffumanNumber[6] <= HaffumanNumber2r[6];
HaffumanTable[7] <= HaffumanTable2r[7];
HaffumanNumber[7] <= HaffumanNumber2r[7];
HaffumanTable[8] <= HaffumanTable2r[8];
HaffumanNumber[8] <= HaffumanNumber2r[8];
HaffumanTable[9] <= HaffumanTable2r[9];
HaffumanNumber[9] <= HaffumanNumber2r[9];
HaffumanTable[10] <= HaffumanTable2r[10];
HaffumanNumber[10] <= HaffumanNumber2r[10];
HaffumanTable[11] <= HaffumanTable2r[11];
HaffumanNumber[11] <= HaffumanNumber2r[11];
HaffumanTable[12] <= HaffumanTable2r[12];
HaffumanNumber[12] <= HaffumanNumber2r[12];
HaffumanTable[13] <= HaffumanTable2r[13];
HaffumanNumber[13] <= HaffumanNumber2r[13];
HaffumanTable[14] <= HaffumanTable2r[14];
HaffumanNumber[14] <= HaffumanNumber2r[14];
HaffumanTable[15] <= HaffumanTable2r[15];
HaffumanNumber[15] <= HaffumanNumber2r[15];
end else begin
HaffumanTable[0] <= HaffumanTable3r[0];
HaffumanNumber[0] <= HaffumanNumber3r[0];
HaffumanTable[1] <= HaffumanTable3r[1];
HaffumanNumber[1] <= HaffumanNumber3r[1];
HaffumanTable[2] <= HaffumanTable3r[2];
HaffumanNumber[2] <= HaffumanNumber3r[2];
HaffumanTable[3] <= HaffumanTable3r[3];
HaffumanNumber[3] <= HaffumanNumber3r[3];
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};
function [15:0] OutCodePSel;
input [3:0] DhtWidth;
input [31:0] ProcessData;
begin
case (DhtWidth)
4'h0: OutCodePSel = 16'h0000;
4'h1: OutCodePSel = {15'h0000,ProcessData[31]};
4'h2: OutCodePSel = {14'h0000,ProcessData[31:30]};
4'h3: OutCodePSel = {13'h0000,ProcessData[31:29]};
4'h4: OutCodePSel = {12'h000, ProcessData[31:28]};
4'h5: OutCodePSel = {11'h000, ProcessData[31:27]};
4'h6: OutCodePSel = {10'h000, ProcessData[31:26]};
4'h7: OutCodePSel = {9'h000, ProcessData[31:25]};
4'h8: OutCodePSel = {8'h00, ProcessData[31:24]};
4'h9: OutCodePSel = {7'h00, ProcessData[31:23]};
4'hA: OutCodePSel = {6'h00, ProcessData[31:22]};
4'hB: OutCodePSel = {5'h00, ProcessData[31:21]};
4'hC: OutCodePSel = {4'h0, ProcessData[31:20]};
4'hD: OutCodePSel = {3'h0, ProcessData[31:19]};
4'hE: OutCodePSel = {2'h0, ProcessData[31:18]};
4'hF: OutCodePSel = {1'h0, ProcessData[31:17]};
endcase
end
endfunction
assign OutCodeP = OutCodePSel(DhtWidth, ProcessData);
function [15:0] SubCodeSel;
input [3:0] DhtWidth;
begin
case (DhtWidth)
4'h0: SubCodeSel = 16'hFFFF;
4'h1: SubCodeSel = 16'hFFFE;
4'h2: SubCodeSel = 16'hFFFC;
4'h3: SubCodeSel = 16'hFFF8;
4'h4: SubCodeSel = 16'hFFF0;
4'h5: SubCodeSel = 16'hFFE0;
4'h6: SubCodeSel = 16'hFFC0;
4'h7: SubCodeSel = 16'hFF80;
4'h8: SubCodeSel = 16'hFF00;
4'h9: SubCodeSel = 16'hFE00;
4'hA: SubCodeSel = 16'hFC00;
4'hB: SubCodeSel = 16'hF800;
4'hC: SubCodeSel = 16'hF000;
4'hD: SubCodeSel = 16'hE000;
4'hE: SubCodeSel = 16'hC000;
4'hF: SubCodeSel = 16'h8000;
endcase
end
endfunction
assign SubCode = SubCodeSel(DhtWidth);
always @(posedge clk or negedge rst) begin
if(!rst) begin
Process <= ProcIdle;
ProcessData <= 32'h00000000;
ProcessCount <= 6'd0;
OutEnable <= 1'b0;
// DataOutEnable <= 1'b0;
DataOutColor <= 3'b000;
PreData[0] <= 32'h00000000;
PreData[1] <= 32'h00000000;
PreData[2] <= 32'h00000000;
UseWidth <= 5'h00;
CodeNumber <= 4'd0;
end else begin
case (Process)
ProcIdle: begin
if(DataInRun == 1'b1) begin
Process <= Phase1;
end else begin
// Reset DC code
PreData[0] <= 32'h00000000;
PreData[1] <= 32'h00000000;
PreData[2] <= 32'h00000000;
end
OutEnable <= 1'b0;
ProcessColor <= 3'b000;
ProcessCount <= 6'd0;
// DataOutEnable <= 1'b0;
DataOutColor <= 3'b000;
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};
// get a table-data and table-number
Phase1: begin
if(DataInRun == 1'b0) begin
Process <= ProcIdle;
end else if(DataInEnable == 1'b1 & DataOutIdle == 1'b1) begin
Process <= Phase2;
ProcessData <= DataIn;
end
OutEnable <= 1'b0;
// DataOutEnable <= 1'b0;
if(ProcessColor[2] == 1'b0) begin
if(ProcessCount == 0) begin
HuffmanTable[0] <= HuffmanTable0r[0];
HuffmanNumber[0] <= HuffmanNumber0r[0];
HuffmanTable[1] <= HuffmanTable0r[1];
HuffmanNumber[1] <= HuffmanNumber0r[1];
HuffmanTable[2] <= HuffmanTable0r[2];
HuffmanNumber[2] <= HuffmanNumber0r[2];
HuffmanTable[3] <= HuffmanTable0r[3];
HuffmanNumber[3] <= HuffmanNumber0r[3];
HuffmanTable[4] <= HuffmanTable0r[4];
HuffmanNumber[4] <= HuffmanNumber0r[4];
HuffmanTable[5] <= HuffmanTable0r[5];
HuffmanNumber[5] <= HuffmanNumber0r[5];
HuffmanTable[6] <= HuffmanTable0r[6];
HuffmanNumber[6] <= HuffmanNumber0r[6];
HuffmanTable[7] <= HuffmanTable0r[7];
HuffmanNumber[7] <= HuffmanNumber0r[7];
HuffmanTable[8] <= HuffmanTable0r[8];
HuffmanNumber[8] <= HuffmanNumber0r[8];
HuffmanTable[9] <= HuffmanTable0r[9];
HuffmanNumber[9] <= HuffmanNumber0r[9];
HuffmanTable[10] <= HuffmanTable0r[10];
HuffmanNumber[10] <= HuffmanNumber0r[10];
HuffmanTable[11] <= HuffmanTable0r[11];
HuffmanNumber[11] <= HuffmanNumber0r[11];
HuffmanTable[12] <= HuffmanTable0r[12];
HuffmanNumber[12] <= HuffmanNumber0r[12];
HuffmanTable[13] <= HuffmanTable0r[13];
HuffmanNumber[13] <= HuffmanNumber0r[13];
HuffmanTable[14] <= HuffmanTable0r[14];
HuffmanNumber[14] <= HuffmanNumber0r[14];
HuffmanTable[15] <= HuffmanTable0r[15];
HuffmanNumber[15] <= HuffmanNumber0r[15];
end else begin
HuffmanTable[0] <= HuffmanTable1r[0];
HuffmanNumber[0] <= HuffmanNumber1r[0];
HuffmanTable[1] <= HuffmanTable1r[1];
HuffmanNumber[1] <= HuffmanNumber1r[1];
HuffmanTable[2] <= HuffmanTable1r[2];
HuffmanNumber[2] <= HuffmanNumber1r[2];
HuffmanTable[3] <= HuffmanTable1r[3];
HuffmanNumber[3] <= HuffmanNumber1r[3];
HuffmanTable[4] <= HuffmanTable1r[4];
HuffmanNumber[4] <= HuffmanNumber1r[4];
HuffmanTable[5] <= HuffmanTable1r[5];
HuffmanNumber[5] <= HuffmanNumber1r[5];
HuffmanTable[6] <= HuffmanTable1r[6];
HuffmanNumber[6] <= HuffmanNumber1r[6];
HuffmanTable[7] <= HuffmanTable1r[7];
HuffmanNumber[7] <= HuffmanNumber1r[7];
HuffmanTable[8] <= HuffmanTable1r[8];
HuffmanNumber[8] <= HuffmanNumber1r[8];
HuffmanTable[9] <= HuffmanTable1r[9];
HuffmanNumber[9] <= HuffmanNumber1r[9];
HuffmanTable[10] <= HuffmanTable1r[10];
HuffmanNumber[10] <= HuffmanNumber1r[10];
HuffmanTable[11] <= HuffmanTable1r[11];
HuffmanNumber[11] <= HuffmanNumber1r[11];
HuffmanTable[12] <= HuffmanTable1r[12];
HuffmanNumber[12] <= HuffmanNumber1r[12];
HuffmanTable[13] <= HuffmanTable1r[13];
HuffmanNumber[13] <= HuffmanNumber1r[13];
HuffmanTable[14] <= HuffmanTable1r[14];
HuffmanNumber[14] <= HuffmanNumber1r[14];
HuffmanTable[15] <= HuffmanTable1r[15];
HuffmanNumber[15] <= HuffmanNumber1r[15];
end
end else begin
if(ProcessCount == 0) begin
HuffmanTable[0] <= HuffmanTable2r[0];
HuffmanNumber[0] <= HuffmanNumber2r[0];
HuffmanTable[1] <= HuffmanTable2r[1];
HuffmanNumber[1] <= HuffmanNumber2r[1];
HuffmanTable[2] <= HuffmanTable2r[2];
HuffmanNumber[2] <= HuffmanNumber2r[2];
HuffmanTable[3] <= HuffmanTable2r[3];
HuffmanNumber[3] <= HuffmanNumber2r[3];
HuffmanTable[4] <= HuffmanTable2r[4];
HuffmanNumber[4] <= HuffmanNumber2r[4];
HuffmanTable[5] <= HuffmanTable2r[5];
HuffmanNumber[5] <= HuffmanNumber2r[5];
HuffmanTable[6] <= HuffmanTable2r[6];
HuffmanNumber[6] <= HuffmanNumber2r[6];
HuffmanTable[7] <= HuffmanTable2r[7];
HuffmanNumber[7] <= HuffmanNumber2r[7];
HuffmanTable[8] <= HuffmanTable2r[8];
HuffmanNumber[8] <= HuffmanNumber2r[8];
HuffmanTable[9] <= HuffmanTable2r[9];
HuffmanNumber[9] <= HuffmanNumber2r[9];
HuffmanTable[10] <= HuffmanTable2r[10];
HuffmanNumber[10] <= HuffmanNumber2r[10];
HuffmanTable[11] <= HuffmanTable2r[11];
HuffmanNumber[11] <= HuffmanNumber2r[11];
HuffmanTable[12] <= HuffmanTable2r[12];
HuffmanNumber[12] <= HuffmanNumber2r[12];
HuffmanTable[13] <= HuffmanTable2r[13];
HuffmanNumber[13] <= HuffmanNumber2r[13];
HuffmanTable[14] <= HuffmanTable2r[14];
HuffmanNumber[14] <= HuffmanNumber2r[14];
HuffmanTable[15] <= HuffmanTable2r[15];
HuffmanNumber[15] <= HuffmanNumber2r[15];
end else begin
HuffmanTable[0] <= HuffmanTable3r[0];
HuffmanNumber[0] <= HuffmanNumber3r[0];
HuffmanTable[1] <= HuffmanTable3r[1];
HuffmanNumber[1] <= HuffmanNumber3r[1];
HuffmanTable[2] <= HuffmanTable3r[2];
HuffmanNumber[2] <= HuffmanNumber3r[2];
HuffmanTable[3] <= HuffmanTable3r[3];
HuffmanNumber[3] <= HuffmanNumber3r[3];
HuffmanTable[4] <= HuffmanTable3r[4];
HuffmanNumber[4] <= HuffmanNumber3r[4];
HuffmanTable[5] <= HuffmanTable3r[5];
HuffmanNumber[5] <= HuffmanNumber3r[5];
HuffmanTable[6] <= HuffmanTable3r[6];
HuffmanNumber[6] <= HuffmanNumber3r[6];
HuffmanTable[7] <= HuffmanTable3r[7];
HuffmanNumber[7] <= HuffmanNumber3r[7];
HuffmanTable[8] <= HuffmanTable3r[8];
HuffmanNumber[8] <= HuffmanNumber3r[8];
HuffmanTable[9] <= HuffmanTable3r[9];
HuffmanNumber[9] <= HuffmanNumber3r[9];
HuffmanTable[10] <= HuffmanTable3r[10];
HuffmanNumber[10] <= HuffmanNumber3r[10];
HuffmanTable[11] <= HuffmanTable3r[11];
HuffmanNumber[11] <= HuffmanNumber3r[11];
HuffmanTable[12] <= HuffmanTable3r[12];
HuffmanNumber[12] <= HuffmanNumber3r[12];
HuffmanTable[13] <= HuffmanTable3r[13];
HuffmanNumber[13] <= HuffmanNumber3r[13];
HuffmanTable[14] <= HuffmanTable3r[14];
HuffmanNumber[14] <= HuffmanNumber3r[14];
HuffmanTable[15] <= HuffmanTable3r[15];
HuffmanNumber[15] <= HuffmanNumber3r[15];
end
end
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};
// compare table
Phase2: begin
Process <= Phase4;
if(ProcessData[31:16] >= HuffmanTable[0]) Place[0] <= 1'b1;
else Place[0] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[1]) Place[1] <= 1'b1;
else Place[1] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[2]) Place[2] <= 1'b1;
else Place[2] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[3]) Place[3] <= 1'b1;
else Place[3] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[4]) Place[4] <= 1'b1;
else Place[4] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[5]) Place[5] <= 1'b1;
else Place[5] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[6]) Place[6] <= 1'b1;
else Place[6] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[7]) Place[7] <= 1'b1;
else Place[7] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[8]) Place[8] <= 1'b1;
else Place[8] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[9]) Place[9] <= 1'b1;
else Place[9] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[10]) Place[10] <= 1'b1;
else Place[10] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[11]) Place[11] <= 1'b1;
else Place[11] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[12]) Place[12] <= 1'b1;
else Place[12] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[13]) Place[13] <= 1'b1;
else Place[13] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[14]) Place[14] <= 1'b1;
else Place[14] <= 1'b0;
if(ProcessData[31:16] >= HuffmanTable[15]) Place[15] <= 1'b1;
else Place[15] <= 1'b0;
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};
// shift code
Phase4: begin
Process <= Phase5;
case (Place)
16'b0000000000000001: begin
TableCode <= {15'h0000,HuffmanTable[0][15]};
NumberCode <= HuffmanNumber[0];
CodeNumber <= 4'h0;
DataNumber <= {15'h0000,ProcessData[31]};
ProcessData <= {ProcessData[30:0],1'b0};
end
16'b0000000000000011: begin
TableCode <= {14'h0000,HuffmanTable[1][15:14]};
NumberCode <= HuffmanNumber[1];
CodeNumber <= 4'h1;
DataNumber <= {14'h0000,ProcessData[31:30]};
ProcessData <= {ProcessData[29:0],2'b00};
end
16'b0000000000000111: begin
TableCode <= {13'h0000,HuffmanTable[2][15:13]};
NumberCode <= HuffmanNumber[2];
CodeNumber <= 4'h2;
DataNumber <= {13'h0000,ProcessData[31:29]};
ProcessData <= {ProcessData[28:0],3'b000};
end
16'b0000000000001111: begin
TableCode <= {12'h000,HuffmanTable[3][15:12]};
NumberCode <= HuffmanNumber[3];
CodeNumber <= 4'h3;
DataNumber <= {12'h000,ProcessData[31:28]};
ProcessData <= {ProcessData[27:0],4'h0};
end
16'b0000000000011111: begin
TableCode <= {11'h000,HuffmanTable[4][15:11]};
NumberCode <= HuffmanNumber[4];
CodeNumber <= 4'h4;
DataNumber <= {11'h000,ProcessData[31:27]};
ProcessData <= {ProcessData[26:0],5'h00};
end
16'b0000000000111111: begin
TableCode <= {10'h000,HuffmanTable[5][15:10]};
NumberCode <= HuffmanNumber[5];
CodeNumber <= 4'h5;
DataNumber <= {10'h000,ProcessData[31:26]};
ProcessData <= {ProcessData[25:0],6'h00};
end
16'b0000000001111111: begin
TableCode <= {9'h000,HuffmanTable[6][15:9]};
NumberCode <= HuffmanNumber[6];
CodeNumber <= 4'h6;
DataNumber <= {9'h000,ProcessData[31:25]};
ProcessData <= {ProcessData[24:0],7'h00};
end
16'b0000000011111111: begin
TableCode <= {8'h00,HuffmanTable[7][15:8]};
NumberCode <= HuffmanNumber[7];
CodeNumber <= 4'h7;
DataNumber <= {8'h00,ProcessData[31:24]};
ProcessData <= {ProcessData[23:0],8'h00};
end
16'b0000000111111111: begin
TableCode <= {7'h00,HuffmanTable[8][15:7]};
NumberCode <= HuffmanNumber[8];
CodeNumber <= 4'h8;
DataNumber <= {7'h00,ProcessData[31:23]};
ProcessData <= {ProcessData[22:0],9'h000};
end
16'b0000001111111111: begin
TableCode <= {6'h00,HuffmanTable[9][15:6]};
NumberCode <= HuffmanNumber[9];
CodeNumber <= 4'h9;
DataNumber <= {6'h00,ProcessData[31:22]};
ProcessData <= {ProcessData[21:0],10'h000};
end
16'b0000011111111111: begin
TableCode <= {5'h00,HuffmanTable[10][15:5]};
NumberCode <= HuffmanNumber[10];
CodeNumber <= 4'hA;
DataNumber <= {5'h00,ProcessData[31:21]};
ProcessData <= {ProcessData[20:0],11'h000};
end
16'b0000111111111111: begin
TableCode <= {4'h0,HuffmanTable[11][15:4]};
NumberCode <= HuffmanNumber[11];
CodeNumber <= 4'hB;
DataNumber <= {4'h0,ProcessData[31:20]};
ProcessData <= {ProcessData[19:0],12'h000};
end
16'b0001111111111111: begin
TableCode <= {3'h0,HuffmanTable[12][15:3]};
NumberCode <= HuffmanNumber[12];
CodeNumber <= 4'hC;
DataNumber <= {3'h0,ProcessData[31:19]};
ProcessData <= {ProcessData[18:0],13'h0000};
end
16'b0011111111111111: begin
TableCode <= {2'h0,HuffmanTable[13][15:2]};
NumberCode <= HuffmanNumber[13];
CodeNumber <= 4'hD;
DataNumber <= {2'h0,ProcessData[31:18]};
ProcessData <= {ProcessData[17:0],14'h0000};
end
16'b0111111111111111: begin
TableCode <= {1'h0,HuffmanTable[14][15:1]};
NumberCode <= HuffmanNumber[14];
CodeNumber <= 4'hE;
DataNumber <= {1'h0,ProcessData[31:17]};
ProcessData <= {ProcessData[16:0],15'h0000};
end
16'b1111111111111111: begin
TableCode <= HuffmanTable[15];
NumberCode <= HuffmanNumber[15];
CodeNumber <= 4'hF;
DataNumber <= ProcessData[31:16] ;
ProcessData <= {ProcessData[15:0],16'h0000};
end
endcase
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};
Phase5: begin
if(DataOutIdle == 1'b1) Process <= Phase6;
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};
Phase6: begin
Process <= Phase7;
OutZero <= DhtZero;
UseWidth <= CodeNumber + DhtWidth +5'd1;
if(ProcessCount == 0) begin
OutEnable <= 1'b1;
end else begin
if(DhtZero == 4'h0 & DhtWidth == 4'h0) begin
ProcessCount <= 6'd63;
OutEnable <= 1'b0;
end else if(DhtZero == 4'hF & DhtWidth == 4'h0) begin
ProcessCount <= ProcessCount + 6'd15;
OutEnable <= 1'b0;
end else begin
ProcessCount <= ProcessCount + DhtZero;
OutEnable <= 1'b1;
end
end
if(ProcessData[31] == 1'b0 & DhtWidth != 0) begin
OutCode <= (OutCodeP | SubCode) + 16'h0001;
end else begin
OutCode <= OutCodeP;
end
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};
Phase7: begin
Process <= Phase8;
if(ProcessCount == 0) begin
if(ProcessColor[2] == 1'b0) begin
OutCode <= OutCode + PreData[0][15:0];
PreData[0] <= OutCode + PreData[0];
end else begin
if(ProcessColor[0] == 1'b0) begin
OutCode <= OutCode + PreData[1][15:0];
PreData[1] <= OutCode + PreData[1];
end else begin
OutCode <= OutCode + PreData[2][15:0];
PreData[2] <= OutCode + PreData[2];
end
end
end
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];
Phase8: begin
OutEnable <= 1'b0;
if(ProcessCount <6'd63) begin
Process <= Phase1;
ProcessCount <= ProcessCount +6'd1;
end else begin
OutCode <= OutCode + PreData[2];
PreData[2] <= OutCode + PreData[2];
ProcessCount <= 6'd0;
// DataOutEnable <= 1'b1;
DataOutColor <= ProcessColor;
if(ProcessColor == 5) begin
ProcessColor <= 3'b000;
Process <= Phase1;
end else begin
Process <= Phase1;
ProcessColor <= ProcessColor +3'd1;
end
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;
end
endcase
end
end
assign DhtColor[1] = ProcessColor[2];
assign DhtColor[0] = ProcessCount != 6'd0;
assign DhtNumber = DataNumber - TableCode + NumberCode;
 
assign DqtColor = ProcessColor[2];
assign DqtNumber = ProcessCount[5:0];
assign DqtColor = ProcessColor[2];
assign DqtNumber = ProcessCount[5:0];
 
//assign DecodeUseBit = Process == Phase8;
assign DecodeUseBit = Process == Phase9;
assign DecodeUseWidth = UseWidth;
assign DecodeUseBit = Process == Phase7;
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;
assign DecodeEnable = OutEnable == 1'b1 & Process == Phase8;
assign DecodeColor = ProcessColor;
assign DecodeCount = ProcessCount[5:0];
assign DecodeZero = OutZero;
assign DecodeCode = DqtData * OutCode;
 
endmodule // jpeg_hm_decode
assign DataOutEnable = (Process == Phase8) & (ProcessCount == 6'd63);
 
endmodule
/djpeg/trunk/src/jpeg_dqt.v
1,76 → 1,71
//---------------------------------------------------------------------------
// File Name : jpeg_dqt.v
// Module Name : jpeg_dqt
// Description : DQT spcae
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_dqt.v
// Module Name : jpeg_dqt
// Description : DQT spcae
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
//---------------------------------------------------------------------------
// Rev. Date Description
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_dqt
(
rst,
clk,
module jpeg_dqt(
rst,
clk,
 
DataInEnable,
DataInColor,
DataInCount,
DataIn,
DataInEnable,
DataInColor,
DataInCount,
DataIn,
 
TableColor,
TableNumber,
TableData
);
TableColor,
TableNumber,
TableData
);
 
input rst;
input clk;
input rst;
input clk;
 
input DataInEnable;
input DataInColor;
input [5:0] DataInCount;
input [7:0] DataIn;
input DataInEnable;
input DataInColor;
input [5:0] DataInCount;
input [7:0] DataIn;
 
input TableColor;
input [5:0] TableNumber;
output [7:0] TableData;
input TableColor;
input [5:0] TableNumber;
output [7:0] TableData;
 
// RAM
reg [7:0] DQT_Y [0:63];
reg [7:0] DQT_C [0:63];
// RAM
reg [7:0] DQT_Y [0:63];
reg [7:0] DQT_C [0:63];
 
// RAM
always @(posedge clk)
begin
// RAM
always @(posedge clk) begin
if(DataInEnable ==1'b1 && DataInColor ==1'b0) begin
DQT_Y[DataInCount] <= DataIn;
DQT_Y[DataInCount] <= DataIn;
end
if(DataInEnable ==1'b1 && DataInColor ==1'b1) begin
DQT_C[DataInCount] <= DataIn;
DQT_C[DataInCount] <= DataIn;
end
end
end
 
reg [7:0] TableDataY;
reg [7:0] TableDataC;
reg [7:0] TableDataY;
reg [7:0] TableDataC;
 
// RAM out
always @(posedge clk) begin
TableDataY <= DQT_Y[TableNumber];
TableDataC <= DQT_C[TableNumber];
end
// RAM out
always @(posedge clk) begin
TableDataY <= DQT_Y[TableNumber];
TableDataC <= DQT_C[TableNumber];
end
 
// Selector
assign TableData = (TableColor)?TableDataC:TableDataY;
endmodule // jpeg_dqt
 
// Selector
assign TableData = (TableColor)?TableDataC:TableDataY;
endmodule
/djpeg/trunk/src/jpeg_decode_fsm.v
1,640 → 1,454
//---------------------------------------------------------------------------
// File Name : jpeg_decode_fsm.v
// Module Name : jpeg_decode_fsm
// Description : Decode Maker
// 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
// File Name : jpeg_decode_fsm.v
// Module Name : jpeg_decode_fsm
// Description : Decode Maker
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2008/02/27
// Rev. : 2.00
//---------------------------------------------------------------------------
// Rev. Date Description
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 1.02 2006/10/04 Remove a HmOldData register.
// When reset, clear a ReadDqtTable register.
// When reset, clear a ReadDqtTable register.
// 1.03 2007/04/11 Remove JpegDecodeStart
// Exchange StateMachine(Add ImageData)
// Remove JpegDecodeStart
// 2.00 2008/02/27 Exchange State Machine
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
module jpeg_decode_fsm
(
rst,
clk,
module jpeg_decode_fsm(
rst,
clk,
 
// From FIFO
DataInEnable,
DataIn,
// From FIFO
DataInEnable,
DataIn,
JpegDecodeIdle, // Deocder Process Idle(1:Idle, 0:Run)
OutWidth,
OutHeight,
OutBlockWidth,
OutEnable,
OutPixelX,
OutPixelY,
//
DqtEnable,
DqtTable,
DqtCount,
DqtData,
//
DhtEnable,
DhtTable,
DhtCount,
DhtData,
//
HuffmanEnable,
HuffmanTable,
HuffmanCount,
HuffmanData,
HuffmanStart,
//
ImageEnable,
//
UseByte,
UseWord
);
input rst;
input clk;
input DataInEnable;
input [31:0] DataIn;
output JpegDecodeIdle;
output [15:0] OutWidth;
output [15:0] OutHeight;
output [11:0] OutBlockWidth;
input OutEnable;
input [15:0] OutPixelX;
input [15:0] OutPixelY;
output DqtEnable;
output DqtTable;
output [5:0] DqtCount;
output [7:0] DqtData;
output DhtEnable;
output [1:0] DhtTable;
output [7:0] DhtCount;
output [7:0] DhtData;
//
output HuffmanEnable;
output [1:0] HuffmanTable;
output [3:0] HuffmanCount;
output [15:0] HuffmanData;
output [7:0] HuffmanStart;
//
output ImageEnable;
//
output UseByte;
output UseWord;
//--------------------------------------------------------------------------
// Read Maker from Jpeg Data
//--------------------------------------------------------------------------
// State Machine Parameter
parameter S_Idle = 5'd0;
parameter S_GetMarker = 5'd1;
parameter S_ImageData = 5'd2;
// APP Segment
parameter S_APPLength = 5'd3;
parameter S_APPRead = 5'd4;
// DQT Segment
parameter S_DQTLength = 5'd5;
parameter S_DQTTable = 5'd6;
parameter S_DQTRead = 5'd7;
// DHT Segmen
parameter S_DHTLength = 5'd8;
parameter S_DHTTable = 5'd9;
parameter S_DHTMakeHm0 = 5'd10;
parameter S_DHTMakeHm1 = 5'd11;
parameter S_DHTMakeHm2 = 5'd12;
parameter S_DHTReadTable = 5'd13;
// SOS Segment
parameter S_SOSLength = 5'd14;
parameter S_SOSRead0 = 5'd15;
parameter S_SOSRead1 = 5'd16;
parameter S_SOSRead2 = 5'd17;
parameter S_SOSRead3 = 5'd18;
parameter S_SOSRead4 = 5'd19;
parameter S_SOFLength = 5'd20;
parameter S_SOFRead0 = 5'd21;
parameter S_SOFReadY = 5'd22;
parameter S_SOFReadX = 5'd23;
parameter S_SOFReadComp = 5'd24;
parameter S_SOFMakeBlock0 = 5'd25;
parameter S_SOFMakeBlock1 = 5'd26;
reg [4:0] State;
//wire ImageEnable;
reg [15:0] ReadCount;
 
JpegDecodeIdle, // Deocdeer Process Idle(1:Idle, 0:Run)
reg [15:0] JpegWidth;
reg [15:0] JpegHeight;
 
OutWidth,
OutHeight,
OutBlockWidth,
OutEnable,
OutPixelX,
OutPixelY,
//
DqtEnable,
DqtTable,
DqtCount,
DqtData,
reg ReadDqtTable;
reg [1:0] ReadDhtTable;
 
//
DhtEnable,
DhtTable,
DhtCount,
DhtData,
reg [15:0] HmShift;
reg [15:0] HmData;
reg [7:0] HmMax;
reg [7:0] HmCount;
reg HmEnable;
 
//
HaffumanEnable,
HaffumanTable,
HaffumanCount,
HaffumanData,
HaffumanStart,
reg [15:0] JpegBlockWidth;
reg [15:0] JpegBlockHeight;
reg ImageEnable;
 
//
ImageEnable,
ImageEnd,
EnableFF00,
//
UseByte,
UseWord
);
always @(posedge clk or negedge rst) begin
if(!rst) begin
State <= S_Idle;
ReadCount <= 16'd0;
JpegWidth <= 16'd0;
JpegHeight <= 16'd0;
ReadDqtTable <= 1'b0;
ReadDhtTable <= 2'd0;
HmShift <= 16'd0;
HmData <= 16'd0;
HmMax <= 8'd0;
HmCount <= 8'd0;
HmEnable <= 1'b0;
JpegBlockWidth <= 16'd0;
JpegBlockHeight <= 16'd0;
ImageEnable <= 1'b0;
end else begin
case(State)
S_Idle: begin
if(DataInEnable == 1'b1) begin
State <= S_GetMarker;
end
end
// Get Marker(with Header)
S_GetMarker: begin
if(DataInEnable == 1'b1) begin
case(DataIn[31:16])
16'hFFD8: begin // SOI Segment
State <= S_GetMarker;
end
16'hFFE0: begin // APP0 Segment
State <= S_APPLength;
end
16'hFFDB: begin // DQT Segment
State <= S_DQTLength;
end
16'hFFC4: begin // DHT Segment
State <= S_DHTLength;
end
16'hFFC0: begin // SOF0 Segment
State <= S_SOFLength;
end
16'hFFDA: begin // SOS Segment
State <= S_SOSLength;
end
//16'hFFDD: begin // DRI Segment
// State <= S_DRI;
//end
//16'hFFDx: begin // RSTn Segment
// State <= S_RST;
//end
//16'hFFD9: begin // EOI Segment
// State <= S_EOI;
//end
default: begin
State <= S_APPLength;
end
endcase
end
end
// APP Segment
S_APPLength: begin
if(DataInEnable == 1'b1) begin
ReadCount <= DataIn[31:16] -16'd2;
State <= S_APPRead;
end
end
S_APPRead: begin
if(DataInEnable == 1'b1) begin
if(ReadCount == 16'd1) begin
State <= S_GetMarker;
end else begin
ReadCount <= ReadCount -16'd1;
end
end
end
// DQT Segment
S_DQTLength: begin
if(DataInEnable == 1'b1) begin
State <= S_DQTTable;
ReadCount <= DataIn[31:16] -16'd2;
end
end
S_DQTTable: begin
if(DataInEnable == 1'b1) begin
State <= S_DQTRead;
ReadDqtTable <= DataIn[24];
ReadCount <= 16'd0;
end
end
S_DQTRead: begin
if(DataInEnable == 1'b1) begin
if(ReadCount ==63) begin
State <= S_GetMarker;
end
ReadCount <= ReadCount +16'd1;
end
end
// DHT Segment
S_DHTLength: begin
if(DataInEnable == 1'b1) begin
State <= S_DHTTable;
ReadCount <= DataIn[31:16];
end
end
S_DHTTable: begin
if(DataInEnable == 1'b1) begin
State <= S_DHTMakeHm0;
case(DataIn[31:24])
8'h00: ReadDhtTable <= 2'b00;
8'h10: ReadDhtTable <= 2'b01;
8'h01: ReadDhtTable <= 2'b10;
8'h11: ReadDhtTable <= 2'b11;
endcase
end
HmShift <= 16'h8000;
HmData <= 16'h0000;
HmMax <= 8'h00;
ReadCount <= 16'd0;
end
S_DHTMakeHm0: begin
if(DataInEnable == 1'b1) begin
State <= S_DHTMakeHm1;
HmCount <= DataIn[31:24];
end
HmEnable <= 1'b0;
end
S_DHTMakeHm1: begin
State <= S_DHTMakeHm2;
HmMax <= HmMax + HmCount;
end
S_DHTMakeHm2: begin
if(HmCount != 0) begin
HmData <= HmData + HmShift;
HmCount <= HmCount -8'd1;
end else begin
if(ReadCount == 15) begin
State <= S_DHTReadTable;
HmCount <= 8'h00;
end else begin
HmEnable <= 1'b1;
State <= S_DHTMakeHm0;
ReadCount <= ReadCount +16'd1;
end
HmShift <= HmShift >> 1;
end
end
S_DHTReadTable: begin
HmEnable <= 1'b0;
if(DataInEnable == 1'b1) begin
if(HmMax == HmCount +1) begin
State <= S_GetMarker;
end
HmCount <= HmCount +8'd1;
end
end
// SOS Segment
S_SOSLength: begin
if(DataInEnable == 1'b1) begin
State <= S_SOSRead0;
ReadCount <= DataIn[31:16];
end
end
S_SOSRead0: begin
if(DataInEnable == 1'b1) begin
State <= S_SOSRead1;
ReadCount <= {8'h00,DataIn[31:24]};
end
end
S_SOSRead1: begin
if(DataInEnable == 1'b1) begin
if(ReadCount == 1) begin
State <= S_SOSRead2;
end else begin
ReadCount <= ReadCount -16'd1;
end
end
end
S_SOSRead2: begin
if(DataInEnable == 1'b1) begin
State <= S_SOSRead3;
end
end
S_SOSRead3: begin
if(DataInEnable == 1'b1) begin
State <= S_SOSRead4;
end
end
S_SOSRead4: begin
if(DataInEnable == 1'b1) begin
State <= S_ImageData;
ImageEnable <= 1'b1;
end
end
// SOF0 Segment
S_SOFLength: begin
if(DataInEnable == 1'b1) begin
State <= S_SOFRead0;
ReadCount <= DataIn[31:16];
end
end
S_SOFRead0: begin
if(DataInEnable == 1'b1) begin
State <= S_SOFReadY;
end
end
S_SOFReadY: begin
if(DataInEnable == 1'b1) begin
State <= S_SOFReadX;
JpegHeight <= DataIn[31:16];
JpegBlockHeight <= DataIn[31:16];
end
end
S_SOFReadX: begin
if(DataInEnable == 1'b1) begin
State <= S_SOFReadComp;
JpegWidth <= DataIn[31:16];
JpegBlockWidth <= DataIn[31:16];
ReadCount <= 16'd0;
end
end
S_SOFReadComp: begin
if(DataInEnable == 1'b1) begin
if(ReadCount == 9) begin
State <= S_SOFMakeBlock0;
end else begin
ReadCount <= ReadCount +16'd1;
end
end
end
S_SOFMakeBlock0:begin
State <= S_SOFMakeBlock1;
JpegBlockWidth <= JpegBlockWidth +16'd15;
JpegBlockHeight <= JpegBlockHeight +16'd15;
end
S_SOFMakeBlock1:begin
State <= S_GetMarker;
JpegBlockWidth <= JpegBlockWidth >> 4;
JpegBlockHeight <= JpegBlockHeight >> 4;
end
// Image Process
S_ImageData: begin
if(OutEnable & (JpegWidth == (OutPixelX +1)) & (JpegHeight == (OutPixelY +1))) begin
State <= S_Idle;
ImageEnable <= 1'b0;
end
end
endcase
end
end
assign UseByte = (DataInEnable == 1'b1) & ((State == S_APPRead) |
(State == S_DQTRead) | (State == S_DQTTable) |
(State == S_DHTTable) | (State == S_DHTMakeHm0) | (State == S_DHTReadTable) |
(State == S_SOSRead0) | (State == S_SOSRead2) | (State == S_SOSRead3) | (State == S_SOSRead4) |
(State == S_SOFRead0) | (State == S_SOFReadComp)
);
assign UseWord = (DataInEnable == 1'b1) & ((State == S_GetMarker) |
(State == S_APPLength) |
(State == S_DQTLength) |
(State == S_DHTLength) |
(State == S_SOSLength) | (State == S_SOSRead1) |
(State == S_SOFLength) | (State == S_SOFReadX) | (State == S_SOFReadY)
);
 
input rst;
input clk;
assign JpegDecodeIdle = (State == S_Idle);
//assign ImageEnable = (State == S_ImageData);
 
input DataInEnable;
input [31:0] DataIn;
output JpegDecodeIdle;
assign OutWidth = JpegWidth;
assign OutHeight = JpegHeight;
assign OutBlockWidth = JpegBlockWidth[11:0];
assign DqtEnable = (State == S_DQTRead);
assign DqtTable = ReadDqtTable;
assign DqtCount = ReadCount[5:0];
assign DqtData = DataIn[31:24];
assign DhtEnable = (State == S_DHTReadTable);
assign DhtTable = ReadDhtTable;
assign DhtCount = HmCount;
assign DhtData = DataIn[31:24];
assign HuffmanEnable = HmEnable;
assign HuffmanTable = ReadDhtTable;
assign HuffmanCount = ReadCount[3:0];
assign HuffmanData = HmData;
assign HuffmanStart = HmMax;
 
output [15:0] OutWidth;
output [15:0] OutHeight;
output [11:0] OutBlockWidth;
input OutEnable;
input [15:0] OutPixelX;
input [15:0] OutPixelY;
output DqtEnable;
output DqtTable;
output [5:0] DqtCount;
output [7:0] DqtData;
 
output DhtEnable;
output [1:0] DhtTable;
output [7:0] DhtCount;
output [7:0] DhtData;
 
//
output HaffumanEnable;
output [1:0] HaffumanTable;
output [3:0] HaffumanCount;
output [15:0] HaffumanData;
output [7:0] HaffumanStart;
//
output ImageEnable;
input ImageEnd;
output EnableFF00;
//
output UseByte;
output UseWord;
 
 
//--------------------------------------------------------------------------
// Read Maker from Jpeg Data
//--------------------------------------------------------------------------
reg [1:0] State;
reg [3:0] Process;
wire StateReadByte;
wire StateReadWord;
wire ImageEnable;
 
wire ReadSegmentEnd;
 
parameter Idle = 2'b00;
parameter GetMarker = 2'b01;
parameter ReadSegment = 2'b10;
parameter ImageData = 2'b11;
 
parameter NoProcess = 4'h0;
parameter SegSOI = 4'h1;
parameter SegAPP = 4'h2;
parameter SegDQT = 4'h3;
parameter SegDHT = 4'h4;
parameter SegSOF0 = 4'h5;
parameter SegSOS = 4'h6;
parameter SegDRI = 4'h7;
parameter SegRST = 4'h8;
parameter SegEOI = 4'h9;
reg [15:0] JpegWidth;
reg [15:0] JpegHeight;
 
always @(posedge clk or negedge rst) begin
if(!rst) begin
State <= Idle;
Process <= NoProcess;
end else begin
case(State)
Idle: begin
if(DataInEnable == 1'b1) begin
State <= GetMarker;
end
Process <= NoProcess;
end
GetMarker: begin
if(DataInEnable == 1'b1) begin
State <= ReadSegment;
case(DataIn[31:16])
16'hFFD8: begin // SOI Segment
Process <= SegSOI;
end
16'hFFE0: begin // APP0 Segment
Process <= SegAPP;
end
16'hFFDB: begin // DQT Segment
Process <= SegDQT;
end
16'hFFC4: begin // DHT Segment
Process <= SegDHT;
end
16'hFFC0: begin // SOF0 Segment
Process <= SegSOF0;
end
16'hFFDA: begin // SOS Segment
Process <= SegSOS;
end
//16'hFFDD: begin // DRI Segment
// Process <= SegDRI;
//end
//16'hFFDx: begin // RSTn Segment
// Process <= SegRST;
//end
//16'hFFD9: begin // EOI Segment
// Process <= SegEOI;
//end
default: begin
Process <= SegAPP;
end
endcase
end
end
ReadSegment: begin
if(ReadSegmentEnd == 1'b1) begin
Process <= NoProcess;
if(Process == SegSOS) begin
State <= ImageData;
end else begin
State <= GetMarker;
end
end
end
ImageData: begin
if(OutEnable & (JpegWidth == OutPixelX +1) & (JpegHeight == OutPixelY +1)) begin
State <= Idle;
end
end
endcase
end
end
 
assign JpegDecodeIdle = (State == Idle);
assign StateReadByte = 1'b0;
assign StateReadWord = ((State == GetMarker) & (DataInEnable == 1'b1));
assign ImageEnable = (State == ImageData);
 
wire ReadNopEnd;
 
assign ReadNopEnd = ((Process == SegSOI) | (Process == SegRST));
//--------------------------------------------------------------------------
// APP Segment
// Skip read data!
//--------------------------------------------------------------------------
 
reg [1:0] StateAPP;
reg [15:0] ReadAppCount;
wire ReadAppByte;
wire ReadAppWord;
wire ReadAppEnd;
 
parameter AppIdle = 2'd0;
parameter AppLength = 2'd1;
parameter AppRead = 2'd2;
always @(posedge clk or negedge rst) begin
if(!rst) begin
StateAPP <= AppIdle;
ReadAppCount <= 16'd0;
end else begin
case(StateAPP)
AppIdle: begin
if(Process == SegAPP) StateAPP <= AppLength;
ReadAppCount <= 16'd0;
end
AppLength: begin
if(DataInEnable == 1'b1) begin
ReadAppCount <= DataIn[31:16] -2;
StateAPP <= AppRead;
end
end
AppRead: begin
if(DataInEnable == 1'b1) begin
if(ReadAppCount == 1) begin
StateAPP <= AppIdle;
end else begin
ReadAppCount <= ReadAppCount -1;
end
end
end
endcase
end
end
assign ReadAppByte = (StateAPP == AppRead);
assign ReadAppWord = (StateAPP == AppLength);
assign ReadAppEnd = ((StateAPP == AppRead) & (DataInEnable == 1'b1) & (ReadAppCount == 1));
//--------------------------------------------------------------------------
// DQT Segment
//--------------------------------------------------------------------------
 
reg [1:0] StateDQT;
reg [15:0] ReadDqtCount;
wire ReadDqtByte;
wire ReadDqtWord;
wire ReadDqtEnd;
wire ReadDqtEnable;
wire [7:0] ReadDqtData;
reg ReadDqtTable;
 
parameter DQTIdle = 2'b00;
parameter DQTLength = 2'b01;
parameter DQTTable = 2'b10;
parameter DQTRead = 2'b11;
always @(posedge clk or negedge rst) begin
if(!rst) begin
StateDQT <= DQTIdle;
ReadDqtCount <= 16'h0000;
ReadDqtTable <= 1'b0;
end else begin
case(StateDQT)
DQTIdle: begin
if(Process == SegDQT) begin
StateDQT <= DQTLength;
end
ReadDqtCount <= 16'h0000;
end
DQTLength: begin
if(DataInEnable == 1'b1) begin
StateDQT <= DQTTable;
ReadDqtCount <= DataIn[31:16] -2;
end
end
DQTTable: begin
if(DataInEnable == 1'b1) begin
StateDQT <= DQTRead;
ReadDqtTable <= DataIn[24];
ReadDqtCount <= 16'd0;
end
end
DQTRead: begin
if(DataInEnable == 1'b1) begin
if(ReadDqtCount ==63) begin
StateDQT <= DQTIdle;
end
ReadDqtCount <= ReadDqtCount +1;
end
end
endcase
end
end
 
assign ReadDqtEnable = StateDQT == DQTRead;
assign ReadDqtData = DataIn[31:24];
assign ReadDqtByte = StateDQT == DQTRead | StateDQT == DQTTable;
assign ReadDqtWord = StateDQT == DQTLength;
assign ReadDqtEnd = StateDQT == DQTRead & DataInEnable == 1'b1 & ReadDqtCount ==63;
 
//--------------------------------------------------------------------------
// DHT Segment
//--------------------------------------------------------------------------
reg [2:0] StateDHT;
reg [15:0] ReadDhtCount;
wire ReadDhtByte;
wire ReadDhtWord;
wire ReadDhtEnd;
wire ReadDhtEnable;
wire [7:0] ReadDhtData;
reg [1:0] ReadDhtTable;
 
reg [15:0] HmShift;
reg [15:0] HmData;
reg [7:0] HmMax;
reg [7:0] HmCount;
reg HmEnable;
 
parameter DHTIdle = 3'h0;
parameter DHTLength = 3'h1;
parameter DHTTable = 3'h2;
parameter DHTMakeHm0 = 3'h3;
parameter DHTMakeHm1 = 3'h4;
parameter DHTMakeHm2 = 3'h5;
parameter DHTReadTable = 3'h6;
always @(posedge clk or negedge rst)
begin
if(!rst) begin
StateDHT <= DHTIdle;
ReadDhtCount <= 16'h0000;
ReadDhtTable <= 2'b00;
HmEnable <= 1'b0;
HmShift <= 16'h8000;
HmData <= 16'h0000;
HmMax <= 8'h00;
HmCount <= 8'h00;
end else begin // if (!rst)
case(StateDHT)
DHTIdle: begin
if(Process == SegDHT) begin
StateDHT <= DHTLength;
end
HmEnable <= 1'b0;
end
DHTLength: begin
if(DataInEnable == 1'b1) begin
StateDHT <= DHTTable;
ReadDhtCount <= DataIn[31:16];
end
end
DHTTable: begin
if(DataInEnable == 1'b1) begin
StateDHT <= DHTMakeHm0;
case(DataIn[31:24])
8'h00: ReadDhtTable <= 2'b00;
8'h10: ReadDhtTable <= 2'b01;
8'h01: ReadDhtTable <= 2'b10;
8'h11: ReadDhtTable <= 2'b11;
endcase
end
HmShift <= 16'h8000;
HmData <= 16'h0000;
HmMax <= 8'h00;
ReadDhtCount <= 0;
end // case: DHTTable
DHTMakeHm0: begin
if(DataInEnable == 1'b1) begin
StateDHT <= DHTMakeHm1;
HmCount <= DataIn[31:24];
end
HmEnable <= 1'b0;
end
DHTMakeHm1: begin
StateDHT <= DHTMakeHm2;
HmMax <= HmMax + HmCount;
end
DHTMakeHm2: begin
if(HmCount != 0) begin
HmData <= HmData + HmShift;
HmCount <= HmCount -1;
end else begin
if(ReadDhtCount == 15) begin
StateDHT <= DHTReadTable;
HmCount <= 8'h00;
//HmMax <= HmMax -1;
end else begin
HmEnable <= 1'b1;
StateDHT <= DHTMakeHm0;
ReadDhtCount <= ReadDhtCount +1;
end
HmShift <= HmShift >> 1;
end
end
DHTReadTable: begin
HmEnable <= 1'b0;
if(DataInEnable == 1'b1) begin
if(HmMax == HmCount +1) begin
StateDHT <= DHTIdle;
end
HmCount <= HmCount +1;
end
end
endcase
end
end
 
assign ReadDhtEnable = StateDHT == DHTReadTable;
assign ReadDhtData = DataIn[31:24];
assign ReadDhtByte = StateDHT == DHTTable | StateDHT == DHTMakeHm0 |
StateDHT == DHTReadTable;
assign ReadDhtWord = StateDHT == DHTLength;
assign ReadDhtEnd = StateDHT == DHTReadTable & DataInEnable == 1'b1 & HmMax == HmCount +1;
 
//--------------------------------------------------------------------------
// SOS Segment
//--------------------------------------------------------------------------
reg [3:0] StateSOS;
reg [15:0] ReadSosCount;
wire ReadSosByte;
wire ReadSosWord;
wire ReadSosEnd;
 
parameter SOSIdle = 4'h0;
parameter SOSLength = 4'h1;
parameter SOSRead0 = 4'h2;
parameter SOSRead1 = 4'h3;
parameter SOSRead2 = 4'h4;
parameter SOSRead3 = 4'h5;
parameter SOSRead4 = 4'h6;
 
reg EnableFF00;
always @(posedge clk or negedge rst)
begin
if(!rst) begin
StateSOS <= SOSIdle;
ReadSosCount <= 16'h0000;
EnableFF00 <= 1'b0;
end else begin
case(StateSOS)
SOSIdle: begin
if(Process == SegSOS) begin
StateSOS <= SOSLength;
EnableFF00 <= 1'b1;
end
end
SOSLength: begin
if(DataInEnable == 1'b1) begin
StateSOS <= SOSRead0;
ReadSosCount <= DataIn[31:16];
end
end
SOSRead0: begin
if(DataInEnable == 1'b1) begin
StateSOS <= SOSRead1;
ReadSosCount <= {8'h00,DataIn[31:24]};
end
end
SOSRead1: begin
if(DataInEnable == 1'b1) begin
if(ReadSosCount == 1) begin
StateSOS <= SOSRead2;
end else begin
ReadSosCount <= ReadSosCount -1;
end
end
end
SOSRead2: begin
if(DataInEnable == 1'b1) begin
StateSOS <= SOSRead3;
end
end
SOSRead3: begin
if(DataInEnable == 1'b1) begin
StateSOS <= SOSRead4;
end
end
SOSRead4: begin
if(DataInEnable == 1'b1) begin
StateSOS <= SOSIdle;
end
end
endcase
end
end
assign ReadSosByte = StateSOS == SOSRead0 | StateSOS == SOSRead2 | StateSOS == SOSRead3 | StateSOS == SOSRead4;
assign ReadSosWord = StateSOS == SOSLength | StateSOS == SOSRead1;
assign ReadSosEnd = DataInEnable == 1'b1 & StateSOS == SOSRead4;
 
//--------------------------------------------------------------------------
// SOF0 Segment
//--------------------------------------------------------------------------
reg [3:0] StateSOF;
reg [15:0] ReadSofCount;
wire ReadSofByte;
wire ReadSofWord;
wire ReadSofEnd;
 
reg [15:0] JpegBlockWidth;
reg [15:0] JpegBlockHeight;
 
parameter SOFIdle = 4'h0;
parameter SOFLength = 4'h1;
parameter SOFRead0 = 4'h2;
parameter SOFReadY = 4'h3;
parameter SOFReadX = 4'h4;
parameter SOFReadComp = 4'h5;
parameter SOFMakeBlock0 = 4'H6;
parameter SOFMakeBlock1 = 4'h7;
always @(posedge clk or negedge rst)
begin
if(!rst) begin
StateSOF <= SOFIdle;
ReadSofCount <= 16'h0000;
JpegWidth <= 16'h0000;
JpegHeight <= 16'h0000;
JpegBlockWidth <= 16'h0000;
JpegBlockHeight <= 16'h0000;
end else begin
case(StateSOF)
SOFIdle: begin
if(Process == SegSOF0) begin
StateSOF <= SOFLength;
end
end
SOFLength: begin
if(DataInEnable == 1'b1) begin
StateSOF <= SOFRead0;
ReadSofCount <= DataIn[31:16];
end
end
SOFRead0: begin
if(DataInEnable == 1'b1) begin
StateSOF <= SOFReadY;
end
end
SOFReadY: begin
if(DataInEnable == 1'b1) begin
StateSOF <= SOFReadX;
JpegHeight <= DataIn[31:16];
JpegBlockHeight <= DataIn[31:16];
end
end
SOFReadX: begin
if(DataInEnable == 1'b1) begin
StateSOF <= SOFReadComp;
JpegWidth <= DataIn[31:16];
JpegBlockWidth <= DataIn[31:16];
ReadSofCount <= 16'h0000;
end
end
SOFReadComp: begin
if(DataInEnable == 1'b1) begin
if(ReadSofCount == 9) begin
StateSOF <= SOFMakeBlock0;
end else begin
ReadSofCount <= ReadSofCount +1;
end
end
end
SOFMakeBlock0:begin
StateSOF <= SOFMakeBlock1;
JpegBlockWidth <= JpegBlockWidth +15;
JpegBlockHeight <= JpegBlockHeight +15;
end
SOFMakeBlock1:begin
StateSOF <= SOFIdle;
JpegBlockWidth <= JpegBlockWidth >> 4;
JpegBlockHeight <= JpegBlockHeight >> 4;
end
endcase
end
end
assign ReadSofByte = StateSOF == SOFRead0 | StateSOF == SOFReadComp;
assign ReadSofWord = StateSOF == SOFLength | StateSOF == SOFReadX | StateSOF == SOFReadY ;
assign ReadSofEnd = StateSOF == SOFMakeBlock1;
 
assign OutWidth = JpegWidth;
assign OutHeight = JpegHeight;
assign OutBlockWidth = JpegBlockWidth[11:0];
//
assign UseByte = DataInEnable == 1'b1 & (StateReadByte | ReadAppByte | ReadDqtByte | ReadDhtByte | ReadSosByte | ReadSofByte) ;
assign UseWord = DataInEnable == 1'b1 & (StateReadWord | ReadAppWord | ReadDqtWord | ReadDhtWord | ReadSosWord | ReadSofWord) ;
assign ReadSegmentEnd = ReadNopEnd | ReadAppEnd | ReadDqtEnd | ReadDhtEnd | ReadSosEnd | ReadSofEnd ;
 
//
assign DqtEnable = ReadDqtEnable;
assign DqtTable = ReadDqtTable;
assign DqtCount = ReadDqtCount[5:0];
assign DqtData = ReadDqtData;
 
//
assign DhtEnable = ReadDhtEnable;
assign DhtTable = ReadDhtTable;
assign DhtCount = HmCount;
assign DhtData = ReadDhtData;
 
//
assign HaffumanEnable = HmEnable;
assign HaffumanTable = ReadDhtTable;
assign HaffumanCount = ReadDhtCount[3:0];
assign HaffumanData = HmData;
assign HaffumanStart = HmMax;
 
endmodule
/djpeg/trunk/src/jpeg_ycbcr2rgb.v
1,245 → 1,232
//---------------------------------------------------------------------------
// File Name : jpeg_ycbcr2rgb.v
// Module Name : jpeg_ycbcr2rgb
// Description : YCbCr2RGB
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_ycbcr2rgb.v
// Module Name : jpeg_ycbcr2rgb
// Description : YCbCr2RGB
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
//---------------------------------------------------------------------------
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
//----------------------------------------------------------------------------
// JPEG YCbCr -> RGB Conveter
//----------------------------------------------------------------------------
module jpeg_ycbcbr2rgb
(
rst,
clk,
module jpeg_ycbcr2rgb(
rst,
clk,
 
InEnable,
InBlockX,
InBlockY,
InIdle,
InBank,
InAddress,
InY,
InCb,
InCr,
InEnable,
InRead,
InBlockX,
InBlockY,
InAddress,
InY,
InCb,
InCr,
 
OutEnable,
OutPixelX,
OutPixelY,
OutR,
OutG,
OutB
);
OutEnable,
OutPixelX,
OutPixelY,
OutR,
OutG,
OutB
);
 
input clk;
input rst;
input InEnable;
input [11:0] InBlockX;
input [11:0] InBlockY;
output InIdle;
output InBank;
output [7:0] InAddress;
input [8:0] InY;
input [8:0] InCb;
input [8:0] InCr;
 
output OutEnable;
output [15:0] OutPixelX;
output [15:0] OutPixelY;
output [7:0] OutR;
output [7:0] OutG;
output [7:0] OutB;
 
reg RunActive;
reg [7:0] RunCount;
reg [11:0] RunBlockX;
reg [11:0] RunBlockY;
reg RunBank;
always @(posedge clk or negedge rst) begin
if(!rst) begin
RunActive <= 1'b0;
RunBank <= 1'b0;
RunCount <= 8'h00;
RunBlockX <= 12'h000;
RunBlockY <= 12'h000;
end else begin
if(RunActive == 1'b0) begin
if(InEnable == 1'b1) begin
RunActive <= 1'b1;
RunBlockX <= InBlockX;
RunBlockY <= InBlockY;
end
input clk;
input rst;
input InEnable;
output InRead;
input [11:0] InBlockX;
input [11:0] InBlockY;
output [7:0] InAddress;
input [8:0] InY;
input [8:0] InCb;
input [8:0] InCr;
output OutEnable;
output [15:0] OutPixelX;
output [15:0] OutPixelY;
output [7:0] OutR;
output [7:0] OutG;
output [7:0] OutB;
reg RunActive;
reg [7:0] RunCount;
reg [11:0] RunBlockX;
reg [11:0] RunBlockY;
always @(posedge clk or negedge rst) begin
if(!rst) begin
RunActive <= 1'b0;
RunCount <= 8'h00;
end else begin
if(RunCount == 8'hFF) begin
RunActive <= 1'b0;
RunBank <= ~RunBank;
RunCount <= 8'h00;
RunBlockX <= 12'h000;
RunBlockY <= 12'h000;
end else begin
if(RunActive == 1'b0) begin
if(InEnable == 1'b1) begin
RunActive <= 1'b1;
RunBlockX <= InBlockX;
RunBlockY <= InBlockY;
end
RunCount <= 8'h00;
end else begin
RunCount <= RunCount +1;
if(RunCount == 8'hFF) begin
RunActive <= 1'b0;
RunCount <= 8'h00;
end else begin
RunCount <= RunCount +8'd1;
end
end
end // else: !if(RunActive == 1'b0)
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
end
end
assign InRead = RunActive;
assign InAddress = RunCount;
 
assign InIdle = RunActive == 1'b0 | (RunActive == 1'b1 & RunCount == 8'hFF);
assign InAddress = RunCount;
assign InBank = RunBank;
reg PreEnable;
reg [15:0] PreCountX;
reg [15:0] PreCountY;
reg Phase0Enable;
reg [15:0] Phase0CountX;
reg [15:0] Phase0CountY;
reg Phase1Enable;
reg [15:0] Phase1CountX;
reg [15:0] Phase1CountY;
reg Phase2Enable;
reg [15:0] Phase2CountX;
reg [15:0] Phase2CountY;
reg Phase3Enable;
reg [15:0] Phase3CountX;
reg [15:0] Phase3CountY;
reg signed [31:0] rgb00r;
reg signed [31:0] r00r;
reg signed [31:0] g00r;
reg signed [31:0] g01r;
reg signed [31:0] b00r;
reg signed [31:0] r10r;
reg signed [31:0] g10r;
reg signed [31:0] g11r;
reg signed [31:0] b10r;
reg signed [31:0] r20r;
reg signed [31:0] g20r;
reg signed [31:0] b20r;
wire signed [8:0] DataY;
wire signed [8:0] DataCb;
wire signed [8:0] DataCr;
reg signed [8:0] Phase0Y;
reg signed [8:0] Phase0Cb;
reg signed [8:0] Phase0Cr;
wire signed [19:0] C_RR = 20'h59BA5; // R_Cr: 1.402 * 0x4000
wire signed [19:0] C_GB = 20'h16066; // G_Cb: 0.34414 * 0x4000
wire signed [19:0] C_GR = 20'h2DB47; // G_Cr: 0.71414 * 0x4000
wire signed [19:0] C_BB = 20'h71687; // B_Cb: 1.772 * 0x4000
assign DataY = InY;
assign DataCb = InCb;
assign DataCr = InCr;
reg signed [8:0] Phase1Y,Phase1Cb,Phase1Cr;
reg signed [8:0] Phase2Y,Phase2Cb,Phase2Cr;
always @(posedge clk or negedge rst) begin
if(!rst) begin
rgb00r <= 0;
r00r <= 0;
g00r <= 0;
g01r <= 0;
b00r <= 0;
r10r <= 0;
g10r <= 0;
g11r <= 0;
b10r <= 0;
r20r <= 0;
g20r <= 0;
b20r <= 0;
Phase0Enable <= 1'b0;
Phase0CountX <= 16'h0000;
Phase0CountY <= 16'h0000;
Phase1Enable <= 1'b0;
Phase1CountX <= 16'h0000;
Phase1CountY <= 16'h0000;
Phase2Enable <= 1'b0;
Phase2CountX <= 16'h0000;
Phase2CountY <= 16'h0000;
Phase3Enable <= 1'b0;
Phase3CountX <= 16'h0000;
Phase3CountY <= 16'h0000;
end else begin
// Pre
PreEnable <= RunActive;
PreCountX <= {RunBlockX,RunCount[3:0]};
PreCountY <= {RunBlockY,RunCount[7:4]};
// Phase0
Phase0Enable <= PreEnable;
Phase0CountX <= PreCountX;
Phase0CountY <= PreCountY;
Phase0Y <= DataY;
Phase0Cb <= DataCb;
Phase0Cr <= DataCr;
 
reg PreEnable;
reg [15:0] PreCountX;
reg [15:0] PreCountY;
reg Phase0Enable;
reg [15:0] Phase0CountX;
reg [15:0] Phase0CountY;
reg Phase1Enable;
reg [15:0] Phase1CountX;
reg [15:0] Phase1CountY;
reg Phase2Enable;
reg [15:0] Phase2CountX;
reg [15:0] Phase2CountY;
reg Phase3Enable;
reg [15:0] Phase3CountX;
reg [15:0] Phase3CountY;
reg signed [31:0] rgb00r;
reg signed [31:0] r00r;
reg signed [31:0] g00r;
reg signed [31:0] g01r;
reg signed [31:0] b00r;
reg signed [31:0] r10r;
reg signed [31:0] g10r;
reg signed [31:0] g11r;
reg signed [31:0] b10r;
reg signed [31:0] r20r;
reg signed [31:0] g20r;
reg signed [31:0] b20r;
 
wire signed [8:0] DataY;
wire signed [8:0] DataCb;
wire signed [8:0] DataCr;
 
reg signed [8:0] Phase0Y;
reg signed [8:0] Phase0Cb;
reg signed [8:0] Phase0Cr;
 
wire signed [19:0] C_RR = 20'h59BA5; // R_Cr: 1.402 * 0x4000
wire signed [19:0] C_GB = 20'h16066; // G_Cb: 0.34414 * 0x4000
wire signed [19:0] C_GR = 20'h2DB47; // G_Cr: 0.71414 * 0x4000
wire signed [19:0] C_BB = 20'h71687; // B_Cb: 1.772 * 0x4000
assign DataY = InY;
assign DataCb = InCb;
assign DataCr = InCr;
 
reg signed [8:0] Phase1Y,Phase1Cb,Phase1Cr;
reg signed [8:0] Phase2Y,Phase2Cb,Phase2Cr;
reg signed [8:0] Phase3Y,Phase3Cb,Phase3Cr;
always @(posedge clk or negedge rst) begin
if(!rst) begin
rgb00r <= 0;
r00r <= 0;
g00r <= 0;
g01r <= 0;
b00r <= 0;
 
r10r <= 0;
g10r <= 0;
g11r <= 0;
b10r <= 0;
 
r20r <= 0;
g20r <= 0;
b20r <= 0;
 
Phase0Enable <= 1'b0;
Phase0CountX <= 16'h0000;
Phase0CountY <= 16'h0000;
Phase1Enable <= 1'b0;
Phase1CountX <= 16'h0000;
Phase1CountY <= 16'h0000;
Phase2Enable <= 1'b0;
Phase2CountX <= 16'h0000;
Phase2CountY <= 16'h0000;
Phase3Enable <= 1'b0;
Phase3CountX <= 16'h0000;
Phase3CountY <= 16'h0000;
end else begin // if (!rst)
// Pre
PreEnable <= RunActive;
PreCountX <= {RunBlockX,RunCount[3:0]};
PreCountY <= {RunBlockY,RunCount[7:4]};
// Phase0
Phase0Enable <= PreEnable;
Phase0CountX <= PreCountX;
Phase0CountY <= PreCountY;
Phase0Y <= DataY;
Phase0Cb <= DataCb;
Phase0Cr <= DataCr;
// Phase1
Phase1Enable <= Phase0Enable;
Phase1CountX <= Phase0CountX;
Phase1CountY <= Phase0CountY;
rgb00r <= 32'h02000000 + {Phase0Y[8],Phase0Y[8],Phase0Y[8],Phase0Y[8],Phase0Y[8],Phase0Y[8:0],18'h0000};
r00r <= Phase0Cr * C_RR;
g00r <= Phase0Cb * C_GB;
g01r <= Phase0Cr * C_GR;
b00r <= Phase0Cb * C_BB;
 
Phase1Y <= Phase0Y;
Phase1Cb <= Phase0Cb;
Phase1Cr <= Phase0Cr;
// Phase2
Phase2Enable <= Phase1Enable;
Phase2CountX <= Phase1CountX;
Phase2CountY <= Phase1CountY;
r10r <= rgb00r + r00r;
g10r <= rgb00r - g00r;
g11r <= g01r;
b10r <= rgb00r + b00r;
 
Phase2Y <= Phase1Y;
Phase2Cb <= Phase1Cb;
Phase2Cr <= Phase1Cr;
// Phase3
Phase3Enable <= Phase2Enable;
Phase3CountX <= Phase2CountX;
Phase3CountY <= Phase2CountY;
r20r <= r10r;
g20r <= g10r - g11r;
b20r <= b10r;
 
Phase3Y <= Phase2Y;
Phase3Cb <= Phase2Cb;
Phase3Cr <= Phase2Cr;
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
 
assign OutEnable = Phase3Enable;
assign OutPixelX = Phase3CountX;
assign OutPixelY = Phase3CountY;
assign OutR = (r20r[31])?8'h00:(r20r[26])?8'hFF:r20r[25:18];
assign OutG = (g20r[31])?8'h00:(g20r[26])?8'hFF:g20r[25:18];
assign OutB = (b20r[31])?8'h00:(b20r[26])?8'hFF:b20r[25:18];
endmodule // jpeg_ycbcbr2rgb
// Phase1
Phase1Enable <= Phase0Enable;
Phase1CountX <= Phase0CountX;
Phase1CountY <= Phase0CountY;
rgb00r <= 32'h02000000 + {Phase0Y[8],Phase0Y[8],Phase0Y[8],Phase0Y[8],Phase0Y[8],Phase0Y[8:0],18'h0000};
r00r <= Phase0Cr * C_RR;
g00r <= Phase0Cb * C_GB;
g01r <= Phase0Cr * C_GR;
b00r <= Phase0Cb * C_BB;
Phase1Y <= Phase0Y;
Phase1Cb <= Phase0Cb;
Phase1Cr <= Phase0Cr;
// Phase2
Phase2Enable <= Phase1Enable;
Phase2CountX <= Phase1CountX;
Phase2CountY <= Phase1CountY;
r10r <= rgb00r + r00r;
g10r <= rgb00r - g00r;
g11r <= g01r;
b10r <= rgb00r + b00r;
Phase2Y <= Phase1Y;
Phase2Cb <= Phase1Cb;
Phase2Cr <= Phase1Cr;
// Phase3
Phase3Enable <= Phase2Enable;
Phase3CountX <= Phase2CountX;
Phase3CountY <= Phase2CountY;
r20r <= r10r;
g20r <= g10r - g11r;
b20r <= b10r;
end
end
assign OutEnable = Phase3Enable;
assign OutPixelX = Phase3CountX;
assign OutPixelY = Phase3CountY;
assign OutR = (r20r[31])?8'h00:(r20r[26])?8'hFF:r20r[25:18];
assign OutG = (g20r[31])?8'h00:(g20r[26])?8'hFF:g20r[25:18];
assign OutB = (b20r[31])?8'h00:(b20r[26])?8'hFF:b20r[25:18];
endmodule
/djpeg/trunk/src/jpeg_dht.v
1,118 → 1,105
//---------------------------------------------------------------------------
// File Name : jpeg_dht.v
// Module Name : jpeg_dht
// Description : DHT space
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_dht.v
// Module Name : jpeg_dht
// Description : DHT space
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
//---------------------------------------------------------------------------
// Rev. Date Description
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_dht
(
rst,
clk,
module jpeg_dht(
rst,
clk,
 
DataInEnable,
DataInColor,
DataInCount,
DataIn,
DataInEnable,
DataInColor,
DataInCount,
DataIn,
 
ColorNumber,
TableNumber,
ZeroTable,
WidhtTable
);
ColorNumber,
TableNumber,
ZeroTable,
WidhtTable
);
 
input rst;
input clk;
input rst;
input clk;
 
input DataInEnable;
input [1:0] DataInColor;
input [7:0] DataInCount;
input [7:0] DataIn;
input DataInEnable;
input [1:0] DataInColor;
input [7:0] DataInCount;
input [7:0] DataIn;
 
input [1:0] ColorNumber;
input [7:0] TableNumber;
output [3:0] ZeroTable;
output [3:0] WidhtTable;
input [1:0] ColorNumber;
input [7:0] TableNumber;
output [3:0] ZeroTable;
output [3:0] WidhtTable;
 
// RAM
reg [7:0] DHT_Ydc [0:15];
reg [7:0] DHT_Yac [0:255];
reg [7:0] DHT_Cdc [0:15];
reg [7:0] DHT_Cac [0:255];
// RAM
reg [7:0] DHT_Ydc [0:15];
reg [7:0] DHT_Yac [0:255];
reg [7:0] DHT_Cdc [0:15];
reg [7:0] DHT_Cac [0:255];
 
reg [7:0] ReadDataYdc;
reg [7:0] ReadDataYac;
reg [7:0] ReadDataCdc;
reg [7:0] ReadDataCac;
reg [7:0] ReadDataYdc;
reg [7:0] ReadDataYac;
reg [7:0] ReadDataCdc;
reg [7:0] ReadDataCac;
 
wire [7:0] ReadData;
// RAM
always @(posedge clk) begin
if(DataInEnable ==1'b1 & DataInColor ==2'b00) begin
DHT_Ydc[DataInCount[3:0]] <= DataIn;
end
if(DataInEnable ==1'b1 & DataInColor ==2'b01) begin
DHT_Yac[DataInCount] <= DataIn;
end
if(DataInEnable ==1'b1 & DataInColor ==2'b10) begin
DHT_Cdc[DataInCount[3:0]] <= DataIn;
end
if(DataInEnable ==1'b1 & DataInColor ==2'b11) begin
DHT_Cac[DataInCount] <= DataIn;
end
end // always @ (posedge clk)
wire [7:0] ReadData;
// RAM
always @(posedge clk) begin
if(DataInEnable ==1'b1 & DataInColor ==2'b00) begin
DHT_Ydc[DataInCount[3:0]] <= DataIn;
end
if(DataInEnable ==1'b1 & DataInColor ==2'b01) begin
DHT_Yac[DataInCount] <= DataIn;
end
if(DataInEnable ==1'b1 & DataInColor ==2'b10) begin
DHT_Cdc[DataInCount[3:0]] <= DataIn;
end
if(DataInEnable ==1'b1 & DataInColor ==2'b11) begin
DHT_Cac[DataInCount] <= DataIn;
end
end
 
always @(posedge clk) begin
ReadDataYdc <= DHT_Ydc[TableNumber[3:0]];
ReadDataYac <= DHT_Yac[TableNumber];
ReadDataCdc <= DHT_Cdc[TableNumber[3:0]];
ReadDataCac <= DHT_Cac[TableNumber];
end // always @ (posedge clk or negedge rst)
// Selector
/*
always @(*) begin
case (ColorNumber)
2'b00: ReadData <= ReadDataYdc;
2'b01: ReadData <= ReadDataYac;
2'b10: ReadData <= ReadDataCdc;
2'b11: ReadData <= ReadDataCac;
endcase // case(ColorNumber)
end
*/
function [7:0] ReadDataSel;
input [1:0] ColorNumber;
input [7:0] ReadDataYdc;
input [7:0] ReadDataYac;
input [7:0] ReadDataCdc;
input [7:0] ReadDataCac;
begin
case (ColorNumber)
2'b00: ReadDataSel = ReadDataYdc;
2'b01: ReadDataSel = ReadDataYac;
2'b10: ReadDataSel = ReadDataCdc;
2'b11: ReadDataSel = ReadDataCac;
endcase
end
endfunction
assign ReadData = ReadDataSel(ColorNumber, ReadDataYdc, ReadDataYac, ReadDataCdc, ReadDataCac);
assign ZeroTable = ReadData[7:4];
assign WidhtTable = ReadData[3:0];
endmodule // jpeg_dht
always @(posedge clk) begin
ReadDataYdc <= DHT_Ydc[TableNumber[3:0]];
ReadDataYac <= DHT_Yac[TableNumber];
ReadDataCdc <= DHT_Cdc[TableNumber[3:0]];
ReadDataCac <= DHT_Cac[TableNumber];
end
// Selector
function [7:0] ReadDataSel;
input [1:0] ColorNumber;
input [7:0] ReadDataYdc;
input [7:0] ReadDataYac;
input [7:0] ReadDataCdc;
input [7:0] ReadDataCac;
begin
case (ColorNumber)
2'b00: ReadDataSel = ReadDataYdc;
2'b01: ReadDataSel = ReadDataYac;
2'b10: ReadDataSel = ReadDataCdc;
2'b11: ReadDataSel = ReadDataCac;
endcase
end
endfunction
assign ReadData = ReadDataSel(ColorNumber, ReadDataYdc, ReadDataYac, ReadDataCdc, ReadDataCac);
assign ZeroTable = ReadData[7:4];
assign WidhtTable = ReadData[3:0];
endmodule
/djpeg/trunk/src/jpeg_ycbcr_mem.v
1,175 → 1,181
//---------------------------------------------------------------------------
// File Name : jpeg_ycbcr_mem.v
// Module Name : jpeg_ycbcr_mem
// Description : Memory for YCbCr2RGB
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_ycbcr_mem.v
// Module Name : jpeg_ycbcr_mem
// Description : Memory for YCbCr2RGB
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 2.00
//---------------------------------------------------------------------------
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 1.02 2006/10/04 remove a WriteData,WriteDataA,WriteDataB wires.
// 2.00 2007/03/25 Replace to RAM from D-FF
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_ycbcr_mem
(
clk,
module jpeg_ycbcr_mem(
rst,
clk,
 
DataInEnable,
DataInColor,
DataInPage,
DataInCount,
Data0In,
Data1In,
DataInit,
 
DataOutAddress,
DataOutY,
DataOutCb,
DataOutCr
);
DataInEnable,
DataInColor,
DataInPage,
DataInCount,
Data0In,
Data1In,
 
input clk;
DataOutEnable,
DataOutAddress,
DataOutRead,
DataOutY,
DataOutCb,
DataOutCr
);
input rst;
input clk;
input DataInit;
input DataInEnable;
input [2:0] DataInColor;
input [2:0] DataInPage;
input [1:0] DataInCount;
input [8:0] Data0In;
input [8:0] Data1In;
input [7:0] DataOutAddress;
output [8:0] DataOutY;
output [8:0] DataOutCb;
output [8:0] DataOutCr;
input DataInEnable;
input [2:0] DataInColor;
input [2:0] DataInPage;
input [1:0] DataInCount;
input [8:0] Data0In;
input [8:0] Data1In;
 
reg [8:0] MemYA [0:127];
reg [8:0] MemYB [0:127];
reg [8:0] MemCbA [0:31];
reg [8:0] MemCbB [0:31];
reg [8:0] MemCrA [0:31];
reg [8:0] MemCrB [0:31];
output DataOutEnable;
input [7:0] DataOutAddress;
input DataOutRead;
output [8:0] DataOutY;
output [8:0] DataOutCb;
output [8:0] DataOutCr;
reg [8:0] MemYA [0:511];
reg [8:0] MemYB [0:511];
reg [8:0] MemCbA [0:127];
reg [8:0] MemCbB [0:127];
reg [8:0] MemCrA [0:127];
reg [8:0] MemCrB [0:127];
reg [1:0] WriteBank, ReadBank;
 
reg [6:0] WriteAddressA;
reg [6:0] WriteAddressB;
wire [5:0] DataInAddress;
assign DataInAddress = {DataInPage, DataInCount};
 
always @(DataInColor or DataInPage or DataInCount) begin
WriteAddressA[6] <= DataInColor[1];
WriteAddressB[6] <= DataInColor[1];
if(DataInColor[2] == 1'b0) begin
if(DataInColor[0] == 1'b0) begin
case(DataInCount)
2'h0: begin
WriteAddressA[5:0] <= DataInPage + 0;
WriteAddressB[5:0] <= DataInPage +112 -64;
end
2'h1: begin
WriteAddressA[5:0] <= DataInPage + 16;
WriteAddressB[5:0] <= DataInPage + 96 -64;
end
2'h2: begin
WriteAddressA[5:0] <= DataInPage + 32;
WriteAddressB[5:0] <= DataInPage + 80 -64;
end
2'h3: begin
WriteAddressA[5:0] <= DataInPage + 48;
WriteAddressB[5:0] <= DataInPage + 64 -64;
end
endcase // case(DataInCount)
end else begin // if (DataInColor[0] == 1'b0)
case(DataInCount)
2'h0: begin
WriteAddressA[5:0] <= DataInPage + 0 +8;
WriteAddressB[5:0] <= DataInPage +112 +8 -64;
end
2'h1: begin
WriteAddressA[5:0] <= DataInPage + 16 +8;
WriteAddressB[5:0] <= DataInPage + 96 +8 -64;
end
2'h2: begin
WriteAddressA[5:0] <= DataInPage + 32 +8;
WriteAddressB[5:0] <= DataInPage + 80 +8 -64;
end
2'h3: begin
WriteAddressA[5:0] <= DataInPage + 48 +8;
WriteAddressB[5:0] <= DataInPage + 64 +8 -64;
end
endcase // case(DataInCount)
end // else: !if(DataInColor[0] == 1'b0)
end else begin // if (DataInColor[2] == 1'b0)
case(DataInCount)
2'h0: begin
WriteAddressA[5:0] <= DataInPage + 0;
WriteAddressB[5:0] <= DataInPage + 56 -32;
end
2'h1: begin
WriteAddressA[5:0] <= DataInPage + 8;
WriteAddressB[5:0] <= DataInPage + 48 -32;
end
2'h2: begin
WriteAddressA[5:0] <= DataInPage + 16;
WriteAddressB[5:0] <= DataInPage + 40 -32;
end
2'h3: begin
WriteAddressA[5:0] <= DataInPage + 24;
WriteAddressB[5:0] <= DataInPage + 32 -32;
end
endcase // case(DataInCount)
end // else: !if(DataInColor[2] == 1'b0)
end // always @ (DataInColor or DataInPage or DataInCount)
always @(posedge clk) begin
if(DataInColor[2] == 1'b0 & DataInEnable == 1'b1) begin
MemYA[WriteAddressA] <= Data0In;
MemYB[WriteAddressB] <= Data1In;
end
end
always @(posedge clk) begin
if(DataInColor == 3'b100 & DataInEnable == 1'b1) begin
MemCbA[WriteAddressA[4:0]] <= Data0In;
MemCbB[WriteAddressB[4:0]] <= Data1In;
end
end
always @(posedge clk) begin
if(DataInColor == 3'b101 & DataInEnable == 1'b1) begin
MemCrA[WriteAddressA[4:0]] <= Data0In;
MemCrB[WriteAddressB[4:0]] <= Data1In;
end
end
// Bank
always @(posedge clk or negedge rst) begin
if(!rst) begin
WriteBank <= 2'd0;
ReadBank <= 2'd0;
end else begin
if(DataInit) begin
WriteBank <= 2'd0;
end else if(DataInEnable && (DataInAddress == 5'h1F) && (DataInColor == 3'b101)) begin
WriteBank <= WriteBank + 2'd1;
end
if(DataInit) begin
ReadBank <= 2'd0;
end else if(DataOutRead && (DataOutAddress == 8'hFF)) begin
ReadBank <= ReadBank + 2'd1;
end
end
end
 
reg [8:0] ReadYA;
reg [8:0] ReadYB;
reg [8:0] ReadCbA;
reg [8:0] ReadCbB;
reg [8:0] ReadCrA;
reg [8:0] ReadCrB;
wire [6:0] WriteAddressA;
wire [6:0] WriteAddressB;
function [6:0] F_WriteAddressA;
input [2:0] DataInColor;
input [2:0] DataInPage;
input [1:0] DataInCount;
begin
F_WriteAddressA[6] = DataInColor[1];
if(DataInColor[2] == 1'b0) begin
F_WriteAddressA[5:4] = DataInCount[1:0];
F_WriteAddressA[3] = DataInColor[0] & ~DataInColor[2];
end else begin
F_WriteAddressA[5] = 1'b0;
F_WriteAddressA[4:3] = DataInCount[1:0];
end
F_WriteAddressA[2:0] = DataInPage[2:0];
end
endfunction
function [6:0] F_WriteAddressB;
input [2:0] DataInColor;
input [2:0] DataInPage;
input [1:0] DataInCount;
begin
F_WriteAddressB[6] = DataInColor[1];
if(DataInColor[2] == 1'b0) begin
F_WriteAddressB[5:4] = ~DataInCount[1:0];
F_WriteAddressB[3] = DataInColor[0] & ~DataInColor[2];
end else begin
F_WriteAddressB[5] = 1'b0;
F_WriteAddressB[4:3] = ~DataInCount[1:0];
end
F_WriteAddressB[2:0] = DataInPage[2:0];
end
endfunction
 
reg [7:0] RegAdrs;
always @(posedge clk) begin
RegAdrs <= DataOutAddress;
ReadYA <= MemYA[{DataOutAddress[7],DataOutAddress[5:0]}];
ReadYB <= MemYB[{DataOutAddress[7],DataOutAddress[5:0]}];
assign WriteAddressA = F_WriteAddressA(DataInColor, DataInPage, DataInCount);
assign WriteAddressB = F_WriteAddressB(DataInColor, DataInPage, DataInCount);
 
ReadCbA <= MemCbA[{DataOutAddress[6:5],DataOutAddress[3:1]}];
ReadCrA <= MemCrA[{DataOutAddress[6:5],DataOutAddress[3:1]}];
always @(posedge clk) begin
if(DataInColor[2] == 1'b0 & DataInEnable == 1'b1) begin
MemYA[{WriteBank, WriteAddressA}] <= Data0In;
MemYB[{WriteBank, WriteAddressB}] <= Data1In;
end
end
always @(posedge clk) begin
if(DataInColor == 3'b100 & DataInEnable == 1'b1) begin
MemCbA[{WriteBank, WriteAddressA[4:0]}] <= Data0In;
MemCbB[{WriteBank, WriteAddressB[4:0]}] <= Data1In;
end
end
always @(posedge clk) begin
if(DataInColor == 3'b101 & DataInEnable == 1'b1) begin
MemCrA[{WriteBank, WriteAddressA[4:0]}] <= Data0In;
MemCrB[{WriteBank, WriteAddressB[4:0]}] <= Data1In;
end
end
reg [8:0] ReadYA;
reg [8:0] ReadYB;
reg [8:0] ReadCbA;
reg [8:0] ReadCbB;
reg [8:0] ReadCrA;
reg [8:0] ReadCrB;
reg [7:0] RegAdrs;
always @(posedge clk) begin
RegAdrs <= DataOutAddress;
 
ReadCbB <= MemCbB[{DataOutAddress[6:5],DataOutAddress[3:1]}];
ReadCrB <= MemCrB[{DataOutAddress[6:5],DataOutAddress[3:1]}];
end // always @ (posedge clk)
 
assign DataOutY = (RegAdrs[6] ==1'b0)?ReadYA:ReadYB;
assign DataOutCb = (RegAdrs[7] ==1'b0)?ReadCbA:ReadCbB;
assign DataOutCr = (RegAdrs[7] ==1'b0)?ReadCrA:ReadCrB;
ReadYA <= MemYA[{ReadBank, DataOutAddress[7],DataOutAddress[5:0]}];
ReadYB <= MemYB[{ReadBank, DataOutAddress[7],DataOutAddress[5:0]}];
ReadCbA <= MemCbA[{ReadBank, DataOutAddress[6:5],DataOutAddress[3:1]}];
ReadCrA <= MemCrA[{ReadBank, DataOutAddress[6:5],DataOutAddress[3:1]}];
ReadCbB <= MemCbB[{ReadBank, DataOutAddress[6:5],DataOutAddress[3:1]}];
ReadCrB <= MemCrB[{ReadBank, DataOutAddress[6:5],DataOutAddress[3:1]}];
end
assign DataOutEnable = (WriteBank != ReadBank);
assign DataOutY = (RegAdrs[6] ==1'b0)?ReadYA:ReadYB;
assign DataOutCb = (RegAdrs[7] ==1'b0)?ReadCbA:ReadCbB;
assign DataOutCr = (RegAdrs[7] ==1'b0)?ReadCrA:ReadCrB;
endmodule // jpeg_ycbcr_mem
endmodule
/djpeg/trunk/src/jpeg_ycbcr.v
14,215 → 14,144
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_ycbcr
(
rst,
clk,
module jpeg_ycbcr(
rst,
clk,
 
DataInEnable,
DataInPage,
DataInCount,
DataInIdle,
Data0In,
Data1In,
DataInBlockWidth,
ProcessInit,
 
OutEnable,
OutPixelX,
OutPixelY,
OutR,
OutG,
OutB
);
DataInEnable,
DataInPage,
DataInCount,
DataInIdle,
Data0In,
Data1In,
DataInBlockWidth,
 
input rst;
input clk;
input DataInEnable;
input [2:0] DataInPage;
input [1:0] DataInCount;
output DataInIdle;
input [8:0] Data0In;
input [8:0] Data1In;
input [11:0] DataInBlockWidth;
OutEnable,
OutPixelX,
OutPixelY,
OutR,
OutG,
OutB
);
 
output OutEnable;
output [15:0] OutPixelX;
output [15:0] OutPixelY;
output [7:0] OutR;
output [7:0] OutG;
output [7:0] OutB;
input rst;
input clk;
input ProcessInit;
input DataInEnable;
input [2:0] DataInPage;
input [1:0] DataInCount;
output DataInIdle;
input [8:0] Data0In;
input [8:0] Data1In;
input [11:0] DataInBlockWidth;
output OutEnable;
output [15:0] OutPixelX;
output [15:0] OutPixelY;
output [7:0] OutR;
output [7:0] OutG;
output [7:0] OutB;
reg [2:0] DataInColor;
reg [11:0] DataInBlockX;
reg [11:0] DataInBlockY;
 
reg DataInBank;
reg [2:0] DataInColor;
reg [11:0] DataInBlockX;
reg [11:0] DataInBlockY;
reg BankAActive;
reg BankBActive;
wire BankAEnable;
wire BankBEnable;
wire [8:0] BankAY;
wire [8:0] BankACb;
wire [8:0] BankACr;
wire [8:0] BankBY;
wire [8:0] BankBCb;
wire [8:0] BankBCr;
reg [11:0] BankABlockX;
reg [11:0] BankABlockY;
reg [11:0] BankBBlockX;
reg [11:0] BankBBlockY;
wire ConvertEnable;
wire ConvertBank;
wire [7:0] ConvertAddress;
wire [8:0] DataY;
wire [8:0] DataCb;
wire [8:0] DataCr;
wire [11:0] ConvertBlockX;
wire [11:0] ConvertBlockY;
wire ConvertEnable;
wire ConvertRead;
wire ConvertBank;
wire [7:0] ConvertAddress;
wire [8:0] DataY;
wire [8:0] DataCb;
wire [8:0] DataCr;
wire [11:0] ConvertBlockX;
wire [11:0] ConvertBlockY;
always @(posedge clk or negedge rst) begin
if(!rst) begin
DataInColor <= 3'b000;
end else begin
if(ProcessInit) begin
DataInColor <= 3'b000;
end else if(DataInEnable == 1'b1 & DataInPage == 3'b111 & DataInCount == 2'b11) begin
if(DataInColor == 3'b101) begin
DataInColor <= 3'b000;
end else begin
DataInColor <= DataInColor + 3'b001;
end
end
end
end
//------------------------------------------------------------------------
// YCbCr Memory
//------------------------------------------------------------------------
jpeg_ycbcr_mem u_jpeg_ycbcr_mem(
.rst ( rst ),
.clk ( clk ),
.DataInit ( ProcessInit ),
.DataInEnable ( DataInEnable ),
.DataInColor ( DataInColor ),
.DataInPage ( DataInPage ),
.DataInCount ( DataInCount ),
.Data0In ( Data0In ),
.Data1In ( Data1In ),
.DataOutEnable ( ConvertEnable ),
.DataOutAddress ( ConvertAddress ),
.DataOutRead ( ConvertRead ),
.DataOutY ( DataY ),
.DataOutCb ( DataCb ),
.DataOutCr ( DataCr )
);
//------------------------------------------------------------------------
// YCbCr to RGB
//------------------------------------------------------------------------
always @(posedge clk or negedge rst) begin
if(!rst) begin
DataInBlockX <= 12'h000;
DataInBlockY <= 12'h000;
end else begin
if(ProcessInit) begin
DataInBlockX <= 12'h000;
DataInBlockY <= 12'h000;
end else if((ConvertRead == 1'b1) && (ConvertAddress == 5'h1F)) begin
if(DataInBlockWidth == DataInBlockX +1) begin
DataInBlockX <= 12'h000;
DataInBlockY <= DataInBlockY + 12'h001;
end else begin
DataInBlockX <= DataInBlockX + 12'h001;
end
end
end
end
 
wire BankAIdle;
wire BankBIdle;
always @(posedge clk or negedge rst) begin
if(!rst) begin
DataInBank <= 1'b0;
DataInColor <= 3'b000;
DataInBlockX <= 12'h000;
DataInBlockY <= 12'h000;
BankAActive <= 1'b0;
BankBActive <= 1'b0;
BankABlockX <= 12'h000;
BankABlockY <= 12'h000;
BankBBlockX <= 12'h000;
BankBBlockY <= 12'h000;
end else begin // if (!rst)
if(DataInEnable == 1'b1 & DataInColor == 3'b101 &
DataInPage == 3'b111 & DataInCount == 2'b11) begin
end
if(DataInEnable == 1'b1 & DataInColor == 3'b101 &
DataInPage == 3'b111 & DataInCount == 2'b11 &
DataInBank == 1'b0 & BankAActive == 1'b0) begin
BankAActive <= 1'b1;
BankABlockX <= DataInBlockX;
BankABlockY <= DataInBlockY;
end else if(ConvertBank == 1'b0 & ConvertAddress == 7'b111) begin
BankAActive <= 1'b0;
end
if(DataInEnable == 1'b1 & DataInColor == 3'b101 &
DataInPage == 3'b111 & DataInCount == 2'b11 &
DataInBank == 1'b1 & BankBActive == 1'b0) begin
BankBActive <= 1'b1;
BankBBlockX <= DataInBlockX;
BankBBlockY <= DataInBlockY;
end else if(ConvertBank == 1'b1 & ConvertAddress == 7'b111) begin
BankBActive <= 1'b0;
end
if(DataInEnable == 1'b1 &
DataInPage == 3'b111 & DataInCount == 2'b11) begin
if(DataInColor == 3'b101) begin
DataInColor <= 3'b000;
DataInBank <= ~DataInBank;
if(DataInBlockWidth == DataInBlockX +1) begin
DataInBlockX <= 12'h000;
DataInBlockY <= DataInBlockY + 12'h001;
end else begin
DataInBlockX <= DataInBlockX + 12'h001;
end
end else begin
DataInColor <= DataInColor + 3'b001;
end // else: !if(DataInColor == 3'b101)
end // if (DataInEnable == 1'b1 &...
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
 
assign BankAEnable = DataInEnable == 1'b1 & DataInBank == 1'b0;
assign BankBEnable = DataInEnable == 1'b1 & DataInBank == 1'b1;
 
/*
assign ConvertBlockX = (ConvertBank)?BankBBlockX:BankABlockX;
assign ConvertBlockY = (ConvertBank)?BankBBlockY:BankABlockY;
*/
 
assign ConvertEnable = DataInEnable == 1'b1 & DataInColor == 3'b101 &
DataInPage == 3'b111 & DataInCount == 2'b11;
 
assign DataInIdle = BankAActive == 1'b0 | BankBActive == 1'b0;
//------------------------------------------------------------------------
// YCbCr Memory
//------------------------------------------------------------------------
jpeg_ycbcr_mem u_jpeg_ycbcr_mem0(
.clk(clk),
.DataInEnable (BankAEnable),
.DataInColor (DataInColor),
.DataInPage (DataInPage),
.DataInCount (DataInCount),
.Data0In (Data0In),
.Data1In (Data1In),
.DataOutAddress (ConvertAddress),
.DataOutY (BankAY),
.DataOutCb (BankACb),
.DataOutCr (BankACr)
);
jpeg_ycbcr_mem u_jpeg_ycbcr_mem1(
.clk(clk),
.DataInEnable (BankBEnable),
.DataInColor (DataInColor),
.DataInPage (DataInPage),
.DataInCount (DataInCount),
.Data0In (Data0In),
.Data1In (Data1In),
.DataOutAddress (ConvertAddress),
.DataOutY (BankBY),
.DataOutCb (BankBCb),
.DataOutCr (BankBCr)
);
 
reg ConvertBankD;
always @(posedge clk or negedge rst) begin
if(!rst) ConvertBankD <= 1'b0;
else ConvertBankD <= ConvertBank;
end
assign DataY = (ConvertBankD)?BankBY :BankAY;
assign DataCb = (ConvertBankD)?BankBCb:BankACb;
assign DataCr = (ConvertBankD)?BankBCr:BankACr;
 
//------------------------------------------------------------------------
// YCbCr to RGB
//------------------------------------------------------------------------
jpeg_ycbcbr2rgb u_jpeg_ycbcr2rgb(
.rst(rst),
.clk(clk),
.InEnable ( ConvertEnable ),
.InBlockX ( DataInBlockX ),
.InBlockY ( DataInBlockY ),
.InIdle ( ConvertIdle ),
.InBank ( ConvertBank ),
.InAddress ( ConvertAddress ),
.InY ( DataY ),
.InCb ( DataCb ),
.InCr ( DataCr ),
.OutEnable ( OutEnable ),
.OutPixelX ( OutPixelX ),
.OutPixelY ( OutPixelY ),
.OutR ( OutR ),
.OutG ( OutG ),
.OutB ( OutB )
);
endmodule // jpeg_ycbcr
jpeg_ycbcr2rgb u_jpeg_yccr2rgb(
.rst ( rst ),
.clk ( clk ),
.InEnable ( ConvertEnable ),
.InRead ( ConvertRead ),
.InBlockX ( DataInBlockX ),
.InBlockY ( DataInBlockY ),
.InAddress ( ConvertAddress ),
.InY ( DataY ),
.InCb ( DataCb ),
.InCr ( DataCr ),
.OutEnable ( OutEnable ),
.OutPixelX ( OutPixelX ),
.OutPixelY ( OutPixelY ),
.OutR ( OutR ),
.OutG ( OutG ),
.OutB ( OutB )
);
endmodule
/djpeg/trunk/src/jpeg_idct.v
1,505 → 1,128
//---------------------------------------------------------------------------
// File Name : jpeg_idct.v
// Module Name : jpeg_idct
// Description : iDCT top module
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_idct.v
// Module Name : jpeg_idct
// Description : iDCT top module
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2008/03/19
// Rev. : 2.00
//---------------------------------------------------------------------------
// Rev. Date Description
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 2.00 2008/03/19 Replace to RAM from D-FF
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_idct
(
rst,
clk,
module jpeg_idct(
rst,
clk,
 
DataInEnable,
DataInSel,
Data00In,
Data01In,
Data02In,
Data03In,
Data04In,
Data05In,
Data06In,
Data07In,
Data08In,
Data09In,
Data10In,
Data11In,
Data12In,
Data13In,
Data14In,
Data15In,
Data16In,
Data17In,
Data18In,
Data19In,
Data20In,
Data21In,
Data22In,
Data23In,
Data24In,
Data25In,
Data26In,
Data27In,
Data28In,
Data29In,
Data30In,
Data31In,
Data32In,
Data33In,
Data34In,
Data35In,
Data36In,
Data37In,
Data38In,
Data39In,
Data40In,
Data41In,
Data42In,
Data43In,
Data44In,
Data45In,
Data46In,
Data47In,
Data48In,
Data49In,
Data50In,
Data51In,
Data52In,
Data53In,
Data54In,
Data55In,
Data56In,
Data57In,
Data58In,
Data59In,
Data60In,
Data61In,
Data62In,
Data63In,
DataInIdle,
DataInRelease,
ProcessInit,
DataInEnable,
DataInRead,
DataInAddress,
DataInA,
DataInB,
 
DataOutEnable,
DataOutPage,
DataOutCount,
Data0Out,
Data1Out
);
DataOutEnable,
DataOutPage,
DataOutCount,
Data0Out,
Data1Out
);
 
input rst;
input clk;
input DataInEnable;
output DataInSel;
input [15:0] Data00In;
input [15:0] Data01In;
input [15:0] Data02In;
input [15:0] Data03In;
input [15:0] Data04In;
input [15:0] Data05In;
input [15:0] Data06In;
input [15:0] Data07In;
input [15:0] Data08In;
input [15:0] Data09In;
input [15:0] Data10In;
input [15:0] Data11In;
input [15:0] Data12In;
input [15:0] Data13In;
input [15:0] Data14In;
input [15:0] Data15In;
input [15:0] Data16In;
input [15:0] Data17In;
input [15:0] Data18In;
input [15:0] Data19In;
input [15:0] Data20In;
input [15:0] Data21In;
input [15:0] Data22In;
input [15:0] Data23In;
input [15:0] Data24In;
input [15:0] Data25In;
input [15:0] Data26In;
input [15:0] Data27In;
input [15:0] Data28In;
input [15:0] Data29In;
input [15:0] Data30In;
input [15:0] Data31In;
input [15:0] Data32In;
input [15:0] Data33In;
input [15:0] Data34In;
input [15:0] Data35In;
input [15:0] Data36In;
input [15:0] Data37In;
input [15:0] Data38In;
input [15:0] Data39In;
input [15:0] Data40In;
input [15:0] Data41In;
input [15:0] Data42In;
input [15:0] Data43In;
input [15:0] Data44In;
input [15:0] Data45In;
input [15:0] Data46In;
input [15:0] Data47In;
input [15:0] Data48In;
input [15:0] Data49In;
input [15:0] Data50In;
input [15:0] Data51In;
input [15:0] Data52In;
input [15:0] Data53In;
input [15:0] Data54In;
input [15:0] Data55In;
input [15:0] Data56In;
input [15:0] Data57In;
input [15:0] Data58In;
input [15:0] Data59In;
input [15:0] Data60In;
input [15:0] Data61In;
input [15:0] Data62In;
input [15:0] Data63In;
output DataInIdle;
output DataInRelease;
output DataOutEnable;
output [2:0] DataOutPage;
output [1:0] DataOutCount;
output [8:0] Data0Out;
output [8:0] Data1Out;
input rst;
input clk;
input ProcessInit;
input DataInEnable;
output DataInRead;
output [4:0] DataInAddress;
input [15:0] DataInA;
input [15:0] DataInB;
output DataOutEnable;
output [2:0] DataOutPage;
output [1:0] DataOutCount;
output [8:0] Data0Out;
output [8:0] Data1Out;
wire DctXEnable;
wire [2:0] DctXPage;
wire [1:0] DctXCount;
wire [31:0] DctXData0r;
wire [31:0] DctXData1r;
jpeg_idct_calc u_jpeg_idctx(
.rst ( rst ),
.clk ( clk ),
.DataInEnable ( DataInEnable ),
.DataInRead ( DataInRead ),
.DataInAddress ( DataInAddress ),
.DataInA ( DataInA ),
.DataInB ( DataInB ),
.DataOutEnable ( DctXEnable ),
.DataOutPage ( DctXPage ),
.DataOutCount ( DctXCount ),
.Data0Out ( DctXData0r ),
.Data1Out ( DctXData1r )
);
 
wire DctXEnable;
wire [2:0] DctXPage;
wire [1:0] DctXCount;
wire [15:0] DctXData0r;
wire [15:0] DctXData1r;
wire DctBBank;
wire DctBIdle;
jpeg_idctx u_jpeg_idctx(
.rst(rst),
.clk(clk),
.DataInEnable( DataInEnable ),
.DataInSel( DataInSel ),
.Data00In( Data00In ),
.Data01In( Data01In ),
.Data02In( Data02In ),
.Data03In( Data03In ),
.Data04In( Data04In ),
.Data05In( Data05In ),
.Data06In( Data06In ),
.Data07In( Data07In ),
.Data08In( Data08In ),
.Data09In( Data09In ),
.Data10In( Data10In ),
.Data11In( Data11In ),
.Data12In( Data12In ),
.Data13In( Data13In ),
.Data14In( Data14In ),
.Data15In( Data15In ),
.Data16In( Data16In ),
.Data17In( Data17In ),
.Data18In( Data18In ),
.Data19In( Data19In ),
.Data20In( Data20In ),
.Data21In( Data21In ),
.Data22In( Data22In ),
.Data23In( Data23In ),
.Data24In( Data24In ),
.Data25In( Data25In ),
.Data26In( Data26In ),
.Data27In( Data27In ),
.Data28In( Data28In ),
.Data29In( Data29In ),
.Data30In( Data30In ),
.Data31In( Data31In ),
.Data32In( Data32In ),
.Data33In( Data33In ),
.Data34In( Data34In ),
.Data35In( Data35In ),
.Data36In( Data36In ),
.Data37In( Data37In ),
.Data38In( Data38In ),
.Data39In( Data39In ),
.Data40In( Data40In ),
.Data41In( Data41In ),
.Data42In( Data42In ),
.Data43In( Data43In ),
.Data44In( Data44In ),
.Data45In( Data45In ),
.Data46In( Data46In ),
.Data47In( Data47In ),
.Data48In( Data48In ),
.Data49In( Data49In ),
.Data50In( Data50In ),
.Data51In( Data51In ),
.Data52In( Data52In ),
.Data53In( Data53In ),
.Data54In( Data54In ),
.Data55In( Data55In ),
.Data56In( Data56In ),
.Data57In( Data57In ),
.Data58In( Data58In ),
.Data59In( Data59In ),
.Data60In( Data60In ),
.Data61In( Data61In ),
.Data62In( Data62In ),
.Data63In( Data63In ),
.DataInIdle( DataInIdle),
.DataInRelease( DataInRelease ),
.DataOutIdle ( DctBIdle ),
.DataOutEnable ( DctXEnable ),
.DataOutPage ( DctXPage ),
.DataOutCount ( DctXCount ),
.Data0Out ( DctXData0r ),
.Data1Out ( DctXData1r )
);
wire DctBEnable;
wire DctBRead;
wire [4:0] DctBAddress;
wire [15:0] DctBDataA;
wire [15:0] DctBDataB;
jpeg_idctb u_jpeg_idctb(
.rst ( rst ),
.clk ( clk ),
.DataInit ( ProcessInit ),
.DataInEnable ( DctXEnable ),
.DataInPage ( DctXPage ),
.DataInCount ( DctXCount ),
.DataInIdle ( DctBIdle ),
.DataInA ( DctXData0r[26:11] ),
.DataInB ( DctXData1r[26:11] ),
.DataOutEnable ( DctBEnable ),
.DataOutRead ( DctBRead ),
.DataOutAddress ( DctBAddress ),
.DataOutA ( DctBDataA ),
.DataOutB ( DctBDataB )
 
wire [15:0] DctB00r;
wire [15:0] DctB01r;
wire [15:0] DctB02r;
wire [15:0] DctB03r;
wire [15:0] DctB04r;
wire [15:0] DctB05r;
wire [15:0] DctB06r;
wire [15:0] DctB07r;
wire [15:0] DctB08r;
wire [15:0] DctB09r;
wire [15:0] DctB10r;
wire [15:0] DctB11r;
wire [15:0] DctB12r;
wire [15:0] DctB13r;
wire [15:0] DctB14r;
wire [15:0] DctB15r;
wire [15:0] DctB16r;
wire [15:0] DctB17r;
wire [15:0] DctB18r;
wire [15:0] DctB19r;
wire [15:0] DctB20r;
wire [15:0] DctB21r;
wire [15:0] DctB22r;
wire [15:0] DctB23r;
wire [15:0] DctB24r;
wire [15:0] DctB25r;
wire [15:0] DctB26r;
wire [15:0] DctB27r;
wire [15:0] DctB28r;
wire [15:0] DctB29r;
wire [15:0] DctB30r;
wire [15:0] DctB31r;
wire [15:0] DctB32r;
wire [15:0] DctB33r;
wire [15:0] DctB34r;
wire [15:0] DctB35r;
wire [15:0] DctB36r;
wire [15:0] DctB37r;
wire [15:0] DctB38r;
wire [15:0] DctB39r;
wire [15:0] DctB40r;
wire [15:0] DctB41r;
wire [15:0] DctB42r;
wire [15:0] DctB43r;
wire [15:0] DctB44r;
wire [15:0] DctB45r;
wire [15:0] DctB46r;
wire [15:0] DctB47r;
wire [15:0] DctB48r;
wire [15:0] DctB49r;
wire [15:0] DctB50r;
wire [15:0] DctB51r;
wire [15:0] DctB52r;
wire [15:0] DctB53r;
wire [15:0] DctB54r;
wire [15:0] DctB55r;
wire [15:0] DctB56r;
wire [15:0] DctB57r;
wire [15:0] DctB58r;
wire [15:0] DctB59r;
wire [15:0] DctB60r;
wire [15:0] DctB61r;
wire [15:0] DctB62r;
wire [15:0] DctB63r;
);
 
wire DctBReleaseA;
wire DctBReleaseB;
wire DctBRelease;
jpeg_idctb u_jpeg_idctb(
.rst(rst),
.clk(clk),
.DataInEnable ( DctXEnable ),
.DataInPage ( DctXPage ),
.DataInCount ( DctXCount ),
.DataInIdle ( DctBIdle ),
.Data0In ( DctXData0r ),
.Data1In ( DctXData1r ),
wire [31:0] Data0OutW, Data1OutW;
 
.DataOutEnable ( DctBEnable ),
.DataOutSel( DctBSel),
.Data00Out( DctB00r ),
.Data01Out( DctB01r ),
.Data02Out( DctB02r ),
.Data03Out( DctB03r ),
.Data04Out( DctB04r ),
.Data05Out( DctB05r ),
.Data06Out( DctB06r ),
.Data07Out( DctB07r ),
.Data08Out( DctB08r ),
.Data09Out( DctB09r ),
.Data10Out( DctB10r ),
.Data11Out( DctB11r ),
.Data12Out( DctB12r ),
.Data13Out( DctB13r ),
.Data14Out( DctB14r ),
.Data15Out( DctB15r ),
.Data16Out( DctB16r ),
.Data17Out( DctB17r ),
.Data18Out( DctB18r ),
.Data19Out( DctB19r ),
.Data20Out( DctB20r ),
.Data21Out( DctB21r ),
.Data22Out( DctB22r ),
.Data23Out( DctB23r ),
.Data24Out( DctB24r ),
.Data25Out( DctB25r ),
.Data26Out( DctB26r ),
.Data27Out( DctB27r ),
.Data28Out( DctB28r ),
.Data29Out( DctB29r ),
.Data30Out( DctB30r ),
.Data31Out( DctB31r ),
.Data32Out( DctB32r ),
.Data33Out( DctB33r ),
.Data34Out( DctB34r ),
.Data35Out( DctB35r ),
.Data36Out( DctB36r ),
.Data37Out( DctB37r ),
.Data38Out( DctB38r ),
.Data39Out( DctB39r ),
.Data40Out( DctB40r ),
.Data41Out( DctB41r ),
.Data42Out( DctB42r ),
.Data43Out( DctB43r ),
.Data44Out( DctB44r ),
.Data45Out( DctB45r ),
.Data46Out( DctB46r ),
.Data47Out( DctB47r ),
.Data48Out( DctB48r ),
.Data49Out( DctB49r ),
.Data50Out( DctB50r ),
.Data51Out( DctB51r ),
.Data52Out( DctB52r ),
.Data53Out( DctB53r ),
.Data54Out( DctB54r ),
.Data55Out( DctB55r ),
.Data56Out( DctB56r ),
.Data57Out( DctB57r ),
.Data58Out( DctB58r ),
.Data59Out( DctB59r ),
.Data60Out( DctB60r ),
.Data61Out( DctB61r ),
.Data62Out( DctB62r ),
.Data63Out( DctB63r ),
.BankARelease( DctBReleaseA ),
.BankBRelease( DctBReleaseB )
);
jpeg_idct_calc u_jpeg_idcty(
.rst ( rst ),
.clk ( clk ),
.DataInEnable ( DctBEnable ),
.DataInRead ( DctBRead ),
.DataInAddress ( DctBAddress ),
.DataInA ( DctBDataA ),
.DataInB ( DctBDataB ),
.DataOutEnable ( DataOutEnable ),
.DataOutPage ( DataOutPage ),
.DataOutCount ( DataOutCount ),
.Data0Out ( Data0OutW ),
.Data1Out ( Data1OutW )
);
assign Data0Out = Data0OutW[23:15];
assign Data1Out = Data1OutW[23:15];
 
assign DctBReleaseA = DctBSel == 1'b0 & DctBRelease;
assign DctBReleaseB = DctBSel == 1'b1 & DctBRelease;
 
jpeg_idcty u_jpeg_idcty(
.rst(rst),
.clk(clk),
.DataInEnable(DctBEnable),
.DataInBank(DctBBank),
.DataInSel(DctBSel),
.Data00In( DctB00r ),
.Data01In( DctB01r ),
.Data02In( DctB02r ),
.Data03In( DctB03r ),
.Data04In( DctB04r ),
.Data05In( DctB05r ),
.Data06In( DctB06r ),
.Data07In( DctB07r ),
.Data08In( DctB08r ),
.Data09In( DctB09r ),
.Data10In( DctB10r ),
.Data11In( DctB11r ),
.Data12In( DctB12r ),
.Data13In( DctB13r ),
.Data14In( DctB14r ),
.Data15In( DctB15r ),
.Data16In( DctB16r ),
.Data17In( DctB17r ),
.Data18In( DctB18r ),
.Data19In( DctB19r ),
.Data20In( DctB20r ),
.Data21In( DctB21r ),
.Data22In( DctB22r ),
.Data23In( DctB23r ),
.Data24In( DctB24r ),
.Data25In( DctB25r ),
.Data26In( DctB26r ),
.Data27In( DctB27r ),
.Data28In( DctB28r ),
.Data29In( DctB29r ),
.Data30In( DctB30r ),
.Data31In( DctB31r ),
.Data32In( DctB32r ),
.Data33In( DctB33r ),
.Data34In( DctB34r ),
.Data35In( DctB35r ),
.Data36In( DctB36r ),
.Data37In( DctB37r ),
.Data38In( DctB38r ),
.Data39In( DctB39r ),
.Data40In( DctB40r ),
.Data41In( DctB41r ),
.Data42In( DctB42r ),
.Data43In( DctB43r ),
.Data44In( DctB44r ),
.Data45In( DctB45r ),
.Data46In( DctB46r ),
.Data47In( DctB47r ),
.Data48In( DctB48r ),
.Data49In( DctB49r ),
.Data50In( DctB50r ),
.Data51In( DctB51r ),
.Data52In( DctB52r ),
.Data53In( DctB53r ),
.Data54In( DctB54r ),
.Data55In( DctB55r ),
.Data56In( DctB56r ),
.Data57In( DctB57r ),
.Data58In( DctB58r ),
.Data59In( DctB59r ),
.Data60In( DctB60r ),
.Data61In( DctB61r ),
.Data62In( DctB62r ),
.Data63In( DctB63r ),
.DataInIdle( DctYIdle ),
.DataInRelease( DctBRelease),
.DataOutEnable ( DataOutEnable ),
.DataOutPage ( DataOutPage ),
.DataOutCount ( DataOutCount ),
.Data0Out ( Data0Out ),
.Data1Out ( Data1Out )
);
 
endmodule // jpeg_idct
endmodule
/djpeg/trunk/src/jpeg_decode.v
7,468 → 7,276
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2007/04/11
// Rev. : 2.0
// Date : 2008/03/05
// Rev. : 2.00
//---------------------------------------------------------------------------
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 1.02 2006/10/04 add ProcessIdle register
// 2.00 2007/04/11
// 1.99 2007/04/11
// 2.00 2008/03/05 New Verion
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_decode
(
rst,
clk,
module jpeg_decode(
rst,
clk,
 
// From FIFO
DataIn,
DataInEnable,
DataInRead,
// From FIFO
DataIn,
DataInEnable,
DataInRead,
 
JpegDecodeIdle, // Deocdeer Process Idle(1:Idle, 0:Run)
JpegDecodeIdle, // Deocdeer Process Idle(1:Idle, 0:Run)
 
OutEnable,
OutWidth,
OutHeight,
OutPixelX,
OutPixelY,
OutR,
OutG,
OutB
OutEnable,
OutWidth,
OutHeight,
OutPixelX,
OutPixelY,
OutR,
OutG,
OutB
);
 
);
input rst;
input clk;
input [31:0] DataIn;
input DataInEnable;
output DataInRead;
output JpegDecodeIdle;
output OutEnable;
output [15:0] OutWidth;
output [15:0] OutHeight;
output [15:0] OutPixelX;
output [15:0] OutPixelY;
output [7:0] OutR;
output [7:0] OutG;
output [7:0] OutB;
wire [31:0] JpegData;
wire JpegDataEnable;
wire JpegDecodeIdle;
wire UseBit;
wire [6:0] UseWidth;
wire UseByte;
wire UseWord;
wire ImageEnable;
wire EnableFF00;
//reg ProcessIdle;
//--------------------------------------------------------------------------
// Read JPEG Data from FIFO
//--------------------------------------------------------------------------
jpeg_regdata u_jpeg_regdata(
.rst(rst),
.clk(clk),
// Read Data
.DataIn ( DataIn ),
.DataInEnable ( DataInEnable ),
.DataInRead ( DataInRead ),
// DataOut
.DataOut ( JpegData ),
.DataOutEnable ( JpegDataEnable ),
//
.ImageEnable ( ImageEnable ),
.ProcessIdle ( JpegDecodeIdle ),
// UseData
.UseBit ( UseBit ),
.UseWidth ( UseWidth ),
.UseByte ( UseByte ),
.UseWord ( UseWord )
);
 
input rst;
input clk;
input [31:0] DataIn;
input DataInEnable;
output DataInRead;
output JpegDecodeIdle;
output OutEnable;
output [15:0] OutWidth;
output [15:0] OutHeight;
output [15:0] OutPixelX;
output [15:0] OutPixelY;
output [7:0] OutR;
output [7:0] OutG;
output [7:0] OutB;
//--------------------------------------------------------------------------
// Read Maker from Jpeg Data
//--------------------------------------------------------------------------
wire DqtEnable;
wire DqtTable;
wire [5:0] DqtCount;
wire [7:0] DqtData;
wire DhtEnable;
wire [1:0] DhtTable;
wire [7:0] DhtCount;
wire [7:0] DhtData;
//
wire HuffmanEnable;
wire [1:0] HuffmanTable;
wire [3:0] HuffmanCount;
wire [15:0] HuffmanData;
wire [7:0] HuffmanStart;
wire [11:0] JpegBlockWidth;
jpeg_decode_fsm u_jpeg_decode_fsm(
.rst ( rst ),
.clk ( clk ),
// From FIFO
.DataInEnable ( JpegDataEnable ),
.DataIn ( JpegData ),
.JpegDecodeIdle ( JpegDecodeIdle ),
.OutWidth ( OutWidth ),
.OutHeight ( OutHeight ),
.OutBlockWidth ( JpegBlockWidth ),
.OutEnable ( OutEnable ),
.OutPixelX ( OutPixelX ),
.OutPixelY ( OutPixelY ),
//
.DqtEnable ( DqtEnable ),
.DqtTable ( DqtTable ),
.DqtCount ( DqtCount ),
.DqtData ( DqtData ),
//
.DhtEnable ( DhtEnable ),
.DhtTable ( DhtTable ),
.DhtCount ( DhtCount ),
.DhtData ( DhtData ),
//
.HuffmanEnable ( HuffmanEnable ),
.HuffmanTable ( HuffmanTable ),
.HuffmanCount ( HuffmanCount ),
.HuffmanData ( HuffmanData ),
.HuffmanStart ( HuffmanStart ),
//
.ImageEnable ( ImageEnable ),
//
.UseByte ( UseByte ),
.UseWord ( UseWord )
);
wire HmDecEnable;
wire [2:0] HmDecColor;
wire HmRead;
wire [4:0] HmAddress;
wire [15:0] HmDataA, HmDataB;
jpeg_huffman u_jpeg_huffman(
.rst ( rst ),
.clk ( clk ),
.ProcessInit ( JpegDecodeIdle ),
// DQT Table
.DqtInEnable ( DqtEnable ),
.DqtInColor ( DqtTable ),
.DqtInCount ( DqtCount[5:0] ),
.DqtInData ( DqtData ),
// DHT Table
.DhtInEnable ( DhtEnable ),
.DhtInColor ( DhtTable ),
.DhtInCount ( DhtCount ),
.DhtInData ( DhtData ),
// Huffman Table
.HuffmanTableEnable ( HuffmanEnable ),
.HuffmanTableColor ( HuffmanTable ),
.HuffmanTableCount ( HuffmanCount ),
.HuffmanTableCode ( HuffmanData ),
.HuffmanTableStart ( HuffmanStart ),
// Huffman Decode
.DataInRun ( ImageEnable ),
.DataInEnable ( JpegDataEnable ),
.DataIn ( JpegData ),
// Output decode data
.DecodeUseBit ( UseBit ),
.DecodeUseWidth ( UseWidth ),
// Data Out
.DataOutEnable ( HmDecEnable ),
.DataOutRead ( HmRead ),
.DataOutAddress ( HmAddress ),
.DataOutColor ( HmDecColor ),
.DataOutA ( HmDataA ),
.DataOutB ( HmDataB )
);
wire DctEnable;
wire [2:0] DctColor;
wire [2:0] DctPage;
wire [1:0] DctCount;
wire [8:0] Dct0Data, Dct1Data;
wire [15:0] DctWidth, DctHeight;
wire [11:0] DctBlockX, DctBlockY;
wire YCbCrIdle;
jpeg_idct u_jpeg_idct(
.rst ( rst ),
.clk ( clk ),
.ProcessInit ( JpegDecodeIdle ),
.DataInEnable ( HmDecEnable ),
.DataInRead ( HmRead ),
.DataInAddress ( HmAddress ),
.DataInA ( HmDataA ),
.DataInB ( HmDataB ),
.DataOutEnable ( DctEnable ),
.DataOutPage ( DctPage ),
.DataOutCount ( DctCount ),
.Data0Out ( Dct0Data ),
.Data1Out ( Dct1Data )
);
wire ColorEnable;
wire [15:0] ColorPixelX, ColorPixelY;
wire [7:0] ColorR, ColorG, ColorB;
jpeg_ycbcr u_jpeg_ycbcr(
.rst ( rst ),
.clk ( clk ),
.ProcessInit ( JpegDecodeIdle ),
.DataInEnable ( DctEnable ),
.DataInPage ( DctPage ),
.DataInCount ( DctCount ),
.DataInIdle ( YCbCrIdle ),
.Data0In ( Dct0Data ),
.Data1In ( Dct1Data ),
.DataInBlockWidth ( JpegBlockWidth ),
.OutEnable ( ColorEnable ),
.OutPixelX ( ColorPixelX ),
.OutPixelY ( ColorPixelY ),
.OutR ( ColorR ),
.OutG ( ColorG ),
.OutB ( ColorB )
);
// OutData
assign OutEnable = (ImageEnable)?ColorEnable:1'b0;
assign OutPixelX = (ImageEnable)?ColorPixelX:16'd0;
assign OutPixelY = (ImageEnable)?ColorPixelY:16'd0;
assign OutR = (ImageEnable)?ColorR:8'd0;
assign OutG = (ImageEnable)?ColorG:8'd0;
assign OutB = (ImageEnable)?ColorB:8'd0;
 
wire [31:0] JpegData;
wire JpegDataEnable;
wire JpegDecodeIdle;
 
wire UseBit;
wire [6:0] UseWidth;
wire UseByte;
wire UseWord;
wire ImageEnable;
wire EnableFF00;
wire DecodeFinish;
 
// reg ProcessIdle;
 
//--------------------------------------------------------------------------
// Read JPEG Data from FIFO
//--------------------------------------------------------------------------
jpeg_regdata u_jpeg_regdata(
.rst(rst),
.clk(clk),
// Read Data
.DataIn ( DataIn ),
.DataInEnable ( DataInEnable ),
.DataInRead ( DataInRead ),
// DataOut
.DataOut ( JpegData ),
.DataOutEnable ( JpegDataEnable ),
//
.ImageEnable ( EnableFF00 ),
.ProcessIdle ( JpegDecodeIdle ),
// UseData
.UseBit ( UseBit ),
.UseWidth ( UseWidth ),
.UseByte ( UseByte ),
.UseWord ( UseWord )
);
 
//--------------------------------------------------------------------------
// Read Maker from Jpeg Data
//--------------------------------------------------------------------------
wire DqtEnable;
wire DqtTable;
wire [5:0] DqtCount;
wire [7:0] DqtData;
wire DhtEnable;
wire [1:0] DhtTable;
wire [7:0] DhtCount;
wire [7:0] DhtData;
//
wire HaffumanEnable;
wire [1:0] HaffumanTable;
wire [3:0] HaffumanCount;
wire [15:0] HaffumanData;
wire [7:0] HaffumanStart;
 
wire [11:0] JpegBlockWidth;
 
jpeg_decode_fsm u_jpeg_decode_fsm(
.rst(rst),
.clk(clk),
// From FIFO
.DataInEnable ( JpegDataEnable ),
.DataIn ( JpegData ),
.JpegDecodeIdle ( JpegDecodeIdle ),
.OutWidth ( OutWidth ),
.OutHeight ( OutHeight ),
.OutBlockWidth ( JpegBlockWidth ),
.OutEnable ( OutEnable ),
.OutPixelX ( OutPixelX ),
.OutPixelY ( OutPixelY ),
//
.DqtEnable ( DqtEnable ),
.DqtTable ( DqtTable ),
.DqtCount ( DqtCount ),
.DqtData ( DqtData ),
//
.DhtEnable ( DhtEnable ),
.DhtTable ( DhtTable ),
.DhtCount ( DhtCount ),
.DhtData ( DhtData ),
//
.HaffumanEnable ( HaffumanEnable ),
.HaffumanTable ( HaffumanTable ),
.HaffumanCount ( HaffumanCount ),
.HaffumanData ( HaffumanData ),
.HaffumanStart ( HaffumanStart ),
//
.ImageEnable ( ImageEnable ),
.ImageEnd ( DecodeFinish ),
.EnableFF00 ( EnableFF00 ),
//
.UseByte ( UseByte ),
.UseWord ( UseWord )
);
 
wire HmDecEnable;
wire [2:0] HmDecColor;
 
wire HmDecSel;
wire HmDecRelease;
wire [15:0] Hm00Data;
wire [15:0] Hm01Data;
wire [15:0] Hm02Data;
wire [15:0] Hm03Data;
wire [15:0] Hm04Data;
wire [15:0] Hm05Data;
wire [15:0] Hm06Data;
wire [15:0] Hm07Data;
wire [15:0] Hm08Data;
wire [15:0] Hm09Data;
wire [15:0] Hm10Data;
wire [15:0] Hm11Data;
wire [15:0] Hm12Data;
wire [15:0] Hm13Data;
wire [15:0] Hm14Data;
wire [15:0] Hm15Data;
wire [15:0] Hm16Data;
wire [15:0] Hm17Data;
wire [15:0] Hm18Data;
wire [15:0] Hm19Data;
wire [15:0] Hm20Data;
wire [15:0] Hm21Data;
wire [15:0] Hm22Data;
wire [15:0] Hm23Data;
wire [15:0] Hm24Data;
wire [15:0] Hm25Data;
wire [15:0] Hm26Data;
wire [15:0] Hm27Data;
wire [15:0] Hm28Data;
wire [15:0] Hm29Data;
wire [15:0] Hm30Data;
wire [15:0] Hm31Data;
wire [15:0] Hm32Data;
wire [15:0] Hm33Data;
wire [15:0] Hm34Data;
wire [15:0] Hm35Data;
wire [15:0] Hm36Data;
wire [15:0] Hm37Data;
wire [15:0] Hm38Data;
wire [15:0] Hm39Data;
wire [15:0] Hm40Data;
wire [15:0] Hm41Data;
wire [15:0] Hm42Data;
wire [15:0] Hm43Data;
wire [15:0] Hm44Data;
wire [15:0] Hm45Data;
wire [15:0] Hm46Data;
wire [15:0] Hm47Data;
wire [15:0] Hm48Data;
wire [15:0] Hm49Data;
wire [15:0] Hm50Data;
wire [15:0] Hm51Data;
wire [15:0] Hm52Data;
wire [15:0] Hm53Data;
wire [15:0] Hm54Data;
wire [15:0] Hm55Data;
wire [15:0] Hm56Data;
wire [15:0] Hm57Data;
wire [15:0] Hm58Data;
wire [15:0] Hm59Data;
wire [15:0] Hm60Data;
wire [15:0] Hm61Data;
wire [15:0] Hm62Data;
wire [15:0] Hm63Data;
 
wire DctIdle;
jpeg_haffuman u_jpeg_haffuman(
.rst(rst),
.clk(clk),
// DQT Table
.DqtInEnable ( DqtEnable ),
.DqtInColor ( DqtTable ),
.DqtInCount ( DqtCount[5:0] ),
.DqtInData ( DqtData ),
// DHT Table
.DhtInEnable ( DhtEnable ),
.DhtInColor ( DhtTable ),
.DhtInCount ( DhtCount ),
.DhtInData ( DhtData ),
// Haffuman Table
.HaffumanTableEnable ( HaffumanEnable ),
.HaffumanTableColor ( HaffumanTable ),
.HaffumanTableCount ( HaffumanCount ),
.HaffumanTableCode ( HaffumanData ),
.HaffumanTableStart ( HaffumanStart ),
// Haffuman Decode
.DataInRun ( ImageEnable ),
.DataInEnable ( JpegDataEnable ),
.DataIn ( JpegData ),
// Output decode data
.DecodeUseBit ( UseBit ),
.DecodeUseWidth ( UseWidth ),
// Data Out
.DataOutIdle ( DctIdle ),
.DataOutEnable ( HmDecEnable ),
.DataOutColor ( HmDecColor ),
.DataOutSel ( HmDecSel ),
.Data00Reg ( Hm00Data ),
.Data01Reg ( Hm01Data ),
.Data02Reg ( Hm02Data ),
.Data03Reg ( Hm03Data ),
.Data04Reg ( Hm04Data ),
.Data05Reg ( Hm05Data ),
.Data06Reg ( Hm06Data ),
.Data07Reg ( Hm07Data ),
.Data08Reg ( Hm08Data ),
.Data09Reg ( Hm09Data ),
.Data10Reg ( Hm10Data ),
.Data11Reg ( Hm11Data ),
.Data12Reg ( Hm12Data ),
.Data13Reg ( Hm13Data ),
.Data14Reg ( Hm14Data ),
.Data15Reg ( Hm15Data ),
.Data16Reg ( Hm16Data ),
.Data17Reg ( Hm17Data ),
.Data18Reg ( Hm18Data ),
.Data19Reg ( Hm19Data ),
.Data20Reg ( Hm20Data ),
.Data21Reg ( Hm21Data ),
.Data22Reg ( Hm22Data ),
.Data23Reg ( Hm23Data ),
.Data24Reg ( Hm24Data ),
.Data25Reg ( Hm25Data ),
.Data26Reg ( Hm26Data ),
.Data27Reg ( Hm27Data ),
.Data28Reg ( Hm28Data ),
.Data29Reg ( Hm29Data ),
.Data30Reg ( Hm30Data ),
.Data31Reg ( Hm31Data ),
.Data32Reg ( Hm32Data ),
.Data33Reg ( Hm33Data ),
.Data34Reg ( Hm34Data ),
.Data35Reg ( Hm35Data ),
.Data36Reg ( Hm36Data ),
.Data37Reg ( Hm37Data ),
.Data38Reg ( Hm38Data ),
.Data39Reg ( Hm39Data ),
.Data40Reg ( Hm40Data ),
.Data41Reg ( Hm41Data ),
.Data42Reg ( Hm42Data ),
.Data43Reg ( Hm43Data ),
.Data44Reg ( Hm44Data ),
.Data45Reg ( Hm45Data ),
.Data46Reg ( Hm46Data ),
.Data47Reg ( Hm47Data ),
.Data48Reg ( Hm48Data ),
.Data49Reg ( Hm49Data ),
.Data50Reg ( Hm50Data ),
.Data51Reg ( Hm51Data ),
.Data52Reg ( Hm52Data ),
.Data53Reg ( Hm53Data ),
.Data54Reg ( Hm54Data ),
.Data55Reg ( Hm55Data ),
.Data56Reg ( Hm56Data ),
.Data57Reg ( Hm57Data ),
.Data58Reg ( Hm58Data ),
.Data59Reg ( Hm59Data ),
.Data60Reg ( Hm60Data ),
.Data61Reg ( Hm61Data ),
.Data62Reg ( Hm62Data ),
.Data63Reg ( Hm63Data ),
.DataOutRelease (HmDecRelase)
);
 
wire DctEnable;
wire [2:0] DctColor;
wire [2:0] DctPage;
wire [1:0] DctCount;
wire [8:0] Dct0Data;
wire [8:0] Dct1Data;
 
wire [15:0] DctWidth;
wire [15:0] DctHeight;
wire [11:0] DctBlockX;
wire [11:0] DctBlockY;
 
wire YCbCrIdle;
jpeg_idct u_jpeg_idct(
.rst(rst),
.clk(clk),
 
.DataInEnable( HmDecEnable ),
.DataInSel( HmDecSel ),
.Data00In( Hm00Data ),
.Data01In( Hm01Data ),
.Data02In( Hm02Data ),
.Data03In( Hm03Data ),
.Data04In( Hm04Data ),
.Data05In( Hm05Data ),
.Data06In( Hm06Data ),
.Data07In( Hm07Data ),
.Data08In( Hm08Data ),
.Data09In( Hm09Data ),
.Data10In( Hm10Data ),
.Data11In( Hm11Data ),
.Data12In( Hm12Data ),
.Data13In( Hm13Data ),
.Data14In( Hm14Data ),
.Data15In( Hm15Data ),
.Data16In( Hm16Data ),
.Data17In( Hm17Data ),
.Data18In( Hm18Data ),
.Data19In( Hm19Data ),
.Data20In( Hm20Data ),
.Data21In( Hm21Data ),
.Data22In( Hm22Data ),
.Data23In( Hm23Data ),
.Data24In( Hm24Data ),
.Data25In( Hm25Data ),
.Data26In( Hm26Data ),
.Data27In( Hm27Data ),
.Data28In( Hm28Data ),
.Data29In( Hm29Data ),
.Data30In( Hm30Data ),
.Data31In( Hm31Data ),
.Data32In( Hm32Data ),
.Data33In( Hm33Data ),
.Data34In( Hm34Data ),
.Data35In( Hm35Data ),
.Data36In( Hm36Data ),
.Data37In( Hm37Data ),
.Data38In( Hm38Data ),
.Data39In( Hm39Data ),
.Data40In( Hm40Data ),
.Data41In( Hm41Data ),
.Data42In( Hm42Data ),
.Data43In( Hm43Data ),
.Data44In( Hm44Data ),
.Data45In( Hm45Data ),
.Data46In( Hm46Data ),
.Data47In( Hm47Data ),
.Data48In( Hm48Data ),
.Data49In( Hm49Data ),
.Data50In( Hm50Data ),
.Data51In( Hm51Data ),
.Data52In( Hm52Data ),
.Data53In( Hm53Data ),
.Data54In( Hm54Data ),
.Data55In( Hm55Data ),
.Data56In( Hm56Data ),
.Data57In( Hm57Data ),
.Data58In( Hm58Data ),
.Data59In( Hm59Data ),
.Data60In( Hm60Data ),
.Data61In( Hm61Data ),
.Data62In( Hm62Data ),
.Data63In( Hm63Data ),
.DataInIdle( DctIdle ),
.DataInRelease( HmDecRelase ),
.DataOutEnable ( DctEnable ),
.DataOutPage ( DctPage ),
.DataOutCount ( DctCount ),
.Data0Out ( Dct0Data ),
.Data1Out ( Dct1Data )
);
 
wire ColorEnable;
wire [15:0] ColorPixelX, ColorPixelY;
wire [7:0] ColorR, ColorG, ColorB;
jpeg_ycbcr u_jpeg_ycbcr(
.rst(rst),
.clk(clk),
.DataInEnable ( DctEnable ),
.DataInPage ( DctPage ),
.DataInCount ( DctCount ),
.DataInIdle ( YCbCrIdle ),
.Data0In ( Dct0Data ),
.Data1In ( Dct1Data ),
.DataInBlockWidth ( JpegBlockWidth ),
.OutEnable ( ColorEnable ),
.OutPixelX ( ColorPixelX ),
.OutPixelY ( ColorPixelY ),
.OutR ( ColorR ),
.OutG ( ColorG ),
.OutB ( ColorB )
);
// OutData
assign OutEnable = (ImageEnable)?ColorEnable:1'b0;
assign OutPixelX = (ImageEnable)?ColorPixelX:16'd0;
assign OutPixelY = (ImageEnable)?ColorPixelY:16'd0;
assign OutR = (ImageEnable)?ColorR:8'd0;
assign OutG = (ImageEnable)?ColorG:8'd0;
assign OutB = (ImageEnable)?ColorB:8'd0;
 
endmodule // jpeg_decode
endmodule
/djpeg/trunk/src/jpeg_idctb.v
1,763 → 1,195
//---------------------------------------------------------------------------
// File Name : jpeg_idctb.v
// Module Name : jpeg_idctb
// Description : data register for iDCT
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_idctb.v
// Module Name : jpeg_idctb
// Description : data register for iDCT
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2008/03/19
// Rev. : 2.00
//---------------------------------------------------------------------------
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 2.00 2008/03/19 Replace to RAM from D-FF
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_idctb
(
rst,
clk,
module jpeg_idctb(
rst,
clk,
 
DataInEnable,
DataInPage,
DataInCount,
DataInIdle,
Data0In,
Data1In,
DataInit,
 
DataOutEnable,
DataOutSel,
Data00Out,
Data01Out,
Data02Out,
Data03Out,
Data04Out,
Data05Out,
Data06Out,
Data07Out,
Data08Out,
Data09Out,
Data10Out,
Data11Out,
Data12Out,
Data13Out,
Data14Out,
Data15Out,
Data16Out,
Data17Out,
Data18Out,
Data19Out,
Data20Out,
Data21Out,
Data22Out,
Data23Out,
Data24Out,
Data25Out,
Data26Out,
Data27Out,
Data28Out,
Data29Out,
Data30Out,
Data31Out,
Data32Out,
Data33Out,
Data34Out,
Data35Out,
Data36Out,
Data37Out,
Data38Out,
Data39Out,
Data40Out,
Data41Out,
Data42Out,
Data43Out,
Data44Out,
Data45Out,
Data46Out,
Data47Out,
Data48Out,
Data49Out,
Data50Out,
Data51Out,
Data52Out,
Data53Out,
Data54Out,
Data55Out,
Data56Out,
Data57Out,
Data58Out,
Data59Out,
Data60Out,
Data61Out,
Data62Out,
Data63Out,
DataInEnable,
DataInPage,
DataInCount,
DataInIdle,
DataInA,
DataInB,
 
BankARelease,
BankBRelease
);
DataOutEnable,
DataOutRead,
DataOutAddress,
DataOutA,
DataOutB
);
 
input clk;
input rst;
input clk;
input rst;
 
input DataInEnable;
input [2:0] DataInPage;
input [1:0] DataInCount;
output DataInIdle;
input [15:0] Data0In;
input [15:0] Data1In;
input DataInit;
input DataInEnable;
input [2:0] DataInPage;
input [1:0] DataInCount;
output DataInIdle;
input [15:0] DataInA;
input [15:0] DataInB;
output DataOutEnable;
input DataOutRead;
input [4:0] DataOutAddress;
output [15:0] DataOutA;
output [15:0] DataOutB;
wire [4:0] DataInAddress;
reg [1:0] WriteBank, ReadBank;
 
output DataOutEnable;
input DataOutSel;
output [15:0] Data00Out;
output [15:0] Data01Out;
output [15:0] Data02Out;
output [15:0] Data03Out;
output [15:0] Data04Out;
output [15:0] Data05Out;
output [15:0] Data06Out;
output [15:0] Data07Out;
output [15:0] Data08Out;
output [15:0] Data09Out;
output [15:0] Data10Out;
output [15:0] Data11Out;
output [15:0] Data12Out;
output [15:0] Data13Out;
output [15:0] Data14Out;
output [15:0] Data15Out;
output [15:0] Data16Out;
output [15:0] Data17Out;
output [15:0] Data18Out;
output [15:0] Data19Out;
output [15:0] Data20Out;
output [15:0] Data21Out;
output [15:0] Data22Out;
output [15:0] Data23Out;
output [15:0] Data24Out;
output [15:0] Data25Out;
output [15:0] Data26Out;
output [15:0] Data27Out;
output [15:0] Data28Out;
output [15:0] Data29Out;
output [15:0] Data30Out;
output [15:0] Data31Out;
output [15:0] Data32Out;
output [15:0] Data33Out;
output [15:0] Data34Out;
output [15:0] Data35Out;
output [15:0] Data36Out;
output [15:0] Data37Out;
output [15:0] Data38Out;
output [15:0] Data39Out;
output [15:0] Data40Out;
output [15:0] Data41Out;
output [15:0] Data42Out;
output [15:0] Data43Out;
output [15:0] Data44Out;
output [15:0] Data45Out;
output [15:0] Data46Out;
output [15:0] Data47Out;
output [15:0] Data48Out;
output [15:0] Data49Out;
output [15:0] Data50Out;
output [15:0] Data51Out;
output [15:0] Data52Out;
output [15:0] Data53Out;
output [15:0] Data54Out;
output [15:0] Data55Out;
output [15:0] Data56Out;
output [15:0] Data57Out;
output [15:0] Data58Out;
output [15:0] Data59Out;
output [15:0] Data60Out;
output [15:0] Data61Out;
output [15:0] Data62Out;
output [15:0] Data63Out;
assign DataInAddress = {DataInPage, DataInCount};
 
input BankARelease;
input BankBRelease;
reg BankAEnable;
reg BankBEnable;
reg DataInBank;
always @(posedge clk or negedge rst) begin
if(!rst) begin
BankAEnable <= 1'b0;
BankBEnable <= 1'b0;
DataInBank <= 1'b0;
end else begin
if(BankAEnable == 1'b0 & DataInBank == 1'b0) begin
if(DataInEnable == 1'b1 &
DataInPage == 3'd7 & DataInCount == 2'd3) begin
BankAEnable <= 1'b1;
// Bank
always @(posedge clk or negedge rst) begin
if(!rst) begin
WriteBank <= 2'd0;
ReadBank <= 2'd0;
end else begin
if(DataInit) begin
WriteBank <= 2'd0;
end else if(DataInEnable && (DataInAddress == 5'h1F)) begin
WriteBank <= WriteBank + 2'd1;
end
end else begin
if(BankARelease == 1'b1) begin
BankAEnable <= 1'b0;
if(DataInit) begin
ReadBank <= 2'd0;
end else if(DataOutRead && (DataOutAddress == 5'h1F)) begin
ReadBank <= ReadBank + 2'd1;
end
end
if(BankBEnable == 1'b0 & DataInBank == 1'b1) begin
if(DataInEnable == 1'b1 &
DataInPage == 3'd7 & DataInCount == 2'd3) begin
BankBEnable <= 1'b1;
end
end else begin
if(BankBRelease == 1'b1) begin
BankBEnable <= 1'b0;
end
end
if(DataInEnable == 1'b1 &
DataInPage == 3'd7 & DataInCount == 2'd3) begin
DataInBank <= ~DataInBank;
end
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
end
end
 
assign DataInIdle = BankAEnable == 1'b0 | BankBEnable == 1'b0;
wire [5:0] WriteQueryA, WriteQueryB;
 
assign DataOutEnable = DataInEnable == 1'b1 & DataInPage == 3'b111 &
DataInCount == 2'b11;
reg [15:0] BankAReg [0:63];
always @(posedge clk or negedge rst) begin
if(!rst) begin
BankAReg[0] <= 12'h000;
BankAReg[1] <= 12'h000;
BankAReg[2] <= 12'h000;
BankAReg[3] <= 12'h000;
BankAReg[4] <= 12'h000;
BankAReg[5] <= 12'h000;
BankAReg[6] <= 12'h000;
BankAReg[7] <= 12'h000;
BankAReg[8] <= 12'h000;
BankAReg[9] <= 12'h000;
BankAReg[10] <= 12'h000;
BankAReg[11] <= 12'h000;
BankAReg[12] <= 12'h000;
BankAReg[13] <= 12'h000;
BankAReg[14] <= 12'h000;
BankAReg[15] <= 12'h000;
BankAReg[16] <= 12'h000;
BankAReg[17] <= 12'h000;
BankAReg[18] <= 12'h000;
BankAReg[19] <= 12'h000;
BankAReg[20] <= 12'h000;
BankAReg[21] <= 12'h000;
BankAReg[22] <= 12'h000;
BankAReg[23] <= 12'h000;
BankAReg[24] <= 12'h000;
BankAReg[25] <= 12'h000;
BankAReg[26] <= 12'h000;
BankAReg[27] <= 12'h000;
BankAReg[28] <= 12'h000;
BankAReg[29] <= 12'h000;
BankAReg[30] <= 12'h000;
BankAReg[31] <= 12'h000;
BankAReg[32] <= 12'h000;
BankAReg[33] <= 12'h000;
BankAReg[34] <= 12'h000;
BankAReg[35] <= 12'h000;
BankAReg[36] <= 12'h000;
BankAReg[37] <= 12'h000;
BankAReg[38] <= 12'h000;
BankAReg[39] <= 12'h000;
BankAReg[40] <= 12'h000;
BankAReg[41] <= 12'h000;
BankAReg[42] <= 12'h000;
BankAReg[43] <= 12'h000;
BankAReg[44] <= 12'h000;
BankAReg[45] <= 12'h000;
BankAReg[46] <= 12'h000;
BankAReg[47] <= 12'h000;
BankAReg[48] <= 12'h000;
BankAReg[49] <= 12'h000;
BankAReg[50] <= 12'h000;
BankAReg[51] <= 12'h000;
BankAReg[52] <= 12'h000;
BankAReg[53] <= 12'h000;
BankAReg[54] <= 12'h000;
BankAReg[55] <= 12'h000;
BankAReg[56] <= 12'h000;
BankAReg[57] <= 12'h000;
BankAReg[58] <= 12'h000;
BankAReg[59] <= 12'h000;
BankAReg[60] <= 12'h000;
BankAReg[61] <= 12'h000;
BankAReg[62] <= 12'h000;
BankAReg[63] <= 12'h000;
end else begin // if (!rst)
if(DataInEnable == 1'b1 & DataInBank == 1'b0) begin
case(DataInPage)
3'd0: begin
case(DataInCount)
2'd0: begin
BankAReg[0] <= Data0In;
BankAReg[7] <= Data1In;
end
2'd1: begin
BankAReg[1] <= Data0In;
BankAReg[6] <= Data1In;
end
2'd2: begin
BankAReg[2] <= Data0In;
BankAReg[5] <= Data1In;
end
2'd3: begin
BankAReg[3] <= Data0In;
BankAReg[4] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd0
3'd1: begin
case(DataInCount)
2'd0: begin
BankAReg[8] <= Data0In;
BankAReg[15] <= Data1In;
end
2'd1: begin
BankAReg[9] <= Data0In;
BankAReg[14] <= Data1In;
end
2'd2: begin
BankAReg[10] <= Data0In;
BankAReg[13] <= Data1In;
end
2'd3: begin
BankAReg[11] <= Data0In;
BankAReg[12] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd1
3'd2: begin
case(DataInCount)
2'd0: begin
BankAReg[16] <= Data0In;
BankAReg[23] <= Data1In;
end
2'd1: begin
BankAReg[17] <= Data0In;
BankAReg[22] <= Data1In;
end
2'd2: begin
BankAReg[18] <= Data0In;
BankAReg[21] <= Data1In;
end
2'd3: begin
BankAReg[19] <= Data0In;
BankAReg[20] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd2
3'd3: begin
case(DataInCount)
2'd0: begin
BankAReg[24] <= Data0In;
BankAReg[31] <= Data1In;
end
2'd1: begin
BankAReg[25] <= Data0In;
BankAReg[30] <= Data1In;
end
2'd2: begin
BankAReg[26] <= Data0In;
BankAReg[29] <= Data1In;
end
2'd3: begin
BankAReg[27] <= Data0In;
BankAReg[28] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd3
3'd4: begin
case(DataInCount)
2'd0: begin
BankAReg[32] <= Data0In;
BankAReg[39] <= Data1In;
end
2'd1: begin
BankAReg[33] <= Data0In;
BankAReg[38] <= Data1In;
end
2'd2: begin
BankAReg[34] <= Data0In;
BankAReg[37] <= Data1In;
end
2'd3: begin
BankAReg[35] <= Data0In;
BankAReg[36] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd4
3'd5: begin
case(DataInCount)
2'd0: begin
BankAReg[40] <= Data0In;
BankAReg[47] <= Data1In;
end
2'd1: begin
BankAReg[41] <= Data0In;
BankAReg[46] <= Data1In;
end
2'd2: begin
BankAReg[42] <= Data0In;
BankAReg[45] <= Data1In;
end
2'd3: begin
BankAReg[43] <= Data0In;
BankAReg[44] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd5
3'd6: begin
case(DataInCount)
2'd0: begin
BankAReg[48] <= Data0In;
BankAReg[55] <= Data1In;
end
2'd1: begin
BankAReg[49] <= Data0In;
BankAReg[54] <= Data1In;
end
2'd2: begin
BankAReg[50] <= Data0In;
BankAReg[53] <= Data1In;
end
2'd3: begin
BankAReg[51] <= Data0In;
BankAReg[52] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd6
3'd7: begin
case(DataInCount)
2'd0: begin
BankAReg[56] <= Data0In;
BankAReg[63] <= Data1In;
end
2'd1: begin
BankAReg[57] <= Data0In;
BankAReg[62] <= Data1In;
end
2'd2: begin
BankAReg[58] <= Data0In;
BankAReg[61] <= Data1In;
end
2'd3: begin
BankAReg[59] <= Data0In;
BankAReg[60] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd7
endcase // case(DataInPage)
end // if (DataInEnable == 1'b1 & DataInBank == 1'b0)
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
reg [15:0] BankBReg [0:63];
// Make a Write Address
function [5:0] F_WriteQueryA;
input [4:0] Count;
case(Count)
5'd0: F_WriteQueryA = {1'd0, 5'd0}; // 0
5'd1: F_WriteQueryA = {1'd0, 5'd4}; // 1
5'd2: F_WriteQueryA = {1'd0, 5'd8}; // 2
5'd3: F_WriteQueryA = {1'd0, 5'd12}; // 3
5'd4: F_WriteQueryA = {1'd0, 5'd2}; // 8
5'd5: F_WriteQueryA = {1'd0, 5'd6}; // 9
5'd6: F_WriteQueryA = {1'd0, 5'd10}; // 10
5'd7: F_WriteQueryA = {1'd0, 5'd14}; // 11
5'd8: F_WriteQueryA = {1'd0, 5'd1}; // 16
5'd9: F_WriteQueryA = {1'd0, 5'd5}; // 17
5'd10: F_WriteQueryA = {1'd0, 5'd9}; // 18
5'd11: F_WriteQueryA = {1'd0, 5'd13}; // 19
5'd12: F_WriteQueryA = {1'd1, 5'd3}; // 24
5'd13: F_WriteQueryA = {1'd1, 5'd7}; // 25
5'd14: F_WriteQueryA = {1'd1, 5'd11}; // 26
5'd15: F_WriteQueryA = {1'd1, 5'd15}; // 27
5'd16: F_WriteQueryA = {1'd1, 5'd0}; // 32
5'd17: F_WriteQueryA = {1'd1, 5'd4}; // 33
5'd18: F_WriteQueryA = {1'd1, 5'd8}; // 34
5'd19: F_WriteQueryA = {1'd1, 5'd12}; // 35
5'd20: F_WriteQueryA = {1'd0, 5'd3}; // 40
5'd21: F_WriteQueryA = {1'd0, 5'd7}; // 41
5'd22: F_WriteQueryA = {1'd0, 5'd11}; // 42
5'd23: F_WriteQueryA = {1'd0, 5'd15}; // 43
5'd24: F_WriteQueryA = {1'd1, 5'd1}; // 48
5'd25: F_WriteQueryA = {1'd1, 5'd5}; // 49
5'd26: F_WriteQueryA = {1'd1, 5'd9}; // 50
5'd27: F_WriteQueryA = {1'd1, 5'd13}; // 51
5'd28: F_WriteQueryA = {1'd1, 5'd2}; // 56
5'd29: F_WriteQueryA = {1'd1, 5'd6}; // 57
5'd30: F_WriteQueryA = {1'd1, 5'd10}; // 58
5'd31: F_WriteQueryA = {1'd1, 5'd14}; // 59
endcase
endfunction
 
always @(posedge clk or negedge rst) begin
if(!rst) begin
BankBReg[0] <= 12'h000;
BankBReg[1] <= 12'h000;
BankBReg[2] <= 12'h000;
BankBReg[3] <= 12'h000;
BankBReg[4] <= 12'h000;
BankBReg[5] <= 12'h000;
BankBReg[6] <= 12'h000;
BankBReg[7] <= 12'h000;
BankBReg[8] <= 12'h000;
BankBReg[9] <= 12'h000;
BankBReg[10] <= 12'h000;
BankBReg[11] <= 12'h000;
BankBReg[12] <= 12'h000;
BankBReg[13] <= 12'h000;
BankBReg[14] <= 12'h000;
BankBReg[15] <= 12'h000;
BankBReg[16] <= 12'h000;
BankBReg[17] <= 12'h000;
BankBReg[18] <= 12'h000;
BankBReg[19] <= 12'h000;
BankBReg[20] <= 12'h000;
BankBReg[21] <= 12'h000;
BankBReg[22] <= 12'h000;
BankBReg[23] <= 12'h000;
BankBReg[24] <= 12'h000;
BankBReg[25] <= 12'h000;
BankBReg[26] <= 12'h000;
BankBReg[27] <= 12'h000;
BankBReg[28] <= 12'h000;
BankBReg[29] <= 12'h000;
BankBReg[30] <= 12'h000;
BankBReg[31] <= 12'h000;
BankBReg[32] <= 12'h000;
BankBReg[33] <= 12'h000;
BankBReg[34] <= 12'h000;
BankBReg[35] <= 12'h000;
BankBReg[36] <= 12'h000;
BankBReg[37] <= 12'h000;
BankBReg[38] <= 12'h000;
BankBReg[39] <= 12'h000;
BankBReg[40] <= 12'h000;
BankBReg[41] <= 12'h000;
BankBReg[42] <= 12'h000;
BankBReg[43] <= 12'h000;
BankBReg[44] <= 12'h000;
BankBReg[45] <= 12'h000;
BankBReg[46] <= 12'h000;
BankBReg[47] <= 12'h000;
BankBReg[48] <= 12'h000;
BankBReg[49] <= 12'h000;
BankBReg[50] <= 12'h000;
BankBReg[51] <= 12'h000;
BankBReg[52] <= 12'h000;
BankBReg[53] <= 12'h000;
BankBReg[54] <= 12'h000;
BankBReg[55] <= 12'h000;
BankBReg[56] <= 12'h000;
BankBReg[57] <= 12'h000;
BankBReg[58] <= 12'h000;
BankBReg[59] <= 12'h000;
BankBReg[60] <= 12'h000;
BankBReg[61] <= 12'h000;
BankBReg[62] <= 12'h000;
BankBReg[63] <= 12'h000;
end else begin // if (!rst)
if(DataInEnable == 1'b1 & DataInBank == 1'b1) begin
case(DataInPage)
3'd0: begin
case(DataInCount)
2'd0: begin
BankBReg[0] <= Data0In;
BankBReg[7] <= Data1In;
end
2'd1: begin
BankBReg[1] <= Data0In;
BankBReg[6] <= Data1In;
end
2'd2: begin
BankBReg[2] <= Data0In;
BankBReg[5] <= Data1In;
end
2'd3: begin
BankBReg[3] <= Data0In;
BankBReg[4] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd0
3'd1: begin
case(DataInCount)
2'd0: begin
BankBReg[8] <= Data0In;
BankBReg[15] <= Data1In;
end
2'd1: begin
BankBReg[9] <= Data0In;
BankBReg[14] <= Data1In;
end
2'd2: begin
BankBReg[10] <= Data0In;
BankBReg[13] <= Data1In;
end
2'd3: begin
BankBReg[11] <= Data0In;
BankBReg[12] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd1
3'd2: begin
case(DataInCount)
2'd0: begin
BankBReg[16] <= Data0In;
BankBReg[23] <= Data1In;
end
2'd1: begin
BankBReg[17] <= Data0In;
BankBReg[22] <= Data1In;
end
2'd2: begin
BankBReg[18] <= Data0In;
BankBReg[21] <= Data1In;
end
2'd3: begin
BankBReg[19] <= Data0In;
BankBReg[20] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd2
3'd3: begin
case(DataInCount)
2'd0: begin
BankBReg[24] <= Data0In;
BankBReg[31] <= Data1In;
end
2'd1: begin
BankBReg[25] <= Data0In;
BankBReg[30] <= Data1In;
end
2'd2: begin
BankBReg[26] <= Data0In;
BankBReg[29] <= Data1In;
end
2'd3: begin
BankBReg[27] <= Data0In;
BankBReg[28] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd3
3'd4: begin
case(DataInCount)
2'd0: begin
BankBReg[32] <= Data0In;
BankBReg[39] <= Data1In;
end
2'd1: begin
BankBReg[33] <= Data0In;
BankBReg[38] <= Data1In;
end
2'd2: begin
BankBReg[34] <= Data0In;
BankBReg[37] <= Data1In;
end
2'd3: begin
BankBReg[35] <= Data0In;
BankBReg[36] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd4
3'd5: begin
case(DataInCount)
2'd0: begin
BankBReg[40] <= Data0In;
BankBReg[47] <= Data1In;
end
2'd1: begin
BankBReg[41] <= Data0In;
BankBReg[46] <= Data1In;
end
2'd2: begin
BankBReg[42] <= Data0In;
BankBReg[45] <= Data1In;
end
2'd3: begin
BankBReg[43] <= Data0In;
BankBReg[44] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd5
3'd6: begin
case(DataInCount)
2'd0: begin
BankBReg[48] <= Data0In;
BankBReg[55] <= Data1In;
end
2'd1: begin
BankBReg[49] <= Data0In;
BankBReg[54] <= Data1In;
end
2'd2: begin
BankBReg[50] <= Data0In;
BankBReg[53] <= Data1In;
end
2'd3: begin
BankBReg[51] <= Data0In;
BankBReg[52] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd6
3'd7: begin
case(DataInCount)
2'd0: begin
BankBReg[56] <= Data0In;
BankBReg[63] <= Data1In;
end
2'd1: begin
BankBReg[57] <= Data0In;
BankBReg[62] <= Data1In;
end
2'd2: begin
BankBReg[58] <= Data0In;
BankBReg[61] <= Data1In;
end
2'd3: begin
BankBReg[59] <= Data0In;
BankBReg[60] <= Data1In;
end
endcase // case(DataInCount)
end // case: 3'd7
endcase // case(DataInPage)
end // if (DataInEnable == 1'b1 & DataInBank == 1'b1)
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
function [5:0] F_WriteQueryB;
input [4:0] Count;
case(Count)
5'd0: F_WriteQueryB = {1'd1, 5'd28}; // 7
5'd1: F_WriteQueryB = {1'd1, 5'd24}; // 6
5'd2: F_WriteQueryB = {1'd1, 5'd20}; // 5
5'd3: F_WriteQueryB = {1'd1, 5'd16}; // 4
5'd4: F_WriteQueryB = {1'd1, 5'd30}; // 15
5'd5: F_WriteQueryB = {1'd1, 5'd26}; // 14
5'd6: F_WriteQueryB = {1'd1, 5'd22}; // 13
5'd7: F_WriteQueryB = {1'd1, 5'd18}; // 12
5'd8: F_WriteQueryB = {1'd1, 5'd29}; // 23
5'd9: F_WriteQueryB = {1'd1, 5'd25}; // 22
5'd10: F_WriteQueryB = {1'd1, 5'd21}; // 21
5'd11: F_WriteQueryB = {1'd1, 5'd17}; // 20
5'd12: F_WriteQueryB = {1'd0, 5'd31}; // 31
5'd13: F_WriteQueryB = {1'd0, 5'd27}; // 30
5'd14: F_WriteQueryB = {1'd0, 5'd23}; // 29
5'd15: F_WriteQueryB = {1'd0, 5'd19}; // 28
5'd16: F_WriteQueryB = {1'd0, 5'd28}; // 39
5'd17: F_WriteQueryB = {1'd0, 5'd24}; // 38
5'd18: F_WriteQueryB = {1'd0, 5'd20}; // 37
5'd19: F_WriteQueryB = {1'd0, 5'd16}; // 36
5'd20: F_WriteQueryB = {1'd1, 5'd31}; // 47
5'd21: F_WriteQueryB = {1'd1, 5'd27}; // 46
5'd22: F_WriteQueryB = {1'd1, 5'd23}; // 45
5'd23: F_WriteQueryB = {1'd1, 5'd19}; // 44
5'd24: F_WriteQueryB = {1'd0, 5'd29}; // 55
5'd25: F_WriteQueryB = {1'd0, 5'd25}; // 54
5'd26: F_WriteQueryB = {1'd0, 5'd21}; // 53
5'd27: F_WriteQueryB = {1'd0, 5'd17}; // 52
5'd28: F_WriteQueryB = {1'd0, 5'd30}; // 63
5'd29: F_WriteQueryB = {1'd0, 5'd26}; // 62
5'd30: F_WriteQueryB = {1'd0, 5'd22}; // 61
5'd31: F_WriteQueryB = {1'd0, 5'd18}; // 60
endcase
endfunction
 
assign Data00Out = (DataOutSel)?BankBReg[00]:BankAReg[00];
assign Data01Out = (DataOutSel)?BankBReg[08]:BankAReg[08];
assign Data02Out = (DataOutSel)?BankBReg[16]:BankAReg[16];
assign Data03Out = (DataOutSel)?BankBReg[24]:BankAReg[24];
assign Data04Out = (DataOutSel)?BankBReg[32]:BankAReg[32];
assign Data05Out = (DataOutSel)?BankBReg[40]:BankAReg[40];
assign Data06Out = (DataOutSel)?BankBReg[48]:BankAReg[48];
assign Data07Out = (DataOutSel)?BankBReg[56]:BankAReg[56];
assign Data08Out = (DataOutSel)?BankBReg[01]:BankAReg[01];
assign Data09Out = (DataOutSel)?BankBReg[09]:BankAReg[09];
assign Data10Out = (DataOutSel)?BankBReg[17]:BankAReg[17];
assign Data11Out = (DataOutSel)?BankBReg[25]:BankAReg[25];
assign Data12Out = (DataOutSel)?BankBReg[33]:BankAReg[33];
assign Data13Out = (DataOutSel)?BankBReg[41]:BankAReg[41];
assign Data14Out = (DataOutSel)?BankBReg[49]:BankAReg[49];
assign Data15Out = (DataOutSel)?BankBReg[57]:BankAReg[57];
assign Data16Out = (DataOutSel)?BankBReg[02]:BankAReg[02];
assign Data17Out = (DataOutSel)?BankBReg[10]:BankAReg[10];
assign Data18Out = (DataOutSel)?BankBReg[18]:BankAReg[18];
assign Data19Out = (DataOutSel)?BankBReg[26]:BankAReg[26];
assign Data20Out = (DataOutSel)?BankBReg[34]:BankAReg[34];
assign Data21Out = (DataOutSel)?BankBReg[42]:BankAReg[42];
assign Data22Out = (DataOutSel)?BankBReg[50]:BankAReg[50];
assign Data23Out = (DataOutSel)?BankBReg[58]:BankAReg[58];
assign Data24Out = (DataOutSel)?BankBReg[03]:BankAReg[03];
assign Data25Out = (DataOutSel)?BankBReg[11]:BankAReg[11];
assign Data26Out = (DataOutSel)?BankBReg[19]:BankAReg[19];
assign Data27Out = (DataOutSel)?BankBReg[27]:BankAReg[27];
assign Data28Out = (DataOutSel)?BankBReg[35]:BankAReg[35];
assign Data29Out = (DataOutSel)?BankBReg[43]:BankAReg[43];
assign Data30Out = (DataOutSel)?BankBReg[51]:BankAReg[51];
assign Data31Out = (DataOutSel)?BankBReg[59]:BankAReg[59];
assign Data32Out = (DataOutSel)?BankBReg[04]:BankAReg[04];
assign Data33Out = (DataOutSel)?BankBReg[12]:BankAReg[12];
assign Data34Out = (DataOutSel)?BankBReg[20]:BankAReg[20];
assign Data35Out = (DataOutSel)?BankBReg[28]:BankAReg[28];
assign Data36Out = (DataOutSel)?BankBReg[36]:BankAReg[36];
assign Data37Out = (DataOutSel)?BankBReg[44]:BankAReg[44];
assign Data38Out = (DataOutSel)?BankBReg[52]:BankAReg[52];
assign Data39Out = (DataOutSel)?BankBReg[60]:BankAReg[60];
assign Data40Out = (DataOutSel)?BankBReg[05]:BankAReg[05];
assign Data41Out = (DataOutSel)?BankBReg[13]:BankAReg[13];
assign Data42Out = (DataOutSel)?BankBReg[21]:BankAReg[21];
assign Data43Out = (DataOutSel)?BankBReg[29]:BankAReg[29];
assign Data44Out = (DataOutSel)?BankBReg[37]:BankAReg[37];
assign Data45Out = (DataOutSel)?BankBReg[45]:BankAReg[45];
assign Data46Out = (DataOutSel)?BankBReg[53]:BankAReg[53];
assign Data47Out = (DataOutSel)?BankBReg[61]:BankAReg[61];
assign Data48Out = (DataOutSel)?BankBReg[06]:BankAReg[06];
assign Data49Out = (DataOutSel)?BankBReg[14]:BankAReg[14];
assign Data50Out = (DataOutSel)?BankBReg[22]:BankAReg[22];
assign Data51Out = (DataOutSel)?BankBReg[30]:BankAReg[30];
assign Data52Out = (DataOutSel)?BankBReg[38]:BankAReg[38];
assign Data53Out = (DataOutSel)?BankBReg[46]:BankAReg[46];
assign Data54Out = (DataOutSel)?BankBReg[54]:BankAReg[54];
assign Data55Out = (DataOutSel)?BankBReg[62]:BankAReg[62];
assign Data56Out = (DataOutSel)?BankBReg[07]:BankAReg[07];
assign Data57Out = (DataOutSel)?BankBReg[15]:BankAReg[15];
assign Data58Out = (DataOutSel)?BankBReg[23]:BankAReg[23];
assign Data59Out = (DataOutSel)?BankBReg[31]:BankAReg[31];
assign Data60Out = (DataOutSel)?BankBReg[39]:BankAReg[39];
assign Data61Out = (DataOutSel)?BankBReg[47]:BankAReg[47];
assign Data62Out = (DataOutSel)?BankBReg[55]:BankAReg[55];
assign Data63Out = (DataOutSel)?BankBReg[63]:BankAReg[63];
assign WriteQueryA = F_WriteQueryA(DataInAddress);
assign WriteQueryB = F_WriteQueryB(DataInAddress);
// RAM(16bit x 32word x 2Bank)
reg [15:0] MemoryA [0:127];
reg [15:0] MemoryB [0:127];
 
endmodule // jpeg_idctb
wire [6:0] WriteAddressA, WriteAddressB;
wire [15:0] WriteDataA, WriteDataB;
assign WriteAddressA = {WriteBank, (WriteQueryA[5])?WriteQueryB[4:0]:WriteQueryA[4:0]};
assign WriteAddressB = {WriteBank, (WriteQueryB[5])?WriteQueryB[4:0]:WriteQueryA[4:0]};
 
assign WriteDataA = (WriteQueryA[5])?DataInB:DataInA;
assign WriteDataB = (WriteQueryB[5])?DataInB:DataInA;
// Port A(Write Only)
always @(posedge clk) begin
if(DataInEnable) MemoryA[WriteAddressA] <= WriteDataA;
if(DataInEnable) MemoryB[WriteAddressB] <= WriteDataB;
end
 
reg [15:0] RegMemoryA, RegMemoryB;
// Port B(Read/Wirte)
always @(posedge clk) begin
RegMemoryA <= MemoryA[{ReadBank, DataOutAddress}];
RegMemoryB <= MemoryB[{ReadBank, DataOutAddress}];
end
 
assign DataOutEnable = (WriteBank != ReadBank);
assign DataOutA = (DataOutAddress[4])?RegMemoryB:RegMemoryA;
assign DataOutB = (DataOutAddress[4])?RegMemoryA:RegMemoryB;
 
endmodule
/djpeg/trunk/src/jpeg_ziguzagu.v
1,581 → 1,338
//---------------------------------------------------------------------------
// File Name : jpeg_ziguzagu.v
// Module Name : jpeg_ziguzagu
// Description : Ziguzagu
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2006/10/01
// Rev. : 1.1
// File Name : jpeg_ziguzagu.v
// Module Name : jpeg_ziguzagu
// Description : Ziguzagu
// Project : JPEG Decoder
// Belong to :
// Author : H.Ishihara
// E-Mail : hidemi@sweetcafe.jp
// HomePage : http://www.sweetcafe.jp/
// Date : 2008/03/05
// Rev. : 2.00
//---------------------------------------------------------------------------
// Rev. Date Description
//---------------------------------------------------------------------------
// 1.01 2006/10/01 1st Release
// 2.00 2008/03/05 Replace to Memory from D-FFs.
//---------------------------------------------------------------------------
// $Id:
//---------------------------------------------------------------------------
`timescale 1ps / 1ps
 
module jpeg_ziguzagu
(
rst,
clk,
module jpeg_ziguzagu(
rst,
clk,
 
DataInEnable,
DataInAddress,
DataInColor,
DataInIdle,
DataIn,
DataInit,
HuffmanEndEnable,
 
HaffumanEndEnable,
DataInEnable,
DataInAddress,
DataInColor,
DataInIdle,
DataIn,
 
DataOutEnable,
DataOutColor,
DataOutSel,
Data00Reg,
Data01Reg,
Data02Reg,
Data03Reg,
Data04Reg,
Data05Reg,
Data06Reg,
Data07Reg,
Data08Reg,
Data09Reg,
Data10Reg,
Data11Reg,
Data12Reg,
Data13Reg,
Data14Reg,
Data15Reg,
Data16Reg,
Data17Reg,
Data18Reg,
Data19Reg,
Data20Reg,
Data21Reg,
Data22Reg,
Data23Reg,
Data24Reg,
Data25Reg,
Data26Reg,
Data27Reg,
Data28Reg,
Data29Reg,
Data30Reg,
Data31Reg,
Data32Reg,
Data33Reg,
Data34Reg,
Data35Reg,
Data36Reg,
Data37Reg,
Data38Reg,
Data39Reg,
Data40Reg,
Data41Reg,
Data42Reg,
Data43Reg,
Data44Reg,
Data45Reg,
Data46Reg,
Data47Reg,
Data48Reg,
Data49Reg,
Data50Reg,
Data51Reg,
Data52Reg,
Data53Reg,
Data54Reg,
Data55Reg,
Data56Reg,
Data57Reg,
Data58Reg,
Data59Reg,
Data60Reg,
Data61Reg,
Data62Reg,
Data63Reg,
DataOutEnable,
DataOutRead,
DataOutAddress,
DataOutColor,
DataOutA,
DataOutB
);
input clk;
input rst;
 
BankARelease,
BankBRelease
);
input DataInit;
input HuffmanEndEnable;
input DataInEnable;
input [5:0] DataInAddress;
input [2:0] DataInColor;
output DataInIdle;
input [15:0] DataIn;
output DataOutEnable;
input DataOutRead;
input [4:0] DataOutAddress;
output [2:0] DataOutColor;
output [15:0] DataOutA;
output [15:0] DataOutB;
 
input clk;
input rst;
// State Machine Parameter
parameter S_IDLE = 2'd0;
parameter S_VALID = 2'd1;
parameter S_FULL = 2'd2;
parameter S_INIT = 2'd3;
reg [1:0] State;
reg [1:0] BankCount;
reg [2:0] BankColor [0:3];
reg [1:0] WriteBank;
reg [1:0] ReadBank;
 
input DataInEnable;
input [5:0] DataInAddress;
input [2:0] DataInColor;
output DataInIdle;
input [15:0] DataIn;
wire [5:0] WriteQuery;
 
input HaffumanEndEnable;
// State Machine
always @(posedge clk or negedge rst) begin
if(!rst) begin
State <= S_IDLE;
BankCount <= 2'd0;
end else begin
case(State)
S_IDLE: begin
if(DataInit) begin
State <= S_INIT;
end else if(HuffmanEndEnable) begin
State <= S_VALID;
BankCount <= 2'd0;
end
end
S_VALID: begin
if(HuffmanEndEnable && !(DataOutRead && (DataOutAddress == 5'd31))) begin
if(BankCount == 2'd2) begin
State <= S_FULL;
BankCount <= 2'd3;
end else begin
BankCount <= BankCount + 2'd1;
end
end else if(!HuffmanEndEnable && (DataOutRead && (DataOutAddress == 5'd31))) begin
if(BankCount == 2'd0) begin
State <= S_IDLE;
BankCount <= 2'd0;
end else begin
BankCount <= BankCount - 2'd1;
end
end
end
S_FULL: begin
if(DataOutRead && (DataOutAddress == 5'd31)) begin
State <= S_VALID;
BankCount <= 2'd2;
end
end
S_INIT: begin
State <= S_IDLE;
end
endcase
end
end
 
output DataOutEnable;
output [2:0] DataOutColor;
input DataOutSel;
output [15:0] Data00Reg;
output [15:0] Data01Reg;
output [15:0] Data02Reg;
output [15:0] Data03Reg;
output [15:0] Data04Reg;
output [15:0] Data05Reg;
output [15:0] Data06Reg;
output [15:0] Data07Reg;
output [15:0] Data08Reg;
output [15:0] Data09Reg;
output [15:0] Data10Reg;
output [15:0] Data11Reg;
output [15:0] Data12Reg;
output [15:0] Data13Reg;
output [15:0] Data14Reg;
output [15:0] Data15Reg;
output [15:0] Data16Reg;
output [15:0] Data17Reg;
output [15:0] Data18Reg;
output [15:0] Data19Reg;
output [15:0] Data20Reg;
output [15:0] Data21Reg;
output [15:0] Data22Reg;
output [15:0] Data23Reg;
output [15:0] Data24Reg;
output [15:0] Data25Reg;
output [15:0] Data26Reg;
output [15:0] Data27Reg;
output [15:0] Data28Reg;
output [15:0] Data29Reg;
output [15:0] Data30Reg;
output [15:0] Data31Reg;
output [15:0] Data32Reg;
output [15:0] Data33Reg;
output [15:0] Data34Reg;
output [15:0] Data35Reg;
output [15:0] Data36Reg;
output [15:0] Data37Reg;
output [15:0] Data38Reg;
output [15:0] Data39Reg;
output [15:0] Data40Reg;
output [15:0] Data41Reg;
output [15:0] Data42Reg;
output [15:0] Data43Reg;
output [15:0] Data44Reg;
output [15:0] Data45Reg;
output [15:0] Data46Reg;
output [15:0] Data47Reg;
output [15:0] Data48Reg;
output [15:0] Data49Reg;
output [15:0] Data50Reg;
output [15:0] Data51Reg;
output [15:0] Data52Reg;
output [15:0] Data53Reg;
output [15:0] Data54Reg;
output [15:0] Data55Reg;
output [15:0] Data56Reg;
output [15:0] Data57Reg;
output [15:0] Data58Reg;
output [15:0] Data59Reg;
output [15:0] Data60Reg;
output [15:0] Data61Reg;
output [15:0] Data62Reg;
output [15:0] Data63Reg;
input BankARelease;
input BankBRelease;
reg BankAEnable;
reg BankBEnable;
reg DataInBank;
 
reg [2:0] BankAColor;
reg [2:0] BankBColor;
always @(posedge clk or negedge rst) begin
if(!rst) begin
BankAEnable <= 1'b0;
BankBEnable <= 1'b0;
BankAColor <= 3'b000;
BankBColor <= 3'b000;
DataInBank <= 1'b0;
end else begin
if(BankAEnable == 1'b0 & DataInBank == 1'b0) begin
if(HaffumanEndEnable == 1'b1 & DataInIdle == 1'b1) begin
BankAEnable <= 1'b1;
BankAColor <= DataInColor;
// Color
always @(posedge clk or negedge rst) begin
if(!rst) begin
BankColor[0] <= 3'd0;
BankColor[1] <= 3'd0;
BankColor[2] <= 3'd0;
BankColor[3] <= 3'd0;
end else begin
if(HuffmanEndEnable) BankColor[WriteBank] <= DataInColor;
end
end
// Bank
always @(posedge clk or negedge rst) begin
if(!rst) begin
WriteBank <= 2'd0;
ReadBank <= 2'd0;
end else begin
// Write Bank
if(State == S_INIT) begin
WriteBank <= 2'd0;
end else if(HuffmanEndEnable) begin
WriteBank <= WriteBank + 2'd1;
end
end else begin
if(BankARelease == 1'b1) begin
BankAEnable <= 1'b0;
// Read Bank
if(State == S_INIT) begin
ReadBank <= 2'd0;
end else if(DataOutRead && (DataOutAddress == 5'd31)) begin
ReadBank <= ReadBank + 2'd1;
end
end
if(BankBEnable == 1'b0 & DataInBank == 1'b1) begin
if(HaffumanEndEnable == 1'b1 & DataInIdle == 1'b1) begin
BankBEnable <= 1'b1;
BankBColor <= DataInColor;
end
end else begin
if(BankBRelease == 1'b1) begin
BankBEnable <= 1'b0;
end
end
if(HaffumanEndEnable == 1'b1) begin
DataInBank <= ~DataInBank;
end
end // else: !if(!rst)
end // always @ (posedge clk or negedge rst)
end
end
// Make a Write Address
function [5:0] F_WriteQuery;
input [5:0] Count;
case(Count)
6'd0: F_WriteQuery = {1'b0, 5'd0 };
6'd1: F_WriteQuery = {1'b0, 5'd2 };
6'd2: F_WriteQuery = {1'b0, 5'd4 };
6'd3: F_WriteQuery = {1'b0, 5'd8 };
6'd4: F_WriteQuery = {1'b0, 5'd6 };
6'd5: F_WriteQuery = {1'b0, 5'd1 };
6'd6: F_WriteQuery = {1'b1, 5'd3 };
6'd7: F_WriteQuery = {1'b0, 5'd5 };
6'd8: F_WriteQuery = {1'b0, 5'd10};
6'd9: F_WriteQuery = {1'b0, 5'd12};
6'd10: F_WriteQuery = {1'b0, 5'd16};
6'd11: F_WriteQuery = {1'b0, 5'd14};
6'd12: F_WriteQuery = {1'b0, 5'd9 };
6'd13: F_WriteQuery = {1'b1, 5'd7 };
6'd14: F_WriteQuery = {1'b1, 5'd0 };
6'd15: F_WriteQuery = {1'b0, 5'd3 };
6'd16: F_WriteQuery = {1'b1, 5'd4 };
6'd17: F_WriteQuery = {1'b1, 5'd11};
6'd18: F_WriteQuery = {1'b0, 5'd13};
6'd19: F_WriteQuery = {1'b0, 5'd18};
6'd20: F_WriteQuery = {1'b0, 5'd20};
6'd21: F_WriteQuery = {1'b0, 5'd24};
6'd22: F_WriteQuery = {1'b0, 5'd22};
6'd23: F_WriteQuery = {1'b0, 5'd17};
6'd24: F_WriteQuery = {1'b1, 5'd15};
6'd25: F_WriteQuery = {1'b1, 5'd8 };
6'd26: F_WriteQuery = {1'b0, 5'd7 };
6'd27: F_WriteQuery = {1'b1, 5'd1 };
6'd28: F_WriteQuery = {1'b1, 5'd2 };
6'd29: F_WriteQuery = {1'b1, 5'd5 };
6'd30: F_WriteQuery = {1'b0, 5'd11};
6'd31: F_WriteQuery = {1'b1, 5'd12};
6'd32: F_WriteQuery = {1'b1, 5'd19};
6'd33: F_WriteQuery = {1'b0, 5'd21};
6'd34: F_WriteQuery = {1'b0, 5'd26};
6'd35: F_WriteQuery = {1'b0, 5'd28};
6'd36: F_WriteQuery = {1'b0, 5'd30};
6'd37: F_WriteQuery = {1'b0, 5'd25};
6'd38: F_WriteQuery = {1'b1, 5'd23};
6'd39: F_WriteQuery = {1'b1, 5'd16};
6'd40: F_WriteQuery = {1'b0, 5'd15};
6'd41: F_WriteQuery = {1'b1, 5'd9 };
6'd42: F_WriteQuery = {1'b1, 5'd6 };
6'd43: F_WriteQuery = {1'b1, 5'd10};
6'd44: F_WriteQuery = {1'b1, 5'd13};
6'd45: F_WriteQuery = {1'b0, 5'd19};
6'd46: F_WriteQuery = {1'b1, 5'd20};
6'd47: F_WriteQuery = {1'b1, 5'd27};
6'd48: F_WriteQuery = {1'b0, 5'd29};
6'd49: F_WriteQuery = {1'b1, 5'd31};
6'd50: F_WriteQuery = {1'b1, 5'd24};
6'd51: F_WriteQuery = {1'b0, 5'd23};
6'd52: F_WriteQuery = {1'b1, 5'd17};
6'd53: F_WriteQuery = {1'b1, 5'd14};
6'd54: F_WriteQuery = {1'b1, 5'd18};
6'd55: F_WriteQuery = {1'b1, 5'd21};
6'd56: F_WriteQuery = {1'b0, 5'd27};
6'd57: F_WriteQuery = {1'b1, 5'd28};
6'd58: F_WriteQuery = {1'b0, 5'd31};
6'd59: F_WriteQuery = {1'b1, 5'd25};
6'd60: F_WriteQuery = {1'b1, 5'd22};
6'd61: F_WriteQuery = {1'b1, 5'd26};
6'd62: F_WriteQuery = {1'b1, 5'd29};
6'd63: F_WriteQuery = {1'b1, 5'd30};
endcase
endfunction
assign WriteQuery = F_WriteQuery(DataInAddress);
// RAM(16bit x 32word x 2Bank)
reg [15:0] MemoryA [0:127];
reg [15:0] MemoryB [0:127];
wire [6:0] WriteAddress;
wire WriteEnableA, WriteEnableB;
assign WriteEnableA = DataInEnable & ~WriteQuery[5];
assign WriteEnableB = DataInEnable & WriteQuery[5];
assign WriteAddress = {WriteBank, WriteQuery[4:0]};
 
assign DataInIdle = BankAEnable == 1'b0 | BankBEnable == 1'b0;
assign DataOutEnable = BankAEnable == 1'b1 | BankBEnable == 1'b1;
assign DataOutColor = (DataInBank)?BankBColor:BankAColor;
// Port A(Write Only)
always @(posedge clk) begin
if(WriteEnableA) MemoryA[WriteAddress] <= DataIn;
if(WriteEnableB) MemoryB[WriteAddress] <= DataIn;
end
 
wire ZigAEnable;
wire ZigBEnable;
wire [15:0] BankA00Reg;
wire [15:0] BankA01Reg;
wire [15:0] BankA02Reg;
wire [15:0] BankA03Reg;
wire [15:0] BankA04Reg;
wire [15:0] BankA05Reg;
wire [15:0] BankA06Reg;
wire [15:0] BankA07Reg;
wire [15:0] BankA08Reg;
wire [15:0] BankA09Reg;
wire [15:0] BankA10Reg;
wire [15:0] BankA11Reg;
wire [15:0] BankA12Reg;
wire [15:0] BankA13Reg;
wire [15:0] BankA14Reg;
wire [15:0] BankA15Reg;
wire [15:0] BankA16Reg;
wire [15:0] BankA17Reg;
wire [15:0] BankA18Reg;
wire [15:0] BankA19Reg;
wire [15:0] BankA20Reg;
wire [15:0] BankA21Reg;
wire [15:0] BankA22Reg;
wire [15:0] BankA23Reg;
wire [15:0] BankA24Reg;
wire [15:0] BankA25Reg;
wire [15:0] BankA26Reg;
wire [15:0] BankA27Reg;
wire [15:0] BankA28Reg;
wire [15:0] BankA29Reg;
wire [15:0] BankA30Reg;
wire [15:0] BankA31Reg;
wire [15:0] BankA32Reg;
wire [15:0] BankA33Reg;
wire [15:0] BankA34Reg;
wire [15:0] BankA35Reg;
wire [15:0] BankA36Reg;
wire [15:0] BankA37Reg;
wire [15:0] BankA38Reg;
wire [15:0] BankA39Reg;
wire [15:0] BankA40Reg;
wire [15:0] BankA41Reg;
wire [15:0] BankA42Reg;
wire [15:0] BankA43Reg;
wire [15:0] BankA44Reg;
wire [15:0] BankA45Reg;
wire [15:0] BankA46Reg;
wire [15:0] BankA47Reg;
wire [15:0] BankA48Reg;
wire [15:0] BankA49Reg;
wire [15:0] BankA50Reg;
wire [15:0] BankA51Reg;
wire [15:0] BankA52Reg;
wire [15:0] BankA53Reg;
wire [15:0] BankA54Reg;
wire [15:0] BankA55Reg;
wire [15:0] BankA56Reg;
wire [15:0] BankA57Reg;
wire [15:0] BankA58Reg;
wire [15:0] BankA59Reg;
wire [15:0] BankA60Reg;
wire [15:0] BankA61Reg;
wire [15:0] BankA62Reg;
wire [15:0] BankA63Reg;
reg [15:0] RegMemoryA, RegMemoryB;
// Port B(Read/Wirte)
always @(posedge clk) begin
RegMemoryA <= MemoryA[{ReadBank, DataOutAddress}];
RegMemoryB <= MemoryB[{ReadBank, DataOutAddress}];
end
// Data Enable Register
reg [127:0] DataEnableA, DataEnableB;
always @(posedge clk or negedge rst) begin
if(!rst) begin
DataEnableA <= 128'd0;
DataEnableB <= 128'd0;
end else begin
if(State == S_INIT) begin
DataEnableA <= 128'd0;
DataEnableB <= 128'd0;
end else begin
if(DataInEnable && (WriteBank == 2'd0)) begin
if(WriteEnableA) begin
if(WriteAddress[4:0] == 5'd0) begin
DataEnableA[{2'd0, WriteAddress[4:0]}] <= 1'b1;
DataEnableA[31:1] <= 31'd0;
DataEnableB[31:0] <= 32'd0;
end else begin
DataEnableA[{2'd0, WriteAddress[4:0]}] <= 1'b1;
end
end else begin
DataEnableB[{2'd0, WriteAddress[4:0]}] <= 1'b1;
end
end
if(DataInEnable && (WriteBank == 2'd1)) begin
if(WriteEnableA) begin
if(WriteAddress[4:0] == 5'd0) begin
DataEnableA[{2'd1, WriteAddress[4:0]}] <= 1'b1;
DataEnableA[63:33] <= 31'd0;
DataEnableB[63:32] <= 32'd0;
end else begin
DataEnableA[{2'd1, WriteAddress[4:0]}] <= 1'b1;
end
end else begin
DataEnableB[{2'd1, WriteAddress[4:0]}] <= 1'b1;
end
end
if(DataInEnable && (WriteBank == 2'd2)) begin
if(WriteEnableA) begin
if(WriteAddress[4:0] == 5'd0) begin
DataEnableA[{2'd2, WriteAddress[4:0]}] <= 1'b1;
DataEnableA[95:65] <= 31'd0;
DataEnableB[95:64] <= 32'd0;
end else begin
DataEnableA[{2'd2, WriteAddress[4:0]}] <= 1'b1;
end
end else begin
DataEnableB[{2'd2, WriteAddress[4:0]}] <= 1'b1;
end
end
if(DataInEnable && (WriteBank == 2'd3)) begin
if(WriteEnableA) begin
if(WriteAddress[4:0] == 5'd0) begin
DataEnableA[{2'd3, WriteAddress[4:0]}] <= 1'b1;
DataEnableA[127:97] <= 31'd0;
DataEnableB[127:96] <= 32'd0;
end else begin
DataEnableA[{2'd3, WriteAddress[4:0]}] <= 1'b1;
end
end else begin
DataEnableB[{2'd3, WriteAddress[4:0]}] <= 1'b1;
end
end
end
end
end
reg AddressDelayA, AddressDelayB;
always @(posedge clk or negedge rst) begin
if(!rst) begin
AddressDelayA <= 1'b0;
AddressDelayB <= 1'b0;
end else begin
AddressDelayA <= DataEnableA[{ReadBank, DataOutAddress}];
AddressDelayB <= DataEnableB[{ReadBank, DataOutAddress}];
end
end
 
wire [15:0] BankB00Reg;
wire [15:0] BankB01Reg;
wire [15:0] BankB02Reg;
wire [15:0] BankB03Reg;
wire [15:0] BankB04Reg;
wire [15:0] BankB05Reg;
wire [15:0] BankB06Reg;
wire [15:0] BankB07Reg;
wire [15:0] BankB08Reg;
wire [15:0] BankB09Reg;
wire [15:0] BankB10Reg;
wire [15:0] BankB11Reg;
wire [15:0] BankB12Reg;
wire [15:0] BankB13Reg;
wire [15:0] BankB14Reg;
wire [15:0] BankB15Reg;
wire [15:0] BankB16Reg;
wire [15:0] BankB17Reg;
wire [15:0] BankB18Reg;
wire [15:0] BankB19Reg;
wire [15:0] BankB20Reg;
wire [15:0] BankB21Reg;
wire [15:0] BankB22Reg;
wire [15:0] BankB23Reg;
wire [15:0] BankB24Reg;
wire [15:0] BankB25Reg;
wire [15:0] BankB26Reg;
wire [15:0] BankB27Reg;
wire [15:0] BankB28Reg;
wire [15:0] BankB29Reg;
wire [15:0] BankB30Reg;
wire [15:0] BankB31Reg;
wire [15:0] BankB32Reg;
wire [15:0] BankB33Reg;
wire [15:0] BankB34Reg;
wire [15:0] BankB35Reg;
wire [15:0] BankB36Reg;
wire [15:0] BankB37Reg;
wire [15:0] BankB38Reg;
wire [15:0] BankB39Reg;
wire [15:0] BankB40Reg;
wire [15:0] BankB41Reg;
wire [15:0] BankB42Reg;
wire [15:0] BankB43Reg;
wire [15:0] BankB44Reg;
wire [15:0] BankB45Reg;
wire [15:0] BankB46Reg;
wire [15:0] BankB47Reg;
wire [15:0] BankB48Reg;
wire [15:0] BankB49Reg;
wire [15:0] BankB50Reg;
wire [15:0] BankB51Reg;
wire [15:0] BankB52Reg;
wire [15:0] BankB53Reg;
wire [15:0] BankB54Reg;
wire [15:0] BankB55Reg;
wire [15:0] BankB56Reg;
wire [15:0] BankB57Reg;
wire [15:0] BankB58Reg;
wire [15:0] BankB59Reg;
wire [15:0] BankB60Reg;
wire [15:0] BankB61Reg;
wire [15:0] BankB62Reg;
wire [15:0] BankB63Reg;
// Output Signal
assign DataInIdle = (State == S_IDLE) | (State == S_VALID);
assign DataOutEnable = (State == S_VALID) | (State == S_FULL);
assign DataOutColor = BankColor[ReadBank];
assign DataOutA = (AddressDelayA)?RegMemoryA:16'd0;
assign DataOutB = (AddressDelayB)?RegMemoryB:16'd0;
 
assign ZigAEnable = DataInEnable == 1'b1 & DataInBank == 1'b0;
assign ZigBEnable = DataInEnable == 1'b1 & DataInBank == 1'b1;
jpeg_ziguzagu_reg u_jpeg_ziguzagu_reg0(
.rst(rst),
.clk(clk),
.DataInEnable ( ZigAEnable ),
.DataInAddress ( DataInAddress ),
.DataIn ( DataIn ),
.Data00Reg( BankA00Reg ),
.Data01Reg( BankA01Reg ),
.Data02Reg( BankA02Reg ),
.Data03Reg( BankA03Reg ),
.Data04Reg( BankA04Reg ),
.Data05Reg( BankA05Reg ),
.Data06Reg( BankA06Reg ),
.Data07Reg( BankA07Reg ),
.Data08Reg( BankA08Reg ),
.Data09Reg( BankA09Reg ),
.Data10Reg( BankA10Reg ),
.Data11Reg( BankA11Reg ),
.Data12Reg( BankA12Reg ),
.Data13Reg( BankA13Reg ),
.Data14Reg( BankA14Reg ),
.Data15Reg( BankA15Reg ),
.Data16Reg( BankA16Reg ),
.Data17Reg( BankA17Reg ),
.Data18Reg( BankA18Reg ),
.Data19Reg( BankA19Reg ),
.Data20Reg( BankA20Reg ),
.Data21Reg( BankA21Reg ),
.Data22Reg( BankA22Reg ),
.Data23Reg( BankA23Reg ),
.Data24Reg( BankA24Reg ),
.Data25Reg( BankA25Reg ),
.Data26Reg( BankA26Reg ),
.Data27Reg( BankA27Reg ),
.Data28Reg( BankA28Reg ),
.Data29Reg( BankA29Reg ),
.Data30Reg( BankA30Reg ),
.Data31Reg( BankA31Reg ),
.Data32Reg( BankA32Reg ),
.Data33Reg( BankA33Reg ),
.Data34Reg( BankA34Reg ),
.Data35Reg( BankA35Reg ),
.Data36Reg( BankA36Reg ),
.Data37Reg( BankA37Reg ),
.Data38Reg( BankA38Reg ),
.Data39Reg( BankA39Reg ),
.Data40Reg( BankA40Reg ),
.Data41Reg( BankA41Reg ),
.Data42Reg( BankA42Reg ),
.Data43Reg( BankA43Reg ),
.Data44Reg( BankA44Reg ),
.Data45Reg( BankA45Reg ),
.Data46Reg( BankA46Reg ),
.Data47Reg( BankA47Reg ),
.Data48Reg( BankA48Reg ),
.Data49Reg( BankA49Reg ),
.Data50Reg( BankA50Reg ),
.Data51Reg( BankA51Reg ),
.Data52Reg( BankA52Reg ),
.Data53Reg( BankA53Reg ),
.Data54Reg( BankA54Reg ),
.Data55Reg( BankA55Reg ),
.Data56Reg( BankA56Reg ),
.Data57Reg( BankA57Reg ),
.Data58Reg( BankA58Reg ),
.Data59Reg( BankA59Reg ),
.Data60Reg( BankA60Reg ),
.Data61Reg( BankA61Reg ),
.Data62Reg( BankA62Reg ),
.Data63Reg( BankA63Reg )
);
jpeg_ziguzagu_reg u_jpeg_ziguzagu_reg1(
.rst(rst),
.clk(clk),
.DataInEnable ( ZigBEnable ),
.DataInAddress ( DataInAddress ),
.DataIn ( DataIn ),
.Data00Reg( BankB00Reg ),
.Data01Reg( BankB01Reg ),
.Data02Reg( BankB02Reg ),
.Data03Reg( BankB03Reg ),
.Data04Reg( BankB04Reg ),
.Data05Reg( BankB05Reg ),
.Data06Reg( BankB06Reg ),
.Data07Reg( BankB07Reg ),
.Data08Reg( BankB08Reg ),
.Data09Reg( BankB09Reg ),
.Data10Reg( BankB10Reg ),
.Data11Reg( BankB11Reg ),
.Data12Reg( BankB12Reg ),
.Data13Reg( BankB13Reg ),
.Data14Reg( BankB14Reg ),
.Data15Reg( BankB15Reg ),
.Data16Reg( BankB16Reg ),
.Data17Reg( BankB17Reg ),
.Data18Reg( BankB18Reg ),
.Data19Reg( BankB19Reg ),
.Data20Reg( BankB20Reg ),
.Data21Reg( BankB21Reg ),
.Data22Reg( BankB22Reg ),
.Data23Reg( BankB23Reg ),
.Data24Reg( BankB24Reg ),
.Data25Reg( BankB25Reg ),
.Data26Reg( BankB26Reg ),
.Data27Reg( BankB27Reg ),
.Data28Reg( BankB28Reg ),
.Data29Reg( BankB29Reg ),
.Data30Reg( BankB30Reg ),
.Data31Reg( BankB31Reg ),
.Data32Reg( BankB32Reg ),
.Data33Reg( BankB33Reg ),
.Data34Reg( BankB34Reg ),
.Data35Reg( BankB35Reg ),
.Data36Reg( BankB36Reg ),
.Data37Reg( BankB37Reg ),
.Data38Reg( BankB38Reg ),
.Data39Reg( BankB39Reg ),
.Data40Reg( BankB40Reg ),
.Data41Reg( BankB41Reg ),
.Data42Reg( BankB42Reg ),
.Data43Reg( BankB43Reg ),
.Data44Reg( BankB44Reg ),
.Data45Reg( BankB45Reg ),
.Data46Reg( BankB46Reg ),
.Data47Reg( BankB47Reg ),
.Data48Reg( BankB48Reg ),
.Data49Reg( BankB49Reg ),
.Data50Reg( BankB50Reg ),
.Data51Reg( BankB51Reg ),
.Data52Reg( BankB52Reg ),
.Data53Reg( BankB53Reg ),
.Data54Reg( BankB54Reg ),
.Data55Reg( BankB55Reg ),
.Data56Reg( BankB56Reg ),
.Data57Reg( BankB57Reg ),
.Data58Reg( BankB58Reg ),
.Data59Reg( BankB59Reg ),
.Data60Reg( BankB60Reg ),
.Data61Reg( BankB61Reg ),
.Data62Reg( BankB62Reg ),
.Data63Reg( BankB63Reg )
);
 
assign Data00Reg = (DataOutSel)?BankB00Reg:BankA00Reg;
assign Data01Reg = (DataOutSel)?BankB01Reg:BankA01Reg;
assign Data02Reg = (DataOutSel)?BankB02Reg:BankA02Reg;
assign Data03Reg = (DataOutSel)?BankB03Reg:BankA03Reg;
assign Data04Reg = (DataOutSel)?BankB04Reg:BankA04Reg;
assign Data05Reg = (DataOutSel)?BankB05Reg:BankA05Reg;
assign Data06Reg = (DataOutSel)?BankB06Reg:BankA06Reg;
assign Data07Reg = (DataOutSel)?BankB07Reg:BankA07Reg;
assign Data08Reg = (DataOutSel)?BankB08Reg:BankA08Reg;
assign Data09Reg = (DataOutSel)?BankB09Reg:BankA09Reg;
assign Data10Reg = (DataOutSel)?BankB10Reg:BankA10Reg;
assign Data11Reg = (DataOutSel)?BankB11Reg:BankA11Reg;
assign Data12Reg = (DataOutSel)?BankB12Reg:BankA12Reg;
assign Data13Reg = (DataOutSel)?BankB13Reg:BankA13Reg;
assign Data14Reg = (DataOutSel)?BankB14Reg:BankA14Reg;
assign Data15Reg = (DataOutSel)?BankB15Reg:BankA15Reg;
assign Data16Reg = (DataOutSel)?BankB16Reg:BankA16Reg;
assign Data17Reg = (DataOutSel)?BankB17Reg:BankA17Reg;
assign Data18Reg = (DataOutSel)?BankB18Reg:BankA18Reg;
assign Data19Reg = (DataOutSel)?BankB19Reg:BankA19Reg;
assign Data20Reg = (DataOutSel)?BankB20Reg:BankA20Reg;
assign Data21Reg = (DataOutSel)?BankB21Reg:BankA21Reg;
assign Data22Reg = (DataOutSel)?BankB22Reg:BankA22Reg;
assign Data23Reg = (DataOutSel)?BankB23Reg:BankA23Reg;
assign Data24Reg = (DataOutSel)?BankB24Reg:BankA24Reg;
assign Data25Reg = (DataOutSel)?BankB25Reg:BankA25Reg;
assign Data26Reg = (DataOutSel)?BankB26Reg:BankA26Reg;
assign Data27Reg = (DataOutSel)?BankB27Reg:BankA27Reg;
assign Data28Reg = (DataOutSel)?BankB28Reg:BankA28Reg;
assign Data29Reg = (DataOutSel)?BankB29Reg:BankA29Reg;
assign Data30Reg = (DataOutSel)?BankB30Reg:BankA30Reg;
assign Data31Reg = (DataOutSel)?BankB31Reg:BankA31Reg;
assign Data32Reg = (DataOutSel)?BankB32Reg:BankA32Reg;
assign Data33Reg = (DataOutSel)?BankB33Reg:BankA33Reg;
assign Data34Reg = (DataOutSel)?BankB34Reg:BankA34Reg;
assign Data35Reg = (DataOutSel)?BankB35Reg:BankA35Reg;
assign Data36Reg = (DataOutSel)?BankB36Reg:BankA36Reg;
assign Data37Reg = (DataOutSel)?BankB37Reg:BankA37Reg;
assign Data38Reg = (DataOutSel)?BankB38Reg:BankA38Reg;
assign Data39Reg = (DataOutSel)?BankB39Reg:BankA39Reg;
assign Data40Reg = (DataOutSel)?BankB40Reg:BankA40Reg;
assign Data41Reg = (DataOutSel)?BankB41Reg:BankA41Reg;
assign Data42Reg = (DataOutSel)?BankB42Reg:BankA42Reg;
assign Data43Reg = (DataOutSel)?BankB43Reg:BankA43Reg;
assign Data44Reg = (DataOutSel)?BankB44Reg:BankA44Reg;
assign Data45Reg = (DataOutSel)?BankB45Reg:BankA45Reg;
assign Data46Reg = (DataOutSel)?BankB46Reg:BankA46Reg;
assign Data47Reg = (DataOutSel)?BankB47Reg:BankA47Reg;
assign Data48Reg = (DataOutSel)?BankB48Reg:BankA48Reg;
assign Data49Reg = (DataOutSel)?BankB49Reg:BankA49Reg;
assign Data50Reg = (DataOutSel)?BankB50Reg:BankA50Reg;
assign Data51Reg = (DataOutSel)?BankB51Reg:BankA51Reg;
assign Data52Reg = (DataOutSel)?BankB52Reg:BankA52Reg;
assign Data53Reg = (DataOutSel)?BankB53Reg:BankA53Reg;
assign Data54Reg = (DataOutSel)?BankB54Reg:BankA54Reg;
assign Data55Reg = (DataOutSel)?BankB55Reg:BankA55Reg;
assign Data56Reg = (DataOutSel)?BankB56Reg:BankA56Reg;
assign Data57Reg = (DataOutSel)?BankB57Reg:BankA57Reg;
assign Data58Reg = (DataOutSel)?BankB58Reg:BankA58Reg;
assign Data59Reg = (DataOutSel)?BankB59Reg:BankA59Reg;
assign Data60Reg = (DataOutSel)?BankB60Reg:BankA60Reg;
assign Data61Reg = (DataOutSel)?BankB61Reg:BankA61Reg;
assign Data62Reg = (DataOutSel)?BankB62Reg:BankA62Reg;
assign Data63Reg = (DataOutSel)?BankB63Reg:BankA63Reg;
endmodule // jpeg_ziguzagu
endmodule
/djpeg/trunk/readme.txt
1,14 → 1,8
JPEG Decoder
 
[Product Name] JPEG Decoder
[Update Date ] 2007/04/18
[Version ] Ver 1.03
[License ] LGPL
[Update Date ] 2009/10/05
[Version ] Ver 2.01
[License ] CPL 1.0
[Langage ] Verilog
[Author ] Hidemi Ishihara(E-Mail:hidemi@sweetcafe.jp)
 
Specification for Japanese
http://claude.sweetcafe.jp//index.php?option=com_content&task=view&id=38&Itemid=88888896
 
Specification for English
http://translate.google.com/translate?u=http%3A%2F%2Fclaude.sweetcafe.jp%2F%2Findex.php%3Foption%3Dcom_content%26task%3Dview%26id%3D38%26Itemid%3D88888896&langpair=ja%7Cen&hl=ja&ie=UTF-8&oe=UTF-8&prev=%2Flanguage_tools

powered by: WebSVN 2.1.0

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