diff options
Diffstat (limited to 'fpga/usrp2/vrt/vita_tx_deframer.v')
-rw-r--r-- | fpga/usrp2/vrt/vita_tx_deframer.v | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/fpga/usrp2/vrt/vita_tx_deframer.v b/fpga/usrp2/vrt/vita_tx_deframer.v deleted file mode 100644 index ed3916311..000000000 --- a/fpga/usrp2/vrt/vita_tx_deframer.v +++ /dev/null @@ -1,261 +0,0 @@ -// -// Copyright 2011-2012 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -module vita_tx_deframer - #(parameter BASE=0, - parameter MAXCHAN=1, - parameter USE_TRANS_HEADER=0) - (input clk, input reset, input clear, input clear_seqnum, - input set_stb, input [7:0] set_addr, input [31:0] set_data, - - // To FIFO interface of Buffer Pool - input [35:0] data_i, - input src_rdy_i, - output dst_rdy_o, - - output [5+64+16+(32*MAXCHAN)-1:0] sample_fifo_o, - output sample_fifo_src_rdy_o, - input sample_fifo_dst_rdy_i, - - output [31:0] current_seqnum, - - // FIFO Levels - output [15:0] fifo_occupied, - output fifo_full, - output fifo_empty, - output [31:0] debug - ); - - localparam FIFOWIDTH = 5+64+16+(32*MAXCHAN); - - wire [1:0] numchan = 0;/* - setting_reg #(.my_addr(BASE), .at_reset(0), .width(2)) sr_numchan - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(numchan),.changed()); - */ - - reg [3:0] vita_state; - wire has_streamid, has_classid, has_secs, has_tics, has_trailer; - assign has_streamid = (data_i[31:28]==4'b0001); - assign has_classid = data_i[27]; - assign has_secs = ~(data_i[23:22]==2'b00); - assign has_tics = ~(data_i[21:20]==2'b00); - assign has_trailer = data_i[26]; - wire is_sob = data_i[25]; - wire is_eob = data_i[24]; - wire eof = data_i[33]; - reg has_streamid_reg, has_classid_reg, has_secs_reg, has_tics_reg; - reg has_trailer_reg, is_sob_reg, is_eob_reg; - - reg [15:0] pkt_len; - reg [1:0] vector_phase; - wire line_done; - - wire [31:0] seqnum = data_i; - reg [31:0] seqnum_reg; - wire [31:0] next_seqnum = seqnum_reg + 32'd1; - wire [3:0] vita_seqnum = data_i[19:16]; - reg [3:0] vita_seqnum_reg; - wire [3:0] next_vita_seqnum = vita_seqnum_reg[3:0] + 4'd1; - reg seqnum_err; - - assign current_seqnum = seqnum_reg; - - // Output FIFO for packetized data - localparam VITA_TRANS_HEADER = 0; - localparam VITA_HEADER = 1; - localparam VITA_STREAMID = 2; - localparam VITA_CLASSID = 3; - localparam VITA_CLASSID2 = 4; - localparam VITA_SECS = 5; - localparam VITA_TICS = 6; - localparam VITA_TICS2 = 7; - localparam VITA_PAYLOAD = 8; - localparam VITA_TRAILER = 10; - localparam VITA_DUMP = 11; - - wire [15:0] hdr_len = 2 + has_streamid_reg + has_classid_reg + has_classid_reg + has_secs_reg + - has_tics_reg + has_tics_reg + has_trailer_reg; - - wire vita_eof = (pkt_len==hdr_len); - wire eop = eof | vita_eof; // FIXME would ignoring eof allow larger VITA packets? - wire fifo_space; - - always @(posedge clk) - if(reset | clear | clear_seqnum) - begin - seqnum_reg <= 32'hFFFF_FFFF; - vita_seqnum_reg <= 4'hF; - end - else - begin - if((vita_state==VITA_TRANS_HEADER) & src_rdy_i) - seqnum_reg <= seqnum; - if((vita_state==VITA_HEADER) & src_rdy_i) - vita_seqnum_reg <= vita_seqnum; - end // else: !if(reset | clear_seqnum) - - always @(posedge clk) - if(reset | clear) - begin - vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER; - {has_streamid_reg, has_classid_reg, has_secs_reg, has_tics_reg, has_trailer_reg, is_sob_reg, is_eob_reg} - <= 0; - seqnum_err <= 0; - end - else if(src_rdy_i & dst_rdy_o) begin //valid read - case(vita_state) - VITA_TRANS_HEADER : - begin - seqnum_err <= ~(seqnum == next_seqnum); - vita_state <= VITA_HEADER; - end - VITA_HEADER : - begin - {has_streamid_reg, has_classid_reg, has_secs_reg, has_tics_reg, has_trailer_reg, is_sob_reg, is_eob_reg} - <= {has_streamid, has_classid, has_secs, has_tics, has_trailer, is_sob, is_eob}; - pkt_len <= data_i[15:0]; - vector_phase <= 0; - if(has_streamid) - vita_state <= VITA_STREAMID; - else if(has_classid) - vita_state <= VITA_CLASSID; - else if(has_secs) - vita_state <= VITA_SECS; - else if(has_tics) - vita_state <= VITA_TICS; - else - vita_state <= VITA_PAYLOAD; - seqnum_err <= seqnum_err | ~(vita_seqnum == next_vita_seqnum); - end // case: VITA_HEADER - VITA_STREAMID : - if(has_classid_reg) - vita_state <= VITA_CLASSID; - else if(has_secs_reg) - vita_state <= VITA_SECS; - else if(has_tics_reg) - vita_state <= VITA_TICS; - else - vita_state <= VITA_PAYLOAD; - VITA_CLASSID : - vita_state <= VITA_CLASSID2; - VITA_CLASSID2 : - if(has_secs_reg) - vita_state <= VITA_SECS; - else if(has_tics_reg) - vita_state <= VITA_TICS; - else - vita_state <= VITA_PAYLOAD; - VITA_SECS : - if(has_tics_reg) - vita_state <= VITA_TICS; - else - vita_state <= VITA_PAYLOAD; - VITA_TICS : - vita_state <= VITA_TICS2; - VITA_TICS2 : - vita_state <= VITA_PAYLOAD; - - VITA_PAYLOAD : begin - - //step through each element until line done, then reset - vector_phase <= (line_done)? 0: vector_phase + 1; - - //decrement the packet count after each line - pkt_len <= (line_done)? pkt_len - 1 : pkt_len; - - //end of frame reached, determine next state - //otherwise, keep processing through the payload - if (line_done && vita_eof) begin - - if (eof) begin - vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER; - end - else if (has_trailer_reg) begin - vita_state <= VITA_TRAILER; - end - else begin - vita_state <= VITA_DUMP; - end - - end //line_done && vita_eof - - end //end VITA_PAYLOAD - - VITA_TRAILER : - if(eof) - vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER; - else - vita_state <= VITA_DUMP; - VITA_DUMP : - if(eof) - vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER; - default : - vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER; - endcase // case (vita_state) - - end //valid read - - assign line_done = (MAXCHAN == 1)? 1 : (vector_phase == numchan); - - wire [FIFOWIDTH-1:0] fifo_i; - reg [63:0] send_time; - - always @(posedge clk) - case(vita_state) - VITA_TICS : - send_time[63:32] <= data_i[31:0]; - VITA_TICS2 : - send_time[31:0] <= data_i[31:0]; - endcase // case (vita_state) - - //sample registers for de-framing a vector input - reg [31:0] sample_reg [1:0]; - always @(posedge clk) - if(src_rdy_i && dst_rdy_o) - sample_reg[vector_phase] <= data_i[31:0]; - - wire store = (vita_state == VITA_PAYLOAD)? (src_rdy_i && line_done) : 0; - assign dst_rdy_o = (vita_state == VITA_PAYLOAD)? fifo_space : 1; - - fifo_short #(.WIDTH(FIFOWIDTH)) short_tx_q - (.clk(clk), .reset(reset), .clear(clear), - .datain(fifo_i), .src_rdy_i(store), .dst_rdy_o(fifo_space), - .dataout(sample_fifo_o), .src_rdy_o(sample_fifo_src_rdy_o), .dst_rdy_i(sample_fifo_dst_rdy_i) ); - - //assign registered/live data to the samples vector - //the numchan'th sample vector is muxed to live data - wire [(32*MAXCHAN)-1:0] samples; - generate - genvar i; - for (i=0; i < MAXCHAN; i = i +1) begin : assign_samples - wire live_data = (i == (MAXCHAN-1))? 1 : numchan == i; - assign samples[32*i + 31:32*i] = (live_data)? data_i[31:0] : sample_reg[i]; - end - endgenerate - - // sob, eob, has_tics (send_at) ignored on all lines except first - assign fifo_i = {samples,seqnum_err,has_tics_reg,is_sob_reg,is_eob_reg,eop, - 12'd0,seqnum_reg[3:0],send_time}; - - assign debug = { { 8'b0 }, - { 8'b0 }, - { eof, line_done, store, fifo_space, src_rdy_i, dst_rdy_o, vector_phase[1:0] }, - { has_secs_reg, is_sob_reg, is_eob_reg, eop, vita_state[3:0] } }; - -endmodule // vita_tx_deframer |