root / usrp2 / fifo / fifo36_demux.v @ d8aae182
History | View | Annotate | Download (1.38 KB)
| 1 | 547e1e69 | Matt Ettus | |
|---|---|---|---|
| 2 | // Demux packets from a fifo based on the contents of the first line |
||
| 3 | // If first line matches the parameter and mask, send to data1, otherwise send to data0 |
||
| 4 | |||
| 5 | module fifo36_demux |
||
| 6 | #(parameter match_data = 0, |
||
| 7 | parameter match_mask = 0) |
||
| 8 | (input clk, input reset, input clear, |
||
| 9 | input [35:0] data_i, input src_rdy_i, output dst_rdy_o, |
||
| 10 | output [35:0] data0_o, output src0_rdy_o, input dst0_rdy_i, |
||
| 11 | output [35:0] data1_o, output src1_rdy_o, input dst1_rdy_i); |
||
| 12 | |||
| 13 | localparam DMX_IDLE = 0; |
||
| 14 | localparam DMX_DATA0 = 1; |
||
| 15 | localparam DMX_DATA1 = 2; |
||
| 16 | |||
| 17 | reg [1:0] state; |
||
| 18 | |||
| 19 | wire match = |( (data_i ^ match_data) & match_mask ); |
||
| 20 | wire eof = data_i[33]; |
||
| 21 | |||
| 22 | always @(posedge clk) |
||
| 23 | if(reset | clear) |
||
| 24 | state <= DMX_IDLE; |
||
| 25 | else |
||
| 26 | case(state) |
||
| 27 | DMX_IDLE : |
||
| 28 | if(src_rdy_i) |
||
| 29 | if(match) |
||
| 30 | state <= DMX_DATA1; |
||
| 31 | else |
||
| 32 | state <= DMX_DATA0; |
||
| 33 | DMX_DATA0 : |
||
| 34 | if(src_rdy_i & dst0_rdy_i & eof) |
||
| 35 | state <= DMX_IDLE; |
||
| 36 | DMX_DATA1 : |
||
| 37 | if(src_rdy_i & dst1_rdy_i & eof) |
||
| 38 | state <= DMX_IDLE; |
||
| 39 | default : |
||
| 40 | state <= DMX_IDLE; |
||
| 41 | endcase // case (state) |
||
| 42 | |||
| 43 | assign dst_rdy_o = (state==DMX_IDLE) ? 0 : (state==DMX_DATA0) ? dst0_rdy_i : dst1_rdy_i; |
||
| 44 | assign src0_rdy_o = (state==DMX_DATA0) ? src_rdy_i : 0; |
||
| 45 | assign src1_rdy_o = (state==DMX_DATA1) ? src_rdy_i : 0; |
||
| 46 | |||
| 47 | assign data0_o = data_i; |
||
| 48 | assign data1_o = data_i; |
||
| 49 | |||
| 50 | endmodule // fifo36_demux |