diff options
| -rw-r--r-- | usrp2/control_lib/newfifo/.gitignore | 2 | ||||
| -rw-r--r-- | usrp2/control_lib/newfifo/packet_generator.v | 59 | ||||
| -rw-r--r-- | usrp2/control_lib/newfifo/packet_tb.v | 29 | ||||
| -rw-r--r-- | usrp2/control_lib/newfifo/packet_verifier.v | 63 | 
4 files changed, 153 insertions, 0 deletions
| diff --git a/usrp2/control_lib/newfifo/.gitignore b/usrp2/control_lib/newfifo/.gitignore index cba7efc8e..866f1faad 100644 --- a/usrp2/control_lib/newfifo/.gitignore +++ b/usrp2/control_lib/newfifo/.gitignore @@ -1 +1,3 @@ +*.vcd +*.lxt  a.out diff --git a/usrp2/control_lib/newfifo/packet_generator.v b/usrp2/control_lib/newfifo/packet_generator.v new file mode 100644 index 000000000..e5bfe5b26 --- /dev/null +++ b/usrp2/control_lib/newfifo/packet_generator.v @@ -0,0 +1,59 @@ + + +module packet_generator +  (input clk, input reset, input clear, +   output reg [7:0] data_o, output sof_o, output eof_o,  +   output src_rdy_o, input dst_rdy_i); + +   localparam len = 32'd100; + +   reg [31:0] state; +   reg [31:0] seq; +   wire [31:0] crc_out; +   wire        calc_crc = src_rdy_o & dst_rdy_i & ~(state[31:2] == 30'h3FFF_FFFF); +    +	 +   always @(posedge clk) +     if(reset | clear) +       seq <= 0; +     else +       if(eof_o & src_rdy_o & dst_rdy_i) +	 seq <= seq + 1; +    +   always @(posedge clk) +     if(reset | clear) +       state <= 0; +     else +       if(src_rdy_o & dst_rdy_i) +	 if(state == (len - 1)) +	   state <= 32'hFFFF_FFFC; +	 else +	   state <= state + 1; + +   always @* +     case(state) +       0 :   data_o <= len[7:0]; +       1 :   data_o <= len[15:8]; +       2 :   data_o <= len[23:16]; +       3 :   data_o <= len[31:24]; +       4 :   data_o <= seq[7:0]; +       5 :   data_o <= seq[15:8]; +       6 :   data_o <= seq[23:16]; +       7 :   data_o <= seq[31:24]; +       32'hFFFF_FFFC : data_o <= crc_out[31:24]; +       32'hFFFF_FFFD : data_o <= crc_out[23:16]; +       32'hFFFF_FFFE : data_o <= crc_out[15:8]; +       32'hFFFF_FFFF : data_o <= crc_out[7:0]; +       default : data_o <= state[7:0]; +     endcase // case (state) +    +   assign src_rdy_o = 1; +   assign sof_o = (state == 0); +   assign eof_o = (state == 32'hFFFF_FFFF); + +   wire        clear_crc = eof_o & src_rdy_o & dst_rdy_i; +    +   crc crc(.clk(clk), .reset(reset), .clear(clear_crc), .data(data_o),  +	   .calc(calc_crc), .crc_out(crc_out), .match()); +    +endmodule // packet_generator diff --git a/usrp2/control_lib/newfifo/packet_tb.v b/usrp2/control_lib/newfifo/packet_tb.v new file mode 100644 index 000000000..3c423d2ba --- /dev/null +++ b/usrp2/control_lib/newfifo/packet_tb.v @@ -0,0 +1,29 @@ + + +module packet_tb(); + +   wire [7:0] data; +   wire       sof, eof, src_rdy, dst_rdy; + +   wire       clear = 0; +   reg 	      clk = 0; +   reg 	      reset = 1; + +   always #10 clk <= ~clk; +   initial #1000 reset <= 0; + +   initial $dumpfile("packet_tb.vcd"); +   initial $dumpvars(0,packet_tb); + +   wire [31:0] total, crc_err, seq_err, len_err; +    +   packet_generator pkt_gen (.clk(clk), .reset(reset), .clear(clear), +			     .data_o(data), .sof_o(sof), .eof_o(eof), +			     .src_rdy_o(src_rdy), .dst_rdy_i(dst_rdy)); + +   packet_verifier pkt_ver (.clk(clk), .reset(reset), .clear(clear), +			    .data_i(data), .sof_i(sof), .eof_i(eof), +			    .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy), +			    .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err)); + +endmodule // packet_tb diff --git a/usrp2/control_lib/newfifo/packet_verifier.v b/usrp2/control_lib/newfifo/packet_verifier.v new file mode 100644 index 000000000..22c924198 --- /dev/null +++ b/usrp2/control_lib/newfifo/packet_verifier.v @@ -0,0 +1,63 @@ + + +// Packet format -- +//    Line 1 -- Length, 32 bits +//    Line 2 -- Sequence number, 32 bits +//    Last line -- CRC, 32 bits + +module packet_verifier +  (input clk, input reset, input clear, +   input [7:0] data_i, input sof_i, output eof_i, input src_rdy_i, output dst_rdy_o, + +   output reg [31:0] total,  +   output reg [31:0] crc_err,  +   output reg [31:0] seq_err,  +   output reg [31:0] len_err); + +   assign dst_rdy_o = ~last_byte_d1; + +   reg [31:0] 	     seq_num; +   reg [31:0] 	     length; + +   wire 	     calc_crc = src_rdy_i & dst_rdy_o; +    +   crc crc(.clk(clk), .reset(reset), .clear(last_byte_d1), .data(data_i),  +	   .calc(calc_crc), .crc_out(), .match(match_crc)); + +   wire 	     first_byte, last_byte; +   reg 		     second_byte, last_byte_d1; + +   assign first_byte = src_rdy_i & dst_rdy_o & sof_i; +   assign last_byte = src_rdy_i & dst_rdy_o & eof_i; + +   // stubs for now +   wire 	     match_seq = 1; +   wire 	     match_len = 1; +    +   always @(posedge clk) +     if(reset | clear) +       last_byte_d1 <= 0; +     else  +       last_byte_d1 <= last_byte; + +   always @(posedge clk) +     if(reset | clear) +       begin +	  total <= 0; +	  crc_err <= 0; +	  seq_err <= 0; +	  len_err <= 0; +       end +     else +       if(last_byte_d1) +	 begin +	    total <= total + 1; +	    if(~match_crc) +	      crc_err <= crc_err + 1; +	    else if(~match_seq) +	      seq_err <= seq_err + 1; +	    else if(~match_len) +	      seq_err <= len_err + 1; +	 end +    +endmodule // packet_verifier | 
