diff options
author | Josh Blum <josh@joshknows.com> | 2010-11-18 12:54:40 -0800 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2010-11-23 19:06:58 -0800 |
commit | 4e5a340bb824b78d5101ed190eb688a300556df2 (patch) | |
tree | 122d6375b70af6ca50f6cba1ba515a4ceebd4740 /usrp2/fifo/packet_router.v | |
parent | cab6fce99c429cf30946c4a2ace4083a0cd89267 (diff) | |
download | uhd-4e5a340bb824b78d5101ed190eb688a300556df2.tar.gz uhd-4e5a340bb824b78d5101ed190eb688a300556df2.tar.bz2 uhd-4e5a340bb824b78d5101ed190eb688a300556df2.zip |
packet_router: use BRAM enables to perform pipelined reads
Diffstat (limited to 'usrp2/fifo/packet_router.v')
-rw-r--r-- | usrp2/fifo/packet_router.v | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/usrp2/fifo/packet_router.v b/usrp2/fifo/packet_router.v index 595ec2015..d78e48523 100644 --- a/usrp2/fifo/packet_router.v +++ b/usrp2/fifo/packet_router.v @@ -249,12 +249,11 @@ module packet_router reg [BUF_SIZE-1:0] cpu_inp_line_count_reg; assign cpu_inp_data[35:32] = - (cpu_inp_addr == 0 )? 4'b0001 : ( - (cpu_inp_addr_next == cpu_inp_line_count_reg)? 4'b0010 : ( + (cpu_inp_addr == 0 )? 4'b0001 : ( + (cpu_inp_addr == cpu_inp_line_count_reg)? 4'b0010 : ( 4'b0000)); - reg cpu_inp_valid_reg; - assign cpu_inp_valid = cpu_inp_valid_reg; + assign cpu_inp_valid = (cpu_inp_state == CPU_INP_STATE_UNLOAD)? 1'b1 : 1'b0; assign cpu_inp_hs_stat = (cpu_inp_state == CPU_INP_STATE_WAIT_CTRL_HI)? 1'b1 : 1'b0; RAMB16_S36_S36 cpu_inp_buff( @@ -263,14 +262,13 @@ module packet_router .ENA(wb_stb_i & (which_buf == 1'b1)),.SSRA(0),.WEA(wb_we_i), //port B = packet router interface from CPU (output only) .DOB(cpu_inp_data[31:0]),.ADDRB(cpu_inp_addr),.CLKB(stream_clk),.DIB(36'b0),.DIPB(4'h0), - .ENB(1'b1),.SSRB(0),.WEB(1'b0) + .ENB(cpu_inp_ready & cpu_inp_valid),.SSRB(0),.WEB(1'b0) ); always @(posedge stream_clk) if(stream_rst) begin cpu_inp_state <= CPU_INP_STATE_WAIT_CTRL_HI; cpu_inp_addr <= 0; - cpu_inp_valid_reg <= 1'b0; end else begin case(cpu_inp_state) @@ -284,6 +282,7 @@ module packet_router CPU_INP_STATE_WAIT_CTRL_LO: begin if (cpu_inp_hs_ctrl == 1'b0) begin cpu_inp_state <= CPU_INP_STATE_UNLOAD; + cpu_inp_addr <= cpu_inp_addr_next; end end @@ -296,10 +295,6 @@ module packet_router else begin cpu_inp_addr <= cpu_inp_addr_next; end - cpu_inp_valid_reg <= 1'b0; - end - else begin - cpu_inp_valid_reg <= 1'b1; end end @@ -330,13 +325,15 @@ module packet_router reg [35:0] com_insp_dregs [COM_INSP_MAX_NUM_DREGS-1:0]; //Inspection logic: - wire com_inp_dregs_is_data = 1'b1 + wire com_inp_dregs_is_dsp = 1'b1 & (com_insp_dregs[3][15:0] == 16'h800) //ethertype IPv4 & (com_insp_dregs[6][23:16] == 8'h11) //protocol UDP & (com_insp_dregs[9][15:0] == 16'd49153) //UDP data port & (com_inp_data[31:0] != 32'h0) //VRT hdr non-zero ; + wire com_inp_dregs_is_ser = 1'b0; + //Inspector output flags special case: //Inject SOF into flags at first DSP line. wire [3:0] com_insp_out_flags = ((com_insp_dreg_count == COM_INSP_DREGS_DSP_OFFSET) & (com_insp_dest == COM_INSP_DEST_DSP))? @@ -399,11 +396,16 @@ module packet_router COM_INSP_STATE_READ_COM: begin if (com_inp_ready & com_inp_valid) begin com_insp_dregs[com_insp_dreg_count] <= com_inp_data; - if (com_inp_dregs_is_data & com_insp_dreg_counter_done) begin + if (com_inp_dregs_is_dsp & com_insp_dreg_counter_done) begin com_insp_dest <= COM_INSP_DEST_DSP; com_insp_state <= COM_INSP_STATE_WRITE_REGS; com_insp_dreg_count <= COM_INSP_DREGS_DSP_OFFSET; end + else if (com_inp_dregs_is_ser & com_insp_dreg_counter_done) begin + com_insp_dest <= COM_INSP_DEST_SER; + com_insp_state <= COM_INSP_STATE_WRITE_REGS; + com_insp_dreg_count <= 0; + end else if (com_inp_data[33] | com_insp_dreg_counter_done) begin com_insp_dest <= COM_INSP_DEST_CPU; com_insp_state <= COM_INSP_STATE_WRITE_REGS; @@ -455,7 +457,6 @@ module packet_router reg [BUF_SIZE-1:0] dsp_frm_addr; reg [BUF_SIZE-1:0] dsp_frm_count; wire [BUF_SIZE-1:0] dsp_frm_addr_next = dsp_frm_addr + 1'b1; - reg dsp_frm_valid_reg; //registered valid to deal with read delay //DSP input stream ready in the following states assign dsp_inp_ready = @@ -469,9 +470,12 @@ module packet_router wire [15:0] dsp_frm_bytes = {dsp_frm_count, 2'b00}; assign dsp_frm_data = (dsp_frm_state == DSP_FRM_STATE_WRITE_HDR)? {4'b0001, 16'b1, dsp_frm_bytes} : ( - (dsp_frm_addr_next == dsp_frm_count) ? {4'b0010, dsp_frm_data_bram} : ( + (dsp_frm_addr == dsp_frm_count) ? {4'b0010, dsp_frm_data_bram} : ( {4'b0000, dsp_frm_data_bram})); - assign dsp_frm_valid = dsp_frm_valid_reg; + assign dsp_frm_valid = ( + (dsp_frm_state == DSP_FRM_STATE_WRITE_HDR) | + (dsp_frm_state == DSP_FRM_STATE_WRITE) + )? 1'b1 : 1'b0; RAMB16_S36_S36 dsp_frm_buff( //port A = DSP input interface (writes to BRAM) @@ -479,14 +483,13 @@ module packet_router .ENA(dsp_inp_ready),.SSRA(0),.WEA(dsp_inp_ready), //port B = DSP framer interface (reads from BRAM) .DOB(dsp_frm_data_bram),.ADDRB(dsp_frm_addr),.CLKB(stream_clk),.DIB(36'b0),.DIPB(4'h0), - .ENB(1'b1),.SSRB(0),.WEB(1'b0) + .ENB(dsp_frm_ready & dsp_frm_valid),.SSRB(0),.WEB(1'b0) ); always @(posedge stream_clk) if(stream_rst) begin dsp_frm_state <= DSP_FRM_STATE_WAIT_SOF; dsp_frm_addr <= 0; - dsp_frm_valid_reg <= 1'b0; end else begin case(dsp_frm_state) @@ -512,12 +515,8 @@ module packet_router DSP_FRM_STATE_WRITE_HDR: begin if (dsp_frm_ready & dsp_frm_valid) begin - dsp_frm_addr <= 0; + dsp_frm_addr <= dsp_frm_addr_next; dsp_frm_state <= DSP_FRM_STATE_WRITE; - dsp_frm_valid_reg <= 1'b0; - end - else begin - dsp_frm_valid_reg <= 1'b1; end end @@ -530,10 +529,6 @@ module packet_router else begin dsp_frm_addr <= dsp_frm_addr_next; end - dsp_frm_valid_reg <= 1'b0; - end - else begin - dsp_frm_valid_reg <= 1'b1; end end endcase //dsp_frm_state |