Acest proiect are ca scop implementarea unui decodor LDPC pe un FPGA.
•caracteristica de concepție, cheie, a decodorului este flexibilitatea, fiind capabil să suporte diferite coduri și calcule
•singurul lucru care se schimbă este configurație ROM
Acest proiect implementează hardware, un decodor flexibil şi iterativ bazat pe o publicație a lui Alberto Tarable din septembrie 2004.
Contribuțiile aduse la acest proiect au fost:
•înțelege, dezvoltă și implementează în MATLAB, un algoritm de alocare a resurselor unui sistem care permite flexibilitatea în decodorul LDPC
•înțelege, dezvoltă și implementează în MATLAB, un algoritm care configureaza comutatoarele crossbar Benes
• dezvoltă si implementează în VHDL operațiunea comutatoarelor crssbar Benes
• concepe o arhitectură a decodorului LDPC.
• dezvoltă și simulează buna funcționare a decodorului LDPC în VHDL.
VCCclk INPUT
VCCrx INPUT
VCCpin_name INPUT
Z0[7..0]OUTPUT
Z1[7..0]OUTPUT
Z2[7..0]OUTPUT
Z3[7..0]OUTPUT
Z4[7..0]OUTPUT
Z5[7..0]OUTPUT
Z6[7..0]OUTPUT
Z7[7..0]OUTPUT
X0[7..0]OUTPUT
X1[7..0]OUTPUT
X2[7..0]OUTPUT
X3[7..0]OUTPUT
X4[7..0]OUTPUT
X5[7..0]OUTPUT
X6[7..0]OUTPUT
X7[7..0]OUTPUT
lambda_writeOUTPUT
address[7..0]OUTPUT
txOUTPUT
send_NROUTPUT
bit_resetOUTPUT
check_resetOUTPUT
clk
reset
in_ready
control_ready
lambda_address[8..0]
done_reading
rst_latch
lambda_write
lambda_wr
inst
PRN
CLRNK
J Q
JKFF
inst1
AND2
inst2AND2
inst3AND2
inst4AND2
inst5AND2
inst6AND2
inst7AND2
inst8AND2
inst9
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst11
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst10
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst12
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst13
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst14
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst15
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst16
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst18
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst19
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst20
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst21
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst22
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst23
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst24
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst25
lambda_sel
lambda_in[7..0]
lambda_address[5..0]
lambda_w r
first_calc
edge_in[7..0]
clk
reset
dv_in[1..0]
send_NR
adder_mux_leaving
X0[7..0]
dv_address[5..0]
bit_node_processor
inst17
VCC
data[2..0] eq0
eq1
eq2
eq3
eq4
eq5
eq6
eq7
lam_wr_decoder
inst26
9 bi
ts51
2 w
ords
Block ty pe: AUTO
address[8..0]
clock
q[8..0]
lambda_rom
inst27
clk
w ren
A0[7..0]
A1[7..0]
A2[7..0]
A3[7..0]
A4[7..0]
A5[7..0]
A6[7..0]
A7[7..0]
sw A[16..0]
sw B[16..0]
A0addrw [7..0]
A1addrw [7..0]
A2addrw [7..0]
A3addrw [7..0]
A4addrw [7..0]
A5addrw [7..0]
A6addrw [7..0]
A7addrw [7..0]
A0addrr[7..0]
A1addrr[7..0]
A2addrr[7..0]
A3addrr[7..0]
A4addrr[7..0]
A5addrr[7..0]
A6addrr[7..0]
A7addrr[7..0]
X0[7..0]
X1[7..0]
X2[7..0]
X3[7..0]
X4[7..0]
X5[7..0]
X6[7..0]
X7[7..0]
xmemx
inst28
17 b
its10
24 w
ords
Block ty pe: AUTO
address[9..0]
clock
q[16..0]
sw2
inst30
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom1
inst41
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom2
inst42
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom3
inst43
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom4
inst44
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom5
inst45
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom6
inst46
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom7
inst47
4 bi
ts32
wor
ds
Block ty pe: AUTO
address[4..0]
clock
q[3..0]
dcrom8
inst48
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom1
inst49
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom2
inst51
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom3
inst52
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom4
inst53
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom5
inst54
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom6
inst55
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom7
inst56
2 bi
ts64
wor
ds
Block ty pe: AUTO
address[5..0]
clock
q[1..0]
dv_rom8
inst57
reset
rx
SW[8..0]
clk
tx_rdy
reset_rdy
data_tx[7..0]
tx
data_out[8..0]
out_address[7..0]
all_in
clr_tx_rdy
Serial
inst50
clk
reset
start_decoding
input
reset_out
output[7..0]
address[5..0]
out_rdy
wr
decoder_output
inst58
17 b
its10
24 w
ords
Block ty pe: AUTO
address[9..0]
clock
q[16..0]
sw1
inst29
clk
reset
channel_done
lambda_sel
control_done
rst_latch
send_NR
xbar_wr
bit_reset
check_reset
swA_address[9..0]
f irst_wr
swB_address[7..0]
adder_mux_sel
start_decoding
control
inst31
64 b
its10
24 w
ords
Block ty pe: AUTO
address[9..0]
clock
q[63..0]
delta1
inst59
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst33
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst34
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst35
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst36
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst37
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst38
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst39
reset
clk
edge_data[7..0]
dc_data[3..0]
state_reset
send_NR
S[7..0]
dc_address[4..0]
check_node_processor
inst40
cheannel_address[8..0]
rst_chan_rdy
clk
channel_reset
in_ready
control_ready
one
clk
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lam_wr1
lam_wr2
lam_wr3
lam_wr4
lam_wr5
lam_wr6
lam_wr7
lam_wr8
lambda_sel
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
dv _address1[5..0]
adder_mux_leav ing
lambda_in[7..0]
lambda_sel
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
lambda_in[7..0]
adder_mux_leav ing
lambda_sel
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
lambda_in[7..0]
lambda_sel
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
lambda_in[7..0]
adder_mux_leav ing
lambda_sel
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
lambda_in[7..0]
adder_mux_leav ing
dv _address2[5..0]
dv _address3[5..0]
adder_mux_leav ing
dv _address4[5..0]
dv _address5[5..0]
check2[7..0]
check3[7..0]
check4[7..0]
check5[7..0]
check1[7..0]
check6[7..0]
check7[7..0]
check8[7..0]
lambda_write
done_eading
lam
_dec
[2..
0]
channel_adress[8..0]
edge_out_1[7..0]
edge_out_2[7..0]
edge_out_3[7..0]
edge_out_4[7..0]
edge_out_5[7..0]
edge_out_6[7..0]
edge_out_7[7..0]
edge_out_8[7..0]
delta4[7..0]
swA[16..0]
swB[16..0]
dv _address6[5..0]
dv _address7[5..0]
dv _address8[5..0]
lambda_sel
lambda_in[7..0]
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
adder_mux_leav ing
lambda_sel
lambda_in[7..0]
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
adder_mux_leav ing
lambda_sel
lambda_in[7..0]
lam_address[5..0]
lam_wr1
f irst_wr
edge_out_1[7..0]
clk
bit_reset
dv 1_in[1..0]
send_NR
adder_mux_leav ing
reset
clk
state_reset
send_NR
edge_out_1[7..0]
reset
clk
state_reset
send_NR
edge_out_1[7..0]
reset
clk
state_reset
send_NR
edge_out_1[7..0]
reset
clk
state_reset
send_NR
edge_out_1[7..0]
reset
clk
state_reset
send_NR
edge_out_1[7..0]
reset
clk
state_reset
send_NR
edge_out_1[7..0]
reset
clk
state_reset
send_NR
edge_out_1[7..0]
reset
clk
state_reset
send_NR
edge_out_1[7..0]
clk
dc_address1[4..0]
clk
dc_address2[4..0]
send
_NR
send
_NR
send
_NR
send
_NR
send
_NR
send
_NR
send
_NR
send
_NR
c lk
dc_address3[4..0]
clk
clk
clk
clk
clk
dc_address4[4..0]
dc_address5[4..0]
dc_address6[4..0]
dc_address7[4..0]
dc_address8[4..0]
dv 1_in[1..0]
dv 2_in[1..0]
dv 3_in[1..0]
dv 4_in[1..0]
dv 5_in[1..0]
dv 6_in[1..0]
dv 7_in[1..0]
dv 8_in[1..0]
clk
clk
clk
clk
clk
clk
clk
clk
dv _address1[5..0]
dv _address2[5..0]
dv _address3[5..0]
dv _address4[5..0]
dv _address5[5..0]
dv _address6[5..0]
dv _address7[5..0]
dv _address8[5..0]
reset
clk
rst_channel
output[7..0]
rx
reset
tx
out_addr[8..0]
rst_out
clk
reset
start_decoding
rst_out
edge_out
clk
swB[16..0]
clk
swA[16..0]
output[7..0]
lambda_sel
control_ready
reset_ik_1
xbar_wr
send_NR
bit_reset
state_reset
f irst_wr
adder_mux_leav ing
start_decoding
clk
reset
rst_jk_1
f irst_wr
lam_address[5..0]
one
out_rdy
one
out_rd
swA_address[9..0]
delta1[7..0]
delta2[7..0]
delta3[7..0]
delta5[7..0]
delta6[7..0]
delta7[7..0]
delta8[7..0]
swB
_add
ress
[7..
0]
swB_address[7..0]
swA_adress[9..0]
swA_address[9..0]
clk
check1[7..0]
dc_address1[4..0]
check2[7..0]
dc_address2[4..0]
check3[7..0]
dc_address3[4..0]
check4[7..0]
dc_address4[4..0]
check5[7..0]
dc_address5[4..0]
check6[7..0]
dc_address6[4..0]
check7[7..0]
dc_address7[4..0]
check8[7..0]
dc_address8[4..0]
delta
[7..
0]
delta[7..0]
lam_dec[8..0]
swA_address[9..0]
clk
ROM-ul cuvantului de cod
Incarcatorul cuvintului de cod
Procesoarele nodului de verif icare
Selectarea permutatiei
ROM-urile comutatoarelor
Permutarea mesajelor bloc
Procesoarele nodului bit
ROM-ul bancilor de intercalare
• coduri corectoare de erori Reed-Solomon Turbo LDPC
• (n,k) – cod bloc• u – totalitatea mesajelor de k biti• c – cuvantul de cod• Cuvintele de cod sunt codate prin matricea generatoare G
• Pentru orice matrice generatoare G, există mai multe matrici de verificare a parității (H), care satisfac condiția :
• c este un cuvânt de cod dacă
Codare bloc sistematică pentru corecţia erorilor
Guc
0 THG0 THc
Reprezentare graficului Tanner conține două seturi de noduri: • n noduri pentru biții cuvântului de cod • m noduri pentru ecuațiile de verificare a parității
01111101
11110011
11101110
10011111
H
Ecuații de verificare a parității:
0
0
0
0
654320
765410
765321
743210
cccccc
cccccc
cccccc
cccccc
GraficulTanner al matricei de verificare a parității
message passing - un mesaj care trece înainte și înapoi pe muchia graficului lui Tanner.
Mesajele sunt informații probabilistice veridice despre bitul emis, exprimat ca Log Likelihood Ratios (LLR)
Mesajul extrinsec de la nodul de verificare j până la nodul i, Ej,i , este
probabilitatea LLR
Mesajul care este trimis de la nodul de bit către nodurile de verificare este dat
ijV
jji
ME
][
1, 2
tanhtanh2
ijC
jjji RQ
][
,de
• InițializareaQij = λj
• Actualizarea mesajului de verificare
• Test pentru validarea cuvantului de cod
ijV
jji
QR
][
1, 2
tanhtanh2
][ jCj
ijji QL
0,0
,0,1
i
ii L
Lz
• Actualizarea mesajelor de bit pentru fiecare nod de bit j, și pentru fiecare nod de verificare asociat calcului j:
Se reia pentru actualizarea mesajelor de verificare.
ijC
jjji kRQ
][
, ]1[
Configuraţiile decodoarelor găsite, inclusiv diagramele lor, viteza, flexibilitatea și potrivirea pentru FPGA.
Decodor serial
•flexibilitate mare•această abordare este prea lentă, exceptând simulările•numărul de cicluri de ceas, cerute pentru fiecare iterație a decodorului de serie, este aproximativ de două ori mai mare decât muchile•nimic nu a putut fi gasit, in literatura de specialitate, despre implementareaunui decodor serial LDPC
Implementare analogică
•este imposibil să implementezi un decodor analogic pe un FPGA •au fost găsite două abordări ale implementării algoritmului sumă-produs
Decodor paralel
Implementarea analogică
• într-un ciclu ceasactualizează faza mesajuluide verificare, iar apoicompletează actualizareafazei mesajului bit• creștere apreciabilă în viteză decodării, comparativcu decodorul serial
Configuratia unui decodor paralel
• figura din stânga arată configurația unui decodor paralel propus de Blanskby și Howland
• implementarea are o complexitate foarte mare
• numărul de fire de mesaj necesare de un decodor paralel exclude FPGA-ul ca dispozitiv țintă
fire de masaj = numarul de muchii ale graficului x numarul de biti/mesaj x 2
Decodor partial paralel
•câteva noduri de verificare și de biți sunt realizate în hardware, asta implică împărțirea ca într-un caz în serie•folosirea memoriei pentru a stoca mesajele între ciclurile de ceas•nodurile de biți și de verificare pot rula și în paralel•este un compromis între viteză și complexitate•o problemă este coloziunea de memorie
Pentru reducerea coloziunilor de memorie, interconexiunea a fost implementată folosind o formă de comutator crossbar, cunoscut sub numele de rețeaua lui Benes.
Structura este compusă din:•P de procesoare•un bloc de permutare a mesajului•un bloc de control logic
Schema bloc pentru decodor
Sunt efectuate verificări pentru un cuvânt de cod valid.
•Inițializare - măsurătorile de canal sunt încărcateîn blocurile procesoarelor bit.
•Bit de verificare - procesorul nodului bit efectueazăfuncția nodului bit
•Verifcare bit - procesorul nodului de verificare efectuează funcția nodului bit
•Rezultat - după un număr de iterații bit de verificat și cicluri de verificarebit, decodorul se mută spre faza de ieșire
• stă în centrul flexibilității decodorului• să conecteze procesorul nodului bit la la procesorul nodului de verificare
(și vice versa)• conține două comutatoare crossbar Benes cu o distribuție interleavers între
ele
Configurația pentru nodul de variabile al jumătății de iterație
Configurația pentru nodul de verificare al jumătății de iterație
Procesul de a găsi setările de comutare, date de setările de intrare și ieșire, este împărțit în 3 grupuri de acțiuni și este bazat pe munca lui Waksman:
• obținerea matricei de permutare• găsirea setărilor comutatorului• găsirea aplicației de permutare pentru sub-blocurile inferioare și
superioare
• reprezentarea numărului (mesajele care se deplasează prin suma rezultată a algoritmului)
• funcții de multiplicare și trigonometrice
• Pentru introducerea functiei ψ (am folosit LUT)
ijVjji kQkR
][, 1
ijC
jjji kRQ
][
, ]1[
ijV
jji
QR
][
1, 2
tanhtanh2
• nevoie de a adaugă, în paralel, multiple mesaje de intrare• numărul de intrări la sumatoare dictează gradul de greutate suportate de
nodurile de bit și de verificare
• ripple• carry-look a head • carry select
A[7..0]
B[7..0]
S[7..0]
Look_Ahead_Adder
inst
A[7..0]
B[7..0]
S[7..0]
Look_Ahead_Adder
inst1
A[7..0]
B[7..0]
S[7..0]
Look_Ahead_Adder
inst2
A[7..0]
B[7..0]
S[7..0]
Look_Ahead_Adder
inst3
A[7..0]
B[7..0]
S[7..0]
Look_Ahead_Adder
inst4
A[7..0]
B[7..0]
S[7..0]
Look_Ahead_Adder
inst5
A[7..0]
B[7..0]
S[7..0]
Look_Ahead_Adder
inst6
VCClambda_sel INPUT
VCClambda_in[7..0 INPUT
VCClambda_address[5..0] INPUT
VCClambda_wr INPUT
VCCedge_in[7..0] INPUT
VCCf irst_calc INPUT
VCCclk INPUT
VCCdv _in[1..0] INPUT
VCCreset INPUT
VCCsend_NR INPUT
VCCadder_mux_leav ing INPUT
dv _address[5..0]OUTPUT
X0[7..0]OUTPUT
clk
wenable
sel_r
sel_w
addr[1..0]
A[7..0]
X0[7..0]
X1[7..0]
X2[7..0]
Vadder_ram
inst
clk
reset
lam_deg[1..0]
send_NR
edge_address[7..0]
lambda_address[5..0]
dv _address[5..0]
mem_sel_r
mem_sel_w
adder_mux[0..2]
adder_address[1..0]
adder_wr
edge_wr
Vcontrol2
inst1
data1x[2..0]
data0x[2..0]
sel
result[2..0]
mux3_8
inst4
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst3
GND
VCC8
bits
256
wor
ds
Block ty pe: AUTO
data[7..0]
w ren
address[7..0]
clock
q[7..0]
ram8_32
inst5
clk
sel
external_in[7..0]
external_addr[5..0]
internal_addr[5..0]
w r
lambda_[7..0]
codew ord_ram
inst2
A[7..0]
B[7..0]
C[7..0]
D[7..0]
sel[7..0]
S[6..0]
TreeAdder3
inst6
clk
lambda_addr[5..0]
lambda_in[7..0]
f irst_calc
edge
_wr
edge_address
clk
adder_wr
mem_sel
first
_cal
c
clk
dv [1..0]
edge_address[7..0]
lambda_address[5..0]
dv _addr[5..0]
mem_sel_r
mem_sel_w
add_sel[2..0]
Va_addr[1..0]
adder_wr
edge_wr
B[7..0]
C[7..0]
D[7..0]
zero
one
add_sel[2..0]
one,one,one
VCCclk INPUT
VCCsel INPUT
VCCexternal_in[7..0] INPUT
VCCexternal_addr[5..0] INPUT
VCCwr INPUT
VCCinternal_addr[5..0] INPUT
lambda_[7..0]OUTPUT
data1x[5..0]
data0x[5..0]
sel
result[5..0]
mux2_5
inst
data1x[5..0]
data0x[5..0]
sel
result[5..0]
mux2_5
inst1
data1
data0
sel
result
mux2
inst5
data1
data0
sel
result
mux2
inst6
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst2
GND8
bits
64 w
ords
Block ty pe: AUTO
data[7..0]
w ren
address[5..0]
clock
q[7..0]
ram8_32
inst3
8 bit
s64
wor
ds
Block ty pe: AUTO
data[7..0]
w ren
address[5..0]
clock
q[7..0]
ram8_32
inst4
clk
sel
sel
sel
sel
wr
wr
sel
sel
zero
zero
zero
VCCreset INPUT
VCCclk INPUT
VCCedge_data[7..0] INPUT
VCCdc_data[3..0] INPUT
VCCsend_NR INPUT
VCCstate_reset INPUT
S[7..0]OUTPUT
clk
wenable
sel_r
sel_w
addr[1..0]
A[7..0]
X0[7..0]
X1[7..0]
X2[7..0]
X3[7..0]
X4[7..0]
X5[7..0]
X6[7..0]
X7[7..0]
Cadder_ram
inst1
8 bi
ts32
wor
ds
Block ty pe: AUTO
data[7..0]
w ren
address[4..0]
clock
q[7..0]
edge8_32
inst2
4 bi
ts32
wor
ds
Block ty pe: AUTO
data[3..0]
w ren
address[4..0]
clock
q[3..0]
dcram4_32
inst3
GND
clk
reset
state_reset
v _deg[3..0]
send_NR
edge_address[4..0]
dc_address[4..0]
mem_sel_r
mem_sel_w
adder_mux[5..0]
adder_address[2..0]
adder_wr
edge_wr
Nodecontrol
inst
edge_wr
edge_data[7..0]
send_NR
clk
adder_wr
mem_sel_r
mem_sel_w
adder_addres[2..0]
reset
clk
edge_data[7..0]
dc_data[3..0]
send_NR
zero
dc_data[3..0]
dc_wr
dc_addres[4..0]
clk
reset
clk
mem_sel_r
mem_sel_w
adder_mux[5..0]
adder_addres[2..0]
adder_wr
edge_wr
dc_addres[4..0]
A[7..0]
B[7..0]
C[7..0]
D[7..0]
E[7..0]
F[7..0]
G[7..0]
H[7..0]
state_reset
edge_address[4..0]
state_reset
edge_adress[4..0]
clk
dc_address[4..0]OUTPUT
A[7..0]
B[7..0]
C[7..0]
D[7..0]
E[7..0]
F[7..0]
G[7..0]
H[7..0]
sel[7..0]
S[7..0]
tree7_8
inst5
VCCA[7..0] INPUT
VCCB[7..0] INPUT
VCCC[7..0] INPUT
VCCD[7..0] INPUT
VCCE[7..0] INPUT
VCCF[7..0] INPUT
VCCG[7..0] INPUT
VCCH[7..0] INPUT
VCCsel[7..0] INPUT
S[7..0]OUTPUT
input[7..0] output[6..0]
LUT2
inst7
input[7..0] output[6..0]
LUT2
inst8
input[7..0] output[6..0]
LUT2
inst9
input[7..0] output[6..0]
LUT2
inst10
input[7..0] output[6..0]
LUT2
inst11
input[7..0] output[6..0]
LUT2
inst12
input[7..0] output[6..0]
LUT2
inst13
input[7..0] output[6..0]
LUT2
inst14
A[6..0]
B[6..0]
S[6..0]
Look_Ahead_Adder
inst
A[6..0]
B[6..0]
S[6..0]
Look_Ahead_Adder
inst15
A[6..0]
B[6..0]
S[6..0]
Look_Ahead_Adder
inst16
A[6..0]
B[6..0]
S[6..0]
Look_Ahead_Adder
inst17
A[6..0]
B[6..0]
S[6..0]
Look_Ahead_Adder
inst18
A[6..0]
B[6..0]
S[6..0]
Look_Ahead_Adder
inst19
A[6..0]
B[6..0]
S[6..0]
Look_Ahead_Adder
inst20
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst21
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst22
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst23
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst24
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst25
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst26
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst27
data1x[7..0]
data0x[7..0]
sel
result[7..0]
mux8_2_1
inst28
VCC
GND
input[6..0]
signs[7..0]
output[7..0]
sign_correctionLUT
inst1
sel[7..0]
ze
ro
on
e
r1[7],r2[7],r3[7],r4[7],r5[7],r6[7],r7[7],r8[7],
clk
reset
in_ready
control_ready
lambda_address[8..0]
done_reading
rst_latch
lambda_write
lambda_wr
inst
AND2
inst2AND2
inst3AND2
inst4AND2
inst5AND2
inst6AND2
inst7AND2
inst8AND2
inst9
cheannel_address[8..0]
rst_chan_rdy
clk
channel_reset
in_ready
control_ready
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lambda_write
lam_wr1
lam_wr2
lam_wr3
lam_wr4
lam_wr5
lam_wr6
lam_wr7
lam_wr8
lambda_write
data[2..0] eq0
eq1
eq2
eq3
eq4
eq5
eq6
eq7
lam_wr_decoder
inst26
done_eading
9 b
its
51
2 w
ord
s
Block ty pe: AUTO
address[8..0]
clock
q[8..0]
lambda_rom
inst27
lam_dec[2..0]lam
_de
c[2
..0
]
VCCclk INPUT
channel_adress[8..0]
clk
w ren
A0[7..0]
A0a
ddrw
[7..0
]
A0a
ddrr
[7..0
]
A1[7..0]
A1a
ddrw
[7..0
]
A1a
ddrr
[7..0
]
A2[7..0]
A2a
ddrw
[7..0
]
A2a
ddrr
[7..0
]
A3[7..0]
A3a
ddrw
[7..0
]
A3a
ddrr
[7..0
]
A4[7..0]
A4a
ddrw
[7..0
]
A4a
ddrr
[7..0
]
A5[7..0]
A5a
ddrw
[7..0
]
A5a
ddrr
[7..0
]
A6[7..0]
A6a
ddrw
[7..0
]
A6a
ddrr
[7..0
]
A7[7..0]
A7a
ddrw
[7..0
]
A7a
ddrr
[7..0
]
X0[7..0]
X1[7..0]
X2[7..0]
X3[7..0]
X4[7..0]
X5[7..0]
X6[7..0]
X7[7..0]
interleaver_banks_block_diagram
inst
A0[7..0]
A1[7..0]
A2[7..0]
A3[7..0]
A4[7..0]
A5[7..0]
A6[7..0]
A7[7..0]
SW1[3..0]
SW[3..0]
SW3[3..0]
SW4[1..0]
SW5[2..0]
X0[7..0]
X1[7..0]
X2[7..0]
X3[7..0]
X4[7..0]
X5[7..0]
X6[7..0]
X7[7..0]
BenesNetw ork
inst1
A0[7..0]
A1[7..0]
A2[7..0]
A3[7..0]
A4[7..0]
A5[7..0]
A6[7..0]
A7[7..0]
SW1[3..0]
SW[3..0]
SW3[3..0]
SW4[1..0]
SW5[2..0]
X0[7..0]
X1[7..0]
X2[7..0]
X3[7..0]
X4[7..0]
X5[7..0]
X6[7..0]
X7[7..0]
BenesNetw ork
inst2
VCCA0[7..0] INPUT
VCCA2[7..0] INPUT
VCCA3[7..0] INPUT
VCCA4[7..0] INPUT
VCCA1[7..0] INPUT
VCCA5[7..0] INPUT
VCCA6[7..0] INPUT
VCCA7[7..0] INPUT
X0[7..0]OUTPUT
X1[7..0]OUTPUT
X2[7..0]OUTPUT
X3[7..0]OUTPUT
X4[7..0]OUTPUT
X5[7..0]OUTPUT
X6[7..0]OUTPUT
X7[7..0]OUTPUT
VCCclk INPUT
VCCwren INPUT
clk
wren
clk
wren
VCCswA[16..0] INPUT
VCCswB[16..0] INPUT
swA[16..0]
swB[16..0]
VC
CA
0add
rw[7
..0]
INP
UT
VC
CA
1add
rw[7
..0]
INP
UT
VC
CA
2add
rw[7
..0]
INP
UT
VC
CA
3add
rw[7
..0]
INP
UT
VC
CA
4add
rw[7
..0]
INP
UT
VC
CA
5add
rw[7
..0]
INP
UT
VC
CA
6add
rw[7
..0]
INP
UT
VC
CA
7add
rw[7
..0]
INP
UT
VC
CA
0add
rr[7
..0]
INP
UT
VC
CA
1add
rw[7
..0]
INP
UT
VC
CA
2add
rw[7
..0]
INP
UT
VC
CA
3add
rw[7
..0]
INP
UT
VC
CA
4add
rw[7
..0]
INP
UT
VC
CA
5add
rw[7
..0]
INP
UT
VC
CA
6add
rw[7
..0]
INP
UT
VC
CA
7add
rw[7
..0]
INP
UT
swA[3..0]
swA[11..8]
swA[16..14]
swA[13..12]
swA[7..4]
swB[3..0]
swB[7..4]
swB[11..8]
swB[13..12]
swB[16..14]
VCCA0[7..0] INPUT
VCCA1[7..0] INPUT
VCCA2[7..0] INPUT
VCCA3[7..0] INPUT
VCCA4[7..0] INPUT
VCCA5[7..0] INPUT
VCCA6[7..0] INPUT
VCCA7[7..0] INPUT
VCCSW1[3..0] INPUT
VCCSW[3..0] INPUT
VCCSW3[3..0] INPUT
VCCSW4[1..0] INPUT
VCCSW5[2..0] INPUT
X0[7..0]OUTPUT
X1[7..0]OUTPUT
X2[7..0]OUTPUT
X3[7..0]OUTPUT
X4[7..0]OUTPUT
X5[7..0]OUTPUT
X6[7..0]OUTPUT
X7[7..0]OUTPUT
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst2
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst3
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst4
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst5
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst6
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst7
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst8
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst9
GND
sw1[0]
sw1[0]
sw1[0]
sw1[0] sw5[2]
sw5[2]
sw5[2]
sw4[0]
sw4[0]
sw2[1..0]
sw3[1..0]
sw2[3..2]
sw3[3..2]
sw1[3..0]
sw3[3..0]
sw2[3..0]
sw4[1..0]
sw5[2..0]
A[7..0]
B[7..0]
C[7..0]
D[7..0]
SW3
SW1[1..0]
SW2[1..0]
X0[7..0]
X1[7..0]
X2[7..0]
X3[7..0]
netw ork44
inst
A[7..0]
B[7..0]
C[7..0]
D[7..0]
SW3
SW1[1..0]
SW2[1..0]
X0[7..0]
X1[7..0]
X2[7..0]
X3[7..0]
netw ork44
inst1
VCCSW3 INPUT
VCCA[7..0] INPUT
VCCB[7..0] INPUT
VCCC[7..0] INPUT
VCCD[7..0] INPUT
VCCSW1[1..0] INPUT
VCCSW2[1..0] INPUT
X0[7..0]OUTPUT
X2[7..0]OUTPUT
X3[7..0]OUTPUT
X1[7..0]OUTPUT
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst1
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst2
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst3
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst4
A[7..0]
B[7..0]
SW
X0[7..0]
X1[7..0]
switch
inst5
VCCclk INPUT
VCCwren INPUT
VCCA0[7..0] INPUT
VCCA1[7..0] INPUT
VCCA2[7..0] INPUT
VCCA3[7..0] INPUT
VCCA4[7..0] INPUT
VCCA5[7..0] INPUT
VCCA6[7..0] INPUT
VCCA7[7..0] INPUT
VCCA0addrw[7..0] INPUT
VCCA1addrw[7..0] INPUT
VCCA2addrw[7..0] INPUT
VCCA3addrw[7..0] INPUT
VCCA4addrw[7..0] INPUT
VCCA5addrw[7..0] INPUT
VCCA6addrw[7..0] INPUT
VCCA7addrw[7..0] INPUT
VCCA0addrr[7..0] INPUT
VCCA1addrr[7..0] INPUT
VCCA2addrr[7..0] INPUT
VCCA3addrr[7..0] INPUT
VCCA4addrr[7..0] INPUT
VCCA5addrr[7..0] INPUT
VCCA6addrr[7..0] INPUT
VCCA7addrr[7..0] INPUT
X0[7..0]OUTPUT
X1[7..0]OUTPUT
X2[7..0]OUTPUT
X3[7..0]OUTPUT
X4[7..0]OUTPUT
X5[7..0]OUTPUT
X6[7..0]OUTPUT
X7[7..0]OUTPUT
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst1
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst2
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst3
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst4
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst5
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst6
25
6 W
ord
(s)
RA
M
Block Ty pe: AUTO
data[7..0]
w raddress[7..0]
w ren
rdaddress[7..0]
clock
q[7..0]
deltaram
inst7
A0[7..0]
A1[7..0]
A3[7..0]
A4[7..0]
A5[7..0]
A6[7..0]
A7[7..0]
A0addrw[7..0]
A1addrw[7..0]
A3addrw[7..0]
A4addrw[7..0]
A5addrw[7..0]
A6addrw[7..0]
A7addrw[7..0]
wren
wren
wren
wren
wren
wren
wren
A0addrr[7..0]
A1addrr[7..0]
A3addrr[7..0]
A4addrr[7..0]
A5addrr[7..0]
A6addrr[7..0]
A7addrr[7..0]
clk
clk
clk
clk
clk
clk
clk
clk
wren
A0[7..0]
A0addrw[7..0]
A0addrr[7..0]
A1[7..0]
A1addrw[7..0]
A1addrr[7..0]
A2[7..0]
A2addrw[7..0]
A2addrr[7..0]
A3[7..0]
A3addrw[7..0]
A3addrr[7..0]
A4[7..0]
A4addrw[7..0]
A4addrr[7..0]
A5[7..0]
A5addrw[7..0]
A5addrr[7..0]
A6[7..0]
A6addrw[7..0]
A6addrr[7..0]
A7[7..0]
A7addrw[7..0]
A7addrr[7..0]
A2[7..0]
A2addrw[7..0]
wren
A2addrr[7..0]
clk
• placa Altera Cyclone I (EP1C6Q240C8) nu a avut suficente resurse hardware pentru implementarea proiectului şi pentru continuare s-a decis testarea pe un model mai nou de la Altera, și anume Cyclone II DE2
• procesoarele nodului de verificare domină utilizarea resurselor (tabelele de căutare ψ(x) sunt responsabile pentru acest lucru)
• procesoarele nodului de verificare nu sunt exagerat de complexe, putându-se mări numărul de procesoare paralele la 32 (implementare ar putea fi realizată pe o placă Altera Stratix II)
• când numărul de procesoare paralele este dublat, codul maxim suportat este de 60 de ori mai mare (complexitatea conceptului crește de două ori)
• complexitatea va crește liniar cu numărul de noduri de procesare paralelă, prin urmare creste şi scalabilitatea decodorului.