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 | |
| 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
| -rw-r--r-- | usrp2/control_lib/Makefile.srcs | 1 | ||||
| -rw-r--r-- | usrp2/fifo/Makefile.srcs | 2 | ||||
| -rw-r--r-- | usrp2/fifo/fifo36_demux.v | 50 | ||||
| -rw-r--r-- | usrp2/fifo/fifo36_mux.v | 57 | ||||
| -rw-r--r-- | usrp2/sdr_lib/dsp_core_tx.v | 4 | ||||
| -rwxr-xr-x[-rw-r--r--] | usrp2/top/u2_rev3/u2_core.v | 3 | ||||
| -rw-r--r-- | usrp2/top/u2_rev3/u2_core_udp.v | 70 | ||||
| -rw-r--r-- | usrp2/udp/prot_eng_tx.v | 19 | ||||
| -rw-r--r-- | usrp2/vrt/vita_tx_deframer.v | 2 | 
9 files changed, 163 insertions, 45 deletions
| diff --git a/usrp2/control_lib/Makefile.srcs b/usrp2/control_lib/Makefile.srcs index 095890d59..383ed97d8 100644 --- a/usrp2/control_lib/Makefile.srcs +++ b/usrp2/control_lib/Makefile.srcs @@ -20,6 +20,7 @@ mux8.v \  nsgpio.v \  ram_2port.v \  ram_harv_cache.v \ +ram_harvard.v \  ram_loader.v \  setting_reg.v \  settings_bus.v \ diff --git a/usrp2/fifo/Makefile.srcs b/usrp2/fifo/Makefile.srcs index 22867da7e..c66979132 100644 --- a/usrp2/fifo/Makefile.srcs +++ b/usrp2/fifo/Makefile.srcs @@ -20,4 +20,6 @@ fifo19_to_ll8.v \  ll8_to_fifo19.v \  fifo36_to_fifo19.v \  fifo19_to_fifo36.v \ +fifo36_mux.v \ +fifo36_demux.v \  )) 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 diff --git a/usrp2/fifo/fifo36_mux.v b/usrp2/fifo/fifo36_mux.v new file mode 100644 index 000000000..04ec5abe8 --- /dev/null +++ b/usrp2/fifo/fifo36_mux.v @@ -0,0 +1,57 @@ + +// Mux packets from multiple FIFO interfaces onto a single one. +//  Can alternate or give priority to one port (port 0) +//  In prio mode, port 1 will never get access if port 0 is always busy + +module fifo36_mux +  #(parameter prio = 0) +   (input clk, input reset, input clear, +    input [35:0] data0_i, input src0_rdy_i, output dst0_rdy_o, +    input [35:0] data1_i, input src1_rdy_i, output dst1_rdy_o, +    output [35:0] data_o, output src_rdy_o, input dst_rdy_i); + +   localparam MUX_IDLE0 = 0; +   localparam MUX_DATA0 = 1; +   localparam MUX_IDLE1 = 2; +   localparam MUX_DATA1 = 3; +    +   reg [1:0] 	  state; + +   wire 	  eof0 = data0_i[33]; +   wire 	  eof1 = data1_i[33]; +    +   always @(posedge clk) +     if(reset | clear) +       state <= MUX_IDLE0; +     else +       case(state) +	 MUX_IDLE0 : +	   if(src0_rdy_i) +	     state <= MUX_DATA0; +	   else if(src1_rdy_i) +	     state <= MUX_DATA1; + +	 MUX_DATA0 : +	   if(src0_rdy_i & dst_rdy_i & eof0) +	     state <= prio ? MUX_IDLE0 : MUX_IDLE1; + +	 MUX_IDLE1 : +	   if(src1_rdy_i) +	     state <= MUX_DATA1; +	   else if(src0_rdy_i) +	     state <= MUX_DATA0; +	    +	 MUX_DATA1 : +	   if(src1_rdy_i & dst_rdy_i & eof1) +	     state <= MUX_IDLE0; +	  +	 default : +	   state <= MUX_IDLE0; +       endcase // case (state) + +   assign dst0_rdy_o = (state==MUX_DATA0) ? dst_rdy_i : 0; +   assign dst1_rdy_o = (state==MUX_DATA1) ? dst_rdy_i : 0; +   assign src_rdy_o = (state==MUX_DATA0) ? src0_rdy_i : (state==MUX_DATA1) ? src1_rdy_i : 0; +   assign data_0 = (state==MUX_DATA0) ? data0_i : data1_i; +    +endmodule // fifo36_demux diff --git a/usrp2/sdr_lib/dsp_core_tx.v b/usrp2/sdr_lib/dsp_core_tx.v index 22d3d44a3..79d92c9b3 100644 --- a/usrp2/sdr_lib/dsp_core_tx.v +++ b/usrp2/sdr_lib/dsp_core_tx.v @@ -29,11 +29,11 @@ module dsp_core_tx       (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),        .in(set_data),.out({scale_i,scale_q}),.changed()); -   setting_reg #(.my_addr(BASE+2)) sr_2 +   setting_reg #(.my_addr(BASE+2), .width(10)) sr_2       (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),        .in(set_data),.out({enable_hb1, enable_hb2, interp_rate}),.changed()); -   setting_reg #(.my_addr(BASE+4)) sr_4 +   setting_reg #(.my_addr(BASE+4), .width(8)) sr_4       (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),        .in(set_data),.out({dacmux_b,dacmux_a}),.changed()); diff --git a/usrp2/top/u2_rev3/u2_core.v b/usrp2/top/u2_rev3/u2_core.v index f669d9a82..9ba3cc136 100644..100755 --- a/usrp2/top/u2_rev3/u2_core.v +++ b/usrp2/top/u2_rev3/u2_core.v @@ -622,7 +622,7 @@ module u2_core     // ///////////////////////////////////////////////////////////////////////////////////     // External RAM Interface - +/*     localparam PAGE_SIZE = 10;  // PAGE SIZE is in bytes, 10 = 1024 bytes     wire [15:0] bus2ram, ram2bus; @@ -650,6 +650,7 @@ module u2_core        .sram_bw(),.sram_adv(RAM_LDn),.sram_ce(RAM_CENn),.sram_oe(RAM_OEn),        .sram_mode(),.sram_zz() ); +*/     assign      RAM_CE1n = 0;     assign      RAM_D[17:16] = 2'bzz; diff --git a/usrp2/top/u2_rev3/u2_core_udp.v b/usrp2/top/u2_rev3/u2_core_udp.v index cb0ed78c7..b034791a7 100644 --- a/usrp2/top/u2_rev3/u2_core_udp.v +++ b/usrp2/top/u2_rev3/u2_core_udp.v @@ -180,6 +180,11 @@ module u2_core     wire [31:0] 	irq;     wire [63:0] 	vita_time; +   wire 	 run_rx, run_tx; +   reg 		 run_rx_d1; +   always @(posedge dsp_clk) +     run_rx_d1 <= run_rx; +        // ///////////////////////////////////////////////////////////////////////////////////////////////     // Wishbone Single Master INTERCON     localparam 	dw = 32;  // Data bus width @@ -279,33 +284,33 @@ module u2_core     // ///////////////////////////////////////////////////////////////////     // RAM Loader -   wire [31:0] 	 ram_loader_dat, iwb_dat; -   wire [15:0] 	 ram_loader_adr, iwb_adr; +   wire [31:0] 	 ram_loader_dat, if_dat; +   wire [15:0] 	 ram_loader_adr; +   wire [14:0] 	 if_adr;     wire [3:0] 	 ram_loader_sel; -   wire 	 ram_loader_stb, ram_loader_we, ram_loader_ack; +   wire 	 ram_loader_stb, ram_loader_we;     wire 	 iwb_ack, iwb_stb;     ram_loader #(.AWIDTH(16),.RAM_SIZE(RAM_SIZE)) -     ram_loader (.clk_i(wb_clk),.rst_i(ram_loader_rst), +     ram_loader (.wb_clk(wb_clk),.dsp_clk(dsp_clk),.ram_loader_rst(ram_loader_rst), +		 .wb_dat(ram_loader_dat),.wb_adr(ram_loader_adr), +		 .wb_stb(ram_loader_stb),.wb_sel(ram_loader_sel), +		 .wb_we(ram_loader_we), +		 .ram_loader_done(ram_loader_done),  		 // CPLD Interface -		 .cfg_clk_i(cpld_clk), -		 .cfg_data_i(cpld_din), -		 .start_o(cpld_start_int), -		 .mode_o(cpld_mode_int), -		 .done_o(cpld_done_int), -		 .detached_i(cpld_detached), -		 // Wishbone Interface -		 .wb_dat_o(ram_loader_dat),.wb_adr_o(ram_loader_adr), -		 .wb_stb_o(ram_loader_stb),.wb_cyc_o(),.wb_sel_o(ram_loader_sel), -		 .wb_we_o(ram_loader_we),.wb_ack_i(ram_loader_ack), -		 .ram_loader_done_o(ram_loader_done)); - +		 .cpld_clk(cpld_clk), +		 .cpld_din(cpld_din), +		 .cpld_start(cpld_start_int), +		 .cpld_mode(cpld_mode_int), +		 .cpld_done(cpld_done_int), +		 .cpld_detached(cpld_detached)); +        // /////////////////////////////////////////////////////////////////////////     // Processor     aeMB_core_BE #(.ISIZ(16),.DSIZ(16),.MUL(0),.BSF(1))       aeMB (.sys_clk_i(wb_clk), .sys_rst_i(wb_rst),  	   // Instruction Wishbone bus to I-RAM -	   .iwb_stb_o(iwb_stb),.iwb_adr_o(iwb_adr), -	   .iwb_dat_i(iwb_dat),.iwb_ack_i(iwb_ack), +	   .if_adr(if_adr), +	   .if_dat(if_dat),  	   // Data Wishbone bus to system bus fabric  	   .dwb_we_o(m0_we),.dwb_stb_o(m0_stb),.dwb_dat_o(m0_dat_i),.dwb_adr_o(m0_adr),  	   .dwb_dat_i(m0_dat_o),.dwb_ack_i(m0_ack),.dwb_sel_o(m0_sel),.dwb_cyc_o(m0_cyc), @@ -319,16 +324,16 @@ module u2_core     // I-port connects directly to processor and ram loader     wire 	 flush_icache; -   ram_harv_cache #(.AWIDTH(15),.RAM_SIZE(RAM_SIZE),.ICWIDTH(7),.DCWIDTH(6)) +   ram_harvard #(.AWIDTH(15),.RAM_SIZE(RAM_SIZE),.ICWIDTH(7),.DCWIDTH(6))       sys_ram(.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),  	     .ram_loader_adr_i(ram_loader_adr[14:0]), .ram_loader_dat_i(ram_loader_dat),  	     .ram_loader_stb_i(ram_loader_stb), .ram_loader_sel_i(ram_loader_sel), -	     .ram_loader_we_i(ram_loader_we), .ram_loader_ack_o(ram_loader_ack), +	     .ram_loader_we_i(ram_loader_we),  	     .ram_loader_done_i(ram_loader_done), -	     .iwb_adr_i(iwb_adr[14:0]), .iwb_stb_i(iwb_stb), -	     .iwb_dat_o(iwb_dat), .iwb_ack_o(iwb_ack), +	     .if_adr(if_adr),  +	     .if_data(if_dat),   	     .dwb_adr_i(s0_adr[14:0]), .dwb_dat_i(s0_dat_o), .dwb_dat_o(s0_dat_i),  	     .dwb_we_i(s0_we), .dwb_ack_o(s0_ack), .dwb_stb_i(s0_stb), .dwb_sel_i(s0_sel), @@ -509,12 +514,13 @@ module u2_core     //    In Rev3 there are only 6 leds, and the highest one is on the ETH connector     wire [7:0] 	 led_src, led_sw; -   wire [7:0] 	 led_hw = {clk_status,serdes_link_up}; +   wire [7:0] 	 led_hw = {run_tx, run_rx, clk_status, serdes_link_up, 1'b0};     setting_reg #(.my_addr(3),.width(8)) sr_led (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),  				      .in(set_data),.out(led_sw),.changed()); -   setting_reg #(.my_addr(8),.width(8)) sr_led_src (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr), -					  .in(set_data),.out(led_src),.changed()); + +   setting_reg #(.my_addr(8),.width(8), .at_reset(8'b0001_1110))  +   sr_led_src (.clk(wb_clk),.rst(wb_rst), .strobe(set_stb),.addr(set_addr), .in(set_data),.out(led_src),.changed());     assign 	 leds = (led_src & led_hw) | (~led_src & led_sw); @@ -565,11 +571,6 @@ module u2_core     // /////////////////////////////////////////////////////////////////////////     // ATR Controller, Slave #11 -   wire 	 run_rx, run_tx; -   reg 		 run_rx_d1; -   always @(posedge dsp_clk) -     run_rx_d1 <= run_rx; -        atr_controller atr_controller       (.clk_i(wb_clk),.rst_i(wb_rst),        .adr_i(sb_adr[5:0]),.sel_i(sb_sel),.dat_i(sb_dat_o),.dat_o(sb_dat_i), @@ -773,8 +774,7 @@ endmodule // u2_core  			     { s6_adr[15:8] },  			     { s6_adr[7:0] },  			     { 6'd0, mdio_cpy, MDC } }; -*/ -/* +     assign debug 	 = { { GMII_TXD },  			     { 5'd0, GMII_TX_EN, GMII_TX_ER, GMII_GTX_CLK },  			     { wr2_flags, rd2_flags }, @@ -783,7 +783,6 @@ endmodule // u2_core  			     { 5'd0, GMII_RX_DV, GMII_RX_ER, GMII_RX_CLK },  			     { wr2_flags, rd2_flags },  			     { GMII_TX_EN,3'd0, wr2_ready_i, wr2_ready_o, rd2_ready_i, rd2_ready_o } }; - */  //   assign debug = debug_udp;    // assign debug = vrc_debug; @@ -794,9 +793,8 @@ endmodule // u2_core  			   {wr1_ready_i, wr1_ready_o, rx1_src_rdy, rx1_dst_rdy, rx1_data[35:32]}};  */  //   assign debug_gpio_1 = {vita_time[63:32] }; -    -/* -    assign debug_gpio_1 = { { tx_f19_data[15:8] }, +/*    +   assign debug_gpio_1 = { { tx_f19_data[15:8] },  			   { tx_f19_data[7:0] },  			   { 3'd0, tx_f19_src_rdy, tx_f19_dst_rdy, tx_f19_data[18:16] },  			   { 2'b0, rd2_ready_i, rd2_ready_o, rd2_flags } }; diff --git a/usrp2/udp/prot_eng_tx.v b/usrp2/udp/prot_eng_tx.v index 9031011f7..a18eb73ae 100644 --- a/usrp2/udp/prot_eng_tx.v +++ b/usrp2/udp/prot_eng_tx.v @@ -40,11 +40,16 @@ module prot_eng_tx     // Store header values in a small dual-port (distributed) ram     reg [HDR_WIDTH-1:0] header_ram[0:HDR_LEN-1];     wire [HDR_WIDTH-1:0] header_word; +   reg [15:0]  chk_precompute;     always @(posedge clk)       if(set_stb & ((set_addr & 8'hE0) == BASE)) -       header_ram[set_addr[4:0]] <= set_data; - +       begin +	  header_ram[set_addr[4:0]] <= set_data; +	  if(set_data[18]) +	    chk_precompute <= set_data[15:0]; +       end +        assign header_word = header_ram[state];     wire last_hdr_line  = header_word[19]; @@ -56,7 +61,7 @@ module prot_eng_tx     reg [15:0] length;     wire [15:0] ip_length = length + 28;  // IP HDR + UDP HDR     wire [15:0] udp_length = length + 8;  //  UDP HDR - +      always @(posedge clk)       if(reset)         begin @@ -101,12 +106,16 @@ module prot_eng_tx     wire [15:0] checksum;     add_onescomp #(.WIDTH(16)) add_onescomp  -     (.A(header_word[15:0]),.B(ip_length),.SUM(checksum)); +     (.A(chk_precompute),.B(ip_length),.SUM(checksum)); +   reg [15:0]  checksum_reg; +   always @(posedge clk) +     checksum_reg <= checksum; +        always @*       if(ip_chk)         //dataout_int 	<= header_word[15:0] ^ ip_length; -       dataout_int 	<= 16'hFFFF ^ checksum; +       dataout_int 	<= 16'hFFFF ^ checksum_reg;       else if(ip_len)         dataout_int 	<= ip_length;       else if(udp_len) diff --git a/usrp2/vrt/vita_tx_deframer.v b/usrp2/vrt/vita_tx_deframer.v index 220d3b061..3b95f5902 100644 --- a/usrp2/vrt/vita_tx_deframer.v +++ b/usrp2/vrt/vita_tx_deframer.v @@ -22,7 +22,7 @@ module vita_tx_deframer      );     wire [1:0] numchan; -   setting_reg #(.my_addr(BASE), .at_reset(0)) sr_numchan +   setting_reg #(.my_addr(BASE), .at_reset(0), .width(2)) sr_numchan       (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),        .in(set_data),.out(numchan),.changed()); | 
