diff options
Diffstat (limited to 'vrt')
-rw-r--r-- | vrt/vita_tx_control.v | 174 | ||||
-rw-r--r-- | vrt/vita_tx_tb.v | 16 |
2 files changed, 50 insertions, 140 deletions
diff --git a/vrt/vita_tx_control.v b/vrt/vita_tx_control.v index 5c5ad9fc9..a887f056f 100644 --- a/vrt/vita_tx_control.v +++ b/vrt/vita_tx_control.v @@ -9,7 +9,7 @@ module vita_tx_control output underrun, // From vita_tx_deframer - input [4+64+WIDTH-1:0] sample_fifo_o, + input [4+64+WIDTH-1:0] sample_fifo_i, input sample_fifo_src_rdy_i, output sample_fifo_dst_rdy_o, @@ -19,152 +19,52 @@ module vita_tx_control input strobe ); - wire [63:0] new_time; - wire [31:0] new_command; - wire sc_pre1, clear_int, clear_reg; + assign sample = sample_fifo_i[4+64+WIDTH-1:4+64]; - assign clear_int = clear | clear_reg; + wire [63:0] send_time = sample_fifo_i[63:0]; + wire eop = sample_fifo_i[64]; + wire eob = sample_fifo_i[65]; + wire sob = sample_fifo_i[66]; + wire send_at = sample_fifo_i[67]; + wire now, early, late, too_early; - wire [63:0] rcvtime_pre; - reg [63:0] rcvtime; - wire [29:0] numlines_pre; - wire send_imm_pre, chain_pre; - reg send_imm, chain; - wire full_ctrl, read_ctrl, empty_ctrl, write_ctrl; - reg sc_pre2; - wire [33:0] fifo_line; - reg [29:0] lines_left; - reg [2:0] ibs_state; - wire now, early, late; - wire sample_fifo_in_rdy; - - setting_reg #(.my_addr(BASE)) sr_cmd - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(new_command),.changed()); - - setting_reg #(.my_addr(BASE+1)) sr_time_h - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(new_time[63:32]),.changed()); - - setting_reg #(.my_addr(BASE+2)) sr_time_l - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(new_time[31:0]),.changed(sc_pre1)); - - setting_reg #(.my_addr(BASE+3)) sr_clear - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(),.changed(clear_reg)); - - // FIFO to store commands sent from the settings bus - always @(posedge clk) - sc_pre2 <= sc_pre1; - assign write_ctrl = sc_pre1 & ~sc_pre2; - - wire [4:0] command_queue_len; - shortfifo #(.WIDTH(96)) commandfifo - (.clk(clk),.rst(reset),.clear(clear_int), - .datain({new_command,new_time}), .write(write_ctrl&~full_ctrl), .full(full_ctrl), - .dataout({send_imm_pre,chain_pre,numlines_pre,rcvtime_pre}), - .read(read_ctrl), .empty(empty_ctrl), - .occupied(command_queue_len), .space() ); + time_compare + time_compare (.time_now(vita_time), .trigger_time(send_time), .now(now), .early(early), + .late(late), .too_early(too_early)); - reg [33:0] pkt_fifo_line; - localparam IBS_IDLE = 0; - localparam IBS_WAITING = 1; - localparam IBS_RUNNING = 2; - localparam IBS_OVERRUN = 4; - localparam IBS_BROKENCHAIN = 5; - localparam IBS_LATECMD = 6; + localparam IBS_WAIT = 1; // FIXME do we need this? + localparam IBS_RUN = 2; + localparam IBS_UNDERRUN = 3; - wire signal_cmd_done = (lines_left == 1) & (~chain | (~empty_ctrl & (numlines_pre==0))); - wire signal_overrun = (ibs_state == IBS_OVERRUN); - wire signal_brokenchain = (ibs_state == IBS_BROKENCHAIN); - wire signal_latecmd = (ibs_state == IBS_LATECMD); - - // Buffer of samples for while we're writing the packet headers - wire [3:0] flags = {signal_overrun,signal_brokenchain,signal_latecmd,signal_cmd_done}; - - wire attempt_sample_write = ((run & strobe) | (ibs_state==IBS_OVERRUN) | - (ibs_state==IBS_BROKENCHAIN) | (ibs_state==IBS_LATECMD)); - - fifo_short #(.WIDTH(4+64+WIDTH)) rx_sample_fifo - (.clk(clk),.reset(reset),.clear(clear_int), - .datain({flags,vita_time,sample}), .src_rdy_i(attempt_sample_write), .dst_rdy_o(sample_fifo_in_rdy), - .dataout(sample_fifo_o), - .src_rdy_o(sample_fifo_src_rdy_o), .dst_rdy_i(sample_fifo_dst_rdy_i), - .space(), .occupied() ); - - // Inband Signalling State Machine - time_compare - time_compare (.time_now(vita_time), .trigger_time(rcvtime), .now(now), .early(early), .late(late)); - - wire too_late = late & ~send_imm; - wire go_now = now | send_imm; - wire full = ~sample_fifo_in_rdy; + reg [2:0] ibs_state; always @(posedge clk) - if(reset | clear_int) - begin - ibs_state <= IBS_IDLE; - lines_left <= 0; - rcvtime <= 0; - send_imm <= 0; - chain <= 0; - end + if(reset | clear) + ibs_state <= 0; else case(ibs_state) IBS_IDLE : - if(~empty_ctrl) - begin - lines_left <= numlines_pre; - rcvtime <= rcvtime_pre; - ibs_state <= IBS_WAITING; - send_imm <= send_imm_pre; - chain <= chain_pre; - end - IBS_WAITING : - if(go_now) - ibs_state <= IBS_RUNNING; - else if(too_late) - ibs_state <= IBS_LATECMD; - IBS_RUNNING : + if(sample_fifo_src_rdy_i) + if(~send_at | now) + ibs_state <= IBS_RUN; + else if(late | too_early) + ibs_state <= IBS_UNDERRUN; + + IBS_RUN : if(strobe) - if(full) - ibs_state <= IBS_OVERRUN; - else - begin - lines_left <= lines_left - 1; - if(lines_left == 1) - if(~chain) - ibs_state <= IBS_IDLE; - else if(empty_ctrl) - ibs_state <= IBS_BROKENCHAIN; - else - begin - lines_left <= numlines_pre; - rcvtime <= rcvtime_pre; - send_imm <= send_imm_pre; - chain <= chain_pre; - if(numlines_pre == 0) // If we are told to stop here - ibs_state <= IBS_IDLE; - else - ibs_state <= IBS_RUNNING; - end - end // else: !if(full) - IBS_OVERRUN, IBS_LATECMD, IBS_BROKENCHAIN : - if(sample_fifo_in_rdy) - ibs_state <= IBS_IDLE; - endcase // case(ibs_state) - - assign overrun = (ibs_state == IBS_OVERRUN); - assign run = (ibs_state == IBS_RUNNING); + if(~sample_fifo_src_rdy_i) + ibs_state <= IBS_UNDERRUN; + else if(eob) + ibs_state <= IBS_IDLE; + // else if(eop) FIXME do we care if the packet ends? - assign read_ctrl = ( (ibs_state == IBS_IDLE) | ((ibs_state == IBS_RUNNING) & strobe & ~full & (lines_left==1) & chain) ) - & ~empty_ctrl; - - assign debug_rx = { { ibs_state[2:0], command_queue_len }, - { 8'd0 }, - { go_now, too_late, run, strobe, read_ctrl, write_ctrl, full_ctrl, empty_ctrl }, - { 2'b0, overrun, chain_pre, sample_fifo_in_rdy, attempt_sample_write, sample_fifo_src_rdy_o,sample_fifo_dst_rdy_i} }; + IBS_UNDERRUN : + ; + endcase // case (ibs_state) + + assign sample_fifo_dst_rdy_o = (strobe & (ibs_state == IBS_RUN)); // FIXME also cleanout + assign run = (ibs_state == IBS_RUN); + assign underrun = (ibs_state == IBS_UNDERRUN); -endmodule // rx_control +endmodule // vita_tx_control diff --git a/vrt/vita_tx_tb.v b/vrt/vita_tx_tb.v index 62532c07c..90986a35f 100644 --- a/vrt/vita_tx_tb.v +++ b/vrt/vita_tx_tb.v @@ -17,7 +17,7 @@ module vita_tx_tb; initial $dumpfile("vita_tx_tb.vcd"); initial $dumpvars(0,vita_tx_tb); - wire [(MAXCHAN*32)-1:0] sample; + wire [(MAXCHAN*32)-1:0] sample, sample_tx; wire strobe, run; wire [35:0] data_o; wire src_rdy; @@ -42,7 +42,7 @@ module vita_tx_tb; //wire [99:0] sample_data_o; wire [64+4+(MAXCHAN*32)-1:0] sample_data_o, sample_data_tx; - time_64bit #(.TICKS_PER_SEC(120000000), .BASE(0)) time_64bit + time_64bit #(.TICKS_PER_SEC(100000000), .BASE(0)) time_64bit (.clk(clk), .rst(reset), .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), .pps(0), .vita_time(vita_time)); @@ -86,8 +86,16 @@ module vita_tx_tb; .sample_fifo_dst_rdy_i(sample_dst_rdy_tx), .sample_fifo_src_rdy_o(sample_src_rdy_tx), .fifo_occupied(), .fifo_full(), .fifo_empty() ); + vita_tx_control #(.BASE(16), .WIDTH(MAXCHAN*32)) vita_tx_control + (.clk(clk), .reset(reset), .clear(0), + .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), + .vita_time(vita_time-100), .underrun(underrun), + .sample_fifo_i(sample_data_tx), + .sample_fifo_dst_rdy_o(sample_dst_rdy_tx), .sample_fifo_src_rdy_i(sample_src_rdy_tx), + .sample(sample_tx), .run(run_tx), .strobe(strobe_tx)); + tx_dsp_model tx_dsp_model - (.clk(clk), .reset(reset), .run(run), .interp(INTERP), .strobe(strobe), .sample(sample[31:0] )); + (.clk(clk), .reset(reset), .run(run_tx), .interp(INTERP), .strobe(strobe_tx), .sample(sample_tx[31:0] )); always @(posedge clk) if(src_rdy & dst_rdy) @@ -120,6 +128,8 @@ module vita_tx_tb; write_setting(6,32'h98765432); // VITA trailer write_setting(7,8); // Samples per VITA packet write_setting(8,NUMCHAN); // Samples per VITA packet + #10000; + queue_rx_cmd(1,0,8,32'h0,32'h0); // send imm, single packet /* queue_rx_cmd(1,0,16,32'h0,32'h0); // send imm, 2 packets worth |