diff options
author | Matt Ettus <matt@ettus.com> | 2010-07-19 15:27:28 -0700 |
---|---|---|
committer | Matt Ettus <matt@ettus.com> | 2010-07-19 15:27:28 -0700 |
commit | ea087cc9fbd19ff05893178ea4395cf0f47af61b (patch) | |
tree | 4031192430dbc40bf6430fbe530a3e11348bbc0f /usrp2/fifo/fifo36_demux.v | |
parent | 5922f348e19fd477c311c0cadef4eb5d3a17d4c6 (diff) | |
parent | 33083078546a910268ee404fc592c7df31451ebc (diff) | |
download | uhd-ea087cc9fbd19ff05893178ea4395cf0f47af61b.tar.gz uhd-ea087cc9fbd19ff05893178ea4395cf0f47af61b.tar.bz2 uhd-ea087cc9fbd19ff05893178ea4395cf0f47af61b.zip |
Merge branch 'ise12' into u1e
* ise12:
move declaration ahead of use
put run_tx and run_rx on the displayed LEDs
remove warnings
add mux and demux to build
mux multiple fifo streams into one. Allows priority or round robin
split fifo into 2 streams based on first line in each packet
precompute udp checksums
barely fails timing on gigE/10 and gigE/12, larger fail on udp/10, but all seem to work ok
Diffstat (limited to 'usrp2/fifo/fifo36_demux.v')
-rw-r--r-- | usrp2/fifo/fifo36_demux.v | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/usrp2/fifo/fifo36_demux.v b/usrp2/fifo/fifo36_demux.v new file mode 100644 index 000000000..a54759d4d --- /dev/null +++ b/usrp2/fifo/fifo36_demux.v @@ -0,0 +1,50 @@ + +// Demux packets from a fifo based on the contents of the first line +// If first line matches the parameter and mask, send to data1, otherwise send to data0 + +module fifo36_demux + #(parameter match_data = 0, + parameter match_mask = 0) + (input clk, input reset, input clear, + input [35:0] data_i, input src_rdy_i, output dst_rdy_o, + output [35:0] data0_o, output src0_rdy_o, input dst0_rdy_i, + output [35:0] data1_o, output src1_rdy_o, input dst1_rdy_i); + + localparam DMX_IDLE = 0; + localparam DMX_DATA0 = 1; + localparam DMX_DATA1 = 2; + + reg [1:0] state; + + wire match = |( (data_i ^ match_data) & match_mask ); + wire eof = data_i[33]; + + always @(posedge clk) + if(reset | clear) + state <= DMX_IDLE; + else + case(state) + DMX_IDLE : + if(src_rdy_i) + if(match) + state <= DMX_DATA1; + else + state <= DMX_DATA0; + DMX_DATA0 : + if(src_rdy_i & dst0_rdy_i & eof) + state <= DMX_IDLE; + DMX_DATA1 : + if(src_rdy_i & dst1_rdy_i & eof) + state <= DMX_IDLE; + default : + state <= DMX_IDLE; + endcase // case (state) + + assign dst_rdy_o = (state==DMX_IDLE) ? 0 : (state==DMX_DATA0) ? dst0_rdy_i : dst1_rdy_i; + assign src0_rdy_o = (state==DMX_DATA0) ? src_rdy_i : 0; + assign src1_rdy_o = (state==DMX_DATA1) ? src_rdy_i : 0; + + assign data0_o = data_i; + assign data1_o = data_i; + +endmodule // fifo36_demux |