Skip to content

Commit

Permalink
add DVB-RSC2 codec
Browse files Browse the repository at this point in the history
  • Loading branch information
dshekhalev committed Jan 19, 2023
1 parent 7cffde9 commit 4d9cb95
Show file tree
Hide file tree
Showing 27 changed files with 6,247 additions and 60 deletions.
26 changes: 26 additions & 0 deletions do/do_rsc2.do
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
onerror {resume}

set incdir ../include
set rtldir ../rtl
set tbdir ../testbench
set workdir ../work
#
vlib $workdir
#
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir $rtldir/*.sv
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir $rtldir/buffer/*.sv
#
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir/rsc $rtldir/rsc/*.sv
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir/rsc/enc $rtldir/rsc/enc/*.sv
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir/rsc/dec $rtldir/rsc/dec/*.sv
#
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir/rsc2 $rtldir/rsc2/*.sv
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir/rsc2/enc $rtldir/rsc2/enc/*.sv
vlog -work $workdir -incr -sv +incdir+$incdir+$rtldir/rsc2/dec $rtldir/rsc2/dec/*.sv
vlog -work $workdir +initreg+0 -sv +incdir+$incdir+$tbdir/rsc $tbdir/rsc2/bertest.sv
set seed [clock seconds]
vsim -sv_seed $seed bertest -lib $workdir +nowarn+3015+3813+2241
run -all
4 changes: 2 additions & 2 deletions rtl/rsc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ vivado 2019.1 Artix 7 - 2

Wimax OFDMA Nduobits = 1920(3840 bits), coderate = 2/3, 5bit metric, 10 iteration. Encoder use output buffer

Encoder : LUT/REG/RAMB 210/179/2.0 >200MHz (100Mbps -> 150Mbps)
Encoder : LUT/REG/RAMB 210/179/2.0 >200MHz (200Mbps -> 300Mbps)

Decoder simple : LUT/REG/RAMB 5.3k/4.7k/12.0 ~160MHz (12Mbps -> 8Mbps)
Decoder simple : LUT/REG/RAMB 5.3k/4.7k/12.0 ~160MHz (24Mbps -> 16Mbps)

Attention: This is only CTC codecs. There is no bits permutation or interleaving. The coder and decoder correspond each other but can have different bit order with standard codes.
2 changes: 1 addition & 1 deletion rtl/rsc/dec/rsc_dec.sv
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ module rsc_dec

//
// input buffer
logic [cIB_TAG_W-1 : 0] ibuffer__iwtag ;
logic [cIB_TAG_W-1 : 0] ibuffer__iwtag ;

logic ibuffer__irempty ;
logic [cADDR_W-1 : 0] ibuffer__ifsaddr ;
Expand Down
114 changes: 57 additions & 57 deletions rtl/rsc/dec/rsc_dec_engine.sv
Original file line number Diff line number Diff line change
Expand Up @@ -467,63 +467,63 @@ module rsc_dec_engine
// address generators
//------------------------------------------------------------------------------------------------------

rsc_dec_addr_gen
#(
.pB_nF ( 0 )
)
faddr_gen
(
.iclk ( iclk ) ,
.ireset ( ireset ) ,
.iclkena ( iclkena ) ,
//
.ipmode ( ctrl__oaddr_pmode ) ,
.iclear ( ctrl__oaddr_clear ) ,
.ienable ( ctrl__oaddr_enable ) ,
//
.iN ( used_N ) ,
.iNm1 ( used_Nm1 ) ,
.iP ( used_P ) ,
.iP0comp ( used_P0comp ) ,
.iPincr ( used_Pincr ) ,
.iPdvbinv ( used_Pdvbinv ) ,
//
.osaddr ( faddr_gen__osaddr ) ,
.opaddr ( faddr_gen__opaddr ) ,
.obitinv ( addr_gen__obitinv )
);

assign ofsaddr = faddr_gen__osaddr[pADDR_W-1 : 0];
assign ofpaddr = faddr_gen__opaddr[pADDR_W-1 : 0];

rsc_dec_addr_gen
#(
.pB_nF ( 1 )
)
baddr_gen
(
.iclk ( iclk ) ,
.ireset ( ireset ) ,
.iclkena ( iclkena ) ,
//
.ipmode ( ctrl__oaddr_pmode ) ,
.iclear ( ctrl__oaddr_clear ) ,
.ienable ( ctrl__oaddr_enable ) ,
//
.iN ( used_N ) ,
.iNm1 ( used_Nm1 ) ,
.iP ( used_P ) ,
.iP0comp ( used_P0comp ) ,
.iPincr ( used_Pincr ) ,
.iPdvbinv ( used_Pdvbinv ) ,
//
.osaddr ( baddr_gen__osaddr ) ,
.opaddr ( baddr_gen__opaddr ) ,
.obitinv ( ) // n.u.
);

assign obsaddr = baddr_gen__osaddr[pADDR_W-1 : 0];
assign obpaddr = baddr_gen__opaddr[pADDR_W-1 : 0];
rsc_dec_addr_gen
#(
.pB_nF ( 0 )
)
faddr_gen
(
.iclk ( iclk ) ,
.ireset ( ireset ) ,
.iclkena ( iclkena ) ,
//
.ipmode ( ctrl__oaddr_pmode ) ,
.iclear ( ctrl__oaddr_clear ) ,
.ienable ( ctrl__oaddr_enable ) ,
//
.iN ( used_N ) ,
.iNm1 ( used_Nm1 ) ,
.iP ( used_P ) ,
.iP0comp ( used_P0comp ) ,
.iPincr ( used_Pincr ) ,
.iPdvbinv ( used_Pdvbinv ) ,
//
.osaddr ( faddr_gen__osaddr ) ,
.opaddr ( faddr_gen__opaddr ) ,
.obitinv ( addr_gen__obitinv )
);

assign ofsaddr = faddr_gen__osaddr[pADDR_W-1 : 0];
assign ofpaddr = faddr_gen__opaddr[pADDR_W-1 : 0];

rsc_dec_addr_gen
#(
.pB_nF ( 1 )
)
baddr_gen
(
.iclk ( iclk ) ,
.ireset ( ireset ) ,
.iclkena ( iclkena ) ,
//
.ipmode ( ctrl__oaddr_pmode ) ,
.iclear ( ctrl__oaddr_clear ) ,
.ienable ( ctrl__oaddr_enable ) ,
//
.iN ( used_N ) ,
.iNm1 ( used_Nm1 ) ,
.iP ( used_P ) ,
.iP0comp ( used_P0comp ) ,
.iPincr ( used_Pincr ) ,
.iPdvbinv ( used_Pdvbinv ) ,
//
.osaddr ( baddr_gen__osaddr ) ,
.opaddr ( baddr_gen__opaddr ) ,
.obitinv ( ) // n.u.
);

assign obsaddr = baddr_gen__osaddr[pADDR_W-1 : 0];
assign obpaddr = baddr_gen__opaddr[pADDR_W-1 : 0];

//------------------------------------------------------------------------------------------------------
// MAP engine
Expand Down
2 changes: 2 additions & 0 deletions rtl/rsc/dec/rsc_dec_map_engine.sv
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,13 @@
assign rsc_dec_map_engine__ifyLLR = '0 ;
assign rsc_dec_map_engine__ifwLLR = '0 ;
assign rsc_dec_map_engine__ifLextr = '0 ;
assign rsc_dec_map_engine__ifsLLRtag = '0 ;
assign rsc_dec_map_engine__ibaddr = '0 ;
assign rsc_dec_map_engine__ibsLLR = '0 ;
assign rsc_dec_map_engine__ibyLLR = '0 ;
assign rsc_dec_map_engine__ibwLLR = '0 ;
assign rsc_dec_map_engine__ibLextr = '0 ;
assign rsc_dec_map_engine__ibsLLRtag = '0 ;
assign rsc_dec_map_engine__if_rp_state_even = '0 ;
assign rsc_dec_map_engine__if_rp_state_odd = '0 ;
assign rsc_dec_map_engine__ib_rp_state_even = '0 ;
Expand Down
19 changes: 19 additions & 0 deletions rtl/rsc2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Dynamic configuration DVB-RSC2 (ETSI EN 301 545-2 V1.2.1) duo-binary convolution turbo code with MAX-Log-MAP decoding.

Supported modes: all modes defined in Table A-1/2/4/5

Supports code rates: [1/3; 1/2; 2/3; 3/4; 4/5; 5/6; 6/7; 7/8]

Encoder uses two pass coding with minimal delays.

Decoder uses special MAP engine with 1 duo-bits per tick processing and simultaneous forward/backard recursion.

vivado 2019.1 Artix 7 - 2

Wimax OFDMA Nduobits = 152(304 bits), coderate = 1/2, 5bit metric, 10 iteration. Encoder use output buffer

Encoder : LUT/REG/RAMB 330/255/2.0 >200MHz (245Mbps -> 490Mbps)

Decoder simple : LUT/REG/RAMB 9.5k/8k/10.0 ~160MHz (29Mbps -> 14.5Mbps)

Attention: This is only CTC codec. There is no bits permutation or interleaving. The coder and decoder correspond each other but can have different bit order with standard codes.
Loading

0 comments on commit 4d9cb95

Please sign in to comment.