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

Subversion Repositories bluespec-h264

[/] [bluespec-h264/] [trunk/] [release/] [DeblockTee.bsv] - Blame information for rev 100

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 85 jamey.hick
// The MIT License
2
 
3
// Copyright (c) 2006-2007 Massachusetts Institute of Technology
4
 
5
// Permission is hereby granted, free of charge, to any person obtaining a copy
6
// of this software and associated documentation files (the "Software"), to deal
7
// in the Software without restriction, including without limitation the rights
8
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
// copies of the Software, and to permit persons to whom the Software is
10
// furnished to do so, subject to the following conditions:
11
 
12
// The above copyright notice and this permission notice shall be included in
13
// all copies or substantial portions of the Software.
14
 
15
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
// THE SOFTWARE.
22 84 jamey.hick
import GetPut::*;
23
import H264Types::*;
24
import RegFile::*;
25
 
26
typedef enum
27
{
28
  Forwarding,
29
  DumpingY,
30
  DumpingU,
31
  DumpingV
32
}
33
  State deriving (Bits, Eq);
34
 
35
module mkDeblockTee#(Get#(DeblockFilterOT) inputData, Put#(DeblockFilterOT) outputData, String prefix, Bool recordFrames) ();
36
 
37
 Reg#(Bit#(32)) cycles <- mkReg(0);
38
 Reg#(State) state <- mkReg(Forwarding);
39
 Reg#(Bit#(32)) horCounter;
40
 Reg#(Bit#(32)) verCounter;
41
 Reg#(Bit#(32)) counter;
42
 Reg#(Bit#(PicWidthSz))  picWidth;
43
 Reg#(Bit#(PicHeightSz)) picHeight;
44
 Reg#(Bit#(PicAreaSz))   frameinmb;
45
 RegFile#(Bit#(TAdd#(PicAreaSz,6)), Bit#(32)) yValues;
46
 RegFile#(Bit#(TAdd#(PicAreaSz,4)), Bit#(32)) uValues;
47
 RegFile#(Bit#(TAdd#(PicAreaSz,4)), Bit#(32)) vValues;
48
 
49
 if(recordFrames)
50
   begin
51
     counter <- mkReg(0);
52
     horCounter <- mkReg(0);
53
     verCounter <- mkReg(0);
54
     picWidth  <- mkReg(maxPicWidthInMB);
55
     picHeight <- mkReg(0);
56
     frameinmb <- mkReg(0);
57
     yValues <- mkRegFileFull();
58
     uValues <- mkRegFileFull();
59
     vValues <- mkRegFileFull();
60
   end
61
 
62
 
63
 rule cycleup;
64
   cycles <= cycles + 1;
65
 endrule
66
 
67
 rule processData(state == Forwarding);
68
   let dataIn <- inputData.get();
69
   outputData.put(dataIn);
70
   $write(prefix);
71
   case (dataIn) matches
72
     tagged DFBLuma .data:
73
       begin
74
         $display("DFBLuma(%d): hor: %d ver:%d data:%h\n", cycles,data.hor, data.ver, data.data);
75
         if(recordFrames)
76
           begin
77
             Bit#(TAdd#(PicAreaSz,6)) addr = {(zeroExtend(data.ver)*zeroExtend(picWidth)),2'b00}+zeroExtend(data.hor);
78
             $write(prefix);
79
             $display("Writing to %d, %h", addr, data);
80
             yValues.upd(addr,{data.data[7:0],data.data[15:8],data.data[23:16],data.data[31:24]});
81
           end
82
       end
83
     tagged DFBChroma .data:
84
       begin
85
         $display("DFBChroma(%d): flag: %d hor: %d ver:%d data:%h\n", cycles, data.uv, data.hor, data.ver, data.data);
86
         if(recordFrames)
87
           begin
88
             Bit#(TAdd#(PicAreaSz,4)) addr = {(zeroExtend(data.ver)*zeroExtend(picWidth)),1'b0}+zeroExtend(data.hor);
89
             if(data.uv == 1)
90
               begin
91
                 $write(prefix);
92
                 $display("Writing to %d, %h", addr, data);
93
                 vValues.upd(addr, {data.data[7:0],data.data[15:8],data.data[23:16],data.data[31:24]});
94
               end
95
             else
96
               begin
97
                 $write(prefix);
98
                 $display("Writing to %d, %h", addr, data);
99
                 uValues.upd(addr, {data.data[7:0],data.data[15:8],data.data[23:16],data.data[31:24]});
100
               end
101
           end
102
       end
103
     tagged EndOfFrame:
104
       begin
105
         if(recordFrames)
106
           begin
107
             state <= DumpingY;
108
             counter <= 0;
109
           end
110
           $display("EndOfFrame(%d)", cycles);
111
       end
112
     tagged EDOT .data:
113
       case (data) matches
114
         tagged SPSpic_width_in_mbs .xdata :
115
           begin
116
             if(recordFrames)
117
               begin
118
                 picWidth <= xdata;
119
               end
120
           end
121
         tagged SPSpic_height_in_map_units .xdata :
122
           begin
123
             if(recordFrames)
124
               begin
125
                 picHeight <= xdata;
126
                 frameinmb <= zeroExtend(picWidth)*zeroExtend(xdata);
127
               end
128
           end
129
       endcase
130
   endcase
131
 endrule
132
 
133
if(recordFrames)
134
 begin
135
   rule dumpY(state == DumpingY);
136
     Bit#(TAdd#(PicAreaSz,6)) addr = truncate({(verCounter*zeroExtend(picWidth)),2'b00}+zeroExtend(horCounter));
137
     $write(prefix);
138
     //$write("(%d,%d,%d,%d,%d,%d)", counter, addr, horCounter, verCounter, picWidth, picHeight);
139
     $write("DUMP ");
140
     $display("%h", yValues.sub(addr));
141
 
142
     yValues.upd(addr,0);
143
     if(horCounter + 1 == zeroExtend(picWidth)*4) // 4 values per Mb
144
       begin
145
         horCounter <= 0;
146
         if(verCounter + 1 == zeroExtend(picHeight)*16)
147
           begin
148
             state <= DumpingU;
149
             verCounter <= 0;
150
             counter <= 0;
151
           end
152
         else
153
           begin
154
             verCounter <= verCounter + 1;
155
             counter <= counter + 1;
156
           end
157
       end
158
     else
159
       begin
160
         horCounter <= horCounter + 1;
161
         counter <= counter + 1;
162
       end
163
   endrule
164
 
165
   rule dumpU(state == DumpingU);
166
     Bit#(TAdd#(PicAreaSz,4)) addr = truncate({(verCounter*zeroExtend(picWidth)),1'b0}+zeroExtend(horCounter));
167
     $write(prefix);
168
     //$write("(%d,%d,%d,%d)", counter, addr, horCounter, verCounter);
169
 
170
     $write("DUMP ");
171
     $display("%h", uValues.sub(addr));
172
     uValues.upd(addr, 0);
173
 
174
     if(horCounter + 1 == zeroExtend(picWidth)*2) // 2 values per Mb
175
       begin
176
         horCounter <= 0;
177
         if(verCounter + 1 == zeroExtend(picHeight)*8) // Chroma have half as much data
178
           begin
179
             state <= DumpingV;
180
             verCounter <= 0;
181
             counter <= 0;
182
           end
183
         else
184
           begin
185
             verCounter <= verCounter + 1;
186
             counter <= counter + 1;
187
           end
188
       end
189
     else
190
       begin
191
         horCounter <= horCounter + 1;
192
         counter <= counter + 1;
193
       end
194
   endrule
195
 
196
   rule dumpV(state == DumpingV);
197
     Bit#(TAdd#(PicAreaSz,4)) addr = truncate({(verCounter*zeroExtend(picWidth)),1'b0}+zeroExtend(horCounter));
198
     $write(prefix);
199
     //$write("(%d,%d,%d,%d)", counter, addr, horCounter, verCounter);
200
     $write("DUMP ");
201
     $display("%h", vValues.sub(addr));
202
     vValues.upd(addr, 0);
203
     if(horCounter + 1 == zeroExtend(picWidth)*2) // 2 values per Mb
204
       begin
205
         horCounter <= 0;
206
         if(verCounter + 1 == zeroExtend(picHeight)*8) // Chroma have half as much data
207
           begin
208
             state <= Forwarding;
209
             verCounter <= 0;
210
           end
211
         else
212
           begin
213
             verCounter <= verCounter + 1;
214
             counter <= counter + 1;
215
           end
216
       end
217
     else
218
       begin
219
         horCounter <= horCounter + 1;
220
         counter <= counter + 1;
221
       end
222
   endrule
223
 end
224
endmodule
225
 
226
 

powered by: WebSVN 2.1.0

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