33

Implementarea pe o placă Altera Cyclone I a unui decodor LDPC şi analiza performanţelor

Embed Size (px)

DESCRIPTION

UNIVERSITATEA POLITEHNICA BUCURESTI FACULTATEA DE ELECTRONICA, TELECOMUNICATII SI TEHNOLOGIA INFORMATIEI CATEDRA DE ELECTRONICA APLICATA SI INGINERIA INFORMATIEI. Implementarea pe o placă Altera Cyclone I a unui decodor LDPC şi analiza performanţelor. Absolvent George CRĂCIUN. - PowerPoint PPT Presentation

Citation preview

Page 1: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor
Page 2: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor
Page 3: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 4: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 5: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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

Page 6: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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

Page 7: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 8: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 9: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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

Page 10: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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[

Page 11: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 12: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 13: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 14: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 15: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

Pentru reducerea coloziunilor de memorie, interconexiunea a fost implementată folosind o formă de comutator crossbar, cunoscut sub numele de rețeaua lui Benes.

Page 16: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

Structura este compusă din:•P de procesoare•un bloc de permutare a mesajului•un bloc de control logic

Schema bloc pentru decodor

Page 17: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 18: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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

Page 19: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 20: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 21: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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

Page 22: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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

Page 23: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 24: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 25: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 26: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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],

Page 27: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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]

Page 28: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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]

Page 29: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 30: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 31: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

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

Page 32: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor

• 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.

Page 33: Implementarea pe o placă  Altera Cyclone I  a unui decodor LDPC  şi analiza performanţelor