1 |
7 |
dbrochart |
######################################################################
|
2 |
|
|
#### ####
|
3 |
|
|
#### iteration.py ####
|
4 |
|
|
#### ####
|
5 |
|
|
#### This file is part of the turbo decoder IP core project ####
|
6 |
|
|
#### http://www.opencores.org/projects/turbocodes/ ####
|
7 |
|
|
#### ####
|
8 |
|
|
#### Author(s): ####
|
9 |
|
|
#### - David Brochart(dbrochart@opencores.org) ####
|
10 |
|
|
#### ####
|
11 |
|
|
#### All additional information is available in the README.txt ####
|
12 |
|
|
#### file. ####
|
13 |
|
|
#### ####
|
14 |
|
|
######################################################################
|
15 |
|
|
#### ####
|
16 |
|
|
#### Copyright (C) 2005 Authors ####
|
17 |
|
|
#### ####
|
18 |
|
|
#### This source file may be used and distributed without ####
|
19 |
|
|
#### restriction provided that this copyright statement is not ####
|
20 |
|
|
#### removed from the file and that any derivative work contains ####
|
21 |
|
|
#### the original copyright notice and the associated disclaimer. ####
|
22 |
|
|
#### ####
|
23 |
|
|
#### This source file is free software; you can redistribute it ####
|
24 |
|
|
#### and/or modify it under the terms of the GNU Lesser General ####
|
25 |
|
|
#### Public License as published by the Free Software Foundation; ####
|
26 |
|
|
#### either version 2.1 of the License, or (at your option) any ####
|
27 |
|
|
#### later version. ####
|
28 |
|
|
#### ####
|
29 |
|
|
#### This source is distributed in the hope that it will be ####
|
30 |
|
|
#### useful, but WITHOUT ANY WARRANTY; without even the implied ####
|
31 |
|
|
#### warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ####
|
32 |
|
|
#### PURPOSE. See the GNU Lesser General Public License for more ####
|
33 |
|
|
#### details. ####
|
34 |
|
|
#### ####
|
35 |
|
|
#### You should have received a copy of the GNU Lesser General ####
|
36 |
|
|
#### Public License along with this source; if not, download it ####
|
37 |
|
|
#### from http://www.opencores.org/lgpl.shtml ####
|
38 |
|
|
#### ####
|
39 |
|
|
######################################################################
|
40 |
|
|
|
41 |
|
|
|
42 |
|
|
|
43 |
|
|
from misc import delayer
|
44 |
|
|
from interleaver import interleaver
|
45 |
|
|
from permut import zPermut, abPermut
|
46 |
|
|
from sova import sova
|
47 |
|
|
from myhdl import Signal, intbv, instances
|
48 |
|
|
|
49 |
|
|
def iteration(clk, rst, flipflop, a, b, y1, y2, y1Int, y2Int, zin, zout, aDec, bDec, aDel, bDel, y1Del, y2Del, y1IntDel, y2IntDel, l = 20, m = 10, q = 8, p = 48, r = 5, n = 4, delay = 0):
|
50 |
|
|
""" Decoding iteration top level (two SOVAs).
|
51 |
|
|
|
52 |
|
|
l -- first trellis length
|
53 |
|
|
m -- second trellis length
|
54 |
|
|
q -- accumulated distance width
|
55 |
|
|
p -- interleaver frame size in bit couples
|
56 |
|
|
r -- extrinsic information width
|
57 |
|
|
n -- systematic data width
|
58 |
|
|
delay -- additional delay created by the previous iterations
|
59 |
|
|
clk, rst -- in : clock and negative reset
|
60 |
|
|
flipflop -- in : permutation control signal (on/off)
|
61 |
|
|
a, b, y1, y2, y1Int, y2Int -- in : received decoder signals
|
62 |
|
|
zin -- in : extrinsic information from the previous iteration
|
63 |
|
|
zout -- out : extrinsic information to the next iteration
|
64 |
|
|
aDec, bDec -- out : decoded signals
|
65 |
|
|
aDel, bDel, y1Del, y2Del, y1IntDel, y2IntDel -- out : delayed received decoder signals
|
66 |
|
|
|
67 |
|
|
"""
|
68 |
|
|
# Signal declarations:
|
69 |
|
|
aDecInt = Signal(bool(0))
|
70 |
|
|
bDecInt = Signal(bool(0))
|
71 |
|
|
zoutInt1 = [Signal(intbv(0, 0, 2**r)) for i in range(4)]
|
72 |
|
|
zout1Perm = [Signal(intbv(0, 0, 2**r)) for i in range(4)]
|
73 |
|
|
aDel1 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
74 |
|
|
bDel1 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
75 |
|
|
aDel2 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
76 |
|
|
bDel2 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
77 |
|
|
y1Del1 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
78 |
|
|
y2Del1 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
79 |
|
|
y1Del2 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
80 |
|
|
y2Del2 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
81 |
|
|
y1IntDel1 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
82 |
|
|
y2IntDel1 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
83 |
|
|
y1IntDel3 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
84 |
|
|
y2IntDel3 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
85 |
|
|
y1IntDel4 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
86 |
|
|
y2IntDel4 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
87 |
|
|
aDel3 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
88 |
|
|
bDel3 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
89 |
|
|
abDel1Perm = [Signal(intbv(0, -(2**(n-1)), 2**(n-1))) for i in range(2)]
|
90 |
|
|
abDel1PermInt = [Signal(intbv(0, -(2**(n-1)), 2**(n-1))) for i in range(2)]
|
91 |
|
|
y1Del3 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
92 |
|
|
y2Del3 = Signal(intbv(0, -(2**(n-1)), 2**(n-1)))
|
93 |
|
|
zout1 = [Signal(intbv(0, 0, 2**r)) for i in range(4)]
|
94 |
|
|
zout2 = [Signal(intbv(0, 0, 2**r)) for i in range(4)]
|
95 |
|
|
zout2Int = [Signal(intbv(0, 0, 2**r)) for i in range(4)]
|
96 |
|
|
|
97 |
|
|
# Instanciations:
|
98 |
|
|
sova_i0 = sova(clk, rst, a, b, y1, y2, zin, zout1, aDec, bDec, l, m, q, r, n)
|
99 |
|
|
zPermut_i0 = zPermut(flipflop, zout1, zout1Perm, (l + m + 2 + delay + 1) % 2)
|
100 |
|
|
interleaver_i0 = interleaver(clk, rst, zout1Perm, zoutInt1, p, l + m + 2 + delay, 0, 2**r, 4, 0)
|
101 |
|
|
delayer_i0 = delayer(clk, rst, a, aDel1, (l + m), -(2**(n-1)), 2**(n-1))
|
102 |
|
|
delayer_i1 = delayer(clk, rst, b, bDel1, (l + m), -(2**(n-1)), 2**(n-1))
|
103 |
|
|
delayer_i2 = delayer(clk, rst, y1, y1Del1, (l + m), -(2**(n-1)), 2**(n-1))
|
104 |
|
|
delayer_i3 = delayer(clk, rst, y2, y2Del1, (l + m), -(2**(n-1)), 2**(n-1))
|
105 |
|
|
delayer_i4 = delayer(clk, rst, y1Int, y1IntDel1, (l + m), -(2**(n-1)), 2**(n-1))
|
106 |
|
|
delayer_i5 = delayer(clk, rst, y2Int, y2IntDel1, (l + m), -(2**(n-1)), 2**(n-1))
|
107 |
|
|
abPermut_i0 = abPermut(flipflop, aDel1, bDel1, abDel1Perm, (l + m + 2 + delay + 1) % 2)
|
108 |
|
|
interleaver_i1 = interleaver(clk, rst, abDel1Perm, abDel1PermInt, p, l + m + 2 + delay, -(2**(n-1)), 2**(n-1), 2, 0)
|
109 |
|
|
delayer_i6 = delayer(clk, rst, aDel1, aDel2, p, -(2**(n-1)), 2**(n-1))
|
110 |
|
|
delayer_i7 = delayer(clk, rst, bDel1, bDel2, p, -(2**(n-1)), 2**(n-1))
|
111 |
|
|
delayer_i8 = delayer(clk, rst, y1Del1, y1Del2, p, -(2**(n-1)), 2**(n-1))
|
112 |
|
|
delayer_i9 = delayer(clk, rst, y2Del1, y2Del2, p, -(2**(n-1)), 2**(n-1))
|
113 |
|
|
sova_i1 = sova(clk, rst, abDel1PermInt[1], abDel1PermInt[0], y1IntDel1, y2IntDel1, zoutInt1, zout2, aDecInt, bDecInt, l, m, q, r, n)
|
114 |
|
|
deinterleaver_i0 = interleaver(clk, rst, zout2, zout2Int, p, 2 * (l + m + 2) + p + delay, 0, 2**r, 4, 1)
|
115 |
|
|
zPermut_i1 = zPermut(flipflop, zout2Int, zout, (2 * (l + m + 2) + p + delay) % 2)
|
116 |
|
|
delayer_i10 = delayer(clk, rst, aDel2, aDel3, (l + m), -(2**(n-1)), 2**(n-1))
|
117 |
|
|
delayer_i11 = delayer(clk, rst, bDel2, bDel3, (l + m), -(2**(n-1)), 2**(n-1))
|
118 |
|
|
delayer_i12 = delayer(clk, rst, y1Del2, y1Del3, (l + m), -(2**(n-1)), 2**(n-1))
|
119 |
|
|
delayer_i13 = delayer(clk, rst, y2Del2, y2Del3, (l + m), -(2**(n-1)), 2**(n-1))
|
120 |
|
|
delayer_i14 = delayer(clk, rst, y1IntDel1, y1IntDel3, (l + m), -(2**(n-1)), 2**(n-1))
|
121 |
|
|
delayer_i15 = delayer(clk, rst, y2IntDel1, y2IntDel3, (l + m), -(2**(n-1)), 2**(n-1))
|
122 |
|
|
delayer_i16 = delayer(clk, rst, aDel3, aDel, p, -(2**(n-1)), 2**(n-1))
|
123 |
|
|
delayer_i17 = delayer(clk, rst, bDel3, bDel, p, -(2**(n-1)), 2**(n-1))
|
124 |
|
|
delayer_i18 = delayer(clk, rst, y1Del3, y1Del, p, -(2**(n-1)), 2**(n-1))
|
125 |
|
|
delayer_i19 = delayer(clk, rst, y2Del3, y2Del, p, -(2**(n-1)), 2**(n-1))
|
126 |
|
|
delayer_i20 = delayer(clk, rst, y1IntDel3, y1IntDel4, p, -(2**(n-1)), 2**(n-1))
|
127 |
|
|
delayer_i21 = delayer(clk, rst, y2IntDel3, y2IntDel4, p, -(2**(n-1)), 2**(n-1))
|
128 |
|
|
delayer_i22 = delayer(clk, rst, y1IntDel4, y1IntDel, p, -(2**(n-1)), 2**(n-1))
|
129 |
|
|
delayer_i23 = delayer(clk, rst, y2IntDel4, y2IntDel, p, -(2**(n-1)), 2**(n-1))
|
130 |
|
|
|
131 |
|
|
return sova_i0, zPermut_i0, interleaver_i0, delayer_i0, delayer_i1, delayer_i2, delayer_i3, delayer_i4, delayer_i5, abPermut_i0, interleaver_i1, delayer_i6, delayer_i7, delayer_i8, delayer_i9, sova_i1, deinterleaver_i0, zPermut_i1, delayer_i10, delayer_i11, delayer_i12, delayer_i13, delayer_i14, delayer_i15, delayer_i16, delayer_i17, delayer_i18, delayer_i19, delayer_i20, delayer_i21, delayer_i22, delayer_i23
|