n n n n n Viterbi Decoder Parameter
목차 n n n n n Viterbi Decoder의 구조 Parameter Input buffer Branch Metric Calculate(BMC) Add Compare Select Normalization Path Metric Memory Traceback Viterbi Top module Viterbi Test bench 2
Viterbi Decoder의 구조 ¨ ¨ ¨ Branch Metric Calculation(BMC) Path metric Calculation Path Metric Memory Add-Compare-Select (ACS) Trace Back Memory Path Metric Memory 3
Parameter /*********************************************/ // MODULE : Parameter // // FILE NAME: parameter. v // VERSION: 1. 0 // DATE: FAB 2, 2004 // AUTHOR: DONG KI CHOI // // Description: This file defines a parameter. // /*********************************************/ // defines simulation period `define FULL `define HALF `define PERIOD 20 10 `FULL // defines delay `define DEL 1 // define parmeter `define CONS_K `define DATA_WIDTH `define BUS_WIDTH 4 4 16 4
Input buffer /*********************************************/ // MODULE : Input buffer // // FILE NAME: input_buf. v // VERSION: 1. 0 // DATE: Feb 2, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a input buffer. // /*********************************************/ `include "parameter. v" module input_buf( clk, rst_n, data_in, data_out ); // input data input clk; input rst_n; input [1: 0] data_in; // output data output [1: 0] data_out; // main code dff_n #(2) dff 0( clk, rst_n, data_in, data_out ); endmodule 5
Branch Metric Calculate(1/5) Transmitted sequence 00 Input buffer 에서 들어오는 Transmitted sequence를 받아 Encoder_out에서 구한 branch codeword를 이용하 여 각각의 branch metric 값 을 계산한다. ¨ 옆의 그림을 보면 Transmitted sequence와 각branch의 codeword의 hamming distance로 구한 branch metric값이 ()안의 값이다. ¨ 6
Branch Metric Calculate(2/5) /*********************************************/ // MODULE : branch metric calculate // // FILE NAME: bmc. v // VERSION: 1. 0 // DATE: JAN 14, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines Branch metric calculate. // /*********************************************/ `include "parameter. v" module bmc( data_in, bm_out ); // input data input [1: 0] data_in; // output data output [31: 0] bm_out; wire [`CONS_K-1: 0] // calcualted hamming distance data polya; polyb; // generator polynomial b 0, b 1, b 2, b 3, b 4, b 5, b 6, b 7, b 8, b 9, b 10, b 11, b 12, b 13, b 14, b 15; 7
Branch Metric Calculate(3/5) wire [1: 0] br 0, br 1, br 2, br 3, br 4, br 5, br 6, br 7, br 8, br 9, br 10, br 11, br 12, br 13, br 14, br 15; wire [1: 0] dout 0, dout 1, dout 2, dout 3, dout 4, dout 5, dout 6, dout 7, dout 8, dout 9, dout 10, dout 11, dout 12, dout 13, dout 14, dout 15; // main code assign polya = 4'b 1011, polyb = 4'b 1111; Generator polynomial b 0 b 1 b 2 b 3 b 4 b 5 b 6 b 7 Branch codeword를 만들기 위 한 각 branch의 상태 표현 = = = = 4'b 0000, 4'b 0001, 4'b 0010, 4'b 0011, 4'b 0100, 4'b 0101, 4'b 0110, 4'b 0111, 예를 들어 b 8은 아래와 같은 상 태를 만들기 위한 data b 8 = 4'b 1000, b 9 = 4'b 1001, b 10 = 4'b 1010, b 11 = 4'b 1011, b 12 = 4'b 1100, b 13 = 4'b 1101, b 14 = 4'b 1110, b 15 = 4'b 1111; 8
Branch Metric Calculate(4/5) en_out eo 0 eo 1 eo 2 eo 3 ( ( polya, polyb, b 0, b 2, b 4, b 6, br 0 br 2 br 4 br 6 ); ); assign br 1 br 3 br 5 br 7 en_out eo 4 eo 5 eo 6 eo 7 ( ( polya, polyb, b 8, br 8 ); assign br 9 = ~br 8; b 10, br 10 ); assign br 11 = ~br 10; b 12, br 12 ); assign br 13 = ~br 12; b 14, br 14 ); assign br 15 = ~br 14; hamming_dist ha 0 ha 1 ha 2 ha 3 ( ( data_in, br 0, br 1, br 2, br 3, dout 0 dout 1 dout 2 dout 3 ); ); hamming_dist ha 4 ha 5 ha 6 ha 7 ( ( data_in, br 4, br 5, br 6, br 7, dout 4 dout 5 dout 6 dout 7 ); ); hamming_dist ha 8 ( data_in, br 8, dout 8 ); ha 9 ( data_in, br 9, dout 9 ); ha 10 ( data_in, br 10, dout 10 ); ha 11 ( data_in, br 11, dout 11 ); hamming_dist ha 12 ha 13 ha 14 ha 15 ( ( data_in, br 12, br 13, br 14, br 15, dout 12 dout 13 dout 14 dout 15 = = 각 branch 의 codeword를 생성 한다. ~br 0; ~br 2; ~br 4; ~br 6; data_in의 값과 en_out의 출 력 값을 사용하여 hamming distance를 구한다 이 값이 각 branch metric 값이 된다. Ex) ); ); Branch metric 9
Branch Metric Calculate(5/5) assign bm_out = { dout 15, dout 14, dout 13, dout 12, dout 11, dout 10, dout 9, dout 8, dout 7, dout 6, dout 5, dout 4, dout 3, dout 2, dout 1, dout 0 }; endmodule 10
Branch Metric Calculateencoder_out(1/3) n 옆의 그림과 같이 각 각의 가지에 대한 codeword를 생성한다. n 여기에서 생성되는 codeword는 입력된 transmitted sequence와 의 hamming distance를 구 하여 branch metric값을 구 할 수 있다. 11
Branch Metric Calculateencoder_out(2/3) /*********************************************/ // MODULE : encoder out // // FILE NAME: bmc. v(sub module) // VERSION: 1. 0 // DATE: JAN 14, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a encoder out. // /*********************************************/ module en_out( polya, polyb, bran_state, br_out ); // input data input [`CONS_K-1: 0] polya; input [`CONS_K-1: 0] polyb; input [`CONS_K-1: 0] bran_state; // branch state // output data output wire // generator polynomial [1: 0] br_out; [`CONS_K-1: 0] wa; wb; reg [1: 0] br_out; 12
Branch Metric Calculateencoder_out(3/3) assign wa = bran_state & polya[`CONS_K-1: 0]; wb = bran_state & polyb[`CONS_K-1: 0]; always @(wa or wb) begin br_out[1] = br_out[0] = end wa[0]^wa[1]^wa[2]^wa[3]; // encoding data, j[1] at branch state wb[0]^wb[1]^wb[2]^wb[3]; // encoding data, j[0] at branch state endmodule 13
Branch Metric Calculate-hamming dist(1/2) Transmitted sequence와 encoder out에서 생성된 codeword 의 hamming distance를 구하여 branch metric 값을 구한다. ¨ 아래의 그림에서 보면 각각의 입력에 대하여 Transmitted sequence – data_in[1: 0]와 encoder out에서 생성된 codeword – br_out[1: 0]각 bit단위로 exclusive-or 시키고 그 값을 더해주어 hamming distance를 구한다. 이때의 값이 branch metric 값이 된다. ¨ n n n Transmitted data Branch codeword Hamming distance - 00 11 01 11 00 - 11 01 01 11 00 - 2 1 0 0 0 14
Branch Metric Calculate-hamming dist(2/2) /*********************************************/ // MODULE : hamming dist // // FILE NAME: bmc. v(sub module) // VERSION: 1. 0 // DATE: JAN 14, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a hamming distance. // /*********************************************/ module hamming_dist( data_in, br_out, hamout ); // input data input [1: 0] data_in; input [1: 0] br_out; // output data output [1: 0] hamout; wire [1: 0] hamout; // main code assign hamout = (data_in[1]^br_out[1]) + (data_in[0]^br_out[0]) ; endmodule 15
Branch Metric Calculatetestbench(1/3) /*********************************************/ // MODULE : Branch Metric Calculation Test-Bench // // FILE NAME: bmc_tb. v // VERSION: 1. 0 // DATE: data_in. AN 15, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a branch metric calculation testbench. // /*********************************************/ `include "parameter. v" module bmc_tb(); reg [1: 0] wire [31: 0] data_in; dist; bmc bm 1( data_in, dist ); initial begin #30; data_in data_in = = = 2'b 00; 2'b 11; 2'b 01; #`PERIOD; #`PERIOD; 16
Branch Metric Calculatetestbench(2/3) data_in data_in = = = 2'b 00; 2'b 11; 2'b 00; #`PERIOD; #`PERIOD; $stop; endmodule 17
Branch Metric Calculatetestbench(3/3) 18
Add_Compare_Select(2/6) 20
Add_Compare_Select(3/6) /*********************************************/ // MODULE : Add-Compare-Select // // FILE NAME: acs. v // VERSION: 1. 0 // DATE: JAN 15, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a add-compare-select(ACS). // /*********************************************/ `include "parameter. v" module acs( comp_en, bm_in, pm_in_h, pm_in_l, pm_out_h, pm_out_l, path_mem ); // input data input comp_en; // from bmc input [31: 0] bm_in; // from metric_memory input [`BUS_WIDTH-1: 0] pm_in_h; pm_in_l; 21
Add_Compare_Select(4/6) // output data // to normalize output [`BUS_WIDTH-1: 0] // to path memory output [7: 0] path_mem; pm_out_h; pm_out_l; wire [`BUS_WIDTH-1: 0] pm_in_h; pm_in_l; wire [`BUS_WIDTH-1: 0] pm_out_h; pm_out_l; wire [`DATA_WIDTH-1: 0] pm_in 0, pm_in 1, pm_in 2, pm_in 3, pm_in 4, pm_in 5, pm_in 6, pm_in 7; pm_out 0, pm_out 1, pm_out 2, pm_out 3, pm_out 4, pm_out 5, pm_out 6, pm_out 7; wire [1: 0] wire [`DATA_WIDTH-1: 0] wire [7: 0] // main code assign bm 00_0, bm 01_0, bm 02_1, bm 03_1, bm 04_2, bm 05_2, bm 06_3, bm 07_3, bm 10_4, bm 11_4, bm 12_5, bm 13_5, bm 14_6, bm 15_6, bm 16_7, bm 17_7; sum 00_0, sum 01_0, sum 02_1, sum 03_1, sum 04_2, sum 05_2, sum 06_3, sum 07_3, sum 10_4, sum 11_4, sum 12_5, sum 13_5, sum 14_6, sum 15_6, sum 16_7, sum 17_7; path_mem; { bm 17_7, bm 16_7, bm 15_6, bm 14_6, bm 13_5, bm 12_5, bm 11_4, bm 10_4, bm 07_3, bm 06_3, bm 05_2, bm 04_2, bm 03_1, bm 02_1, bm 01_0, bm 00_0 } = bm_in; assign { pm_in 7, pm_in 6, pm_in 5, pm_in 4, pm_in 3, pm_in 2, pm_in 1, pm_in 0 } = { pm_in_h, pm_in_l }; assign { pm_out_h, pm_out_l } = { pm_out 7, pm_out 6, pm_out 5, pm_out 4, pm_out 3, pm_out 2, pm_out 1, pm_out 0 }; 22
Add_Compare_Select(5/6) // input information bit : 0 assign sum 00_0 = pm_in 0 + bm 00_0, sum 01_0 = pm_in 1 + bm 01_0, sum 02_1 = pm_in 2 + bm 02_1, sum 03_1 = pm_in 3 + bm 03_1, sum 04_2 = pm_in 4 + bm 04_2, sum 05_2 = pm_in 5 + bm 05_2, sum 06_3 = pm_in 6 + bm 06_3, sum 07_3 = pm_in 7 + bm 07_3, // input information bit : 0 sum 10_4 = pm_in 0 + bm 10_4, sum 11_4 = pm_in 1 + bm 11_4, sum 12_5 = pm_in 2 + bm 12_5, sum 13_5 = pm_in 3 + bm 13_5, sum 14_6 = pm_in 4 + bm 14_6, sum 15_6 = pm_in 5 + bm 15_6, sum 16_7 = pm_in 6 + bm 16_7, sum 17_7 = pm_in 7 + bm 17_7; // compare branch metrices compare comp 0 ( comp_en, compare comp 1 ( comp_en, compare comp 2 ( comp_en, compare comp 3 ( comp_en, compare comp 4 ( comp_en, compare comp 5 ( comp_en, compare comp 6 ( comp_en, compare comp 7 ( comp_en, endmodule sum 00_0, sum 02_1, sum 04_2, sum 06_3, sum 10_4, sum 12_5, sum 14_6, sum 16_7, branch metric 값과 path metric 값을 더 한다. 두개의 pm + bm 값 중 작은 branch 값을 선택한다. sum 01_0, sum 03_1, sum 05_2, sum 07_3, sum 11_4, sum 13_5, sum 15_6, sum 17_7, pm_out 0, pm_out 1, pm_out 2, pm_out 3, pm_out 4, pm_out 5, pm_out 6, pm_out 7, path_mem[0] path_mem[1] path_mem[2] path_mem[3] path_mem[4] path_mem[5] path_mem[6] path_mem[7] ); ); 23
Add_Compare_Select(6/6) 24
Add_Compare_Select. Compare(1/2) /*********************************************/ // MODULE : Compare // // FILE NAME: acs. v(acs submodule) // VERSION: 1. 0 // DATE: JAN 15, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a Compare module. // /*********************************************/ module compare( comp_en, sum_in_a, sum_in_b, min_metric, sel ); // input data input comp_en; input [`DATA_WIDTH-1: 0] sum_in_a; input [`DATA_WIDTH-1: 0] sum_in_b; // output data output [`DATA_WIDTH-1: 0] output sel; reg [`DATA_WIDTH-1: 0] sel; min_metric; 25
Add_Compare_Select. Compare(2/2) compare 과정 시작 // main code always @( sum_in_a or sum_in_b or comp_en) begin if (~comp_en) begin min_metric <= sum_in_a; sel <= 0; end else if( sum_in_a <= sum_in_b ) begin min_metric <= sum_in_a; sel <= 0; end // else if endmodule else begin min_metric <= sum_in_b; sel <= 1; end // else // always Comp_en comp_en 은 K(constraint length)-1 이 후 stage부터 동작하게 된다. 이것은 K 1 이전 stage에서는 비교의 과정이 필요 가 없으며 처음에 사용하지 않는 branch 의 값과 비교하여 traceback memory에 잘못된 값이 저장될 수 있다. 26
ACS Enable /*********************************************/ // MODULE : ACS enable // // FILE NAME: acs_en. v // VERSION: 1. 0 // DATE: Feb 2, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines acs enable. // /*********************************************/ module acs_en( clk, rst_n, comp_en ); input output clk; rst_n; comp_en; wire comp_en 0, comp_en 1, comp_en 2; dff_n en 0( en 1( en 2( en 3( clk, rst_n, rst_n, comp_en 0 ); comp_en 0, comp_en 1 ); comp_en 1, comp_en 2 ); comp_en 2, comp_en ); K stage 부터 ACS 모듈에서compare 과정을 수행하도록 신호를 발생시킨다. endmodule 27
Normalization(1/3) /*********************************************/ // MODULE : Normalize path metric // // FILE NAME: normalize. v // VERSION: 1. 0 // DATE: JAN 14, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a Normalize path metric. // /*********************************************/ `include "parameter. v" module normalize( pm_in_h, pm_in_l, norm_out_h, norm_out_l, small_state ); // input data input [`BUS_WIDTH-1: 0] pm_in_h; input [`BUS_WIDTH-1: 0] pm_in_l; // output data output [`BUS_WIDTH-1: 0] norm_out_h; output [`BUS_WIDTH-1: 0] norm_out_l; output [2: 0] small_state; 28
Normalization(2/3) wire [`DATA_WIDTH-1: 0] pm_dat 0, pm_dat 1, pm_dat 2, pm_dat 3, pm_dat 4, pm_dat 5, pm_dat 6, pm_dat 7; comp_re 0, comp_re 1, comp_re 2, comp_re 3, comp_re 4, comp_re 5; wire [`DATA_WIDTH-1: 0] reg [2: 0] smallest; norm 0, norm 1, norm 2, norm 3, norm 4, norm 5, norm 6, norm 7; small_state; // main code assign { pm_dat 7, pm_dat 6, pm_dat 5, pm_dat 4, pm_dat 3, pm_dat 2, pm_dat 1, pm_dat 0 } = { pm_in_h, pm_in_l }; // compare and find smallest value & state assign comp_re 0 = ( pm_dat 0 <= pm_dat 1 )? pm_dat 0 : pm_dat 1, comp_re 1 = ( pm_dat 2 <= pm_dat 3 )? pm_dat 2 : pm_dat 3, comp_re 2 = ( pm_dat 4 <= pm_dat 5 )? pm_dat 4 : pm_dat 5, comp_re 3 = ( pm_dat 6 <= pm_dat 7 )? pm_dat 6 : pm_dat 7; assign comp_re 4 = ( comp_re 0 <= comp_re 1 )? comp_re 0 : comp_re 1, comp_re 5 = ( comp_re 2 <= comp_re 3 )? comp_re 2 : comp_re 3; assign smallest = ( comp_re 4 <= comp_re 5 )? comp_re 4 : comp_re 5; norm 0 = pm_dat 0 - smallest, norm 1 = pm_dat 1 - smallest, norm 2 = pm_dat 2 - smallest, norm 3 = pm_dat 3 - smallest, norm 4 = pm_dat 4 - smallest, norm 5 = pm_dat 5 - smallest, norm 6 = pm_dat 6 - smallest, norm 7 = pm_dat 7 - smallest; 전체 state중에서 가장 작은 state를 찾는다 가장 작은 state의 metric 값으로 전체 state값을 빼준다. 29
Normalization(3/3) assign { norm_out_h, norm_out_l } = { norm 7, norm 6, norm 5, norm 4, norm 3, norm 2, norm 1, norm 0 }; always @(smallest) begin case (smallest) pm_dat 0 : small_state = 3'b 000; pm_dat 1 : small_state = 3'b 001; pm_dat 2 : small_state = 3'b 010; pm_dat 3 : small_state = 3'b 011; pm_dat 4 : small_state = 3'b 100; pm_dat 5 : small_state = 3'b 101; pm_dat 6 : small_state = 3'b 110; pm_dat 7 : small_state = 3'b 111; endcase // case end // always endmodule Trace back과정 수행시 초기 state를 찾기 위하 여 전체 state중 가장 작 은 state를 traceback 모 듈로 출력한다. 30
Path Metric Memory(1/2) /*********************************************/ // MODULE : Path Metric Memory // // FILE NAME: Metric_mem. v // VERSION: 1. 0 // DATE: JAN 14, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a Path metric Memory. // /*********************************************/ `include "parameter. v" module metric_mem( clk, rst, path_mem_in_h, path_mem_in_l, path_mem_out_h, path_mem_out_l ); // input data input clk; input rst; input [`BUS_WIDTH-1: 0] path_mem_in_h; path_mem_in_l; // output data output [`BUS_WIDTH-1: 0] path_mem_out_h; path_mem_out_l; 31
Path Metric Memory(2/2) wire clk; wire rst; wire [`BUS_WIDTH-1: 0] path_mem_in_h; path_mem_in_l; wire [`BUS_WIDTH-1: 0] // main code path_mem_out_h; path_mem_out_l; dff_n #(16) mm_h ( clk, rst, path_mem_in_h, path_mem_out_h ); dff_n #(16) mm_l ( clk, rst, path_mem_in_l, path_mem_out_l ); path metric값을 저장한다. endmodule 32
Traceback(1/7) ¨ Trellis diagram에서 survival path를 저장하고 traceback 에 의 하여 복호화된 비트를 찾아내는 역할을 하는 부분. Trellis diagram에서 현재 state값중 가장 작은 값을 갖는 state를 초기 값으로 하여 Traceback algorithm을 적용하여 원래 입력 정보와 확률이 가장 높은 값을 선택하여 Traceback과정을 진행하고 최 종 정보를 decoding 한다. Input sequence 0 1 1 1 0 0 Decoding data 00 11 10 11 01 00 11 00 t 1 t 2 t 3 t 4 t 5 t 6 t 7 t 8 S 0 0 0 1 1 0 S 1 0 0 0 1 1 0 1 S 2 0 0 0 0 0 S 3 0 0 0 1 0 0 0 S 4 0 0 0 1 1 0 1 S 5 0 0 0 1 0 S 6 0 0 0 1 0 0 0 S 7 0 0 0 0 0 Lowest state 33
Traceback(2/7) 그림 2 그림 1 그림 3 34
Traceback(4/7) /*********************************************/ // MODULE : Traceback // // FILE NAME: traceback. v // VERSION: 1. 0 // DATE: JAN 15, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a Traceback. // /*********************************************/ //`include "parameter. v" module traceback( clk, rst_n, acs_out, small_state, decode_out ); input clk; rst_n; [7: 0] [2: 0] output wire acs_out; small_state; decode_out; [7: 0] acs_out; pa_mem 0, pa_mem 1, pa_mem 2, pa_mem 3, pa_mem 4, pa_mem 5, pa_mem 6, pa_mem 7, pa_mem 8, pa_mem 9, pa_mem 10, pa_mem 11, pa_mem 12, pa_mem 13, pa_mem 14, pa_mem 15, pa_mem 16, pa_mem 17, pa_mem 18, pa_mem 19; 36
Traceback(5/7) wire [2: 0] next_state 0, next_state 1, next_state 2, next_state 3, next_state 4, next_state 5, next_state 6, next_state 7, next_state 8, next_state 9, next_state 10, next_state 11, next_state 12, next_state 13, next_state 14, next_state 15, next_state 16, next_state 17, next_state 18, next_state 19; wire out 0, out 1, out 2, out 3, out 4, out 5, out 6, out 7, out 8, out 9, out 10, out 11, out 12, out 13, out 14, out 15, out 16, out 17, out 18, out 19; wire [2: 0] small_state; wire decode_out; // main code tb_mem tbm 0( tbm 1( tbm 2( tbm 3( clk, rst_n, acs_out, pa_mem 0); pa_mem 0, pa_mem 1); pa_mem 1, pa_mem 2); pa_mem 2, pa_mem 3); tb_mem tbm 4( clk, rst_n, pa_mem 3, pa_mem 4); tbm 5( clk, rst_n, pa_mem 4, pa_mem 5); tbm 6( clk, rst_n, pa_mem 5, pa_mem 6); tbm 7( clk, rst_n, pa_mem 6, pa_mem 7); tb_mem tbm 8( clk, rst_n, pa_mem 7, pa_mem 8); tbm 9( clk, rst_n, pa_mem 8, pa_mem 9); tbm 10( clk, rst_n, pa_mem 9, pa_mem 10); tbm 11( clk, rst_n, pa_mem 10, pa_mem 11); ACS모듈에서의 survivor path값 을 저장한다. Traceback depth는 하드웨어 구 현시 약 K값의 5~6배의 값을 사 용한다. Traceback depth는 K = 4이기 때문에 20에서 24정도의 Traceback depth값을 가질수 있 도록 설계 37
Traceback(6/7) tb_mem tbm 12( tbm 13( tbm 14( tbm 15( clk, rst_n, pa_mem 11, pa_mem 12, pa_mem 13, pa_mem 14, pa_mem 12); pa_mem 13); pa_mem 14); pa_mem 15); tb_mem tbm 16( tbm 17( tbm 18( tbm 19( clk, rst_n, pa_mem 15, pa_mem 16, pa_mem 17, pa_mem 18, pa_mem 16); pa_mem 17); pa_mem 18); pa_mem 19); tb_unit tbu 0(small_state, pa_mem 0, next_state 0, out 0 ); tbu 1(next_state 0, pa_mem 1, next_state 1, out 1 ); tbu 2(next_state 1, pa_mem 2, next_state 2, out 2 ); tbu 3(next_state 2, pa_mem 3, next_state 3, out 3 ); tb_unit tbu 4(next_state 3, tbu 5(next_state 4, tbu 6(next_state 5, tbu 7(next_state 6, tb_unit tbu 8(next_state 7, pa_mem 8, next_state 8, out 8 ); tbu 9(next_state 8, pa_mem 9, next_state 9, out 9 ); tbu 10(next_state 9, pa_mem 10, next_state 10, out 10 ); tbu 11(next_state 10, pa_mem 11, next_state 11, out 11 ); tb_unit tbu 12(next_state 11, tbu 13(next_state 12, tbu 14(next_state 13, tbu 15(next_state 14, pa_mem 4, pa_mem 5, pa_mem 6, pa_mem 7, next_state 4, next_state 5, next_state 6, next_state 7, pa_mem 12, pa_mem 13, pa_mem 14, pa_mem 15, out 4 out 5 out 6 out 7 next_state 12, next_state 13, next_state 14, next_state 15, ); ); out 12 out 13 out 14 out 15 저장된 survivor path 값을 이용하여 traceback 과정 을 진행한다. ); ); 38
Traceback(7/7) tb_unit tbu 16(next_state 15, tbu 17(next_state 16, tbu 18(next_state 17, tbu 19(next_state 18, pa_mem 16, pa_mem 17, pa_mem 18, pa_mem 19, next_state 16, next_state 17, next_state 18, next_state 19, dff_n buff 1 ( clk, rst_n, out 19, decode_out ); endmodule out 16 out 17 out 18 out 19 ); ); 최종 출력을 decoding 출력 으로 사용한다. 39
Traceback Unit(1/2) /*********************************************/ // MODULE : Traceaback unit // // FILE NAME: tb_unit. v // VERSION: 1. 0 // DATE: JAN 15, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a Traceaback unit. // /*********************************************/ `include "parameter. v" module tb_unit( state, surv_data, next_state, out ); // input data input [2: 0] input [7: 0] state; surv_data; // output data output [2: 0] output // from lowest state or previous state // from traceback memory next_state; out; // to next state // present state decode out data 40
Traceback Unit(2/2) // main code assign out = state[2]; next_state = { state[1: 0], surv_data[state[2: 0]] }; endmodule 41
Traceback Memory(1/2) /*********************************************/ // MODULE : Traceback Memory // // FILE NAME: traceback. v // VERSION: 1. 0 // DATE: JAN 15, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a Traceback memory. // /*********************************************/ `include "parameter. v" module tb_mem( clk, rst_n, tb_in, tb_out, ); // input data input clk; input rst_n; input [7: 0] tb_in; // output data output [7: 0] tb_out; wire clk; wire rst_n; wire [7: 0] tb_in; wire [7: 0] tb_out; 42
Traceback Memory(2/2) // main code dff_n #(8) tbm 0( clk, rst_n, tb_in, tb_out ); endmodule 43
Viterbi Decoder- Top(1/3) /*********************************************/ // MODULE : Viterbi decoder // // FILE NAME: viterbi. v ( top module ) // VERSION: 1. 0 // DATE: Feb 2, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines Viterbi decoder. // /*********************************************/ `include "parameter. v" module viterbi( clk, rst_n, data_in, decode_out ); // input data input clk; input rst_n; input [1: 0] data_in; // output data output decode_out; 44
Viterbi Decoder- Top(2/3) wire wire wire wire clk; rst_n; [1: 0] data_in; [1: 0] data_out; [31: 0] bm_data; [`BUS_WIDTH-1: 0] [`BUS_WIDTH-1: 0] [2: 0] small_state; [7: 0] acs_out; decode_out; comp_en; acs_mem_h; acs_mem_l; acs_norm_h; acs_norm_l; norm_mem_h; norm_mem_l; input_buf 0( clk, rst_n, data_in, data_out ); bmc bm 1( data_out, bm_data ); acs_en acsen 0( clk, rst_n, comp_en); acs 1( comp_en, bm_data, acs_mem_h, acs_mem_l, acs_norm_h, acs_norm_l, acs_out ); normalize norm 1( acs_norm_h, acs_norm_l, norm_mem_h, norm_mem_l, small_state ); metric_mem mm 1( clk, rst_n, norm_mem_h, norm_mem_l, acs_mem_h, acs_mem_l); traceback tb 1( clk, rst_n, acs_out, small_state, decode_out ); endmodule 45
Viterbi Decoder- Top(3/3) 46
Viterbi Decoder-Testbench(1/3) /*********************************************/ // MODULE : viterbi testbench // // FILE NAME: viterbi_test. v(testbench) // VERSION: 1. 0 // DATE: JAN 14, 2004 // AUTHOR: DONG KI CHOI // // Description: This module defines a viterbi testbench. // /*********************************************/ `include "parameter. v" module viterbi_tb(); wire decode_out; reg reg clk; [1: 0] rst_n; data_out; viterbi vi 1( clk, rst_n, data_out, decode_out); always #`HALF clk = ~clk; initial begin clk= 1; rst_n = 1; #5; rst_n = 0; #5; rst_n = 1; 47
Viterbi Decoder-Testbench(2/3) data_out data_out = = = 2'b 00; 2'b 11; 2'b 01; #`PERIOD; #`PERIOD; // // // 00 11 10 01 01 0 1 1 1 0 data_out data_out // 10 data_out data_out = = = 2'b 00; 2'b 11; 2'b 01; #`PERIOD; #`PERIOD; // // // 00 11 01 0 0 0 1 0 = = = 2'b 11; 2'b 00; #`PERIOD; #`PERIOD; // // // 11 11 00 00 00 0 0 data_out data_out // 20 data_out data_out = = = = = 2'b 00; 2'b 00; 2'b 00; #`PERIOD; #`PERIOD; #`PERIOD; // // // 00 00 00 0 0 error! 2개의 error 삽입 48
Viterbi Decoder-Testbench(3/3) $stop; endmodule data_out data_out // 30 data_out data_out = = = = = 2'b 00; 2'b 00; 2'b 00; #`PERIOD; #`PERIOD; #`PERIOD; // // // 00 00 00 0 0 data_out data_out // 40 // initial = = = 2'b 00; 2'b 00; #`PERIOD; #`PERIOD; // // // 00 00 00 0 0 49
Testbench - Input buffer n Input buffer Transmitted sequence : 00 11 11 01 00 11 01 11 00 … 50
Testbench – BMC 51
Testbench – ACS 52
Testbench – Normalize 53
Testbench – Path Metric Memory 54
Testbench – Trace Back 55
Testbench – Decoding out 56
- Slides: 57