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

Subversion Repositories mpeg2fpga

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 kdv
/*
2
 * getbits.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
 * getbits - read bitfields from incoming video stream
21
 */
22
 
23
`include "timescale.v"
24
 
25
`undef DEBUG
26
//`define DEBUG 1
27
 
28
module getbits_fifo (clk, clk_en, rst,
29
   vid_in, vid_in_rd_en, vid_in_rd_valid,
30
   advance, align,
31
   getbits, signbit, getbits_valid,
32
   wait_state, rld_wr_almost_full, mvec_wr_almost_full, motcomp_busy, vld_en);
33
 
34
  input            clk;                      // clock
35
  input            clk_en;                   // clock enable
36
  input            rst;                      // synchronous active low reset
37
 
38
  input      [63:0]vid_in;
39
  output reg       vid_in_rd_en;
40
  input            vid_in_rd_valid;
41
 
42
  input       [4:0]advance;                  // number of bits to advance the bitstream (advance <= 24). Enabled when getbits_valid asserted.
43
  input            align;                    // byte-align getbits and move forward one byte. Enabled when getbits_valid asserted.
44
  input            wait_state;               // asserted if vld needs to be frozen next clock cycle.
45
  input            rld_wr_almost_full;       // asserted if rld fifo almost full
46
  input            mvec_wr_almost_full;      // asserted if motion vector fifo almost full
47
  input            motcomp_busy;             // asserted if motcomp fifo almost full
48
 
49
  output reg [23:0]getbits;                  // bit-aligned elementary stream data. 
50
  output reg       signbit;                  // In table B-14 and B-15, the rightmost bit of the variable length code is the sign bit.
51
                                             // When decoding DCT variable length codes, signbit contains the sign bit of the
52
                                             // previous clock's coefficient.
53
 
54
  output reg       getbits_valid;            // getbits_valid is asserted when getbits is valid.
55
  output reg       vld_en;                   // vld clock enable
56
 
57
  reg       [128:0]dta;                      // 129 bits. No typo.
58
  reg       [103:0]dummy;                    // dummy variable, not used.
59
  reg         [7:0]cursor;
60
  reg       [128:0]next_dta;
61
  reg         [7:0]next_cursor;
62
  reg        [23:0]next_getbits;
63
  reg              next_signbit;
64
 
65
  parameter
66
    STATE_INIT      = 1'b0,
67
    STATE_READY     = 1'b1;
68
 
69
  reg               state;
70
  reg               next;
71
 
72
  /* next state logic */
73
  always @*
74
    case (state)
75
      STATE_INIT:  if (vid_in_rd_valid && (next_cursor < 8'd64)) next = STATE_READY;
76
                   else next = STATE_INIT;
77
 
78
      STATE_READY: if (next_cursor > 63) next = STATE_INIT;
79
                   else next = STATE_READY;
80
 
81
      default      next = STATE_INIT;
82
    endcase
83
 
84
  /* state */
85
  always @(posedge clk)
86
    if(~rst) state <= STATE_INIT;
87
    else if (clk_en) state <= next;
88
    else state <= next;
89
 
90
  /* registers */
91
 
92
  always @*
93
    if ((state == STATE_INIT) && vid_in_rd_valid) next_dta = {dta[64:0], vid_in};
94
    else next_dta = dta;
95
 
96
  wire [7:0]cursor_aligned = {cursor[7:3], 3'b0};
97
  wire [7:0]advance_ext = {3'b0, advance};
98
 
99
  always @*
100
    case (state)
101
      STATE_INIT:  if (vid_in_rd_valid) next_cursor = cursor - 8'd64;
102
                   else next_cursor = cursor;
103
 
104
      STATE_READY: if (align) next_cursor = cursor_aligned + 8'd8;
105
                   else next_cursor = cursor + advance_ext;
106
 
107
      default      next_cursor = cursor;
108
    endcase
109
 
110
  always @*
111
    {next_signbit, next_getbits, dummy} = next_dta << next_cursor;
112
 
113
  always @(posedge clk)
114
    if (~rst) dta <= 129'b0;
115
    else if (clk_en) dta <= next_dta;
116
    else dta <= dta;
117
 
118
  always @(posedge clk)
119
    if (~rst) cursor <= 8'd128;
120
    else if (clk_en) cursor <= next_cursor;
121
    else cursor <= cursor;
122
 
123
  always @(posedge clk)
124
    if (~rst) signbit <= 1'b0;
125
    else if (clk_en) signbit <= next_signbit;
126
    else signbit <= signbit;
127
 
128
  always @(posedge clk)
129
    if (~rst) getbits <= 24'b0;
130
    else if (clk_en) getbits <= next_getbits;
131
    else getbits <= getbits;
132
 
133
  always @(posedge clk)
134
    if (~rst) getbits_valid <= 1'b0;
135
    else if (clk_en) getbits_valid <= (next == STATE_READY);
136
    else getbits_valid <= getbits_valid;
137
 
138
  always @(posedge clk)
139
    if (~rst) vid_in_rd_en <= 1'b0;
140
    else if (clk_en) vid_in_rd_en <= (next == STATE_INIT) && ~vid_in_rd_en && ~vid_in_rd_valid;
141
    else vid_in_rd_en <= vid_in_rd_en;
142
 
143
  /* vld clock enable */
144
 
145
  /*
146
   * variable length decoding and fifo take turns;
147
   * First vld determines how much to move forward in the bitstream;
148
   * next clock, getbits moves that amount forward in the stream while vld waits;
149
   * then vld analyzes the new position in the bitstream while getbits waits,
150
   * and so on.
151
   */
152
 
153
  always @(posedge clk)
154
    if (~rst) vld_en <= 1'b1;
155
    // enable vld when getbits, rld, and motcomp ready, and not a wait state
156
    else if (clk_en && vld_en) vld_en <= (next == STATE_READY) && ~wait_state && ~rld_wr_almost_full && ~mvec_wr_almost_full && ~motcomp_busy;
157
    else if (clk_en) vld_en <= (next == STATE_READY) && ~rld_wr_almost_full && ~mvec_wr_almost_full && ~motcomp_busy;
158
    else vld_en <= vld_en;
159
 
160
  /* Debugging */
161
`ifdef DEBUG
162
   always @(posedge clk)
163
     if (clk_en)
164
       $strobe("%m\tvid_in: %h vid_in_rd_en: %d vid_in_rd_valid: %d advance: %d align: %d state: %d dta: %h cursor: %h signbit: %d getbits: %h getbits_valid: %d ",
165
                    vid_in, vid_in_rd_en, vid_in_rd_valid, advance, align, state, dta, cursor, signbit, getbits, getbits_valid);
166
`endif
167
 
168
endmodule
169
/* not truncated */

powered by: WebSVN 2.1.0

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