diff options
-rw-r--r-- | usrp2/sdr_lib/dspengine_8to16.v | 49 | ||||
-rw-r--r-- | usrp2/vrt/vita_tx_chain.v | 2 |
2 files changed, 26 insertions, 25 deletions
diff --git a/usrp2/sdr_lib/dspengine_8to16.v b/usrp2/sdr_lib/dspengine_8to16.v index a8accee8b..66568bc12 100644 --- a/usrp2/sdr_lib/dspengine_8to16.v +++ b/usrp2/sdr_lib/dspengine_8to16.v @@ -17,7 +17,8 @@ module dspengine_8to16 #(parameter BASE = 0, - parameter BUF_SIZE = 9) + parameter BUF_SIZE = 9, + parameter HEADER_OFFSET = 0) (input clk, input reset, input clear, input set_stb, input [7:0] set_addr, input [31:0] set_data, @@ -40,14 +41,15 @@ module dspengine_8to16 reg [3:0] dsp_state; localparam DSP_IDLE = 0; - localparam DSP_PARSE_HEADER = 1; - localparam DSP_READ = 2; - localparam DSP_WRITE_1 = 3; - localparam DSP_WRITE_0 = 4; - localparam DSP_READ_TRAILER = 5; - localparam DSP_WRITE_TRAILER = 6; - localparam DSP_WRITE_HEADER = 7; - localparam DSP_DONE = 8; + localparam DSP_IDLE_RD = 1; + localparam DSP_PARSE_HEADER = 2; + localparam DSP_READ = 3; + localparam DSP_WRITE_1 = 4; + localparam DSP_WRITE_0 = 5; + localparam DSP_READ_TRAILER = 6; + localparam DSP_WRITE_TRAILER = 7; + localparam DSP_WRITE_HEADER = 8; + localparam DSP_DONE = 9; // Parse VITA header wire is_if_data = (access_dat_i[31:29] == 3'b000); @@ -66,10 +68,10 @@ module dspengine_8to16 reg has_trailer_reg; reg [31:0] new_header, new_trailer, trailer_mask; - reg [15:0] length; reg wait_for_trailer; - reg [15:0] data_in_len, data_out_len; - wire [15:0] data_in_lenx2 = {data_in_len[14:0], 1'b0} - (access_dat_i[20] & access_dat_i[8]); + reg [15:0] data_in_len; + wire is_odd = access_dat_i[22] & access_dat_i[10]; + wire [15:0] data_in_lenx2 = {data_in_len[14:0], 1'b0} - is_odd; reg [7:0] i8_0, q8_0; wire [7:0] i8_1 = access_dat_i[15:8]; @@ -87,20 +89,20 @@ module dspengine_8to16 case(dsp_state) DSP_IDLE : begin - read_adr <= 1; // Skip 0 for transport header - write_adr <= 1; // Skip 0 for transport header + read_adr <= HEADER_OFFSET; + write_adr <= HEADER_OFFSET; if(access_ok) - dsp_state <= DSP_PARSE_HEADER; + dsp_state <= DSP_IDLE_RD; end - + + DSP_IDLE_RD: //extra idle state for read to become valid + dsp_state <= DSP_PARSE_HEADER; + DSP_PARSE_HEADER : begin - // FIXME is data always valid here? - has_trailer_reg <= has_trailer; new_header[31:16] <= access_dat_i[31:16]; - new_header[15:0] <= access_len-1; - length <= access_len; + new_header[15:0] <= access_len-HEADER_OFFSET; hdr_length_reg <= hdr_length; if(~is_if_data | ~convert | ~has_trailer) // ~convert is valid (16 bit mode) but both ~trailer and ~is_if_data are both @@ -111,7 +113,7 @@ module dspengine_8to16 read_adr <= access_len - 1; // point to trailer dsp_state <= DSP_READ_TRAILER; wait_for_trailer <= 0; - data_in_len <= access_len - hdr_length - 2; + data_in_len <= access_len - hdr_length - HEADER_OFFSET - 1 /*trailer*/; end end @@ -121,9 +123,8 @@ module dspengine_8to16 if(wait_for_trailer) dsp_state <= DSP_WRITE_TRAILER; new_trailer <= access_dat_i[31:0]; // Leave trailer unchanged - odd <= access_dat_i[20] & access_dat_i[8]; - data_out_len <= data_in_lenx2; - write_adr <= hdr_length_reg + data_in_lenx2 + 1; + odd <= is_odd; + write_adr <= hdr_length_reg + data_in_lenx2 + HEADER_OFFSET; end DSP_WRITE_TRAILER : diff --git a/usrp2/vrt/vita_tx_chain.v b/usrp2/vrt/vita_tx_chain.v index f9348bbfd..8002eae83 100644 --- a/usrp2/vrt/vita_tx_chain.v +++ b/usrp2/vrt/vita_tx_chain.v @@ -76,7 +76,7 @@ module vita_tx_chain .data_i(tx_data_i), .src_rdy_i(tx_src_rdy_i), .dst_rdy_o(tx_dst_rdy_o), .data_o(tx_data_int2), .src_rdy_o(tx_src_rdy_int2), .dst_rdy_i(tx_dst_rdy_int2)); - dspengine_8to16 #(.BASE(BASE+6), .BUF_SIZE(FIFOSIZE)) dspengine_8to16 + dspengine_8to16 #(.BASE(BASE+6), .BUF_SIZE(FIFOSIZE), .HEADER_OFFSET(USE_TRANS_HEADER)) dspengine_8to16 (.clk(clk),.reset(reset),.clear(clear), .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), .access_we(access_we), .access_stb(access_stb), .access_ok(access_ok), .access_done(access_done), |