diff options
author | Matt Ettus <matt@ettus.com> | 2011-03-04 12:19:08 -0800 |
---|---|---|
committer | Matt Ettus <matt@ettus.com> | 2011-03-04 12:19:08 -0800 |
commit | aed2e0d4c6f379f1a9b6e2bf8ae950661f6027bb (patch) | |
tree | 32b16abbbdc815fda9c770e4e326955e470b6987 /usrp2/fifo | |
parent | 05016c236b82ec49e2d7a7745a572cc0d7f7e72e (diff) | |
download | uhd-aed2e0d4c6f379f1a9b6e2bf8ae950661f6027bb.tar.gz uhd-aed2e0d4c6f379f1a9b6e2bf8ae950661f6027bb.tar.bz2 uhd-aed2e0d4c6f379f1a9b6e2bf8ae950661f6027bb.zip |
u2/u2p: allow cpu to receive or send packets longer than the buffer size.
on reception, the rest is dropped. On sending, the rest is a repeat of the buffer.
Diffstat (limited to 'usrp2/fifo')
-rw-r--r-- | usrp2/fifo/buffer_int2.v | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/usrp2/fifo/buffer_int2.v b/usrp2/fifo/buffer_int2.v index c73456b74..532980aa2 100644 --- a/usrp2/fifo/buffer_int2.v +++ b/usrp2/fifo/buffer_int2.v @@ -31,14 +31,15 @@ module buffer_int2 input rd_ready_i ); - reg [BUF_SIZE-1:0] rd_addr, wr_addr; - wire [BUF_SIZE-1:0] rd_addr_next = rd_addr + 1; + reg [15:0] rd_addr, wr_addr; // Handle pkt bigger than buffer + wire [15:0] rd_addr_next = rd_addr + 1; + reg [15:0] rd_length; + wire [31:0] ctrl; wire wr_done, wr_error, wr_idle; wire rd_done, rd_error, rd_idle; wire we, en, go; - reg [BUF_SIZE-1:0] rd_length; wire read = ctrl[3]; wire rd_clear = ctrl[2]; wire write = ctrl[1]; @@ -73,7 +74,7 @@ module buffer_int2 begin rd_addr <= 0; rd_state <= PRE_READ; - rd_length <= ctrl[15+BUF_SIZE:16]; + rd_length <= ctrl[31:16]; end PRE_READ : @@ -146,17 +147,19 @@ module buffer_int2 assign rd_idle = (rd_state == IDLE); assign wr_idle = (wr_state == IDLE); + wire [BUF_SIZE-1:0] wr_addr_clip = (|wr_addr[15:BUF_SIZE]) ? {BUF_SIZE{1'b1}} : wr_addr[BUF_SIZE-1:0]; + ram_2port #(.DWIDTH(32),.AWIDTH(BUF_SIZE)) buffer_in // CPU reads here (.clka(wb_clk_i),.ena(wb_stb_i),.wea(1'b0), .addra(wb_adr_i[BUF_SIZE+1:2]),.dia(0),.doa(wb_dat_o), .clkb(clk),.enb(1'b1),.web(we), - .addrb(wr_addr),.dib(wr_data_i[31:0]),.dob()); + .addrb(wr_addr_clip),.dib(wr_data_i[31:0]),.dob()); ram_2port #(.DWIDTH(32),.AWIDTH(BUF_SIZE)) buffer_out // CPU writes here (.clka(wb_clk_i),.ena(wb_stb_i),.wea(wb_we_i), .addra(wb_adr_i[BUF_SIZE+1:2]),.dia(wb_dat_i),.doa(), .clkb(clk),.enb(en),.web(1'b0), - .addrb(rd_addr),.dib(0),.dob(rd_data_o[31:0])); + .addrb(rd_addr[BUF_SIZE-1:0]),.dib(0),.dob(rd_data_o[31:0])); always @(posedge wb_clk_i) if(wb_rst_i) @@ -168,7 +171,7 @@ module buffer_int2 sreg(.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),.in(set_data), .out(ctrl),.changed(go)); - assign status = { {(16-BUF_SIZE){1'b0}},wr_addr, + assign status = { wr_addr, 8'b0,1'b0,rd_idle,rd_error,rd_done, 1'b0,wr_idle,wr_error,wr_done}; endmodule // buffer_int2 |