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

Subversion Repositories mpeg2fpga

[/] [mpeg2fpga/] [trunk/] [rtl/] [mpeg2/] [resample_dta.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 kdv
/*
2
 * resample_dta.v
3
 *
4
 * Copyright (c) 2007 Koen De Vleeschauwer.
5
 *
6
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
7
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
10
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
11
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
12
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
14
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
15
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
16
 * SUCH DAMAGE.
17
 */
18
 
19
/*
20
 * resample_dta - chroma resampling: read pixel data from memory fifo.
21
 */
22
 
23
`include "timescale.v"
24
 
25
`undef DEBUG
26
//`define DEBUG 1
27
 
28
module resample_dta (
29
  clk, clk_en, rst,
30
  fifo_read, fifo_valid,
31
  disp_rd_dta_empty, disp_rd_dta_en, disp_rd_dta_valid, disp_rd_dta,
32
  resample_rd_en, resample_rd_dta, resample_rd_valid,
33
  fifo_osd, fifo_y, fifo_u_upper, fifo_u_lower, fifo_v_upper, fifo_v_lower, fifo_position
34
  );
35
 
36
  input            clk;                      // clock
37
  input            clk_en;                   // clock enable
38
  input            rst;                      // synchronous active low reset
39
 
40
  input            fifo_read;                // resample_bilinear asserts 'fifo_read' when resample_bilineear clocks in fifo_* data
41
  output reg       fifo_valid;               // resample_dta asserts 'fifo_valid' when fifo_* valid
42
 
43
  /* chroma resampling: reading reconstructed frame data */
44
  input            disp_rd_dta_empty;
45
  output           disp_rd_dta_en;
46
  input            disp_rd_dta_valid;
47
  input      [63:0]disp_rd_dta;
48
 
49
  output           resample_rd_en;
50
  input       [2:0]resample_rd_dta;
51
  input            resample_rd_valid;
52
 
53
  /* registers to read disp_rd_dta fifo in.
54
     16 pixels - a macroblock - wide.
55
     Two rows of chrominance information are stored, as we will have to interpolate between these two rows. */
56
 
57
  output reg [127:0]fifo_osd;          /* osd data */
58
  output reg [127:0]fifo_y;            /* lumi */
59
  output reg  [63:0]fifo_u_upper;      /* chromi, upper row */
60
  output reg  [63:0]fifo_u_lower;      /* chromi, lower row */
61
  output reg  [63:0]fifo_v_upper;      /* chromi, upper row */
62
  output reg  [63:0]fifo_v_lower;      /* chromi, lower row */
63
  output reg   [2:0]fifo_position;     /* position of pixels, as in  resample_codes */
64
 
65
  /* first-word fall-through fifo readers */
66
 
67
  wire             disp_fwft_valid;
68
  wire      [127:0]disp_fwft_dout;
69
  reg              disp_fwft_rd_en;
70
 
71
  wire             resample_fwft_valid;
72
  wire        [2:0]resample_fwft_dout;
73
  reg              resample_fwft_rd_en;
74
 
75
  parameter [3:0]
76
    STATE_INIT        = 4'h0,
77
    STATE_RD_OSD      = 4'h1,
78
    STATE_RD_Y        = 4'h2,
79
    STATE_RD_U        = 4'h3,
80
    STATE_RD_V        = 4'h4,
81
    STATE_RD_POS      = 4'h5,
82
    STATE_READY       = 4'h6,
83
    STATE_WAIT        = 4'h7;
84
 
85
  reg          [3:0]state;
86
  reg          [3:0]next;
87
 
88
  /* next state logic */
89
  always @*
90
    case (state)
91
      STATE_INIT:         next = STATE_RD_OSD;
92
 
93
      STATE_RD_OSD:       if (disp_fwft_valid) next = STATE_RD_Y;
94
                          else next = STATE_RD_OSD;
95
 
96
      STATE_RD_Y:         if (disp_fwft_valid) next = STATE_RD_U;
97
                          else next = STATE_RD_Y;
98
 
99
      STATE_RD_U:         if (disp_fwft_valid) next = STATE_RD_V;
100
                          else next = STATE_RD_U;
101
 
102
      STATE_RD_V:         if (disp_fwft_valid) next = STATE_RD_POS;
103
                          else next = STATE_RD_V;
104
 
105
      STATE_RD_POS:       if (resample_fwft_valid) next = STATE_READY;
106
                          else next = STATE_RD_POS;
107
 
108
                          /* raise fifo_valid; wait for fifo_read to go high */
109
      STATE_READY:        if (fifo_read) next = STATE_WAIT;
110
                          else next = STATE_READY;
111
 
112
                          /* wait for fifo_read to drop, then lower fifo_valid */
113
      STATE_WAIT:         if (~fifo_read) next = STATE_RD_OSD;
114
                          else next = STATE_WAIT;
115
 
116
      default             next = STATE_INIT;
117
    endcase
118
 
119
  /* state */
120
  always @(posedge clk)
121
    if(~rst) state <= STATE_INIT;
122
    else if (clk_en) state <= next;
123
    else state <= state;
124
 
125
  /* inform resample_bilinear data is valid */
126
  always @(posedge clk)
127
    if(~rst) fifo_valid <= 1'b0;
128
    else if (clk_en && (state == STATE_READY)) fifo_valid <= 1'b1;
129
    else if (clk_en && (state == STATE_WAIT)) fifo_valid <= fifo_read; // drop fifo_valid when fifo_read is lowered
130
    else if (clk_en) fifo_valid <= 1'b0;
131
    else fifo_valid <= fifo_valid;
132
 
133
  /* disp fifo read enable */
134
  always @(posedge clk)
135
    if(~rst) disp_fwft_rd_en <= 1'b0;
136
    else if (clk_en) disp_fwft_rd_en <= (next == STATE_RD_OSD) || (next == STATE_RD_Y) || (next == STATE_RD_U) ||(next == STATE_RD_V);
137
    else disp_fwft_rd_en <= disp_fwft_rd_en;
138
 
139
  /* resample fifo read enable */
140
  always @(posedge clk)
141
    if(~rst) resample_fwft_rd_en <= 1'b0;
142
    else if (clk_en) resample_fwft_rd_en <= (next == STATE_RD_POS);
143
    else resample_fwft_rd_en <= resample_fwft_rd_en;
144
 
145
  /* read data from disp fifo */
146
 
147
  always @(posedge clk)
148
    if (~rst) fifo_osd <= 128'b0;
149
    else if (clk_en && (state == STATE_RD_OSD) && disp_fwft_valid) fifo_osd <= disp_fwft_dout;
150
    else fifo_osd <= fifo_osd;
151
 
152
  always @(posedge clk)
153
    if (~rst) fifo_y <= 128'b0;
154
    else if (clk_en && (state == STATE_RD_Y) && disp_fwft_valid) fifo_y <= disp_fwft_dout;
155
    else fifo_y <= fifo_y;
156
 
157
  always @(posedge clk)
158
    if (~rst) {fifo_u_upper, fifo_u_lower} <= 64'b0;
159
    else if (clk_en && (state == STATE_RD_U) && disp_fwft_valid) {fifo_u_upper, fifo_u_lower} <= disp_fwft_dout;
160
    else {fifo_u_upper, fifo_u_lower} <= {fifo_u_upper, fifo_u_lower};
161
 
162
  always @(posedge clk)
163
    if (~rst) {fifo_v_upper, fifo_v_lower} <= 64'b0;
164
    else if (clk_en && (state == STATE_RD_V) && disp_fwft_valid) {fifo_v_upper, fifo_v_lower} <= disp_fwft_dout;
165
    else {fifo_v_upper, fifo_v_lower} <= {fifo_v_upper, fifo_v_lower};
166
 
167
  /* read data from resample fifo */
168
 
169
  always @(posedge clk)
170
    if (~rst) fifo_position <= 2'b0;
171
    else if (clk_en && (state == STATE_RD_POS) && resample_fwft_valid) fifo_position <= resample_fwft_dout;
172
    else fifo_position <= fifo_position;
173
 
174
  /* fifo readers */
175
 
176
  fwft2_reader
177
    #(.dta_width(9'd64))
178
  disp_fwft_reader (
179
    .rst(rst),
180
    .clk(clk),
181
    .clk_en(clk_en),
182
    .fifo_rd_en(disp_rd_dta_en),
183
    .fifo_valid(disp_rd_dta_valid),
184
    .fifo_dout(disp_rd_dta),
185
    .valid(disp_fwft_valid),
186
    .dout(disp_fwft_dout),
187
    .rd_en(disp_fwft_rd_en)
188
    );
189
 
190
  fwft_reader
191
    #(.dta_width(9'd3))
192
  resample_fwft_reader (
193
    .rst(rst),
194
    .clk(clk),
195
    .clk_en(clk_en),
196
    .fifo_rd_en(resample_rd_en),
197
    .fifo_valid(resample_rd_valid),
198
    .fifo_dout(resample_rd_dta),
199
    .valid(resample_fwft_valid),
200
    .dout(resample_fwft_dout),
201
    .rd_en(resample_fwft_rd_en)
202
    );
203
 
204
`ifdef DEBUG
205
  always @(posedge clk)
206
    if (clk_en)
207
        case (state)
208
        STATE_INIT:                   #0 $display("%m\tSTATE_INIT");
209
        STATE_RD_OSD:                 #0 $display("%m\tSTATE_RD_OSD");
210
        STATE_RD_Y:                   #0 $display("%m\tSTATE_RD_Y");
211
        STATE_RD_U:                   #0 $display("%m\tSTATE_RD_U");
212
        STATE_RD_V:                   #0 $display("%m\tSTATE_RD_V");
213
        STATE_RD_POS:                 #0 $display("%m\tSTATE_RD_POS");
214
        STATE_READY:                  #0 $display("%m\tSTATE_READY");
215
        STATE_WAIT:                   #0 $display("%m\tSTATE_WAIT");
216
        default                       #0 $display("%m\t*** Error: unknown state %d", state);
217
      endcase
218
 
219
  always @(posedge clk)
220
    $strobe("%m\tstate: %d fifo_read: %d fifo_valid: %d fifo_osd: %32h fifo_y: %32h fifo_u_upper: %16h fifo_u_lower: %16h fifo_v_upper: %16h fifo_v_lower: %16h fifo_position: %d disp_rd_dta_en: %d disp_rd_dta_valid: %d disp_rd_dta: %16h resample_rd_en: %d resample_rd_valid: %d resample_rd_dta: %d", state, fifo_read, fifo_valid, fifo_osd, fifo_y, fifo_u_upper, fifo_u_lower, fifo_v_upper, fifo_v_lower, fifo_position, disp_rd_dta_en, disp_rd_dta_valid, disp_rd_dta, resample_rd_en, resample_rd_valid, resample_rd_dta);
221
 
222
`endif
223
endmodule
224
/* not truncated */

powered by: WebSVN 2.1.0

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