openofdm/verilog/demodulate.v

528 lines
26 KiB
Verilog

`include "common_defs.v"
module demodulate (
input clock,
input enable,
input reset,
input [7:0] rate,
input [15:0] cons_i,
input [15:0] cons_q,
input input_strobe,
output reg [5:0] bits,
output reg [5:0] soft_bits,
output reg [3:0] soft_bits_pos,
output output_strobe
);
localparam MAX = 1<<`CONS_SCALE_SHIFT;
localparam QAM_16_DIV = MAX*2/3;
localparam QAM_64_DIV_0 = MAX*2/7;
localparam QAM_64_DIV_1 = MAX*4/7;
localparam QAM_64_DIV_2 = MAX*6/7;
localparam BPSK_SOFT_4 = MAX;
localparam BPSK_SOFT_3 = MAX*3/4;
localparam BPSK_SOFT_2 = MAX*2/4;
localparam BPSK_SOFT_1 = MAX*1/4;
localparam BPSK_SOFT_0 = 0;
localparam QPSK_SOFT_4 = MAX;
localparam QPSK_SOFT_3 = MAX*3/4;
localparam QPSK_SOFT_2 = MAX*2/4;
localparam QPSK_SOFT_1 = MAX*1/4;
localparam QPSK_SOFT_0 = 0;
localparam QAM_16_SOFT_12 = MAX;
localparam QAM_16_SOFT_11 = MAX*11/12;
localparam QAM_16_SOFT_10 = MAX*10/12;
localparam QAM_16_SOFT_9 = MAX*9/12;
localparam QAM_16_SOFT_8 = MAX*8/12;
localparam QAM_16_SOFT_7 = MAX*7/12;
localparam QAM_16_SOFT_6 = MAX*6/12;
localparam QAM_16_SOFT_5 = MAX*5/12;
localparam QAM_16_SOFT_4 = MAX*4/12;
localparam QAM_16_SOFT_3 = MAX*3/12;
localparam QAM_16_SOFT_2 = MAX*2/12;
localparam QAM_16_SOFT_1 = MAX*1/12;
localparam QAM_16_SOFT_0 = 0;
localparam QAM_64_SOFT_28 = MAX;
localparam QAM_64_SOFT_27 = MAX*27/28;
localparam QAM_64_SOFT_26 = MAX*26/28;
localparam QAM_64_SOFT_25 = MAX*25/28;
localparam QAM_64_SOFT_24 = MAX*24/28;
localparam QAM_64_SOFT_23 = MAX*23/28;
localparam QAM_64_SOFT_22 = MAX*22/28;
localparam QAM_64_SOFT_21 = MAX*21/28;
localparam QAM_64_SOFT_20 = MAX*20/28;
localparam QAM_64_SOFT_19 = MAX*19/28;
localparam QAM_64_SOFT_18 = MAX*18/28;
localparam QAM_64_SOFT_17 = MAX*17/28;
localparam QAM_64_SOFT_16 = MAX*16/28;
localparam QAM_64_SOFT_15 = MAX*15/28;
localparam QAM_64_SOFT_14 = MAX*14/28;
localparam QAM_64_SOFT_13 = MAX*13/28;
localparam QAM_64_SOFT_12 = MAX*12/28;
localparam QAM_64_SOFT_11 = MAX*11/28;
localparam QAM_64_SOFT_10 = MAX*10/28;
localparam QAM_64_SOFT_9 = MAX*9/28;
localparam QAM_64_SOFT_8 = MAX*8/28;
localparam QAM_64_SOFT_7 = MAX*7/28;
localparam QAM_64_SOFT_6 = MAX*6/28;
localparam QAM_64_SOFT_5 = MAX*5/28;
localparam QAM_64_SOFT_4 = MAX*4/28;
localparam QAM_64_SOFT_3 = MAX*3/28;
localparam QAM_64_SOFT_2 = MAX*2/28;
localparam QAM_64_SOFT_1 = MAX*1/28;
localparam QAM_64_SOFT_0 = 0;
localparam BPSK = 1;
localparam QPSK = 2;
localparam QAM_16 = 3;
localparam QAM_64 = 4;
reg [15:0] cons_i_delayed;
reg [15:0] cons_q_delayed;
reg [15:0] abs_cons_i;
reg [15:0] abs_cons_q;
reg [2:0] mod;
delayT #(.DATA_WIDTH(1), .DELAY(2)) stb_delay_inst (
.clock(clock),
.reset(reset),
.data_in(input_strobe),
.data_out(output_strobe)
);
always @(posedge clock) begin
if (reset) begin
bits <= 0;
soft_bits <= 0;
soft_bits_pos <= 4'b1111;
abs_cons_i <= 0;
abs_cons_q <= 0;
cons_i_delayed <= 0;
cons_q_delayed <= 0;
mod <= 0;
end else if (enable) begin
abs_cons_i <= cons_i[15]? ~cons_i+1: cons_i;
abs_cons_q <= cons_q[15]? ~cons_q+1: cons_q;
cons_i_delayed <= cons_i;
cons_q_delayed <= cons_q;
case({rate[7], rate[3:0]})
// 802.11a rates
5'b01011: begin mod <= BPSK; end
5'b01111: begin mod <= BPSK; end
5'b01010: begin mod <= QPSK; end
5'b01110: begin mod <= QPSK; end
5'b01001: begin mod <= QAM_16; end
5'b01101: begin mod <= QAM_16; end
5'b01000: begin mod <= QAM_64; end
5'b01100: begin mod <= QAM_64; end
// 802.11n rates
5'b10000: begin mod <= BPSK; end
5'b10001: begin mod <= QPSK; end
5'b10010: begin mod <= QPSK; end
5'b10011: begin mod <= QAM_16; end
5'b10100: begin mod <= QAM_16; end
5'b10101: begin mod <= QAM_64; end
5'b10110: begin mod <= QAM_64; end
5'b10111: begin mod <= QAM_64; end
default: begin mod <= BPSK; end
endcase
case(mod)
BPSK: begin
// Hard decoded bits
bits[0] <= ~cons_i_delayed[15];
bits[5:1] <= 0;
// Inphase soft decoded bits
if(cons_i_delayed[15] == 0 && abs_cons_i >= BPSK_SOFT_3)
soft_bits[2:0] <= 3'b111;
else if(cons_i_delayed[15] == 0 && abs_cons_i < BPSK_SOFT_3 && abs_cons_i >= BPSK_SOFT_2)
soft_bits[2:0] <= 3'b110;
else if(cons_i_delayed[15] == 0 && abs_cons_i < BPSK_SOFT_2 && abs_cons_i >= BPSK_SOFT_1)
soft_bits[2:0] <= 3'b101;
else if(cons_i_delayed[15] == 0 && abs_cons_i < BPSK_SOFT_1 && abs_cons_i >= BPSK_SOFT_0)
soft_bits[2:0] <= 3'b100;
else if(cons_i_delayed[15] == 1 && abs_cons_i < BPSK_SOFT_1 && abs_cons_i >= BPSK_SOFT_0)
soft_bits[2:0] <= 3'b000;
else if(cons_i_delayed[15] == 1 && abs_cons_i < BPSK_SOFT_2 && abs_cons_i >= BPSK_SOFT_1)
soft_bits[2:0] <= 3'b001;
else if(cons_i_delayed[15] == 1 && abs_cons_i < BPSK_SOFT_3 && abs_cons_i >= BPSK_SOFT_2)
soft_bits[2:0] <= 3'b010;
else if(cons_i_delayed[15] == 1 && abs_cons_i < BPSK_SOFT_4 && abs_cons_i >= BPSK_SOFT_3)
soft_bits[2:0] <= 3'b011;
//
else
soft_bits[2:0] <= 3'b011;
// Quadrature soft decoded bits
soft_bits[5:3] <= 3'b000;
// Inphase soft decoded bit positions
if(abs_cons_i < BPSK_SOFT_4)
soft_bits_pos[1:0] <= 2'b00;
else
soft_bits_pos[1:0] <= 2'b11;
// Quadrature soft decoded bit positions
soft_bits_pos[3:2] <= 2'b11;
end
QPSK: begin
// Hard decoded bits
bits[0] <= ~cons_i_delayed[15];
bits[1] <= ~cons_q_delayed[15];
bits[5:2] <= 0;
// Inphase soft decoded bits
if(cons_i_delayed[15] == 0 && abs_cons_i >= QPSK_SOFT_3)
soft_bits[2:0] <= 3'b111;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QPSK_SOFT_3 && abs_cons_i >= QPSK_SOFT_2)
soft_bits[2:0] <= 3'b110;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QPSK_SOFT_2 && abs_cons_i >= QPSK_SOFT_1)
soft_bits[2:0] <= 3'b101;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QPSK_SOFT_1 && abs_cons_i >= QPSK_SOFT_0)
soft_bits[2:0] <= 3'b100;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QPSK_SOFT_1 && abs_cons_i >= QPSK_SOFT_0)
soft_bits[2:0] <= 3'b000;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QPSK_SOFT_2 && abs_cons_i >= QPSK_SOFT_1)
soft_bits[2:0] <= 3'b001;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QPSK_SOFT_3 && abs_cons_i >= QPSK_SOFT_2)
soft_bits[2:0] <= 3'b010;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QPSK_SOFT_4 && abs_cons_i >= QPSK_SOFT_3)
soft_bits[2:0] <= 3'b011;
//
else
soft_bits[2:0] <= 3'b011;
// Quadrature soft decoded bits
if(cons_q_delayed[15] == 0 && abs_cons_q >= QPSK_SOFT_3)
soft_bits[5:3] <= 3'b111;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QPSK_SOFT_3 && abs_cons_q >= QPSK_SOFT_2)
soft_bits[5:3] <= 3'b110;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QPSK_SOFT_2 && abs_cons_q >= QPSK_SOFT_1)
soft_bits[5:3] <= 3'b101;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QPSK_SOFT_1 && abs_cons_q >= QPSK_SOFT_0)
soft_bits[5:3] <= 3'b100;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QPSK_SOFT_1 && abs_cons_q >= QPSK_SOFT_0)
soft_bits[5:3] <= 3'b000;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QPSK_SOFT_2 && abs_cons_q >= QPSK_SOFT_1)
soft_bits[5:3] <= 3'b001;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QPSK_SOFT_3 && abs_cons_q >= QPSK_SOFT_2)
soft_bits[5:3] <= 3'b010;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QPSK_SOFT_4 && abs_cons_q >= QPSK_SOFT_3)
soft_bits[5:3] <= 3'b011;
//
else
soft_bits[5:3] <= 3'b011;
// Inphase soft decoded bit positions
if(abs_cons_i < QPSK_SOFT_4)
soft_bits_pos[1:0] <= 2'b00;
else
soft_bits_pos[1:0] <= 2'b11;
// Quadrature soft decoded bit positions
if(abs_cons_q < QPSK_SOFT_4)
soft_bits_pos[3:2] <= 2'b00;
else
soft_bits_pos[3:2] <= 2'b11;
end
QAM_16: begin
// Hard decoded bits
bits[0] <= ~cons_i_delayed[15];
bits[1] <= abs_cons_i < QAM_16_DIV? 1: 0;
bits[2] <= ~cons_q_delayed[15];
bits[3] <= abs_cons_q < QAM_16_DIV? 1: 0;
bits[5:4] <= 0;
// Inphase soft decoded bits
if(abs_cons_i < QAM_16_SOFT_12 && abs_cons_i >= QAM_16_SOFT_11)
soft_bits[2:0] <= 3'b011;
else if(abs_cons_i < QAM_16_SOFT_11 && abs_cons_i >= QAM_16_SOFT_10)
soft_bits[2:0] <= 3'b010;
else if(abs_cons_i < QAM_16_SOFT_10 && abs_cons_i >= QAM_16_SOFT_9)
soft_bits[2:0] <= 3'b001;
else if(abs_cons_i < QAM_16_SOFT_9 && abs_cons_i >= QAM_16_SOFT_8)
soft_bits[2:0] <= 3'b000;
else if(abs_cons_i < QAM_16_SOFT_8 && abs_cons_i >= QAM_16_SOFT_7)
soft_bits[2:0] <= 3'b100;
else if(abs_cons_i < QAM_16_SOFT_7 && abs_cons_i >= QAM_16_SOFT_6)
soft_bits[2:0] <= 3'b101;
else if(abs_cons_i < QAM_16_SOFT_6 && abs_cons_i >= QAM_16_SOFT_5)
soft_bits[2:0] <= 3'b110;
else if(abs_cons_i < QAM_16_SOFT_5 && abs_cons_i >= QAM_16_SOFT_4)
soft_bits[2:0] <= 3'b111;
//
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_16_SOFT_4 && abs_cons_i >= QAM_16_SOFT_3)
soft_bits[2:0] <= 3'b111;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_16_SOFT_3 && abs_cons_i >= QAM_16_SOFT_2)
soft_bits[2:0] <= 3'b110;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_16_SOFT_2 && abs_cons_i >= QAM_16_SOFT_1)
soft_bits[2:0] <= 3'b101;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_16_SOFT_1 && abs_cons_i >= QAM_16_SOFT_0)
soft_bits[2:0] <= 3'b100;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_16_SOFT_1 && abs_cons_i >= QAM_16_SOFT_0)
soft_bits[2:0] <= 3'b000;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_16_SOFT_2 && abs_cons_i >= QAM_16_SOFT_1)
soft_bits[2:0] <= 3'b001;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_16_SOFT_3 && abs_cons_i >= QAM_16_SOFT_2)
soft_bits[2:0] <= 3'b010;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_16_SOFT_4 && abs_cons_i >= QAM_16_SOFT_3)
soft_bits[2:0] <= 3'b011;
//
else
soft_bits[2:0] <= 3'b011;
// Quadrature soft decoded bits
if(abs_cons_q < QAM_16_SOFT_12 && abs_cons_q >= QAM_16_SOFT_11)
soft_bits[5:3] <= 3'b011;
else if(abs_cons_q < QAM_16_SOFT_11 && abs_cons_q >= QAM_16_SOFT_10)
soft_bits[5:3] <= 3'b010;
else if(abs_cons_q < QAM_16_SOFT_10 && abs_cons_q >= QAM_16_SOFT_9)
soft_bits[5:3] <= 3'b001;
else if(abs_cons_q < QAM_16_SOFT_9 && abs_cons_q >= QAM_16_SOFT_8)
soft_bits[5:3] <= 3'b000;
else if(abs_cons_q < QAM_16_SOFT_8 && abs_cons_q >= QAM_16_SOFT_7)
soft_bits[5:3] <= 3'b100;
else if(abs_cons_q < QAM_16_SOFT_7 && abs_cons_q >= QAM_16_SOFT_6)
soft_bits[5:3] <= 3'b101;
else if(abs_cons_q < QAM_16_SOFT_6 && abs_cons_q >= QAM_16_SOFT_5)
soft_bits[5:3] <= 3'b110;
else if(abs_cons_q < QAM_16_SOFT_5 && abs_cons_q >= QAM_16_SOFT_4)
soft_bits[5:3] <= 3'b111;
//
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_16_SOFT_4 && abs_cons_q >= QAM_16_SOFT_3)
soft_bits[5:3] <= 3'b111;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_16_SOFT_3 && abs_cons_q >= QAM_16_SOFT_2)
soft_bits[5:3] <= 3'b110;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_16_SOFT_2 && abs_cons_q >= QAM_16_SOFT_1)
soft_bits[5:3] <= 3'b101;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_16_SOFT_1 && abs_cons_q >= QAM_16_SOFT_0)
soft_bits[5:3] <= 3'b100;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_16_SOFT_1 && abs_cons_q >= QAM_16_SOFT_0)
soft_bits[5:3] <= 3'b000;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_16_SOFT_2 && abs_cons_q >= QAM_16_SOFT_1)
soft_bits[5:3] <= 3'b001;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_16_SOFT_3 && abs_cons_q >= QAM_16_SOFT_2)
soft_bits[5:3] <= 3'b010;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_16_SOFT_4 && abs_cons_q >= QAM_16_SOFT_3)
soft_bits[5:3] <= 3'b011;
//
else
soft_bits[5:3] <= 3'b011;
// Inphase soft decoded bit positions
if(abs_cons_i < QAM_16_SOFT_12 && abs_cons_i >= QAM_16_SOFT_4)
soft_bits_pos[1:0] <= 2'b01;
else if(abs_cons_i < QAM_16_SOFT_4)
soft_bits_pos[1:0] <= 2'b00;
else
soft_bits_pos[1:0] <= 2'b11;
// Quadrature soft decoded bit positions
if(abs_cons_q < QAM_16_SOFT_12 && abs_cons_q >= QAM_16_SOFT_4)
soft_bits_pos[3:2] <= 2'b01;
else if(abs_cons_q < QAM_16_SOFT_4)
soft_bits_pos[3:2] <= 2'b00;
else
soft_bits_pos[3:2] <= 2'b11;
end
QAM_64: begin
// Hard decoded bits
bits[0] <= ~cons_i_delayed[15];
bits[1] <= abs_cons_i < QAM_64_DIV_1? 1: 0;
bits[2] <= abs_cons_i > QAM_64_DIV_0 &&
abs_cons_i < QAM_64_DIV_2? 1: 0;
bits[3] <= ~cons_q_delayed[15];
bits[4] <= abs_cons_q < QAM_64_DIV_1? 1: 0;
bits[5] <= abs_cons_q > QAM_64_DIV_0 &&
abs_cons_q < QAM_64_DIV_2? 1: 0;
// Inphase soft decoded bits
if(abs_cons_i < QAM_64_SOFT_28 && abs_cons_i >= QAM_64_SOFT_27)
soft_bits[2:0] <= 3'b011;
else if(abs_cons_i < QAM_64_SOFT_27 && abs_cons_i >= QAM_64_SOFT_26)
soft_bits[2:0] <= 3'b010;
else if(abs_cons_i < QAM_64_SOFT_26 && abs_cons_i >= QAM_64_SOFT_25)
soft_bits[2:0] <= 3'b001;
else if(abs_cons_i < QAM_64_SOFT_25 && abs_cons_i >= QAM_64_SOFT_24)
soft_bits[2:0] <= 3'b000;
else if(abs_cons_i < QAM_64_SOFT_24 && abs_cons_i >= QAM_64_SOFT_23)
soft_bits[2:0] <= 3'b100;
else if(abs_cons_i < QAM_64_SOFT_23 && abs_cons_i >= QAM_64_SOFT_22)
soft_bits[2:0] <= 3'b101;
else if(abs_cons_i < QAM_64_SOFT_22 && abs_cons_i >= QAM_64_SOFT_21)
soft_bits[2:0] <= 3'b110;
else if(abs_cons_i < QAM_64_SOFT_21 && abs_cons_i >= QAM_64_SOFT_20)
soft_bits[2:0] <= 3'b111;
//
else if(abs_cons_i < QAM_64_SOFT_20 && abs_cons_i >= QAM_64_SOFT_19)
soft_bits[2:0] <= 3'b010;
else if(abs_cons_i < QAM_64_SOFT_19 && abs_cons_i >= QAM_64_SOFT_18)
soft_bits[2:0] <= 3'b010;
else if(abs_cons_i < QAM_64_SOFT_18 && abs_cons_i >= QAM_64_SOFT_17)
soft_bits[2:0] <= 3'b001;
else if(abs_cons_i < QAM_64_SOFT_17 && abs_cons_i >= QAM_64_SOFT_16)
soft_bits[2:0] <= 3'b000;
else if(abs_cons_i < QAM_64_SOFT_16 && abs_cons_i >= QAM_64_SOFT_15)
soft_bits[2:0] <= 3'b100;
else if(abs_cons_i < QAM_64_SOFT_15 && abs_cons_i >= QAM_64_SOFT_14)
soft_bits[2:0] <= 3'b101;
else if(abs_cons_i < QAM_64_SOFT_14 && abs_cons_i >= QAM_64_SOFT_13)
soft_bits[2:0] <= 3'b110;
else if(abs_cons_i < QAM_64_SOFT_13 && abs_cons_i >= QAM_64_SOFT_12)
soft_bits[2:0] <= 3'b111;
//
else if(abs_cons_i < QAM_64_SOFT_12 && abs_cons_i >= QAM_64_SOFT_11)
soft_bits[2:0] <= 3'b111;
else if(abs_cons_i < QAM_64_SOFT_11 && abs_cons_i >= QAM_64_SOFT_10)
soft_bits[2:0] <= 3'b110;
else if(abs_cons_i < QAM_64_SOFT_10 && abs_cons_i >= QAM_64_SOFT_9)
soft_bits[2:0] <= 3'b101;
else if(abs_cons_i < QAM_64_SOFT_9 && abs_cons_i >= QAM_64_SOFT_8)
soft_bits[2:0] <= 3'b100;
else if(abs_cons_i < QAM_64_SOFT_8 && abs_cons_i >= QAM_64_SOFT_7)
soft_bits[2:0] <= 3'b000;
else if(abs_cons_i < QAM_64_SOFT_7 && abs_cons_i >= QAM_64_SOFT_6)
soft_bits[2:0] <= 3'b001;
else if(abs_cons_i < QAM_64_SOFT_6 && abs_cons_i >= QAM_64_SOFT_5)
soft_bits[2:0] <= 3'b010;
else if(abs_cons_i < QAM_64_SOFT_5 && abs_cons_i >= QAM_64_SOFT_4)
soft_bits[2:0] <= 3'b011;
//
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_64_SOFT_4 && abs_cons_i >= QAM_64_SOFT_3)
soft_bits[2:0] <= 3'b111;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_64_SOFT_3 && abs_cons_i >= QAM_64_SOFT_2)
soft_bits[2:0] <= 3'b110;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_64_SOFT_2 && abs_cons_i >= QAM_64_SOFT_1)
soft_bits[2:0] <= 3'b101;
else if(cons_i_delayed[15] == 0 && abs_cons_i < QAM_64_SOFT_1 && abs_cons_i >= QAM_64_SOFT_0)
soft_bits[2:0] <= 3'b100;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_64_SOFT_1 && abs_cons_i >= QAM_64_SOFT_0)
soft_bits[2:0] <= 3'b000;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_64_SOFT_2 && abs_cons_i >= QAM_64_SOFT_1)
soft_bits[2:0] <= 3'b001;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_64_SOFT_3 && abs_cons_i >= QAM_64_SOFT_2)
soft_bits[2:0] <= 3'b010;
else if(cons_i_delayed[15] == 1 && abs_cons_i < QAM_64_SOFT_4 && abs_cons_i >= QAM_64_SOFT_3)
soft_bits[2:0] <= 3'b011;
//
else
soft_bits[2:0] <= 3'b011;
// Quadrature soft decoded bits
if(abs_cons_q < QAM_64_SOFT_28 && abs_cons_q >= QAM_64_SOFT_27)
soft_bits[5:3] <= 3'b011;
else if(abs_cons_q < QAM_64_SOFT_27 && abs_cons_q >= QAM_64_SOFT_26)
soft_bits[5:3] <= 3'b010;
else if(abs_cons_q < QAM_64_SOFT_26 && abs_cons_q >= QAM_64_SOFT_25)
soft_bits[5:3] <= 3'b001;
else if(abs_cons_q < QAM_64_SOFT_25 && abs_cons_q >= QAM_64_SOFT_24)
soft_bits[5:3] <= 3'b000;
else if(abs_cons_q < QAM_64_SOFT_24 && abs_cons_q >= QAM_64_SOFT_23)
soft_bits[5:3] <= 3'b100;
else if(abs_cons_q < QAM_64_SOFT_23 && abs_cons_q >= QAM_64_SOFT_22)
soft_bits[5:3] <= 3'b101;
else if(abs_cons_q < QAM_64_SOFT_22 && abs_cons_q >= QAM_64_SOFT_21)
soft_bits[5:3] <= 3'b110;
else if(abs_cons_q < QAM_64_SOFT_21 && abs_cons_q >= QAM_64_SOFT_20)
soft_bits[5:3] <= 3'b111;
//
else if(abs_cons_q < QAM_64_SOFT_20 && abs_cons_q >= QAM_64_SOFT_19)
soft_bits[5:3] <= 3'b010;
else if(abs_cons_q < QAM_64_SOFT_19 && abs_cons_q >= QAM_64_SOFT_18)
soft_bits[5:3] <= 3'b010;
else if(abs_cons_q < QAM_64_SOFT_18 && abs_cons_q >= QAM_64_SOFT_17)
soft_bits[5:3] <= 3'b001;
else if(abs_cons_q < QAM_64_SOFT_17 && abs_cons_q >= QAM_64_SOFT_16)
soft_bits[5:3] <= 3'b000;
else if(abs_cons_q < QAM_64_SOFT_16 && abs_cons_q >= QAM_64_SOFT_15)
soft_bits[5:3] <= 3'b100;
else if(abs_cons_q < QAM_64_SOFT_15 && abs_cons_q >= QAM_64_SOFT_14)
soft_bits[5:3] <= 3'b101;
else if(abs_cons_q < QAM_64_SOFT_14 && abs_cons_q >= QAM_64_SOFT_13)
soft_bits[5:3] <= 3'b110;
else if(abs_cons_q < QAM_64_SOFT_13 && abs_cons_q >= QAM_64_SOFT_12)
soft_bits[5:3] <= 3'b111;
//
else if(abs_cons_q < QAM_64_SOFT_12 && abs_cons_q >= QAM_64_SOFT_11)
soft_bits[5:3] <= 3'b111;
else if(abs_cons_q < QAM_64_SOFT_11 && abs_cons_q >= QAM_64_SOFT_10)
soft_bits[5:3] <= 3'b110;
else if(abs_cons_q < QAM_64_SOFT_10 && abs_cons_q >= QAM_64_SOFT_9)
soft_bits[5:3] <= 3'b101;
else if(abs_cons_q < QAM_64_SOFT_9 && abs_cons_q >= QAM_64_SOFT_8)
soft_bits[5:3] <= 3'b100;
else if(abs_cons_q < QAM_64_SOFT_8 && abs_cons_q >= QAM_64_SOFT_7)
soft_bits[5:3] <= 3'b000;
else if(abs_cons_q < QAM_64_SOFT_7 && abs_cons_q >= QAM_64_SOFT_6)
soft_bits[5:3] <= 3'b001;
else if(abs_cons_q < QAM_64_SOFT_6 && abs_cons_q >= QAM_64_SOFT_5)
soft_bits[5:3] <= 3'b010;
else if(abs_cons_q < QAM_64_SOFT_5 && abs_cons_q >= QAM_64_SOFT_4)
soft_bits[5:3] <= 3'b011;
//
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_64_SOFT_4 && abs_cons_q >= QAM_64_SOFT_3)
soft_bits[5:3] <= 3'b111;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_64_SOFT_3 && abs_cons_q >= QAM_64_SOFT_2)
soft_bits[5:3] <= 3'b110;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_64_SOFT_2 && abs_cons_q >= QAM_64_SOFT_1)
soft_bits[5:3] <= 3'b101;
else if(cons_q_delayed[15] == 0 && abs_cons_q < QAM_64_SOFT_1 && abs_cons_q >= QAM_64_SOFT_0)
soft_bits[5:3] <= 3'b100;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_64_SOFT_1 && abs_cons_q >= QAM_64_SOFT_0)
soft_bits[5:3] <= 3'b000;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_64_SOFT_2 && abs_cons_q >= QAM_64_SOFT_1)
soft_bits[5:3] <= 3'b001;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_64_SOFT_3 && abs_cons_q >= QAM_64_SOFT_2)
soft_bits[5:3] <= 3'b010;
else if(cons_q_delayed[15] == 1 && abs_cons_q < QAM_64_SOFT_4 && abs_cons_q >= QAM_64_SOFT_3)
soft_bits[5:3] <= 3'b011;
//
else
soft_bits[5:3] <= 3'b011;
// Inphase soft decoded bit positions
if(abs_cons_i < QAM_64_SOFT_28 && abs_cons_i >= QAM_64_SOFT_20)
soft_bits_pos[1:0] <= 2'b10;
else if(abs_cons_i < QAM_64_SOFT_20 && abs_cons_i >= QAM_64_SOFT_12)
soft_bits_pos[1:0] <= 2'b01;
else if(abs_cons_i < QAM_64_SOFT_12 && abs_cons_i >= QAM_64_SOFT_4)
soft_bits_pos[1:0] <= 2'b10;
else if(abs_cons_i < QAM_64_SOFT_4)
soft_bits_pos[1:0] <= 2'b00;
else
soft_bits_pos[1:0] <= 2'b11;
// Quadrature soft decoded bit positions
if(abs_cons_q < QAM_64_SOFT_28 && abs_cons_q >= QAM_64_SOFT_20)
soft_bits_pos[3:2] <= 2'b10;
else if(abs_cons_q < QAM_64_SOFT_20 && abs_cons_q >= QAM_64_SOFT_12)
soft_bits_pos[3:2] <= 2'b01;
else if(abs_cons_q < QAM_64_SOFT_12 && abs_cons_q >= QAM_64_SOFT_4)
soft_bits_pos[3:2] <= 2'b10;
else if(abs_cons_q < QAM_64_SOFT_4)
soft_bits_pos[3:2] <= 2'b00;
else
soft_bits_pos[3:2] <= 2'b11;
end
endcase
end
end
endmodule