OpenCores
URL https://opencores.org/ocsvn/bluespec-h264/bluespec-h264/trunk

Subversion Repositories bluespec-h264

[/] [bluespec-h264/] [trunk/] [src/] [mkDeblockFilter.bsv] - Diff between revs 36 and 37

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 36 Rev 37
Line 8... Line 8...
 
 
import H264Types::*;
import H264Types::*;
 
 
import IDeblockFilter::*;
import IDeblockFilter::*;
import FIFO::*;
import FIFO::*;
 
import FIFOF::*;
import Vector::*;
import Vector::*;
 
 
import Connectable::*;
import Connectable::*;
import GetPut::*;
import GetPut::*;
import ClientServer::*;
import ClientServer::*;
import RegFile::*;
import RegFile::*;
import RWire::*;
import RWire::*;
 
 
 
 
//-----------------------------------------------------------
//-----------------------------------------------------------
// Local Datatypes
// Local Datatypes
//-----------------------------------------------------------
//-----------------------------------------------------------
 
 
 
 
Line 280... Line 280...
 
 
 
 
(* synthesize *)
(* synthesize *)
module mkDeblockFilter( IDeblockFilter );
module mkDeblockFilter( IDeblockFilter );
 
 
   FIFO#(EntropyDecOT) infifo     <- mkSizedFIFO(deblockFilter_infifo_size);
   FIFOF#(EntropyDecOT) infifo     <- mkSizedFIFOF(deblockFilter_infifo_size);
   FIFO#(DeblockFilterOT) outfifo <- mkFIFO();
   FIFO#(DeblockFilterOT) outfifo <- mkFIFO();
 
   FIFO#(DeblockFilterOT) outfifoVertical <- mkFIFO();
 
 
   FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) dataMemReqQ       <- mkFIFO;
   FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) dataMemReqQ       <- mkFIFO;
 
   FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) memReqRowToColumnConversion <- mkFIFO();
 
   FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) memReqVertical              <- mkFIFO();
 
   FIFO#(MemReq#(TAdd#(PicWidthSz,5),32)) memReqDataSendReq           <- mkFIFO();
 
 
   FIFO#(MemReq#(PicWidthSz,13))          parameterMemReqQ  <- mkFIFO;
   FIFO#(MemReq#(PicWidthSz,13))          parameterMemReqQ  <- mkFIFO;
   FIFO#(MemResp#(32))                    dataMemRespQ      <- mkFIFO;
   FIFO#(MemResp#(32))                    dataMemRespQ      <- mkFIFO;
   FIFO#(MemResp#(13))                    parameterMemRespQ <- mkFIFO;
   FIFO#(MemResp#(13))                    parameterMemRespQ <- mkFIFO;
 
 
   Reg#(Process) process       <- mkReg(Passing);
   Reg#(Process) process       <- mkReg(Passing);
Line 373... Line 378...
   Reg#(Bit#(2)) columnToRowState <- mkReg(0);
   Reg#(Bit#(2)) columnToRowState <- mkReg(0);
   FIFO#(Tuple2#(Bit#(4), Bit#(1))) columnToRowStoreBlock <- mkFIFO();
   FIFO#(Tuple2#(Bit#(4), Bit#(1))) columnToRowStoreBlock <- mkFIFO();
 
 
   Reg#(Bit#(2)) columnNumber <- mkReg(0);
   Reg#(Bit#(2)) columnNumber <- mkReg(0);
 
 
 
   // Debugging register
 
   Reg#(Bit#(32)) fifo_full_count <- mkReg(0);
 
   Reg#(Bit#(32)) total_cycles <- mkReg(0);
 
 
   //-----------------------------------------------------------
   //-----------------------------------------------------------
   // Rules
   // Rules
 
 
 
   rule incr;
 
     total_cycles <= total_cycles + 1;
 
   endrule
 
 
 
 
   rule checkFIFO ( True );
   rule checkFIFO ( True );
      $display( "Trace DeblockFilter: checkFIFO %h", infifo.first() );
      $display( "Trace DeblockFilter: checkFIFO %h cycle: %d", infifo.first(), total_cycles );
      $display( "TRACE DeblockFilter: checkFIFO %h", infifo.first() );
      $display( "TRACE DeblockFilter: checkFIFO %h", infifo.first() );
 
      if(!infifo.notFull)
 
        begin
 
          fifo_full_count <= fifo_full_count + 1;
 
          $display("DEBLOCK FIFO FULL: %d of %d",fifo_full_count, total_cycles);
 
        end
 
   endrule
 
 
 
   rule memReqMergeRowToColumnConversion;
 
     memReqRowToColumnConversion.deq();
 
     dataMemReqQ.enq(memReqRowToColumnConversion.first());
 
   endrule
 
 
 
   rule memReqMergeVertical;
 
     memReqVertical.deq();
 
     dataMemReqQ.enq(memReqVertical.first());
   endrule
   endrule
 
 
 
   rule memReqMergeDataSendReq;
 
     memReqDataSendReq.deq();
 
     dataMemReqQ.enq(memReqDataSendReq.first());
 
   endrule
 
 
 
   rule outfifoVerticalSplit;
 
     outfifoVertical.deq();
 
     outfifo.enq(outfifoVertical.first());
 
   endrule
 
 
   rule passing ( process matches Passing );
   rule passing ( process matches Passing );
      case (infifo.first()) matches
      case (infifo.first()) matches
         tagged NewUnit . xdata :
         tagged NewUnit . xdata :
            begin
            begin
Line 510... Line 546...
         begin
         begin
            if(dataReqCount==1)
            if(dataReqCount==1)
               parameterMemReqQ.enq(LoadReq (temp));
               parameterMemReqQ.enq(LoadReq (temp));
            Bit#(4) temp2 = truncate(dataReqCount-1);
            Bit#(4) temp2 = truncate(dataReqCount-1);
            let temp3 = {temp,chromaFlag,temp2};
            let temp3 = {temp,chromaFlag,temp2};
            dataMemReqQ.enq(LoadReq (temp3));
            memReqDataSendReq.enq(LoadReq (temp3));
            if(dataReqCount==16)
            if(dataReqCount==16)
               dataReqCount <= 0;
               dataReqCount <= 0;
            else
            else
               dataReqCount <= dataReqCount+1;
               dataReqCount <= dataReqCount+1;
         end
         end
Line 565... Line 601...
       begin
       begin
          $display( "TRACE Deblocking Filter: rowToColumnRotate rotating block (%0d, %0d) rowtoColumnState: %d bottomRightBlock: %d, data: %h", blockHor, blockVer, rowToColumnState, storeBottomRightBlock, data_out);
          $display( "TRACE Deblocking Filter: rowToColumnRotate rotating block (%0d, %0d) rowtoColumnState: %d bottomRightBlock: %d, data: %h", blockHor, blockVer, rowToColumnState, storeBottomRightBlock, data_out);
         // The block hor calculation may be questionable... between U and V.
         // The block hor calculation may be questionable... between U and V.
         if(chromaFlag == 0)
         if(chromaFlag == 0)
           begin
           begin
             dataMemReqQ.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,2'b11,rowToColumnState},data:data_out});
             memReqRowToColumnConversion.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,2'b11,rowToColumnState},data:data_out});
           end
           end
         else
         else
           begin  //differentiate between u and v
           begin  //differentiate between u and v
             dataMemReqQ.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,blockHor[1],1'b1,rowToColumnState},data:data_out});
             memReqRowToColumnConversion.enq(StoreReq {addr:{adjustedMbHor,chromaFlag,blockHor[1],1'b1,rowToColumnState},data:data_out});
           end
           end
 
 
       end
       end
     else // pass data along to vertical filter
     else // pass data along to vertical filter
       begin
       begin
Line 819... Line 855...
                    end
                    end
                   // these outputs occur in the past, so we must use the adjusted Mb numbers
                   // these outputs occur in the past, so we must use the adjusted Mb numbers
                   else if(chromaFlag==0)
                   else if(chromaFlag==0)
                     begin
                     begin
                       $display("TRACE mkDeblockFilter: (Left Vector) Outputting Luma ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",{adjustedMbVer,blockVer,pixelNum},{adjustedMbHor,2'b11} ,result[31:0] );
                       $display("TRACE mkDeblockFilter: (Left Vector) Outputting Luma ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",{adjustedMbVer,blockVer,pixelNum},{adjustedMbHor,2'b11} ,result[31:0] );
                       outfifo.enq(DFBLuma {ver:{adjustedMbVer,blockVer,pixelVer},
                       outfifoVertical.enq(DFBLuma {ver:{adjustedMbVer,blockVer,pixelVer},
                                            hor:{adjustedMbHor,2'b11},
                                            hor:{adjustedMbHor,2'b11},
                                            data:result[31:0]});
                                            data:result[31:0]});
                     end
                     end
                   else
                   else
                     begin
                     begin
                       $display("TRACE mkDeblockFilter: (Left Vector) Outputting Chroma %d ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",blockHor[1],{adjustedMbVer,blockVer[0],pixelNum},{adjustedMbHor,1'b1}  ,result[31:0]);
                       $display("TRACE mkDeblockFilter: (Left Vector) Outputting Chroma %d ver{mbVer, blockVer(2), state(2)}: %b, hor{mbHor, blockHor(2)}: %b, data: %h",blockHor[1],{adjustedMbVer,blockVer[0],pixelNum},{adjustedMbHor,1'b1}  ,result[31:0]);
                       outfifo.enq(DFBChroma {uv:blockHor[1],
                       outfifoVertical.enq(DFBChroma {uv:blockHor[1],
                                              ver:{adjustedMbVer,blockVer[0],pixelVer},
                                              ver:{adjustedMbVer,blockVer[0],pixelVer},
                                              hor:{adjustedMbHor,1'b1},
                                              hor:{adjustedMbHor,1'b1},
                                              data:result[31:0]});
                                              data:result[31:0]});
                      end
                      end
                 end
                 end
Line 1012... Line 1048...
                                                                        // roll through the block clean up.
                                                                        // roll through the block clean up.
                  begin
                  begin
                    blockHorVerticalCleanup <= blockHor;
                    blockHorVerticalCleanup <= blockHor;
                    verticalState <= VerticalCleanup;
                    verticalState <= VerticalCleanup;
                  end
                  end
                dataMemReqQ.enq(StoreReq {addr:{currMbHorT,chromaFlag,blockHor,columnNumber},data:resultV[63:32]});
                memReqVertical.enq(StoreReq {addr:{currMbHorT,chromaFlag,blockHor,columnNumber},data:resultV[63:32]});
              end
              end
            columnToRowStore[columnNumber].enq(resultV[31:0]);
            columnToRowStore[columnNumber].enq(resultV[31:0]);
            if(columnNumber == 0)
            if(columnNumber == 0)
              begin
              begin
                columnToRowStoreBlock.enq(tuple2(blockNumCols,1'b0));
                columnToRowStoreBlock.enq(tuple2(blockNumCols,1'b0));
Line 1100... Line 1136...
   interface Client mem_client_parameter;
   interface Client mem_client_parameter;
      interface Get request  = fifoToGet(parameterMemReqQ);
      interface Get request  = fifoToGet(parameterMemReqQ);
      interface Put response = fifoToPut(parameterMemRespQ);
      interface Put response = fifoToPut(parameterMemRespQ);
   endinterface
   endinterface
 
 
   interface Put ioin  = fifoToPut(infifo);
   interface Put ioin  = fifoToPut(fifofToFifo(infifo));
   interface Get ioout = fifoToGet(outfifo);
   interface Get ioout = fifoToGet(outfifo);
 
 
endmodule
endmodule
 
 
endpackage
endpackage

powered by: WebSVN 2.1.0

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