mirror of
https://github.com/jhshi/openofdm.git
synced 2024-12-24 07:46:55 +00:00
73475306b7
Add n_ofdm_sym, n_bit_in_last_sym and phy_len_valid to openofdm_rx ip
117 lines
3.1 KiB
Verilog
117 lines
3.1 KiB
Verilog
// Xianjun jiao. putaoshu@msn.com; xianjun.jiao@imec.be;
|
|
|
|
// Calculate PHY related info:
|
|
// n_ofdm_sym, n_bit_in_last_sym (for decoding latency prediction)
|
|
|
|
module phy_len_calculation
|
|
(
|
|
input clock,
|
|
input reset,
|
|
input enable,
|
|
|
|
input [4:0] state,
|
|
input [4:0] old_state,
|
|
input [19:0] num_bits_to_decode,
|
|
input [7:0] pkt_rate,//bit [7] 1 means ht; 0 means non-ht
|
|
|
|
output reg [14:0] n_ofdm_sym,//max 20166 = (22+65535*8)/26
|
|
output reg [19:0] n_bit_in_last_sym,//max ht ndbps 260
|
|
output reg phy_len_valid
|
|
);
|
|
|
|
reg start_calculation;
|
|
reg end_calculation;
|
|
|
|
reg [8:0] n_dbps;
|
|
|
|
// lookup table for N_DBPS (Number of data bits per OFDM symbol)
|
|
always @( pkt_rate[7],pkt_rate[3:0] )
|
|
begin
|
|
case ({pkt_rate[7],pkt_rate[3:0]})
|
|
5'b01011 : begin //non-ht 6Mbps
|
|
n_dbps = 24;
|
|
end
|
|
5'b01111 : begin //non-ht 9Mbps
|
|
n_dbps = 36;
|
|
end
|
|
5'b01010 : begin //non-ht 12Mbps
|
|
n_dbps = 48;
|
|
end
|
|
5'b01110 : begin //non-ht 18Mbps
|
|
n_dbps = 72;
|
|
end
|
|
5'b01001 : begin //non-ht 24Mbps
|
|
n_dbps = 96;
|
|
end
|
|
5'b01101 : begin //non-ht 36Mbps
|
|
n_dbps = 144;
|
|
end
|
|
5'b01000 : begin //non-ht 48Mbps
|
|
n_dbps = 192;
|
|
end
|
|
5'b01100 : begin //non-ht 54Mbps
|
|
n_dbps = 216;
|
|
end
|
|
5'b10000 : begin //ht mcs 0
|
|
n_dbps = 26;
|
|
end
|
|
5'b10001 : begin //ht mcs 1
|
|
n_dbps = 52;
|
|
end
|
|
5'b10010 : begin //ht mcs 2
|
|
n_dbps = 78;
|
|
end
|
|
5'b10011 : begin //ht mcs 3
|
|
n_dbps = 104;
|
|
end
|
|
5'b10100 : begin //ht mcs 4
|
|
n_dbps = 156;
|
|
end
|
|
5'b10101 : begin //ht mcs 5
|
|
n_dbps = 208;
|
|
end
|
|
5'b10110 : begin //ht mcs 6
|
|
n_dbps = 234;
|
|
end
|
|
5'b10111 : begin //ht mcs 7
|
|
n_dbps = 260;
|
|
end
|
|
default: begin
|
|
n_dbps = 0;
|
|
end
|
|
endcase
|
|
end
|
|
|
|
`include "common_params.v"
|
|
always @(posedge clock) begin
|
|
if (reset) begin
|
|
n_ofdm_sym <= 1;
|
|
n_bit_in_last_sym <= 130; // half of max num bits to have a rough mid-point estimation in case no calculation happen
|
|
phy_len_valid <= 0;
|
|
start_calculation <= 0;
|
|
end_calculation <= 0;
|
|
end else begin
|
|
if ( (state != S_HT_SIG_ERROR && old_state == S_CHECK_HT_SIG) || ((state == S_DECODE_DATA && (old_state == S_CHECK_SIGNAL || old_state == S_DETECT_HT))) ) begin
|
|
n_bit_in_last_sym <= num_bits_to_decode;
|
|
if (num_bits_to_decode <= n_dbps) begin
|
|
phy_len_valid <= 1;
|
|
end_calculation <= 1;
|
|
end else begin
|
|
start_calculation <= 1;
|
|
end
|
|
end
|
|
|
|
if (start_calculation == 1 && end_calculation != 1) begin
|
|
if (n_bit_in_last_sym <= n_dbps) begin
|
|
phy_len_valid <= 1;
|
|
end_calculation <= 1;
|
|
end else begin
|
|
n_bit_in_last_sym <= n_bit_in_last_sym - n_dbps;
|
|
n_ofdm_sym = n_ofdm_sym + 1;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
endmodule
|