source: ReferenceDesigns/w3_802.11/sysgen/wlan_phy_rx_pmd/blackboxes/vb_decoder_top.v

Last change on this file was 5176, checked in by murphpo, 8 years ago

Increased decoder metric precision to 8 bits; avoids rare overflow

File size: 6.0 KB
Line 
1// This file is copyright 2013 by Rice University and was ported from the
2//  original WARP OFDM Reference Design. It is distributed under the WARP license:
3//  http://warpproject.org/license
4
5//*****************************************************************
6// File:    vb_decoder_top.v
7// Author:  Yang Sun (ysun@rice.edu)
8// Birth:   $ 1/15/07
9// Des:     viterbi decoder top level
10//          Take 5 bit soft value is [-16 : +15]
11//          K = 3. g0 =7, g1 = 5
12//          K = 7. g0 = 133, g1 = 171
13// History: $ 1/15/07, Init coding
14//          $ 1/21/07, K = 7
15//          $ 1/27/07, Change to LLR domain
16//          $ 2/4/07, Support puncture 2/3, 3/4
17//          $ 3/22/07, Remove puncture and iq buffer for WARP
18//          $ 3/23/07, Fixed a naming problem for sysgen
19//                     Can not use VHDL reserved key world
20//          $ 4/20/07, K = 7
21//          $ 4/22/07, Change quantilization to -4 ~ 4 9-level
22//          $ 12/1/07: Modified for OFDM V7
23//*****************************************************************
24module vb_decoder_top (
25        clk         ,   // I, clock
26        ce          ,   // I, clock enable (ignored, but required for Sysgen blackbox)
27        nrst        ,   // I, n reset
28        packet_start,   // I, packet start pulse
29        packet_end  ,   // I, packet end pulse
30        vin         ,   // I, valid input
31        llr_b1      ,   // I, 1st LLR
32        llr_b0      ,   // I, 2nd LLR
33        vout        ,   // O, valid output
34        dout_in_byte,   // O, decoded output in byte
35        done,            // O, decoding done
36        early_trace1,
37        early_trace2
38        ) ;
39parameter           SW = 4 ;        // soft input precision
40//parameter           M = 7 ;         // Metric precision
41parameter           M = 8 ;         // Metric precision
42
43parameter           R_EARLY1 = 24; //Early total trace depth
44parameter           C_EARLY1 = 0;  //Early unreliable trace
45parameter           L_EARLY1 = 24; //Early reliable trace trace
46
47parameter           R_EARLY2 = 48; //Early total trace depth
48parameter           C_EARLY2 = 0;  //Early unreliable trace
49parameter           L_EARLY2 = 48; //Early reliable trace trace
50
51//parameter           L = 24 ;        // total trace depth //WLAN
52//parameter           R = 24 ;        // reliable trace
53//parameter           C = 0 ;        // unreliable trace
54
55parameter           L = 88 ;        // total trace depth
56parameter           R = 48 ;        // reliable trace
57parameter           C = 40 ;        // unreliable trace
58
59parameter           LW = 7 ;        // L width
60parameter           K = 7 ;         // constraint length
61parameter           N = 64 ;        // number of states
62parameter           TR = 128 ;      // trace buffer depth
63parameter           TRW = 7 ;       // trace buffer address width
64       
65input               clk ;           // system clock
66input               ce ;
67input               nrst ;          // active low reset
68input               packet_start ;  // start of packet pulse
69input               packet_end ;    // end of packet pulse
70input               vin ;           // data valid input
71input   [4 -1:0]   llr_b1 ;        // soft value for bit1
72input   [4 -1:0]   llr_b0 ;        // soft value for bit0
73
74input early_trace1;
75input early_trace2;
76
77output              done ;
78output              vout ;
79output  [7:0]       dout_in_byte ;
80
81//=============================================
82//Internal signal
83//=============================================
84wire    [LW -1:0]           remain ;
85wire                        dec_vout ;
86wire    [R-1:0]             dec_dout ;
87wire                        dec_done ;
88wire early_dec_vout;
89
90//=============================================
91// Main RTL code
92//=============================================
93
94//================================================================
95// Viterbi decoder core logic
96//================================================================
97//viterbi_core #(SW, M, R, C, L, LW, K, N, TR, TRW) viterbi_core (
98viterbi_core viterbi_core (
99        .clk            (clk            ),  //IN
100        .nrst           (nrst           ),  //IN
101        .packet_start   (packet_start   ),  //IN
102        .packet_end     (packet_end     ),  //IN
103        .zero_tail      (1'b1      ),
104        .dv_in          (vin            ),  //IN
105        .llr1           (llr_b1         ),  //IN[SW-1:0]
106        .llr0           (llr_b0         ),  //IN[SW-1:0]       
107        .remain         (remain         ),  //OUT[LW -1:0]
108        .done           (dec_done       ),  //OUT
109        .dv_out         (dec_vout       ),  //OUT
110        .dout           (dec_dout       ),   //OUT[R -1:0]
111        .early_trace1 (early_trace1),
112        .early_trace2 (early_trace2)
113        ) ;
114defparam viterbi_core.SW = SW;
115defparam viterbi_core.M = M;
116
117defparam viterbi_core.R = R;
118defparam viterbi_core.C = C;
119defparam viterbi_core.L = L;
120
121defparam viterbi_core.R_EARLY1 = R_EARLY1;
122defparam viterbi_core.C_EARLY1 = C_EARLY1;
123defparam viterbi_core.L_EARLY1 = L_EARLY1;
124
125defparam viterbi_core.R_EARLY2 = R_EARLY2;
126defparam viterbi_core.C_EARLY2 = C_EARLY2;
127defparam viterbi_core.L_EARLY2 = L_EARLY2;
128
129defparam viterbi_core.LW = LW;
130defparam viterbi_core.K = K;
131defparam viterbi_core.N = N;
132defparam viterbi_core.TR = TR;
133defparam viterbi_core.TRW = TRW;
134
135//=============================================
136// x to 8bit unpacking
137//=============================================       
138unpack_m2n unpack_Rto8 (
139        .clk    (clk            ),  //IN
140        .nrst   (nrst           ),  //IN
141        .start  (packet_start   ),  //IN
142        .din    (dec_dout       ),  //IN[R -1:0]   
143        .vin    (dec_vout       ),  //IN
144        .last   (dec_done       ),  //IN
145        .remain (remain         ),  //IN[LW -1:0]
146        .dout   (dout_in_byte   ),  //OUT
147        .vout   (vout           ),  //OUT
148        .done   (done           ),   //OUT
149        .early_trace( early_trace1 ) //IN
150        ) ;
151
152        defparam unpack_Rto8.BITM = R;
153        defparam unpack_Rto8.BITM_EARLY = R_EARLY1;
154        defparam unpack_Rto8.BITN = 8;
155        defparam unpack_Rto8.LW = LW;
156       
157endmodule
Note: See TracBrowser for help on using the repository browser.