From 91636cbac2b3edfba45321f1050d0b90b34ab696 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Mon, 31 Aug 2009 12:08:30 -0700 Subject: Merged SVN matt/new_eth r10782:11633 into new_eth * svn diff http://gnuradio.org/svn/branches/developers/matt/new_eth -r10782:11633 * Patch applied with no conflicts or fuzz. --- control_lib/buffer_int.v | 251 ------------------------ control_lib/buffer_pool.v | 323 ------------------------------- control_lib/newfifo/cascadefifo_2clock.v | 27 +++ control_lib/newfifo/fifo36_to_ll8.v | 2 +- control_lib/newfifo/fifo_2clock.v | 66 ------- control_lib/newfifo/fifo_2clock_casc.v | 31 --- control_lib/newfifo/ll8_shortfifo.v | 13 ++ control_lib/newfifo/newfifo_2clock.v | 82 ++++++++ 8 files changed, 123 insertions(+), 672 deletions(-) create mode 100644 control_lib/newfifo/cascadefifo_2clock.v create mode 100644 control_lib/newfifo/ll8_shortfifo.v create mode 100644 control_lib/newfifo/newfifo_2clock.v (limited to 'control_lib') diff --git a/control_lib/buffer_int.v b/control_lib/buffer_int.v index c33f2779d..e69de29bb 100644 --- a/control_lib/buffer_int.v +++ b/control_lib/buffer_int.v @@ -1,251 +0,0 @@ - -// FIFO Interface to the 2K buffer RAMs -// Read port is read-acknowledge -// FIXME do we want to be able to interleave reads and writes? - -module buffer_int - #(parameter BUFF_NUM = 0) - (// Control Interface - input clk, - input rst, - input [31:0] ctrl_word, - input go, - output done, - output error, - output idle, - - // Buffer Interface - output en_o, - output we_o, - output reg [8:0] addr_o, - output [31:0] dat_to_buf, - input [31:0] dat_from_buf, - - // Write FIFO Interface - input [31:0] wr_dat_i, - input wr_write_i, - input wr_done_i, - input wr_error_i, - output reg wr_ready_o, - output reg wr_full_o, - - // Read FIFO Interface - output [31:0] rd_dat_o, - input rd_read_i, - input rd_done_i, - input rd_error_i, - output reg rd_sop_o, - output reg rd_eop_o - ); - - reg [31:0] ctrl_reg; - reg go_reg; - - always @(posedge clk) - go_reg <= go; - - always @(posedge clk) - if(rst) - ctrl_reg <= 0; - else - if(go & (ctrl_word[31:28] == BUFF_NUM)) - ctrl_reg <= ctrl_word; - - wire [8:0] firstline = ctrl_reg[8:0]; - wire [8:0] lastline = ctrl_reg[17:9]; - wire [3:0] step = ctrl_reg[21:18]; - wire read = ctrl_reg[22]; - wire write = ctrl_reg[23]; - wire clear = ctrl_reg[24]; - //wire [2:0] port = ctrl_reg[27:25]; // Ignored in this block - //wire [3:0] buff_num = ctrl_reg[31:28]; // Ignored here ? - - assign dat_to_buf = wr_dat_i; - assign rd_dat_o = dat_from_buf; - - localparam IDLE = 3'd0; - localparam PRE_READ = 3'd1; - localparam READING = 3'd2; - localparam WRITING = 3'd3; - localparam ERROR = 3'd4; - localparam DONE = 3'd5; - - reg [2:0] state; - - always @(posedge clk) - if(rst) - begin - state <= IDLE; - rd_sop_o <= 0; - rd_eop_o <= 0; - wr_ready_o <= 0; - wr_full_o <= 0; - end - else - if(clear) - begin - state <= IDLE; - rd_sop_o <= 0; - rd_eop_o <= 0; - wr_ready_o <= 0; - wr_full_o <= 0; - end - else - case(state) - IDLE : - if(go_reg & read) - begin - addr_o <= firstline; - state <= PRE_READ; - end - else if(go_reg & write) - begin - addr_o <= firstline; - state <= WRITING; - wr_ready_o <= 1; - end - - PRE_READ : - begin - state <= READING; - addr_o <= addr_o + 1; - rd_sop_o <= 1; - end - - READING : - if(rd_error_i) - state <= ERROR; - else if(rd_done_i) - state <= DONE; - else if(rd_read_i) - begin - rd_sop_o <= 0; - addr_o <= addr_o + 1; - if(addr_o == lastline) - rd_eop_o <= 1; - else - rd_eop_o <= 0; - if(rd_eop_o) - state <= DONE; - end - - WRITING : - begin - if(wr_write_i) - addr_o <= addr_o + 1; // This was the timing problem, so now it doesn't depend on wr_error_i - if(wr_error_i) - begin - state <= ERROR; - wr_ready_o <= 0; - end - else - begin - if(wr_write_i) - begin - wr_ready_o <= 0; - if(addr_o == (lastline-1)) - wr_full_o <= 1; - if(addr_o == lastline) - state <= DONE; - end - if(wr_done_i) - begin - state <= DONE; - wr_ready_o <= 0; - end - end // else: !if(wr_error_i) - end // case: WRITING - - DONE : - begin - rd_eop_o <= 0; - rd_sop_o <= 0; - wr_ready_o <= 0; - wr_full_o <= 0; - end - - endcase // case(state) - - // FIXME ignores step for now - - assign we_o = (state == WRITING) && wr_write_i; // FIXME potential critical path - // IF this is a timing problem, we could always write when in this state - assign en_o = ~((state==READING)& ~rd_read_i); // FIXME potential critical path - - assign done = (state == DONE); - assign error = (state == ERROR); - assign idle = (state == IDLE); -endmodule // buffer_int - - - -// These are 2 other ways for doing the WRITING state, both work. First one is faster, but confusing -/* - begin - // Gen 4 values -- state, wr_ready_o, addr_o, wr_full_o - if(~wr_error_i & wr_write_i & (addr_o == (lastline-1))) - wr_full_o <= 1; - if(wr_error_i | wr_write_i | wr_done_i) - wr_ready_o <= 0; - if(wr_error_i) - state <= ERROR; - else if(wr_done_i | (wr_write_i & (addr_o == lastline))) - state <= DONE; - // This one was the timing problem... now we increment addr_o even if there is an error - if(wr_write_i) - addr_o <= addr_o + 1; - end // case: WRITING -*/ - -/* begin - if(wr_error_i) - begin - state <= ERROR; - wr_ready_o <= 0; - end - else - begin - if(wr_write_i) - begin - wr_ready_o <= 0; - addr_o <= addr_o + 1; - if(addr_o == (lastline-1)) - wr_full_o <= 1; - if(addr_o == lastline) - state <= DONE; - end - if(wr_done_i) - begin - state <= DONE; - wr_ready_o <= 0; - end - end // else: !if(wr_error_i) - end // case: WRITING -*/ - - - - - - - - - - - - - - -// Unused old code - //assign rd_empty_o = (state != READING); // && (state != PRE_READ); - //assign rd_empty_o = rd_empty_reg; // timing fix? - //assign rd_ready_o = (state == READING); - //assign rd_ready_o = ~rd_empty_reg; // timing fix? - - //wire rd_en = (state == PRE_READ) || ((state == READING) && rd_read_i); - //wire wr_en = (state == WRITING) && wr_write_i; // IF this is a timing problem, we could always enable when in this state - //assign en_o = rd_en | wr_en; - - // assign wr_full_o = (state != WRITING); - // assign wr_ready_o = (state == WRITING); - diff --git a/control_lib/buffer_pool.v b/control_lib/buffer_pool.v index 969296230..e69de29bb 100644 --- a/control_lib/buffer_pool.v +++ b/control_lib/buffer_pool.v @@ -1,323 +0,0 @@ - -// Buffer pool. Contains 8 buffers, each 2K (512 by 32). Each buffer -// is a dual-ported RAM. Port A on each of them is indirectly connected -// to the wishbone bus by a bridge. Port B may be connected any one of the -// 8 (4 rd, 4 wr) FIFO-like streaming interaces, or disconnected. The wishbone bus -// provides access to all 8 buffers, and also controls the connections -// between the ports and the buffers, allocating them as needed. - -// wb_adr is 16 bits -- -// bits 13:11 select which buffer -// bits 10:2 select line in buffer -// bits 1:0 are unused (32-bit access only) - -module buffer_pool - (input wb_clk_i, - input wb_rst_i, - input wb_we_i, - input wb_stb_i, - input [15:0] wb_adr_i, - input [31:0] wb_dat_i, - output [31:0] wb_dat_o, - output reg wb_ack_o, - output wb_err_o, - output wb_rty_o, - - input stream_clk, - input stream_rst, - - input set_stb, input [7:0] set_addr, input [31:0] set_data, - output [31:0] status, - output sys_int_o, - - output [31:0] s0, output [31:0] s1, output [31:0] s2, output [31:0] s3, - output [31:0] s4, output [31:0] s5, output [31:0] s6, output [31:0] s7, - - // Write Interfaces - input [31:0] wr0_dat_i, input wr0_write_i, input wr0_done_i, input wr0_error_i, output wr0_ready_o, output wr0_full_o, - input [31:0] wr1_dat_i, input wr1_write_i, input wr1_done_i, input wr1_error_i, output wr1_ready_o, output wr1_full_o, - input [31:0] wr2_dat_i, input wr2_write_i, input wr2_done_i, input wr2_error_i, output wr2_ready_o, output wr2_full_o, - input [31:0] wr3_dat_i, input wr3_write_i, input wr3_done_i, input wr3_error_i, output wr3_ready_o, output wr3_full_o, - - // Read Interfaces - output [31:0] rd0_dat_o, input rd0_read_i, input rd0_done_i, input rd0_error_i, output rd0_sop_o, output rd0_eop_o, - output [31:0] rd1_dat_o, input rd1_read_i, input rd1_done_i, input rd1_error_i, output rd1_sop_o, output rd1_eop_o, - output [31:0] rd2_dat_o, input rd2_read_i, input rd2_done_i, input rd2_error_i, output rd2_sop_o, output rd2_eop_o, - output [31:0] rd3_dat_o, input rd3_read_i, input rd3_done_i, input rd3_error_i, output rd3_sop_o, output rd3_eop_o - ); - - wire [7:0] sel_a; - - wire [2:0] which_buf = wb_adr_i[13:11]; // address 15:14 selects the buffer pool - wire [8:0] buf_addra = wb_adr_i[10:2]; // ignore address 1:0, 32-bit access only - - decoder_3_8 dec(.sel(which_buf),.res(sel_a)); - - genvar i; - - wire go; - - reg [2:0] port[0:7]; - reg [3:0] read_src[0:3]; - reg [3:0] write_src[0:3]; - - wire [7:0] done; - wire [7:0] error; - wire [7:0] idle; - - wire [31:0] buf_doa[0:7]; - - wire [7:0] buf_enb; - wire [7:0] buf_web; - wire [8:0] buf_addrb[0:7]; - wire [31:0] buf_dib[0:7]; - wire [31:0] buf_dob[0:7]; - - wire [31:0] wr_dat_i[0:7]; - wire [7:0] wr_write_i; - wire [7:0] wr_done_i; - wire [7:0] wr_error_i; - wire [7:0] wr_ready_o; - wire [7:0] wr_full_o; - - wire [31:0] rd_dat_o[0:7]; - wire [7:0] rd_read_i; - wire [7:0] rd_done_i; - wire [7:0] rd_error_i; - wire [7:0] rd_sop_o; - wire [7:0] rd_eop_o; - - assign status = {8'd0,idle[7:0],error[7:0],done[7:0]}; - - assign s0 = {23'd0,buf_addrb[0]}; - assign s1 = {23'd0,buf_addrb[1]}; - assign s2 = {23'd0,buf_addrb[2]}; - assign s3 = {23'd0,buf_addrb[3]}; - assign s4 = {23'd0,buf_addrb[4]}; - assign s5 = {23'd0,buf_addrb[5]}; - assign s6 = {23'd0,buf_addrb[6]}; - assign s7 = {23'd0,buf_addrb[7]}; - - wire [31:0] fifo_ctrl; - setting_reg #(.my_addr(64)) - sreg(.clk(stream_clk),.rst(stream_rst),.strobe(set_stb),.addr(set_addr),.in(set_data), - .out(fifo_ctrl),.changed(go)); - - integer k; - always @(posedge stream_clk) - if(stream_rst) - for(k=0;k<8;k=k+1) - port[k] <= 4; // disabled - else - for(k=0;k<8;k=k+1) - if(go & (fifo_ctrl[31:28]==k)) - port[k] <= fifo_ctrl[27:25]; - - always @(posedge stream_clk) - if(stream_rst) - for(k=0;k<4;k=k+1) - read_src[k] <= 8; // disabled - else - for(k=0;k<4;k=k+1) - if(go & fifo_ctrl[22] & (fifo_ctrl[27:25]==k)) - read_src[k] <= fifo_ctrl[31:28]; - - always @(posedge stream_clk) - if(stream_rst) - for(k=0;k<4;k=k+1) - write_src[k] <= 8; // disabled - else - for(k=0;k<4;k=k+1) - if(go & fifo_ctrl[23] & (fifo_ctrl[27:25]==k)) - write_src[k] <= fifo_ctrl[31:28]; - - generate - for(i=0;i<8;i=i+1) - begin : gen_buffer - RAMB16_S36_S36 dpram - (.DOA(buf_doa[i]),.ADDRA(buf_addra),.CLKA(wb_clk_i),.DIA(wb_dat_i),.DIPA(4'h0), - .ENA(wb_stb_i & sel_a[i]),.SSRA(0),.WEA(wb_we_i), - .DOB(buf_dob[i]),.ADDRB(buf_addrb[i]),.CLKB(stream_clk),.DIB(buf_dib[i]),.DIPB(4'h0), - .ENB(buf_enb[i]),.SSRB(0),.WEB(buf_web[i]) ); - - /* ram_2port #(.DWIDTH(32),.AWIDTH(9)) buffer - (.clka(wb_clk_i),.ena(wb_stb_i & sel_a[i]),.wea(wb_we_i), - .addra(buf_addra),.dia(wb_dat_i),.doa(buf_doa[i]), - .clkb(stream_clk),.enb(buf_enb[i]),.web(buf_web[i]), - .addrb(buf_addrb[i]),.dib(buf_dib[i]),.dob(buf_dob[i])); */ - - buffer_int #(.BUFF_NUM(i)) fifo_int - (.clk(stream_clk),.rst(stream_rst), - .ctrl_word(fifo_ctrl),.go(go & (fifo_ctrl[31:28]==i)), - .done(done[i]),.error(error[i]),.idle(idle[i]), - .en_o(buf_enb[i]), - .we_o(buf_web[i]), - .addr_o(buf_addrb[i]), - .dat_to_buf(buf_dib[i]), - .dat_from_buf(buf_dob[i]), - .wr_dat_i(wr_dat_i[i]), - .wr_write_i(wr_write_i[i]), - .wr_done_i(wr_done_i[i]), - .wr_error_i(wr_error_i[i]), - .wr_ready_o(wr_ready_o[i]), - .wr_full_o(wr_full_o[i]), - .rd_dat_o(rd_dat_o[i]), - .rd_read_i(rd_read_i[i]), - .rd_done_i(rd_done_i[i]), - .rd_error_i(rd_error_i[i]), - .rd_sop_o(rd_sop_o[i]), - .rd_eop_o(rd_eop_o[i]) - ); - - // FIXME -- if it is a problem, maybe we don't need enables on these muxes - mux4 #(.WIDTH(32)) - mux4_dat_i (.en(~port[i][2]),.sel(port[i][1:0]),.i0(wr0_dat_i),.i1(wr1_dat_i), - .i2(wr2_dat_i),.i3(wr3_dat_i),.o(wr_dat_i[i])); - mux4 #(.WIDTH(1)) - mux4_write_i (.en(~port[i][2]),.sel(port[i][1:0]),.i0(wr0_write_i),.i1(wr1_write_i), - .i2(wr2_write_i),.i3(wr3_write_i),.o(wr_write_i[i])); - mux4 #(.WIDTH(1)) - mux4_wrdone_i (.en(~port[i][2]),.sel(port[i][1:0]),.i0(wr0_done_i),.i1(wr1_done_i), - .i2(wr2_done_i),.i3(wr3_done_i),.o(wr_done_i[i])); - mux4 #(.WIDTH(1)) - mux4_wrerror_i (.en(~port[i][2]),.sel(port[i][1:0]),.i0(wr0_error_i),.i1(wr1_error_i), - .i2(wr2_error_i),.i3(wr3_error_i),.o(wr_error_i[i])); - mux4 #(.WIDTH(1)) - mux4_read_i (.en(~port[i][2]),.sel(port[i][1:0]),.i0(rd0_read_i),.i1(rd1_read_i), - .i2(rd2_read_i),.i3(rd3_read_i),.o(rd_read_i[i])); - mux4 #(.WIDTH(1)) - mux4_rddone_i (.en(~port[i][2]),.sel(port[i][1:0]),.i0(rd0_done_i),.i1(rd1_done_i), - .i2(rd2_done_i),.i3(rd3_done_i),.o(rd_done_i[i])); - mux4 #(.WIDTH(1)) - mux4_rderror_i (.en(~port[i][2]),.sel(port[i][1:0]),.i0(rd0_error_i),.i1(rd1_error_i), - .i2(rd2_error_i),.i3(rd3_error_i),.o(rd_error_i[i])); - end // block: gen_buffer - endgenerate - - //---------------------------------------------------------------------- - // Wishbone Outputs - - // Use the following lines if ram output and mux can be made fast enough - - assign wb_err_o = 1'b0; // Unused for now - assign wb_rty_o = 1'b0; // Unused for now - - always @(posedge wb_clk_i) - wb_ack_o <= wb_stb_i & ~wb_ack_o; - assign wb_dat_o = buf_doa[which_buf]; - - // Use this if we can't make the RAM+MUX fast enough - // reg [31:0] wb_dat_o_reg; - // reg stb_d1; - - // always @(posedge wb_clk_i) - // begin - // wb_dat_o_reg <= buf_doa[which_buf]; - // stb_d1 <= wb_stb_i; - // wb_ack_o <= (stb_d1 & ~wb_ack_o) | (wb_we_i & wb_stb_i); - // end - //assign wb_dat_o = wb_dat_o_reg; - - mux8 #(.WIDTH(1)) - mux8_wr_ready0(.en(~write_src[0][3]),.sel(write_src[0][2:0]), .i0(wr_ready_o[0]), .i1(wr_ready_o[1]), - .i2(wr_ready_o[2]), .i3(wr_ready_o[3]), .i4(wr_ready_o[4]), - .i5(wr_ready_o[5]), .i6(wr_ready_o[6]), .i7(wr_ready_o[7]),.o(wr0_ready_o)); - - mux8 #(.WIDTH(1)) - mux8_wr_full0(.en(~write_src[0][3]),.sel(write_src[0][2:0]), .i0(wr_full_o[0]), .i1(wr_full_o[1]), - .i2(wr_full_o[2]), .i3(wr_full_o[3]), .i4(wr_full_o[4]), - .i5(wr_full_o[5]), .i6(wr_full_o[6]), .i7(wr_full_o[7]),.o(wr0_full_o)); - - mux8 #(.WIDTH(1)) - mux8_wr_ready1(.en(~write_src[1][3]),.sel(write_src[1][2:0]), .i0(wr_ready_o[0]), .i1(wr_ready_o[1]), - .i2(wr_ready_o[2]), .i3(wr_ready_o[3]), .i4(wr_ready_o[4]), - .i5(wr_ready_o[5]), .i6(wr_ready_o[6]), .i7(wr_ready_o[7]),.o(wr1_ready_o)); - - mux8 #(.WIDTH(1)) - mux8_wr_full1(.en(~write_src[1][3]),.sel(write_src[1][2:0]), .i0(wr_full_o[0]), .i1(wr_full_o[1]), - .i2(wr_full_o[2]), .i3(wr_full_o[3]), .i4(wr_full_o[4]), - .i5(wr_full_o[5]), .i6(wr_full_o[6]), .i7(wr_full_o[7]),.o(wr1_full_o)); - - mux8 #(.WIDTH(1)) - mux8_wr_ready2(.en(~write_src[2][3]),.sel(write_src[2][2:0]), .i0(wr_ready_o[0]), .i1(wr_ready_o[1]), - .i2(wr_ready_o[2]), .i3(wr_ready_o[3]), .i4(wr_ready_o[4]), - .i5(wr_ready_o[5]), .i6(wr_ready_o[6]), .i7(wr_ready_o[7]),.o(wr2_ready_o)); - - mux8 #(.WIDTH(1)) - mux8_wr_full2(.en(~write_src[2][3]),.sel(write_src[2][2:0]), .i0(wr_full_o[0]), .i1(wr_full_o[1]), - .i2(wr_full_o[2]), .i3(wr_full_o[3]), .i4(wr_full_o[4]), - .i5(wr_full_o[5]), .i6(wr_full_o[6]), .i7(wr_full_o[7]),.o(wr2_full_o)); - - mux8 #(.WIDTH(1)) - mux8_wr_ready3(.en(~write_src[3][3]),.sel(write_src[3][2:0]), .i0(wr_ready_o[0]), .i1(wr_ready_o[1]), - .i2(wr_ready_o[2]), .i3(wr_ready_o[3]), .i4(wr_ready_o[4]), - .i5(wr_ready_o[5]), .i6(wr_ready_o[6]), .i7(wr_ready_o[7]),.o(wr3_ready_o)); - - mux8 #(.WIDTH(1)) - mux8_wr_full3(.en(~write_src[3][3]),.sel(write_src[3][2:0]), .i0(wr_full_o[0]), .i1(wr_full_o[1]), - .i2(wr_full_o[2]), .i3(wr_full_o[3]), .i4(wr_full_o[4]), - .i5(wr_full_o[5]), .i6(wr_full_o[6]), .i7(wr_full_o[7]),.o(wr3_full_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_sop0(.en(~read_src[0][3]),.sel(read_src[0][2:0]), .i0(rd_sop_o[0]), .i1(rd_sop_o[1]), - .i2(rd_sop_o[2]), .i3(rd_sop_o[3]), .i4(rd_sop_o[4]), - .i5(rd_sop_o[5]), .i6(rd_sop_o[6]), .i7(rd_sop_o[7]),.o(rd0_sop_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_eop0(.en(~read_src[0][3]),.sel(read_src[0][2:0]), .i0(rd_eop_o[0]), .i1(rd_eop_o[1]), - .i2(rd_eop_o[2]), .i3(rd_eop_o[3]), .i4(rd_eop_o[4]), - .i5(rd_eop_o[5]), .i6(rd_eop_o[6]), .i7(rd_eop_o[7]),.o(rd0_eop_o)); - - mux8 #(.WIDTH(32)) - mux8_rd_dat_0 (.en(~read_src[0][3]),.sel(read_src[0][2:0]), .i0(rd_dat_o[0]), .i1(rd_dat_o[1]), - .i2(rd_dat_o[2]), .i3(rd_dat_o[3]), .i4(rd_dat_o[4]), - .i5(rd_dat_o[5]), .i6(rd_dat_o[6]), .i7(rd_dat_o[7]),.o(rd0_dat_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_sop1(.en(~read_src[1][3]),.sel(read_src[1][2:0]), .i0(rd_sop_o[0]), .i1(rd_sop_o[1]), - .i2(rd_sop_o[2]), .i3(rd_sop_o[3]), .i4(rd_sop_o[4]), - .i5(rd_sop_o[5]), .i6(rd_sop_o[6]), .i7(rd_sop_o[7]),.o(rd1_sop_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_eop1(.en(~read_src[1][3]),.sel(read_src[1][2:0]), .i0(rd_eop_o[0]), .i1(rd_eop_o[1]), - .i2(rd_eop_o[2]), .i3(rd_eop_o[3]), .i4(rd_eop_o[4]), - .i5(rd_eop_o[5]), .i6(rd_eop_o[6]), .i7(rd_eop_o[7]),.o(rd1_eop_o)); - - mux8 #(.WIDTH(32)) - mux8_rd_dat_1 (.en(~read_src[1][3]),.sel(read_src[1][2:0]), .i0(rd_dat_o[0]), .i1(rd_dat_o[1]), - .i2(rd_dat_o[2]), .i3(rd_dat_o[3]), .i4(rd_dat_o[4]), - .i5(rd_dat_o[5]), .i6(rd_dat_o[6]), .i7(rd_dat_o[7]),.o(rd1_dat_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_sop2(.en(~read_src[2][3]),.sel(read_src[2][2:0]), .i0(rd_sop_o[0]), .i1(rd_sop_o[1]), - .i2(rd_sop_o[2]), .i3(rd_sop_o[3]), .i4(rd_sop_o[4]), - .i5(rd_sop_o[5]), .i6(rd_sop_o[6]), .i7(rd_sop_o[7]),.o(rd2_sop_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_eop2(.en(~read_src[2][3]),.sel(read_src[2][2:0]), .i0(rd_eop_o[0]), .i1(rd_eop_o[1]), - .i2(rd_eop_o[2]), .i3(rd_eop_o[3]), .i4(rd_eop_o[4]), - .i5(rd_eop_o[5]), .i6(rd_eop_o[6]), .i7(rd_eop_o[7]),.o(rd2_eop_o)); - - mux8 #(.WIDTH(32)) - mux8_rd_dat_2 (.en(~read_src[2][3]),.sel(read_src[2][2:0]), .i0(rd_dat_o[0]), .i1(rd_dat_o[1]), - .i2(rd_dat_o[2]), .i3(rd_dat_o[3]), .i4(rd_dat_o[4]), - .i5(rd_dat_o[5]), .i6(rd_dat_o[6]), .i7(rd_dat_o[7]),.o(rd2_dat_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_sop3(.en(~read_src[3][3]),.sel(read_src[3][2:0]), .i0(rd_sop_o[0]), .i1(rd_sop_o[1]), - .i2(rd_sop_o[2]), .i3(rd_sop_o[3]), .i4(rd_sop_o[4]), - .i5(rd_sop_o[5]), .i6(rd_sop_o[6]), .i7(rd_sop_o[7]),.o(rd3_sop_o)); - - mux8 #(.WIDTH(1)) - mux8_rd_eop3(.en(~read_src[3][3]),.sel(read_src[3][2:0]), .i0(rd_eop_o[0]), .i1(rd_eop_o[1]), - .i2(rd_eop_o[2]), .i3(rd_eop_o[3]), .i4(rd_eop_o[4]), - .i5(rd_eop_o[5]), .i6(rd_eop_o[6]), .i7(rd_eop_o[7]),.o(rd3_eop_o)); - - mux8 #(.WIDTH(32)) - mux8_rd_dat_3 (.en(~read_src[3][3]),.sel(read_src[3][2:0]), .i0(rd_dat_o[0]), .i1(rd_dat_o[1]), - .i2(rd_dat_o[2]), .i3(rd_dat_o[3]), .i4(rd_dat_o[4]), - .i5(rd_dat_o[5]), .i6(rd_dat_o[6]), .i7(rd_dat_o[7]),.o(rd3_dat_o)); - - assign sys_int_o = (|error) | (|done); - -endmodule // buffer_pool diff --git a/control_lib/newfifo/cascadefifo_2clock.v b/control_lib/newfifo/cascadefifo_2clock.v new file mode 100644 index 000000000..2abbbf3b5 --- /dev/null +++ b/control_lib/newfifo/cascadefifo_2clock.v @@ -0,0 +1,27 @@ + +module cascadefifo_2clock + #(parameter DWIDTH=32, AWIDTH=9) + (input wclk, input [DWIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output [AWIDTH-1:0] level_wclk, + input rclk, output [DWIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output [AWIDTH-1:0] level_rclk, + input arst); + + wire [DWIDTH-1:0] data_int1, data_int2; + wire src_rdy_int1, src_rdy_int2, dst_rdy_int1, dst_rdy_int2; + + fifo_short #(.WIDTH(DWIDTH)) shortfifo + (.clk(wclk), .reset(arst), .clear(0), + .datain(datain), .src_rdy_i(src_rdy_i), .dst_rdy_o(dst_rdy_o), + .dataout(data_int1), .src_rdy_o(src_rdy_int1), .dst_rdy_i(dst_rdy_int1) ); + + newfifo_2clock #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) fifo_2clock + (.wclk(wclk), .datain(data_int1), .src_rdy_i(src_rdy_int1), .dst_rdy_o(dst_rdy_int1), .level_wclk(level_wclk), + .rclk(rclk), .dataout(data_int2), .src_rdy_o(src_rdy_int2), .dst_rdy_i(dst_rdy_int2), .level_rclk(level_rclk), + .arst(arst) ); + + fifo_short #(.WIDTH(DWIDTH)) shortfifo2 + (.clk(rclk), .reset(arst), .clear(0), + .datain(data_int2), .src_rdy_i(src_rdy_int2), .dst_rdy_o(dst_rdy_int2), + .dataout(dataout), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i) ); + +endmodule // fifo_2clock_casc + diff --git a/control_lib/newfifo/fifo36_to_ll8.v b/control_lib/newfifo/fifo36_to_ll8.v index 1befb9e6e..0dee1dfc6 100644 --- a/control_lib/newfifo/fifo36_to_ll8.v +++ b/control_lib/newfifo/fifo36_to_ll8.v @@ -1,6 +1,6 @@ module fifo36_to_ll8 - (input clk, reset, + (input clk, input reset, input clear, input [35:0] f36_data, input f36_src_rdy_i, output f36_dst_rdy_o, diff --git a/control_lib/newfifo/fifo_2clock.v b/control_lib/newfifo/fifo_2clock.v index 6b1eb607e..e69de29bb 100644 --- a/control_lib/newfifo/fifo_2clock.v +++ b/control_lib/newfifo/fifo_2clock.v @@ -1,66 +0,0 @@ - -module fifo_2clock - #(parameter DWIDTH=32, AWIDTH=9) - (input wclk, input [DWIDTH-1:0] datain, input write, output full, output reg [AWIDTH-1:0] level_wclk, - input rclk, output [DWIDTH-1:0] dataout, input read, output empty, output reg [AWIDTH-1:0] level_rclk, - input arst); - - reg [AWIDTH-1:0] wr_addr, rd_addr; - wire [AWIDTH-1:0] wr_addr_rclk, rd_addr_wclk; - wire [AWIDTH-1:0] next_rd_addr; - wire enb_read; - - // Write side management - wire [AWIDTH-1:0] next_wr_addr = wr_addr + 1; - always @(posedge wclk or posedge arst) - if(arst) - wr_addr <= 0; - else if(write) - wr_addr <= next_wr_addr; - assign full = (next_wr_addr == rd_addr_wclk); - - // RAM for data storage. Data out is registered, complicating the - // read side logic - ram_2port #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) mac_rx_ff_ram - (.clka(wclk),.ena(1'b1),.wea(write),.addra(wr_addr),.dia(datain),.doa(), - .clkb(rclk),.enb(enb_read),.web(1'b0),.addrb(next_rd_addr),.dib(0),.dob(dataout) ); - - // Read side management - reg data_valid; - assign empty = ~data_valid; - assign next_rd_addr = rd_addr + data_valid; - assign enb_read = read | ~data_valid; - - always @(posedge rclk or posedge arst) - if(arst) - rd_addr <= 0; - else if(read) - rd_addr <= rd_addr + 1; - - always @(posedge rclk or posedge arst) - if(arst) - data_valid <= 0; - else - if(read & (next_rd_addr == wr_addr_rclk)) - data_valid <= 0; - else if(next_rd_addr != wr_addr_rclk) - data_valid <= 1; - - // Send pointers across clock domains via gray code - gray_send #(.WIDTH(AWIDTH)) send_wr_addr - (.clk_in(wclk),.addr_in(wr_addr), - .clk_out(rclk),.addr_out(wr_addr_rclk) ); - - gray_send #(.WIDTH(AWIDTH)) send_rd_addr - (.clk_in(rclk),.addr_in(rd_addr), - .clk_out(wclk),.addr_out(rd_addr_wclk) ); - - // Generate fullness info, these are approximate and may be delayed - // and are only for higher-level flow control. - // Only full and empty are guaranteed exact. - always @(posedge wclk) - level_wclk <= wr_addr - rd_addr_wclk; - always @(posedge rclk) - level_rclk <= wr_addr_rclk - rd_addr; - -endmodule // fifo_2clock diff --git a/control_lib/newfifo/fifo_2clock_casc.v b/control_lib/newfifo/fifo_2clock_casc.v index e9b0cfc25..e69de29bb 100644 --- a/control_lib/newfifo/fifo_2clock_casc.v +++ b/control_lib/newfifo/fifo_2clock_casc.v @@ -1,31 +0,0 @@ - -module fifo_2clock_casc - #(parameter DWIDTH=32, AWIDTH=9) - (input wclk, input [DWIDTH-1:0] datain, input write, output full, output [AWIDTH-1:0] level_wclk, - input rclk, output [DWIDTH-1:0] dataout, input read, output empty, output [AWIDTH-1:0] level_rclk, - input arst); - - wire full_int, empty_int, full_int2, empty_int2, transfer, transfer2; - wire [DWIDTH-1:0] data_int, data_int2; - - shortfifo #(.WIDTH(DWIDTH)) shortfifo - (.clk(wclk), .rst(arst), .clear(0), - .datain(datain), .write(write), .full(full), - .dataout(data_int), .read(transfer), .empty(empty_int) ); - - assign transfer = ~full_int & ~empty_int; - - fifo_2clock #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) fifo_2clock - (.wclk(wclk), .datain(data_int), .write(transfer), .full(full_int), .level_wclk(level_wclk), - .rclk(rclk), .dataout(data_int2), .read(transfer2), .empty(empty_int2), .level_rclk(level_rclk), - .arst(arst) ); - - assign transfer2 = ~full_int2 & ~empty_int2; - - shortfifo #(.WIDTH(DWIDTH)) shortfifo2 - (.clk(rclk), .rst(arst), .clear(0), - .datain(data_int2), .write(transfer2), .full(full_int2), - .dataout(dataout), .read(read), .empty(empty) ); - -endmodule // fifo_2clock_casc - diff --git a/control_lib/newfifo/ll8_shortfifo.v b/control_lib/newfifo/ll8_shortfifo.v new file mode 100644 index 000000000..39ada9a4f --- /dev/null +++ b/control_lib/newfifo/ll8_shortfifo.v @@ -0,0 +1,13 @@ + + +module ll8_shortfifo + (input clk, input reset, input clear, + input [7:0] datain, input sof_i, input eof_i, input error_i, input src_rdy_i, output dst_rdy_o, + output [7:0] dataout, output sof_o, output eof_o, output error_o, output src_rdy_o, input dst_rdy_i); + + fifo_short #(.WIDTH(11)) fifo_short + (.clk(clk), .reset(reset), .clear(clear), + .datain({error_i,eof_i,sof_i,datain}), .src_rdy_i(src_rdy_i), .dst_rdy_o(dst_rdy_o), + .dataout({error_o,eof_o,sof_o,dataout}), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i)); + +endmodule // ll8_shortfifo diff --git a/control_lib/newfifo/newfifo_2clock.v b/control_lib/newfifo/newfifo_2clock.v new file mode 100644 index 000000000..23a6f693c --- /dev/null +++ b/control_lib/newfifo/newfifo_2clock.v @@ -0,0 +1,82 @@ + +module newfifo_2clock + #(parameter DWIDTH=32, AWIDTH=9) + (input wclk, input [DWIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output reg [AWIDTH-1:0] level_wclk, + input rclk, output [DWIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output reg [AWIDTH-1:0] level_rclk, + input arst); + + wire full, empty, write, read; + + assign dst_rdy_o = ~full; + assign src_rdy_o = ~empty; + assign write = src_rdy_i & dst_rdy_o; + assign read = src_rdy_o & dst_rdy_i; + +//`define USE_XLNX_FIFO 1 +`ifdef USE_XLNX_FIFO + fifo_xlnx_512x36_2clk mac_tx_fifo_2clk + (.rst(rst), + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(fifo_occupied[8:0]), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count() ); +`else + // ISE sucks, so the following doesn't work properly + + reg [AWIDTH-1:0] wr_addr, rd_addr; + wire [AWIDTH-1:0] wr_addr_rclk, rd_addr_wclk; + wire [AWIDTH-1:0] next_rd_addr; + wire enb_read; + + // Write side management + wire [AWIDTH-1:0] next_wr_addr = wr_addr + 1; + always @(posedge wclk or posedge arst) + if(arst) + wr_addr <= 0; + else if(write) + wr_addr <= next_wr_addr; + assign full = (next_wr_addr == rd_addr_wclk); + + // RAM for data storage. Data out is registered, complicating the + // read side logic + ram_2port #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) mac_rx_ff_ram + (.clka(wclk),.ena(1'b1),.wea(write),.addra(wr_addr),.dia(datain),.doa(), + .clkb(rclk),.enb(enb_read),.web(1'b0),.addrb(next_rd_addr),.dib(0),.dob(dataout) ); + + // Read side management + reg data_valid; + assign empty = ~data_valid; + assign next_rd_addr = rd_addr + data_valid; + assign enb_read = read | ~data_valid; + + always @(posedge rclk or posedge arst) + if(arst) + rd_addr <= 0; + else if(read) + rd_addr <= rd_addr + 1; + + always @(posedge rclk or posedge arst) + if(arst) + data_valid <= 0; + else + if(read & (next_rd_addr == wr_addr_rclk)) + data_valid <= 0; + else if(next_rd_addr != wr_addr_rclk) + data_valid <= 1; + + // Send pointers across clock domains via gray code + gray_send #(.WIDTH(AWIDTH)) send_wr_addr + (.clk_in(wclk),.addr_in(wr_addr), + .clk_out(rclk),.addr_out(wr_addr_rclk) ); + + gray_send #(.WIDTH(AWIDTH)) send_rd_addr + (.clk_in(rclk),.addr_in(rd_addr), + .clk_out(wclk),.addr_out(rd_addr_wclk) ); + + // Generate fullness info, these are approximate and may be delayed + // and are only for higher-level flow control. + // Only full and empty are guaranteed exact. + always @(posedge wclk) + level_wclk <= wr_addr - rd_addr_wclk; + always @(posedge rclk) + level_rclk <= wr_addr_rclk - rd_addr; +`endif +endmodule // fifo_2clock -- cgit v1.2.3 From 29fa1be3dc307d6d9be0fc3a004213eea50e6071 Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Wed, 2 Sep 2009 16:46:06 -0700 Subject: Removed these files completely, they were for the old style of fifos --- control_lib/buffer_int.v | 0 control_lib/buffer_int_tb.v | 447 ------------------------------------------- control_lib/buffer_pool.v | 0 control_lib/buffer_pool_tb.v | 50 ----- 4 files changed, 497 deletions(-) delete mode 100644 control_lib/buffer_int.v delete mode 100644 control_lib/buffer_int_tb.v delete mode 100644 control_lib/buffer_pool.v delete mode 100644 control_lib/buffer_pool_tb.v (limited to 'control_lib') diff --git a/control_lib/buffer_int.v b/control_lib/buffer_int.v deleted file mode 100644 index e69de29bb..000000000 diff --git a/control_lib/buffer_int_tb.v b/control_lib/buffer_int_tb.v deleted file mode 100644 index 4fb5c6710..000000000 --- a/control_lib/buffer_int_tb.v +++ /dev/null @@ -1,447 +0,0 @@ - -module buffer_int_tb (); - - reg clk = 0; - reg rst = 1; - - initial #100 rst = 0; - always #5 clk = ~clk; - - wire en, we; - wire [8:0] addr; - wire [31:0] fifo2buf, buf2fifo; - - wire [31:0] rd_dat_o; - wire rd_sop_o, rd_eop_o; - reg rd_done_i = 0, rd_error_i = 0, rd_read_i = 0; - - reg [31:0] wr_dat_i = 0; - reg wr_write_i=0, wr_done_i = 0, wr_error_i = 0; - wire wr_ready_o, wr_full_o; - - reg clear = 0, write = 0, read = 0; - reg [8:0] firstline = 0, lastline = 0; - wire [3:0] step = 1; - wire [31:0] ctrl_word = {4'b0,3'b0,clear,write,read,step,lastline,firstline}; - reg go = 0; - wire done, error; - - buffer_int buffer_int - (.clk(clk),.rst(rst), - .ctrl_word(ctrl_word),.go(go), - .done(done),.error(error), - - // Buffer Interface - .en_o(en),.we_o(we),.addr_o(addr), - .dat_to_buf(fifo2buf),.dat_from_buf(buf2fifo), - - // Write FIFO Interface - .wr_dat_i(wr_dat_i), .wr_write_i(wr_write_i), .wr_done_i(wr_done_i), .wr_error_i(wr_error_i), - .wr_ready_o(wr_ready_o), .wr_full_o(wr_full_o), - - // Read FIFO Interface - .rd_dat_o(rd_dat_o), .rd_read_i(rd_read_i), .rd_done_i(rd_done_i), .rd_error_i(rd_error_i), - .rd_sop_o(rd_sop_o), .rd_eop_o(rd_eop_o) - ); - - reg ram_en = 0, ram_we = 0; - reg [8:0] ram_addr = 0; - reg [31:0] ram_data = 0; - - ram_2port #(.DWIDTH(32),.AWIDTH(9)) ram_2port - (.clka(clk), .ena(ram_en), .wea(ram_we), .addra(ram_addr), .dia(ram_data), .doa(), - .clkb(clk), .enb(en), .web(we), .addrb(addr), .dib(fifo2buf), .dob(buf2fifo) ); - - initial - begin - @(negedge rst); - @(posedge clk); - FillRAM; - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing full read, no wait states."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(6,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing full read, 2 wait states."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(6,2); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing full read, done ON the last."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(5,2); - rd_done_i <= 1; - ReadALine; - rd_done_i <= 0; - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing partial read, 0 wait states, then nothing after last."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(3,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing partial read, 0 wait states, then done after last."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(3,0); - rd_done_i <= 1; - @(posedge clk); - rd_done_i <= 0; - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing partial read, 0 wait states, then done at same time as last."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(2,0); - rd_done_i <= 1; - ReadALine; - rd_done_i <= 0; - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing partial read, 3 wait states, then error at same time as last."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(2,3); - rd_error_i <= 1; - ReadALine; - rd_error_i <= 0; - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(5,10); - $display("Testing Reading too much, 3 wait states."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(9,3); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(500,511); - $display("Testing full read, to the end of the buffer."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(12,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(0,511); - $display("Testing full read, start to end of the buffer."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(512,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(505,3); - $display("Testing full read, wraparound"); - while(!rd_sop_o) - @(posedge clk); - ReadLines(11,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(10,15); - $display("Testing Full Write, no wait states"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(6,0,72); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(18,23); - $display("Testing Full Write, 1 wait states"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(6,0,101); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(27,40); - $display("Testing Partial Write, 0 wait states"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(6,0,201); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(35,200); - $display("Testing Partial Write, 0 wait states, then done"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(6,0,301); - wr_done_i <= 1; - @(posedge clk); - wr_done_i <= 0; - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(45,200); - $display("Testing Partial Write, 0 wait states, then done and write simultaneously"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(6,0,301); - wr_done_i <= 1; - WriteALine(400); - wr_done_i <= 0; - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(55,200); - $display("Testing Partial Write, 0 wait states, then error"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(6,0,501); - wr_error_i <= 1; - @(posedge clk); - wr_error_i <= 0; - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(0,82); - $display("Testing read after all the writes"); - while(!rd_sop_o) - @(posedge clk); - ReadLines(83,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(508,4); - $display("Testing wraparound write"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(9,0,601); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(506,10); - $display("Reading wraparound write"); - while(!rd_sop_o) - @(posedge clk); - ReadLines(17,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(0,511); - $display("Testing Whole Buffer write"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(512,0,1000); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(0,511); - $display("Reading Whole Buffer write"); - while(!rd_sop_o) - @(posedge clk); - ReadLines(512,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(5,10); - $display("Testing Write Too Many"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(12,0,2000); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(0,15); - $display("Reading back Write Too Many"); - while(!rd_sop_o) - @(posedge clk); - ReadLines(16,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferWrite(15,20); - $display("Testing Write One Less Than Full"); - while(!wr_ready_o) - @(posedge clk); - WriteLines(5,0,2000); - repeat (10) - @(posedge clk); - - ResetBuffer; - SetBufferRead(13,22); - $display("Reading back Write One Less Than Full"); - while(!rd_sop_o) - @(posedge clk); - ReadLines(10,0); - repeat (10) - @(posedge clk); - - ResetBuffer; - repeat(100) - @(posedge clk); - $finish; - end - - always @(posedge clk) - if(rd_read_i == 1'd1) - $display("READ Buffer %d, rd_sop_o %d, rd_eop_o %d", rd_dat_o, rd_sop_o, rd_eop_o); - - always @(posedge clk) - if(wr_write_i == 1'd1) - $display("WRITE Buffer %d, wr_ready_o %d, wr_full_o %d", wr_dat_i, wr_ready_o, wr_full_o); - - initial begin - $dumpfile("buffer_int_tb.vcd"); - $dumpvars(0,buffer_int_tb); - end - - task FillRAM; - begin - ram_addr <= 0; - ram_data <= 0; - @(posedge clk); - ram_en <= 1; - ram_we <= 1; - @(posedge clk); - repeat (511) - begin - ram_addr <= ram_addr + 1; - ram_data <= ram_data + 1; - ram_en <= 1; - ram_we <= 1; - @(posedge clk); - end - ram_en <= 0; - ram_we <= 0; - @(posedge clk); - $display("Filled the RAM"); - end - endtask // FillRAM - - task ResetBuffer; - begin - clear <= 1; read <= 0; write <= 0; - go <= 1; - @(posedge clk); - go <= 0; - @(posedge clk); - $display("Buffer Reset"); - end - endtask // ClearBuffer - - task SetBufferWrite; - input [8:0] start; - input [8:0] stop; - begin - clear <= 0; read <= 0; write <= 1; - firstline <= start; - lastline <= stop; - go <= 1; - @(posedge clk); - go <= 0; - @(posedge clk); - $display("Buffer Set for Write"); - end - endtask // SetBufferWrite - - task SetBufferRead; - input [8:0] start; - input [8:0] stop; - begin - clear <= 0; read <= 1; write <= 0; - firstline <= start; - lastline <= stop; - go <= 1; - @(posedge clk); - go <= 0; - @(posedge clk); - $display("Buffer Set for Read"); - end - endtask // SetBufferRead - - task ReadALine; - begin - #1 rd_read_i <= 1; - @(posedge clk); - rd_read_i <= 0; - end - endtask // ReadALine - - task ReadLines; - input [9:0] lines; - input [7:0] wait_states; - begin - $display("Read Lines: Number %d, Wait States %d",lines,wait_states); - repeat (lines) - begin - ReadALine; - repeat (wait_states) - @(posedge clk); - end - end - endtask // ReadLines - - task WriteALine; - input [31:0] value; - begin - #1 wr_write_i <= 1; - wr_dat_i <= value; - @(posedge clk); - wr_write_i <= 0; - end - endtask // WriteALine - - task WriteLines; - input [9:0] lines; - input [7:0] wait_states; - input [31:0] value; - begin - $display("Write Lines: Number %d, Wait States %d",lines,wait_states); - repeat(lines) - begin - value <= value + 1; - WriteALine(value); - repeat(wait_states) - @(posedge clk); - end - end - endtask // WriteLines - -endmodule // buffer_int_tb diff --git a/control_lib/buffer_pool.v b/control_lib/buffer_pool.v deleted file mode 100644 index e69de29bb..000000000 diff --git a/control_lib/buffer_pool_tb.v b/control_lib/buffer_pool_tb.v deleted file mode 100644 index 16741438e..000000000 --- a/control_lib/buffer_pool_tb.v +++ /dev/null @@ -1,50 +0,0 @@ - -module buffer_pool_tb(); - - wire wb_clk_i; - wire wb_rst_i; - wire wb_we_i; - wire wb_stb_i; - wire [15:0] wb_adr_i; - wire [31:0] wb_dat_i; - wire [31:0] wb_dat_o; - wire wb_ack_o; - wire wb_err_o; - wire wb_rty_o; - - wire stream_clk, stream_rst; - - wire set_stb; - wire [7:0] set_addr; - wire [31:0] set_data; - - wire [31:0] wr0_dat_i; - buffer_pool dut - (.wb_clk_i(wb_clk_i), - .wb_rst_i(wb_rst_i), - .wb_we_i(wb_we_i), - .wb_stb_i(wb_stb_i), - .wb_adr_i(wb_adr_i), - .wb_dat_i(wb_dat_i), - .wb_dat_o(wb_dat_o), - .wb_ack_o(wb_ack_o), - .wb_err_o(wb_err_o), - .wb_rty_o(wb_rty_o), - - .stream_clk(stream_clk), - .stream_rst(stream_rst), - - .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data), - - .wr0_dat_i(wr0_dat_i), .wr0_write_i(), .wr0_done_i(), .wr0_error_i(), .wr0_ready_o(), .wr0_full_o(), - .wr1_dat_i(), .wr1_write_i(), .wr1_done_i(), .wr1_error_i(), .wr1_ready_o(), .wr1_full_o(), - .wr2_dat_i(), .wr2_write_i(), .wr2_done_i(), .wr2_error_i(), .wr2_ready_o(), .wr2_full_o(), - .wr3_dat_i(), .wr3_write_i(), .wr3_done_i(), .wr3_error_i(), .wr3_ready_o(), .wr3_full_o(), - - .rd0_dat_o(), .rd0_read_i(), .rd0_done_i(), .rd0_error_i(), .rd0_ready_o(), .rd0_empty_o(), - .rd1_dat_o(), .rd1_read_i(), .rd1_done_i(), .rd1_error_i(), .rd1_ready_o(), .rd1_empty_o(), - .rd2_dat_o(), .rd2_read_i(), .rd2_done_i(), .rd2_error_i(), .rd2_ready_o(), .rd2_empty_o(), - .rd3_dat_o(), .rd3_read_i(), .rd3_done_i(), .rd3_error_i(), .rd3_ready_o(), .rd3_empty_o() - ); - -endmodule // buffer_pool_tb -- cgit v1.2.3 From 280e196b60f0a4e8f1915dbd38761e879ccd567e Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Wed, 2 Sep 2009 17:09:16 -0700 Subject: never used, not needed --- control_lib/fifo_reader.v | 28 ------ control_lib/fifo_writer.v | 31 ------- control_lib/giantfifo.v | 209 --------------------------------------------- control_lib/giantfifo_tb.v | 173 ------------------------------------- 4 files changed, 441 deletions(-) delete mode 100644 control_lib/fifo_reader.v delete mode 100644 control_lib/fifo_writer.v delete mode 100644 control_lib/giantfifo.v delete mode 100644 control_lib/giantfifo_tb.v (limited to 'control_lib') diff --git a/control_lib/fifo_reader.v b/control_lib/fifo_reader.v deleted file mode 100644 index 49d05b1a6..000000000 --- a/control_lib/fifo_reader.v +++ /dev/null @@ -1,28 +0,0 @@ - -module fifo_reader - #(parameter rate=4) - (input clk, - input [31:0] data_in, - output read_o - input ready_i, - input done_i - ); - - reg [7:0] state = 0; - - always @(posedge clk) - if(ready) - if(state == rate) - state <= 0; - else - state <= state + 1; - else - state <= 0; - - assign read = (state == rate); - - initial $monitor(data_in); - -endmodule // fifo_reader - - diff --git a/control_lib/fifo_writer.v b/control_lib/fifo_writer.v deleted file mode 100644 index 064ad3cb9..000000000 --- a/control_lib/fifo_writer.v +++ /dev/null @@ -1,31 +0,0 @@ - -module fifo_writer - #(parameter rate=4) - (input clk, - output [31:0] data_out, - output write_o, - input ready_i, - input done_i - ); - - reg [7:0] state = 0; - - - // FIXME change this to write - always @(posedge clk) - if(ready) - if(state == rate) - state <= 0; - else - state <= state + 1; - else - state <= 0; - - assign read = (state == rate); - - initial $monitor(data_in); - -endmodule // fifo_writer - - - diff --git a/control_lib/giantfifo.v b/control_lib/giantfifo.v deleted file mode 100644 index dba330b8a..000000000 --- a/control_lib/giantfifo.v +++ /dev/null @@ -1,209 +0,0 @@ - - - -module giantfifo - #(parameter WIDTH=36) - (input clk, input rst, - input [WIDTH-1:0] datain, - output [WIDTH-1:0] dataout, - input read, - input write, - input clear, - output full, - output empty, - output [15:0] space, - output [15:0] occupied, - - // External RAM - inout [17:0] RAM_D, - output reg [18:0] RAM_A, - output RAM_CE1n, - output RAM_CENn, - output reg RAM_CLK, - output reg RAM_WEn, - output RAM_OEn, - output RAM_LDn - ); - - wire [4:0] path1_occ, path2_space; - wire [35:0] path1_dat, path2_dat; - - shortfifo #(.WIDTH(WIDTH)) sf1 - (.clk(clk),.rst(rst),.clear(clear), - .datain(datain),.write(write),.full(full), - .dataout(path1_dat),.read(path1_read),.empty(path1_empty), - .space(),.occupied(path1_occ) ); - wire path1_almost_empty = (path1_occ == 5'd1); - - shortfifo #(.WIDTH(WIDTH)) sf2 - (.clk(clk),.rst(rst),.clear(clear), - .datain(path2_dat),.write(path2_write),.full(path2_full), - .dataout(dataout),.read(read),.empty(empty), - .space(path2_space),.occupied() ); - wire path2_almost_full = (path2_space == 5'd1); - - assign RAM_CE1n = 1'b0; - assign RAM_CENn = 1'b0; - always @(clk) - RAM_CLK <= #2 clk; - assign RAM_LDn = 1'b0; - - // State machine - wire write_now, read_now, idle, phase; - reg ram_full, ram_empty; - - reg [17:0] read_ptr, write_ptr; - reg [2:0] zbt_state; - - localparam ZBT_IDLE = 0; - localparam ZBT_WRITE_UPPER = 2; - localparam ZBT_WRITE_LOWER = 3; - localparam ZBT_READ_UPPER = 4; - localparam ZBT_READ_LOWER = 5; - - wire can_write = ~ram_full & ~path1_empty; - wire can_write_chain = can_write & ~path1_almost_empty; - - wire can_read = ~ram_empty & ~path2_full; - wire can_read_chain = can_read & ~path2_almost_full; - - assign phase = zbt_state[0]; - - reg [17:0] ram_occupied; - wire ram_almost_empty = (write_ptr == (read_ptr+1'b1)); - wire ram_almost_full = ((write_ptr+1'b1) == read_ptr); - - always @(posedge clk) - if(rst | clear) - begin - zbt_state <= ZBT_IDLE; - write_ptr <= 0; - read_ptr <= 0; - ram_full <= 0; - ram_empty <= 1; - ram_occupied <= 0; - end - else - case(zbt_state) - ZBT_IDLE : - if(can_read) - zbt_state <= ZBT_READ_UPPER; - else if(can_write) - zbt_state <= ZBT_WRITE_UPPER; - - ZBT_WRITE_UPPER : - begin - zbt_state <= ZBT_WRITE_LOWER; - ram_occupied <= ram_occupied + 1; - ram_empty <= 0; - if(ram_occupied == 18'd10) - ram_full <= 1; - end - ZBT_WRITE_LOWER : - begin - write_ptr <= write_ptr + 1; - if(can_read_chain) - zbt_state <= ZBT_READ_UPPER; - else if(can_write_chain) - zbt_state <= ZBT_WRITE_UPPER; - else - zbt_state <= ZBT_IDLE; - end - ZBT_READ_UPPER : - begin - zbt_state <= ZBT_READ_LOWER; - ram_occupied <= ram_occupied - 1; - ram_full <= 0; - if(ram_occupied == 18'd1) - ram_empty <= 1; - end - ZBT_READ_LOWER : - begin - read_ptr <= read_ptr + 1; - if(can_read_chain) - zbt_state <= ZBT_READ_UPPER; - else if(can_write_chain) - zbt_state <= ZBT_WRITE_UPPER; - else - zbt_state <= ZBT_IDLE; - end - default : - zbt_state <= ZBT_IDLE; - endcase // case(zbt_state) - - // Need to generate RAM_WEn, RAM_OEn, RAM_D, RAM_A; - assign path1_read = (zbt_state == ZBT_WRITE_LOWER); - reg path2_write, delayed_read_upper, delayed_read_lower, delayed_write; - - always @(posedge clk) - if(delayed_read_upper) - path2_dat[35:18] <= RAM_D; - always @(posedge clk) - if(delayed_read_lower) - path2_dat[17:0] <= RAM_D; - - always @(posedge clk) - if(rst) - begin - delayed_read_upper <= 0; - delayed_read_lower <= 0; - path2_write <= 0; - end - else - begin - delayed_read_upper <= (zbt_state == ZBT_READ_LOWER); - delayed_read_lower <= delayed_read_upper; - path2_write <= delayed_read_lower; - end - - reg [17:0] RAM_D_pre2, RAM_D_pre1, RAM_D_out; - - always @(posedge clk) - RAM_D_pre2 <= phase ? path1_dat[17:0] : path1_dat[35:18]; - - always @(posedge clk) RAM_D_pre1 <= RAM_D_pre2; - always @(posedge clk) RAM_D_out <= RAM_D_pre1; - reg wr_del_1, wr_del_2; - always @(posedge clk) - if(rst) - begin - wr_del_1 <= 0; - wr_del_2 <= 0; - delayed_write <= 0; - end - else - begin - delayed_write <= wr_del_2; - wr_del_2 <= wr_del_1; - wr_del_1 <= write_now; - end - - reg delayed_read, rd_del_1, rd_del_2; - always @(posedge clk) - if(rst) - begin - rd_del_1 <= 0; - rd_del_2 <= 0; - delayed_read <= 0; - end - else - begin - delayed_read <= rd_del_2; - rd_del_2 <= rd_del_1; - rd_del_1 <= read_now; - end - - assign RAM_D = delayed_write ? RAM_D_out : 18'bzzzzzzzzzzzzzzzzzz; - assign write_now = (zbt_state == ZBT_WRITE_UPPER) || (zbt_state == ZBT_WRITE_LOWER); - assign read_now = (zbt_state == ZBT_READ_UPPER) || (zbt_state == ZBT_READ_LOWER); - - always @(posedge clk) - RAM_A <= write_now ? {write_ptr,phase} : {read_ptr,phase}; - - always @(posedge clk) - RAM_WEn <= ~write_now; - - assign RAM_OEn = ~delayed_read; - assign RAM_OEn = 0; - -endmodule // giantfifo diff --git a/control_lib/giantfifo_tb.v b/control_lib/giantfifo_tb.v deleted file mode 100644 index 87ecd97ae..000000000 --- a/control_lib/giantfifo_tb.v +++ /dev/null @@ -1,173 +0,0 @@ -module fifo_tb(); - - localparam WIDTH = 36; - reg clk, rst; - wire short_full, short_empty, long_full, long_empty, giant_full, giant_empty; - wire casc_full, casc_empty, casc2_full, casc2_empty; - reg read, write; - - wire [WIDTH-1:0] short_do, long_do, casc_do, casc2_do, giant_do; - reg [WIDTH-1:0] di; - - reg clear = 0; - - shortfifo #(.WIDTH(WIDTH)) shortfifo - (.clk(clk),.rst(rst),.datain(di),.dataout(short_do),.clear(clear), - .read(read),.write(write),.full(short_full),.empty(short_empty)); - - longfifo #(.WIDTH(WIDTH), .SIZE(4)) longfifo - (.clk(clk),.rst(rst),.datain(di),.dataout(long_do),.clear(clear), - .read(read),.write(write),.full(long_full),.empty(long_empty)); - - cascadefifo #(.WIDTH(WIDTH), .SIZE(4)) cascadefifo - (.clk(clk),.rst(rst),.datain(di),.dataout(casc_do),.clear(clear), - .read(read),.write(write),.full(casc_full),.empty(casc_empty)); - - cascadefifo2 #(.WIDTH(WIDTH), .SIZE(4)) cascadefifo2 - (.clk(clk),.rst(rst),.datain(di),.dataout(casc2_do),.clear(clear), - .read(read),.write(write),.full(casc2_full),.empty(casc2_empty)); - - wire [17:0] RAM_D; - wire [18:0] RAM_A; - wire RAM_CLK, RAM_WEn, RAM_LDn, RAM_CE1n, RAM_OEn, RAM_CENn; - - giantfifo #(.WIDTH(WIDTH)) giantfifo - (.clk(clk),.rst(rst),.datain(di),.dataout(giant_do),.clear(clear), - .read(read),.write(write),.full(giant_full),.empty(giant_empty), - .RAM_D(RAM_D),.RAM_A(RAM_A),.RAM_CE1n(RAM_CE1n),.RAM_CENn(RAM_CENn), - .RAM_CLK(RAM_CLK),.RAM_WEn(RAM_WEn),.RAM_OEn(RAM_OEn),.RAM_LDn(RAM_LDn) - ); - - wire MODE = 1'b0; - cy1356 ram_model(.d(RAM_D),.clk(RAM_CLK),.a(RAM_A), - .bws(2'b00),.we_b(RAM_WEn),.adv_lb(RAM_LDn), - .ce1b(RAM_CE1n),.ce2(1'b1),.ce3b(1'b0), - .oeb(RAM_OEn),.cenb(RAM_CENn),.mode(MODE) - ); - - initial rst = 1; - initial #1000 rst = 0; - initial clk = 0; - always #50 clk = ~clk; - - initial di = 36'h300AE; - initial read = 0; - initial write = 0; - - always @(posedge clk) - if(write) - di <= di + 1; - - always @(posedge clk) - begin - if(short_full != long_full) - $display("Error: FULL mismatch"); - if(short_empty != long_empty) - $display("Note: EMPTY mismatch, usually not a problem (longfifo has 2 cycle latency)"); - if(read & (short_do != long_do)) - $display("Error: DATA mismatch"); - end - - initial $dumpfile("giantfifo_tb.vcd"); - initial $dumpvars(0,fifo_tb); - - initial - begin - @(negedge rst); - @(posedge clk); - repeat (10) - @(posedge clk); - write <= 1; - @(posedge clk); - write <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - read <= 1; - @(posedge clk); - read <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - - repeat(10) - begin - write <= 1; - @(posedge clk); - write <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - read <= 1; - @(posedge clk); - read <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - end // repeat (10) - - write <= 1; - repeat (4) - @(posedge clk); - write <= 0; - @(posedge clk); - read <= 1; - repeat (4) - @(posedge clk); - read <= 0; - @(posedge clk); - - - write <= 1; - repeat (4) - @(posedge clk); - write <= 0; - @(posedge clk); - repeat (4) - begin - read <= 1; - @(posedge clk); - read <= 0; - @(posedge clk); - end - - write <= 1; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - read <= 1; - repeat (5) - @(posedge clk); - write <= 0; - @(posedge clk); - @(posedge clk); - read <= 0; - @(posedge clk); - - write <= 1; - repeat (16) - @(posedge clk); - write <= 0; - @(posedge clk); - - read <= 1; - repeat (16) - @(posedge clk); - read <= 0; - @(posedge clk); - - repeat (10) - @(posedge clk); - $finish; - end -endmodule // longfifo_tb -- cgit v1.2.3 From a3ebf209706e424df88a0f5abbb12b80147c922b Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Wed, 2 Sep 2009 17:23:12 -0700 Subject: cascadefifo.v wasn't used, only the double cascade version. fifo_2clock.v and fifo_2clock.v are empty --- control_lib/cascadefifo.v | 50 ---------------------------------- control_lib/fifo_tb.v | 8 ++---- control_lib/newfifo/fifo_2clock.v | 0 control_lib/newfifo/fifo_2clock_casc.v | 0 4 files changed, 2 insertions(+), 56 deletions(-) delete mode 100644 control_lib/cascadefifo.v delete mode 100644 control_lib/newfifo/fifo_2clock.v delete mode 100644 control_lib/newfifo/fifo_2clock_casc.v (limited to 'control_lib') diff --git a/control_lib/cascadefifo.v b/control_lib/cascadefifo.v deleted file mode 100644 index c1a4ab335..000000000 --- a/control_lib/cascadefifo.v +++ /dev/null @@ -1,50 +0,0 @@ - - -// This FIFO exists to provide an intermediate point for the data on its -// long trek from one RAM (in the buffer pool) to another (in the longfifo) -// The shortfifo is more flexible in its placement since it is based on -// distributed RAM -// This one should only be used on transmit side applications. I.e. tx_mac, tx_dsp, etc. -// Spartan 3's have slow routing.... -// If we REALLY need to, we could also do this on the output side, -// with for the receive side stuff - -module cascadefifo - #(parameter WIDTH=32, SIZE=9) - (input clk, input rst, - input [WIDTH-1:0] datain, - output [WIDTH-1:0] dataout, - input read, - input write, - input clear, - output full, - output empty, - output [15:0] space, - output [15:0] occupied); - - wire [WIDTH-1:0] data_int; - wire empty_int, full_int, transfer; - wire [4:0] short_space, short_occupied; - wire [15:0] long_space, long_occupied; - - shortfifo #(.WIDTH(WIDTH)) shortfifo - (.clk(clk),.rst(rst),.clear(clear), - .datain(datain), .write(write), .full(full), - .dataout(data_int), .read(transfer), .empty(empty_int), - .space(short_space),.occupied(short_occupied) ); - - longfifo #(.WIDTH(WIDTH),.SIZE(SIZE)) longfifo - (.clk(clk),.rst(rst),.clear(clear), - .datain(data_int), .write(transfer), .full(full_int), - .dataout(dataout), .read(read), .empty(empty), - .space(long_space),.occupied(long_occupied) ); - - assign transfer = ~empty_int & ~full_int; - - assign space = {11'b0,short_space} + long_space; - assign occupied = {11'b0,short_occupied} + long_occupied; - -endmodule // cascadefifo - - - diff --git a/control_lib/fifo_tb.v b/control_lib/fifo_tb.v index 98fd63f8d..616fe4ee7 100644 --- a/control_lib/fifo_tb.v +++ b/control_lib/fifo_tb.v @@ -2,11 +2,11 @@ module fifo_tb(); reg clk, rst; wire short_full, short_empty, long_full, long_empty; - wire casc_full, casc_empty, casc2_full, casc2_empty; + wire casc2_full, casc2_empty; reg read, write; wire [7:0] short_do, long_do; - wire [7:0] casc_do, casc2_do; + wire [7:0] casc2_do; reg [7:0] di; reg clear = 0; @@ -19,10 +19,6 @@ module fifo_tb(); (.clk(clk),.rst(rst),.datain(di),.dataout(long_do),.clear(clear), .read(read),.write(write),.full(long_full),.empty(long_empty)); - cascadefifo #(.WIDTH(8), .SIZE(4)) cascadefifo - (.clk(clk),.rst(rst),.datain(di),.dataout(casc_do),.clear(clear), - .read(read),.write(write),.full(casc_full),.empty(casc_empty)); - cascadefifo2 #(.WIDTH(8), .SIZE(4)) cascadefifo2 (.clk(clk),.rst(rst),.datain(di),.dataout(casc2_do),.clear(clear), .read(read),.write(write),.full(casc2_full),.empty(casc2_empty)); diff --git a/control_lib/newfifo/fifo_2clock.v b/control_lib/newfifo/fifo_2clock.v deleted file mode 100644 index e69de29bb..000000000 diff --git a/control_lib/newfifo/fifo_2clock_casc.v b/control_lib/newfifo/fifo_2clock_casc.v deleted file mode 100644 index e69de29bb..000000000 -- cgit v1.2.3 From fb04ad0eb86ea0cfa65be66c09c8424213c9c932 Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Wed, 2 Sep 2009 17:28:57 -0700 Subject: cleaning up the new fifos --- control_lib/newfifo/cascadefifo_2clock.v | 27 ------ control_lib/newfifo/fifo_2clock.v | 82 ++++++++++++++++ control_lib/newfifo/fifo_2clock_cascade.v | 27 ++++++ control_lib/newfifo/fifo_tb.v | 155 ------------------------------ control_lib/newfifo/newfifo_2clock.v | 82 ---------------- 5 files changed, 109 insertions(+), 264 deletions(-) delete mode 100644 control_lib/newfifo/cascadefifo_2clock.v create mode 100644 control_lib/newfifo/fifo_2clock.v create mode 100644 control_lib/newfifo/fifo_2clock_cascade.v delete mode 100644 control_lib/newfifo/fifo_tb.v delete mode 100644 control_lib/newfifo/newfifo_2clock.v (limited to 'control_lib') diff --git a/control_lib/newfifo/cascadefifo_2clock.v b/control_lib/newfifo/cascadefifo_2clock.v deleted file mode 100644 index 2abbbf3b5..000000000 --- a/control_lib/newfifo/cascadefifo_2clock.v +++ /dev/null @@ -1,27 +0,0 @@ - -module cascadefifo_2clock - #(parameter DWIDTH=32, AWIDTH=9) - (input wclk, input [DWIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output [AWIDTH-1:0] level_wclk, - input rclk, output [DWIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output [AWIDTH-1:0] level_rclk, - input arst); - - wire [DWIDTH-1:0] data_int1, data_int2; - wire src_rdy_int1, src_rdy_int2, dst_rdy_int1, dst_rdy_int2; - - fifo_short #(.WIDTH(DWIDTH)) shortfifo - (.clk(wclk), .reset(arst), .clear(0), - .datain(datain), .src_rdy_i(src_rdy_i), .dst_rdy_o(dst_rdy_o), - .dataout(data_int1), .src_rdy_o(src_rdy_int1), .dst_rdy_i(dst_rdy_int1) ); - - newfifo_2clock #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) fifo_2clock - (.wclk(wclk), .datain(data_int1), .src_rdy_i(src_rdy_int1), .dst_rdy_o(dst_rdy_int1), .level_wclk(level_wclk), - .rclk(rclk), .dataout(data_int2), .src_rdy_o(src_rdy_int2), .dst_rdy_i(dst_rdy_int2), .level_rclk(level_rclk), - .arst(arst) ); - - fifo_short #(.WIDTH(DWIDTH)) shortfifo2 - (.clk(rclk), .reset(arst), .clear(0), - .datain(data_int2), .src_rdy_i(src_rdy_int2), .dst_rdy_o(dst_rdy_int2), - .dataout(dataout), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i) ); - -endmodule // fifo_2clock_casc - diff --git a/control_lib/newfifo/fifo_2clock.v b/control_lib/newfifo/fifo_2clock.v new file mode 100644 index 000000000..23a6f693c --- /dev/null +++ b/control_lib/newfifo/fifo_2clock.v @@ -0,0 +1,82 @@ + +module newfifo_2clock + #(parameter DWIDTH=32, AWIDTH=9) + (input wclk, input [DWIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output reg [AWIDTH-1:0] level_wclk, + input rclk, output [DWIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output reg [AWIDTH-1:0] level_rclk, + input arst); + + wire full, empty, write, read; + + assign dst_rdy_o = ~full; + assign src_rdy_o = ~empty; + assign write = src_rdy_i & dst_rdy_o; + assign read = src_rdy_o & dst_rdy_i; + +//`define USE_XLNX_FIFO 1 +`ifdef USE_XLNX_FIFO + fifo_xlnx_512x36_2clk mac_tx_fifo_2clk + (.rst(rst), + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(fifo_occupied[8:0]), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count() ); +`else + // ISE sucks, so the following doesn't work properly + + reg [AWIDTH-1:0] wr_addr, rd_addr; + wire [AWIDTH-1:0] wr_addr_rclk, rd_addr_wclk; + wire [AWIDTH-1:0] next_rd_addr; + wire enb_read; + + // Write side management + wire [AWIDTH-1:0] next_wr_addr = wr_addr + 1; + always @(posedge wclk or posedge arst) + if(arst) + wr_addr <= 0; + else if(write) + wr_addr <= next_wr_addr; + assign full = (next_wr_addr == rd_addr_wclk); + + // RAM for data storage. Data out is registered, complicating the + // read side logic + ram_2port #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) mac_rx_ff_ram + (.clka(wclk),.ena(1'b1),.wea(write),.addra(wr_addr),.dia(datain),.doa(), + .clkb(rclk),.enb(enb_read),.web(1'b0),.addrb(next_rd_addr),.dib(0),.dob(dataout) ); + + // Read side management + reg data_valid; + assign empty = ~data_valid; + assign next_rd_addr = rd_addr + data_valid; + assign enb_read = read | ~data_valid; + + always @(posedge rclk or posedge arst) + if(arst) + rd_addr <= 0; + else if(read) + rd_addr <= rd_addr + 1; + + always @(posedge rclk or posedge arst) + if(arst) + data_valid <= 0; + else + if(read & (next_rd_addr == wr_addr_rclk)) + data_valid <= 0; + else if(next_rd_addr != wr_addr_rclk) + data_valid <= 1; + + // Send pointers across clock domains via gray code + gray_send #(.WIDTH(AWIDTH)) send_wr_addr + (.clk_in(wclk),.addr_in(wr_addr), + .clk_out(rclk),.addr_out(wr_addr_rclk) ); + + gray_send #(.WIDTH(AWIDTH)) send_rd_addr + (.clk_in(rclk),.addr_in(rd_addr), + .clk_out(wclk),.addr_out(rd_addr_wclk) ); + + // Generate fullness info, these are approximate and may be delayed + // and are only for higher-level flow control. + // Only full and empty are guaranteed exact. + always @(posedge wclk) + level_wclk <= wr_addr - rd_addr_wclk; + always @(posedge rclk) + level_rclk <= wr_addr_rclk - rd_addr; +`endif +endmodule // fifo_2clock diff --git a/control_lib/newfifo/fifo_2clock_cascade.v b/control_lib/newfifo/fifo_2clock_cascade.v new file mode 100644 index 000000000..2abbbf3b5 --- /dev/null +++ b/control_lib/newfifo/fifo_2clock_cascade.v @@ -0,0 +1,27 @@ + +module cascadefifo_2clock + #(parameter DWIDTH=32, AWIDTH=9) + (input wclk, input [DWIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output [AWIDTH-1:0] level_wclk, + input rclk, output [DWIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output [AWIDTH-1:0] level_rclk, + input arst); + + wire [DWIDTH-1:0] data_int1, data_int2; + wire src_rdy_int1, src_rdy_int2, dst_rdy_int1, dst_rdy_int2; + + fifo_short #(.WIDTH(DWIDTH)) shortfifo + (.clk(wclk), .reset(arst), .clear(0), + .datain(datain), .src_rdy_i(src_rdy_i), .dst_rdy_o(dst_rdy_o), + .dataout(data_int1), .src_rdy_o(src_rdy_int1), .dst_rdy_i(dst_rdy_int1) ); + + newfifo_2clock #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) fifo_2clock + (.wclk(wclk), .datain(data_int1), .src_rdy_i(src_rdy_int1), .dst_rdy_o(dst_rdy_int1), .level_wclk(level_wclk), + .rclk(rclk), .dataout(data_int2), .src_rdy_o(src_rdy_int2), .dst_rdy_i(dst_rdy_int2), .level_rclk(level_rclk), + .arst(arst) ); + + fifo_short #(.WIDTH(DWIDTH)) shortfifo2 + (.clk(rclk), .reset(arst), .clear(0), + .datain(data_int2), .src_rdy_i(src_rdy_int2), .dst_rdy_o(dst_rdy_int2), + .dataout(dataout), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i) ); + +endmodule // fifo_2clock_casc + diff --git a/control_lib/newfifo/fifo_tb.v b/control_lib/newfifo/fifo_tb.v deleted file mode 100644 index 98fd63f8d..000000000 --- a/control_lib/newfifo/fifo_tb.v +++ /dev/null @@ -1,155 +0,0 @@ -module fifo_tb(); - - reg clk, rst; - wire short_full, short_empty, long_full, long_empty; - wire casc_full, casc_empty, casc2_full, casc2_empty; - reg read, write; - - wire [7:0] short_do, long_do; - wire [7:0] casc_do, casc2_do; - reg [7:0] di; - - reg clear = 0; - - shortfifo #(.WIDTH(8)) shortfifo - (.clk(clk),.rst(rst),.datain(di),.dataout(short_do),.clear(clear), - .read(read),.write(write),.full(short_full),.empty(short_empty)); - - longfifo #(.WIDTH(8), .SIZE(4)) longfifo - (.clk(clk),.rst(rst),.datain(di),.dataout(long_do),.clear(clear), - .read(read),.write(write),.full(long_full),.empty(long_empty)); - - cascadefifo #(.WIDTH(8), .SIZE(4)) cascadefifo - (.clk(clk),.rst(rst),.datain(di),.dataout(casc_do),.clear(clear), - .read(read),.write(write),.full(casc_full),.empty(casc_empty)); - - cascadefifo2 #(.WIDTH(8), .SIZE(4)) cascadefifo2 - (.clk(clk),.rst(rst),.datain(di),.dataout(casc2_do),.clear(clear), - .read(read),.write(write),.full(casc2_full),.empty(casc2_empty)); - - initial rst = 1; - initial #1000 rst = 0; - initial clk = 0; - always #50 clk = ~clk; - - initial di = 8'hAE; - initial read = 0; - initial write = 0; - - always @(posedge clk) - if(write) - di <= di + 1; - - always @(posedge clk) - begin - if(short_full != long_full) - $display("Error: FULL mismatch"); - if(short_empty != long_empty) - $display("Note: EMPTY mismatch, usually not a problem (longfifo has 2 cycle latency)"); - if(read & (short_do != long_do)) - $display("Error: DATA mismatch"); - end - - initial $dumpfile("fifo_tb.vcd"); - initial $dumpvars(0,fifo_tb); - - initial - begin - @(negedge rst); - @(posedge clk); - repeat (10) - @(posedge clk); - write <= 1; - @(posedge clk); - write <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - read <= 1; - @(posedge clk); - read <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - - repeat(10) - begin - write <= 1; - @(posedge clk); - write <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - read <= 1; - @(posedge clk); - read <= 0; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - end // repeat (10) - - write <= 1; - repeat (4) - @(posedge clk); - write <= 0; - @(posedge clk); - read <= 1; - repeat (4) - @(posedge clk); - read <= 0; - @(posedge clk); - - - write <= 1; - repeat (4) - @(posedge clk); - write <= 0; - @(posedge clk); - repeat (4) - begin - read <= 1; - @(posedge clk); - read <= 0; - @(posedge clk); - end - - write <= 1; - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - read <= 1; - repeat (5) - @(posedge clk); - write <= 0; - @(posedge clk); - @(posedge clk); - read <= 0; - @(posedge clk); - - write <= 1; - repeat (16) - @(posedge clk); - write <= 0; - @(posedge clk); - - read <= 1; - repeat (16) - @(posedge clk); - read <= 0; - @(posedge clk); - - repeat (10) - @(posedge clk); - $finish; - end -endmodule // longfifo_tb diff --git a/control_lib/newfifo/newfifo_2clock.v b/control_lib/newfifo/newfifo_2clock.v deleted file mode 100644 index 23a6f693c..000000000 --- a/control_lib/newfifo/newfifo_2clock.v +++ /dev/null @@ -1,82 +0,0 @@ - -module newfifo_2clock - #(parameter DWIDTH=32, AWIDTH=9) - (input wclk, input [DWIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output reg [AWIDTH-1:0] level_wclk, - input rclk, output [DWIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output reg [AWIDTH-1:0] level_rclk, - input arst); - - wire full, empty, write, read; - - assign dst_rdy_o = ~full; - assign src_rdy_o = ~empty; - assign write = src_rdy_i & dst_rdy_o; - assign read = src_rdy_o & dst_rdy_i; - -//`define USE_XLNX_FIFO 1 -`ifdef USE_XLNX_FIFO - fifo_xlnx_512x36_2clk mac_tx_fifo_2clk - (.rst(rst), - .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(fifo_occupied[8:0]), - .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count() ); -`else - // ISE sucks, so the following doesn't work properly - - reg [AWIDTH-1:0] wr_addr, rd_addr; - wire [AWIDTH-1:0] wr_addr_rclk, rd_addr_wclk; - wire [AWIDTH-1:0] next_rd_addr; - wire enb_read; - - // Write side management - wire [AWIDTH-1:0] next_wr_addr = wr_addr + 1; - always @(posedge wclk or posedge arst) - if(arst) - wr_addr <= 0; - else if(write) - wr_addr <= next_wr_addr; - assign full = (next_wr_addr == rd_addr_wclk); - - // RAM for data storage. Data out is registered, complicating the - // read side logic - ram_2port #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) mac_rx_ff_ram - (.clka(wclk),.ena(1'b1),.wea(write),.addra(wr_addr),.dia(datain),.doa(), - .clkb(rclk),.enb(enb_read),.web(1'b0),.addrb(next_rd_addr),.dib(0),.dob(dataout) ); - - // Read side management - reg data_valid; - assign empty = ~data_valid; - assign next_rd_addr = rd_addr + data_valid; - assign enb_read = read | ~data_valid; - - always @(posedge rclk or posedge arst) - if(arst) - rd_addr <= 0; - else if(read) - rd_addr <= rd_addr + 1; - - always @(posedge rclk or posedge arst) - if(arst) - data_valid <= 0; - else - if(read & (next_rd_addr == wr_addr_rclk)) - data_valid <= 0; - else if(next_rd_addr != wr_addr_rclk) - data_valid <= 1; - - // Send pointers across clock domains via gray code - gray_send #(.WIDTH(AWIDTH)) send_wr_addr - (.clk_in(wclk),.addr_in(wr_addr), - .clk_out(rclk),.addr_out(wr_addr_rclk) ); - - gray_send #(.WIDTH(AWIDTH)) send_rd_addr - (.clk_in(rclk),.addr_in(rd_addr), - .clk_out(wclk),.addr_out(rd_addr_wclk) ); - - // Generate fullness info, these are approximate and may be delayed - // and are only for higher-level flow control. - // Only full and empty are guaranteed exact. - always @(posedge wclk) - level_wclk <= wr_addr - rd_addr_wclk; - always @(posedge rclk) - level_rclk <= wr_addr_rclk - rd_addr; -`endif -endmodule // fifo_2clock -- cgit v1.2.3 From 09951ed9ba4758cc7cced26c1f673545284c5cf3 Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Wed, 2 Sep 2009 17:56:26 -0700 Subject: major cleanup of 2 clock fifos --- control_lib/newfifo/.gitignore | 1 + control_lib/newfifo/fifo_2clock.v | 32 +++--- control_lib/newfifo/fifo_2clock_cascade.v | 44 +++++---- control_lib/newfifo/fifo_new_tb.v | 158 ------------------------------ control_lib/newfifo/fifo_tb.v | 158 ++++++++++++++++++++++++++++++ 5 files changed, 206 insertions(+), 187 deletions(-) create mode 100644 control_lib/newfifo/.gitignore delete mode 100644 control_lib/newfifo/fifo_new_tb.v create mode 100644 control_lib/newfifo/fifo_tb.v (limited to 'control_lib') diff --git a/control_lib/newfifo/.gitignore b/control_lib/newfifo/.gitignore new file mode 100644 index 000000000..cba7efc8e --- /dev/null +++ b/control_lib/newfifo/.gitignore @@ -0,0 +1 @@ +a.out diff --git a/control_lib/newfifo/fifo_2clock.v b/control_lib/newfifo/fifo_2clock.v index 23a6f693c..40c479db7 100644 --- a/control_lib/newfifo/fifo_2clock.v +++ b/control_lib/newfifo/fifo_2clock.v @@ -1,23 +1,31 @@ -module newfifo_2clock - #(parameter DWIDTH=32, AWIDTH=9) - (input wclk, input [DWIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output reg [AWIDTH-1:0] level_wclk, - input rclk, output [DWIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output reg [AWIDTH-1:0] level_rclk, - input arst); +// FIXME ignores the AWIDTH (fifo size) parameter - wire full, empty, write, read; +module fifo_2clock + #(parameter WIDTH=32, SIZE=9) + (input wclk, input [WIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output [15:0] space, + input rclk, output [WIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output [15:0] occupied, + input arst); + + wire [SIZE-1:0] level_rclk, level_wclk; + wire full, empty, write, read; assign dst_rdy_o = ~full; assign src_rdy_o = ~empty; assign write = src_rdy_i & dst_rdy_o; assign read = src_rdy_o & dst_rdy_i; - -//`define USE_XLNX_FIFO 1 -`ifdef USE_XLNX_FIFO + fifo_xlnx_512x36_2clk mac_tx_fifo_2clk (.rst(rst), - .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(fifo_occupied[8:0]), - .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count() ); + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); + + assign occupied = {{(16-SIZE){1'b0}},level_rclk}; + assign space = ((1< Date: Wed, 2 Sep 2009 21:27:18 -0700 Subject: bring the testbench files up to date --- control_lib/newfifo/fifo_2clock_cascade.v | 2 +- simple_gemac/eth_tasks_f36.v | 33 ++++---- simple_gemac/simple_gemac_wrapper.build | 1 + simple_gemac/simple_gemac_wrapper_tb.v | 131 ++++++++++++++---------------- 4 files changed, 79 insertions(+), 88 deletions(-) create mode 100755 simple_gemac/simple_gemac_wrapper.build (limited to 'control_lib') diff --git a/control_lib/newfifo/fifo_2clock_cascade.v b/control_lib/newfifo/fifo_2clock_cascade.v index 8d8a47954..5ce726977 100644 --- a/control_lib/newfifo/fifo_2clock_cascade.v +++ b/control_lib/newfifo/fifo_2clock_cascade.v @@ -17,7 +17,7 @@ module fifo_2clock_cascade .dataout(data_int1), .src_rdy_o(src_rdy_int1), .dst_rdy_i(dst_rdy_int1), .space(s1_space), .occupied(s1_occupied) ); - fifo_2clock #(.DWIDTH(WIDTH),.SIZE(SIZE)) fifo_2clock + fifo_2clock #(.WIDTH(WIDTH),.SIZE(SIZE)) fifo_2clock (.wclk(wclk), .datain(data_int1), .src_rdy_i(src_rdy_int1), .dst_rdy_o(dst_rdy_int1), .space(l_space), .rclk(rclk), .dataout(data_int2), .src_rdy_o(src_rdy_int2), .dst_rdy_i(dst_rdy_int2), .occupied(l_occupied), .arst(arst) ); diff --git a/simple_gemac/eth_tasks_f36.v b/simple_gemac/eth_tasks_f36.v index b7fa52c07..efd72778b 100644 --- a/simple_gemac/eth_tasks_f36.v +++ b/simple_gemac/eth_tasks_f36.v @@ -5,9 +5,9 @@ task SendFlowCtrl; begin $display("Sending Flow Control, quanta = %d, time = %d", fc_len,$time); pause_time <= fc_len; - @(posedge clk); + @(posedge eth_clk); pause_req <= 1; - @(posedge clk); + @(posedge eth_clk); pause_req <= 0; $display("Sent Flow Control"); end @@ -20,27 +20,27 @@ task SendPacket_to_fifo36; begin $display("Sending Packet Len=%d, %d", data_len, $time); count <= 2; - tx_f36_dat <= {2'b0, 1'b0, 1'b1, data_start}; + tx_f36_data <= {2'b0, 1'b0, 1'b1, data_start}; tx_f36_src_rdy <= 1; #1; while(count < data_len) begin while(~tx_f36_dst_rdy) - @(posedge clk); - @(posedge clk); - tx_f36_dat[31:0] = tx_f36_dat[31:0] + 32'h0101_0101; + @(posedge sys_clk); + @(posedge sys_clk); + tx_f36_data[31:0] = tx_f36_data[31:0] + 32'h0101_0101; count = count + 4; - tx_f36_dat[32] <= 0; + tx_f36_data[32] <= 0; end - tx_f36_dat[3] <= 1; + tx_f36_data[33] <= 1; while(~tx_f36_dst_rdy) - @(posedge clk); - @(posedge clk); + @(posedge sys_clk); + @(posedge sys_clk); tx_f36_src_rdy <= 0; end endtask // SendPacket_to_fifo36 - +/* task Waiter; input [31:0] wait_length; begin @@ -50,7 +50,9 @@ task Waiter; tx_ll_src_rdy2 <= 1; end endtask // Waiter +*/ +/* task SendPacketFromFile_f36; input [31:0] data_len; input [31:0] wait_length; @@ -63,9 +65,9 @@ task SendPacketFromFile_f36; while(~tx_f36_dst_rdy) @(posedge clk); - tx_f36_data2 <= pkt_rom[0]; + tx_f36_data <= pkt_rom[0]; tx_f36_src_rdy <= 1; - tx_ll_eof2 <= 0; + tx_f36_eof <= 0; @(posedge clk); for(i=1;i Date: Thu, 3 Sep 2009 14:13:44 -0700 Subject: MAC transmit seems to work now. The root cause of the problem was accidentally using the rx_clk in one stage of the fifos on the tx side. --- control_lib/newfifo/fifo_2clock.v | 33 ++++++++++++++------ simple_gemac/simple_gemac_wrapper.v | 31 ++++++++++++------- simple_gemac/simple_gemac_wrapper_tb.v | 17 ++++++----- top/u2_rev3/Makefile | 56 +++++++++++----------------------- 4 files changed, 70 insertions(+), 67 deletions(-) (limited to 'control_lib') diff --git a/control_lib/newfifo/fifo_2clock.v b/control_lib/newfifo/fifo_2clock.v index 40c479db7..2ada39fb0 100644 --- a/control_lib/newfifo/fifo_2clock.v +++ b/control_lib/newfifo/fifo_2clock.v @@ -2,26 +2,39 @@ // FIXME ignores the AWIDTH (fifo size) parameter module fifo_2clock - #(parameter WIDTH=32, SIZE=9) + #(parameter WIDTH=36, SIZE=6) (input wclk, input [WIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output [15:0] space, input rclk, output [WIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output [15:0] occupied, input arst); - wire [SIZE-1:0] level_rclk, level_wclk; - wire full, empty, write, read; + wire [SIZE:0] level_rclk, level_wclk; // xilinx adds an extra bit if you ask for accurate levels + wire full, empty, write, read; assign dst_rdy_o = ~full; assign src_rdy_o = ~empty; assign write = src_rdy_i & dst_rdy_o; assign read = src_rdy_o & dst_rdy_i; - - fifo_xlnx_512x36_2clk mac_tx_fifo_2clk - (.rst(rst), - .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - assign occupied = {{(16-SIZE){1'b0}},level_rclk}; - assign space = ((1< Date: Fri, 4 Sep 2009 16:33:00 -0700 Subject: no longer used, replaced by newfifo version --- control_lib/fifo_2clock.v | 66 ----------------------------------------------- 1 file changed, 66 deletions(-) delete mode 100644 control_lib/fifo_2clock.v (limited to 'control_lib') diff --git a/control_lib/fifo_2clock.v b/control_lib/fifo_2clock.v deleted file mode 100644 index 6b1eb607e..000000000 --- a/control_lib/fifo_2clock.v +++ /dev/null @@ -1,66 +0,0 @@ - -module fifo_2clock - #(parameter DWIDTH=32, AWIDTH=9) - (input wclk, input [DWIDTH-1:0] datain, input write, output full, output reg [AWIDTH-1:0] level_wclk, - input rclk, output [DWIDTH-1:0] dataout, input read, output empty, output reg [AWIDTH-1:0] level_rclk, - input arst); - - reg [AWIDTH-1:0] wr_addr, rd_addr; - wire [AWIDTH-1:0] wr_addr_rclk, rd_addr_wclk; - wire [AWIDTH-1:0] next_rd_addr; - wire enb_read; - - // Write side management - wire [AWIDTH-1:0] next_wr_addr = wr_addr + 1; - always @(posedge wclk or posedge arst) - if(arst) - wr_addr <= 0; - else if(write) - wr_addr <= next_wr_addr; - assign full = (next_wr_addr == rd_addr_wclk); - - // RAM for data storage. Data out is registered, complicating the - // read side logic - ram_2port #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) mac_rx_ff_ram - (.clka(wclk),.ena(1'b1),.wea(write),.addra(wr_addr),.dia(datain),.doa(), - .clkb(rclk),.enb(enb_read),.web(1'b0),.addrb(next_rd_addr),.dib(0),.dob(dataout) ); - - // Read side management - reg data_valid; - assign empty = ~data_valid; - assign next_rd_addr = rd_addr + data_valid; - assign enb_read = read | ~data_valid; - - always @(posedge rclk or posedge arst) - if(arst) - rd_addr <= 0; - else if(read) - rd_addr <= rd_addr + 1; - - always @(posedge rclk or posedge arst) - if(arst) - data_valid <= 0; - else - if(read & (next_rd_addr == wr_addr_rclk)) - data_valid <= 0; - else if(next_rd_addr != wr_addr_rclk) - data_valid <= 1; - - // Send pointers across clock domains via gray code - gray_send #(.WIDTH(AWIDTH)) send_wr_addr - (.clk_in(wclk),.addr_in(wr_addr), - .clk_out(rclk),.addr_out(wr_addr_rclk) ); - - gray_send #(.WIDTH(AWIDTH)) send_rd_addr - (.clk_in(rclk),.addr_in(rd_addr), - .clk_out(wclk),.addr_out(rd_addr_wclk) ); - - // Generate fullness info, these are approximate and may be delayed - // and are only for higher-level flow control. - // Only full and empty are guaranteed exact. - always @(posedge wclk) - level_wclk <= wr_addr - rd_addr_wclk; - always @(posedge rclk) - level_rclk <= wr_addr_rclk - rd_addr; - -endmodule // fifo_2clock -- cgit v1.2.3 From e50bab11b3cdc30ffebb51f64ffe9f0ef74bdc55 Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Fri, 4 Sep 2009 22:14:21 -0700 Subject: remove unused old style fifo --- control_lib/fifo_2clock_casc.v | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 control_lib/fifo_2clock_casc.v (limited to 'control_lib') diff --git a/control_lib/fifo_2clock_casc.v b/control_lib/fifo_2clock_casc.v deleted file mode 100644 index e9b0cfc25..000000000 --- a/control_lib/fifo_2clock_casc.v +++ /dev/null @@ -1,31 +0,0 @@ - -module fifo_2clock_casc - #(parameter DWIDTH=32, AWIDTH=9) - (input wclk, input [DWIDTH-1:0] datain, input write, output full, output [AWIDTH-1:0] level_wclk, - input rclk, output [DWIDTH-1:0] dataout, input read, output empty, output [AWIDTH-1:0] level_rclk, - input arst); - - wire full_int, empty_int, full_int2, empty_int2, transfer, transfer2; - wire [DWIDTH-1:0] data_int, data_int2; - - shortfifo #(.WIDTH(DWIDTH)) shortfifo - (.clk(wclk), .rst(arst), .clear(0), - .datain(datain), .write(write), .full(full), - .dataout(data_int), .read(transfer), .empty(empty_int) ); - - assign transfer = ~full_int & ~empty_int; - - fifo_2clock #(.DWIDTH(DWIDTH),.AWIDTH(AWIDTH)) fifo_2clock - (.wclk(wclk), .datain(data_int), .write(transfer), .full(full_int), .level_wclk(level_wclk), - .rclk(rclk), .dataout(data_int2), .read(transfer2), .empty(empty_int2), .level_rclk(level_rclk), - .arst(arst) ); - - assign transfer2 = ~full_int2 & ~empty_int2; - - shortfifo #(.WIDTH(DWIDTH)) shortfifo2 - (.clk(rclk), .rst(arst), .clear(0), - .datain(data_int2), .write(transfer2), .full(full_int2), - .dataout(dataout), .read(read), .empty(empty) ); - -endmodule // fifo_2clock_casc - -- cgit v1.2.3 From 2f3e0eefe01b61f8e5e12d2ceef6990abb8a1ff3 Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Thu, 10 Sep 2009 21:52:06 -0700 Subject: More xilinx fifos, more clean up of our fifos --- control_lib/cascadefifo2.v | 56 ------- control_lib/newfifo/fifo18_to_ll8.v | 58 ------- control_lib/newfifo/fifo_2clock.v | 42 +++-- coregen/fifo_xlnx_16x19_2clk.ngc | 3 + coregen/fifo_xlnx_16x19_2clk.v | 169 +++++++++++++++++++++ coregen/fifo_xlnx_16x19_2clk.veo | 53 +++++++ coregen/fifo_xlnx_16x19_2clk.xco | 82 ++++++++++ ...o_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.lso | 3 + ...x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt | 103 +++++++++++++ coregen/fifo_xlnx_16x19_2clk_flist.txt | 8 + coregen/fifo_xlnx_16x19_2clk_readme.txt | 39 +++++ coregen/fifo_xlnx_16x19_2clk_xmdf.tcl | 68 +++++++++ 12 files changed, 555 insertions(+), 129 deletions(-) delete mode 100644 control_lib/cascadefifo2.v delete mode 100644 control_lib/newfifo/fifo18_to_ll8.v create mode 100644 coregen/fifo_xlnx_16x19_2clk.ngc create mode 100644 coregen/fifo_xlnx_16x19_2clk.v create mode 100644 coregen/fifo_xlnx_16x19_2clk.veo create mode 100644 coregen/fifo_xlnx_16x19_2clk.xco create mode 100644 coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.lso create mode 100644 coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt create mode 100644 coregen/fifo_xlnx_16x19_2clk_flist.txt create mode 100644 coregen/fifo_xlnx_16x19_2clk_readme.txt create mode 100644 coregen/fifo_xlnx_16x19_2clk_xmdf.tcl (limited to 'control_lib') diff --git a/control_lib/cascadefifo2.v b/control_lib/cascadefifo2.v deleted file mode 100644 index 984cc46e6..000000000 --- a/control_lib/cascadefifo2.v +++ /dev/null @@ -1,56 +0,0 @@ - - -// This FIFO exists to provide an intermediate point for the data on its -// long trek from one RAM (in the buffer pool) to another (in the longfifo) -// The shortfifo is more flexible in its placement since it is based on -// distributed RAM - -// This one has the shortfifo on both the in and out sides. -module cascadefifo2 - #(parameter WIDTH=32, SIZE=9) - (input clk, input rst, - input [WIDTH-1:0] datain, - output [WIDTH-1:0] dataout, - input read, - input write, - input clear, - output full, - output empty, - output [15:0] space, - output [15:0] occupied); - - wire [WIDTH-1:0] data_int, data_int2; - wire empty_int, full_int, transfer; - wire empty_int2, full_int2, transfer2; - wire [4:0] s1_space, s1_occupied, s2_space, s2_occupied; - wire [15:0] l_space, l_occupied; - - shortfifo #(.WIDTH(WIDTH)) shortfifo - (.clk(clk),.rst(rst),.clear(clear), - .datain(datain), .write(write), .full(full), - .dataout(data_int), .read(transfer), .empty(empty_int), - .space(s1_space),.occupied(s1_occupied) ); - - longfifo #(.WIDTH(WIDTH),.SIZE(SIZE)) longfifo - (.clk(clk),.rst(rst),.clear(clear), - .datain(data_int), .write(transfer), .full(full_int), - .dataout(data_int2), .read(transfer2), .empty(empty_int2), - .space(l_space),.occupied(l_occupied) ); - - shortfifo #(.WIDTH(WIDTH)) shortfifo2 - (.clk(clk),.rst(rst),.clear(clear), - .datain(data_int2), .write(transfer2), .full(full_int2), - .dataout(dataout), .read(read), .empty(empty), - .space(s2_space),.occupied(s2_occupied) ); - - assign transfer = ~empty_int & ~full_int; - assign transfer2 = ~empty_int2 & ~full_int2; - - assign space = {11'b0,s1_space} + {11'b0,s2_space} + l_space; - assign occupied = {11'b0,s1_occupied} + {11'b0,s2_occupied} + l_occupied; - -endmodule // cascadefifo2 - - - - diff --git a/control_lib/newfifo/fifo18_to_ll8.v b/control_lib/newfifo/fifo18_to_ll8.v deleted file mode 100644 index 4653244ef..000000000 --- a/control_lib/newfifo/fifo18_to_ll8.v +++ /dev/null @@ -1,58 +0,0 @@ - -module fifo18_to_ll8 - (input clk, input reset, input clear, - input [35:0] f18_data, - input f18_src_rdy_i, - output f18_dst_rdy_o, - - output reg [7:0] ll_data, - output ll_sof_n, - output ll_eof_n, - output ll_src_rdy_n, - input ll_dst_rdy_n); - - wire ll_sof, ll_eof, ll_src_rdy; - assign ll_sof_n = ~ll_sof; - assign ll_eof_n = ~ll_eof; - assign ll_src_rdy_n = ~ll_src_rdy; - wire ll_dst_rdy = ~ll_dst_rdy_n; - - wire f18_sof = f18_data[32]; - wire f18_eof = f18_data[33]; - wire f18_occ = f18_data[35:34]; - wire advance, end_early; - reg [1:0] state; - assign debug = {29'b0,state}; - - always @(posedge clk) - if(reset) - state <= 0; - else - if(advance) - if(ll_eof) - state <= 0; - else - state <= state + 1; - - always @* - case(state) - 0 : ll_data = f18_data[31:24]; - 1 : ll_data = f18_data[23:16]; - 2 : ll_data = f18_data[15:8]; - 3 : ll_data = f18_data[7:0]; - default : ll_data = f18_data[31:24]; - endcase // case (state) - - assign ll_sof = (state==0) & f18_sof; - assign ll_eof = f18_eof & (((state==0)&(f18_occ==1)) | - ((state==1)&(f18_occ==2)) | - ((state==2)&(f18_occ==3)) | - (state==3)); - - assign ll_src_rdy = f18_src_rdy_i; - - assign advance = ll_src_rdy & ll_dst_rdy; - assign f18_dst_rdy_o = advance & ((state==3)|ll_eof); - assign debug = state; - -endmodule // ll8_to_fifo36 diff --git a/control_lib/newfifo/fifo_2clock.v b/control_lib/newfifo/fifo_2clock.v index 2ada39fb0..07ae090f2 100644 --- a/control_lib/newfifo/fifo_2clock.v +++ b/control_lib/newfifo/fifo_2clock.v @@ -16,21 +16,33 @@ module fifo_2clock assign read = src_rdy_o & dst_rdy_i; generate - if(SIZE==9) - fifo_xlnx_512x36_2clk mac_tx_fifo_2clk - (.rst(rst), - .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - else if(SIZE==11) - fifo_xlnx_2Kx36_2clk mac_tx_fifo_2clk - (.rst(rst), - .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - else if(SIZE==6) - fifo_xlnx_64x36_2clk mac_tx_fifo_2clk - (.rst(rst), - .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); + if(WIDTH==36) + if(SIZE==9) + fifo_xlnx_512x36_2clk fifo_xlnx_512x36_2clk + (.rst(rst), + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); + else if(SIZE==11) + fifo_xlnx_2Kx36_2clk fifo_xlnx_2Kx36_2clk + (.rst(rst), + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); + else if(SIZE==6) + fifo_xlnx_64x36_2clk fifo_xlnx_64x36_2clk + (.rst(rst), + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); + else + fifo_xlnx_512x36_2clk fifo_xlnx_512x36_2clk + (.rst(rst), + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); + else if((WIDTH==19)|(WIDTH==18)) + if(SIZE==4) + fifo_xlnx_16x19_2clk fifo_xlnx_16x19_2clk + (.rst(rst), + .wr_clk(wclk),.din(datain),.full(full),.wr_en(write),.wr_data_count(level_wclk), + .rd_clk(rclk),.dout(dataout),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); endgenerate assign occupied = {{(16-SIZE-1){1'b0}},level_rclk}; diff --git a/coregen/fifo_xlnx_16x19_2clk.ngc b/coregen/fifo_xlnx_16x19_2clk.ngc new file mode 100644 index 000000000..b12d34d7c --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk.ngc @@ -0,0 +1,3 @@ +XILINX-XDB 0.1 STUB 0.1 ASCII +XILINX-XDM V1.4e +$3f24g<,[o}e~g`n;"2*413&;$>"9 > %10?*nhel%fmyz cnpfc`h(|dz$Sni fhdl[}jipV;=t<7P2bnh*kah92:?7=>=0593477339:=<95?8122?45<9'::>6?6:HLSQQ11592=?IR\Y__6iazt=3;>5863;80>=:432006>5?l29x>=>?ff662(363=;n794FNQWW>uthoVof|ywPtipfwm:4294996:5IORVP?vugnUna}zv_ujqavnXizyn~y2<:1<11>2=AGZ^X7~}of]fiur~W}byi~fPndebp`:4294:h6:5IORVP?vugnUmyabPtipfwm:4294986:5IORVP?vugnUmyabPtipfwmYf{zoyx1=50?07?18:79KPRW]]0omyoPcnwmp92=87;i784@UURVP?tcWmkmRm`uov?0?699k1>6B[[PTV9swYci}kTob{at=694;2<=H3==68;;72:41=119?;;9CFB1=?MJL:74:491230>?780805;:497230>?1>0>054864:;EB<45MU3:8FPUXAGLD=6M;;BC;E7=DM880OEKLK^NJG@HTMV^R\H=4CMP:?FIJE@^_II?;;BMQAZABFLXJXDAA_HLEK2=DZLK_II?4D59GF3@33MHI>>5KPN78@UTF8<1O\_O>5:FSVD423MZYM>:4F9:;6>@C;2LOO95IDBG7?CBDX=1MHIH<;GFS0>@CXL>0JK6?5:Dbhvc63N90KCJ>;H08M545FNW18MJD53EE=7AANDDF4?II@AJKG86BZT348HPR5WE>0@XZ<4:NVP10H69:1E=?=4N010?K73;2D:9>5A1718J4143G;3?6@>929M655H4::1E?>=4N270?K50;2D85>5A4018J1243G>>?6@;629M0<55A6618J3>43G<2>6@83:L446=I?890B:<<;O507>H0<:1E;8=4N640?K10;2D<4>5A7808J=53:L;66=I0:90B5:<;O::6>H>;2D2<>5A9018J<443G38?6@6629M=25VFZ]k0\D@PBTQJ@]d5\PN68P\VB;:1^<"i}f/pe+be&jf`t"Cwos]q`Zvi|{UiecQwos2345YUmzgx<=<;T2,cw`)zo%lou lljz,I}iuW{nT|cz}_ckm[}iu89::S_k|umv276=R8&myj#|i/fa{*fjlp&GscQ}d^rmpwYeagUsc>?03]Qavsk|8997X> gsd-vc)`kq$h`fv Mymq[wbXxg~ySjmPxnp3456XZly~`y?<2:W3+bta&{l$knv!cmi{+H~hzVxoS}`{r^e`[}iu89::S_k|umv277=R8&myj#|i/fa{*fjlp&GscQ}d^rmpwY`kVrd~=>?2^Pfwpjs9:90Y=!hrg,qb*adp'iggu!Bxnp\swYwf}xTnd`Pxnp3456XZly~`y?<3:W3+bta&{l$knv!cmi{+H~hzV}yS}`{r^`jjZ~hz9:;=R\jstnw565<]9%l~k }f.e`|+ekcq%Ftb|Pws]sjqtXj`dTtb|?010\V`urd};8>6[?/fpe*w`(ojr%oaew/LzlvZquWyd~Ril_ymq4567W[oxyaz>339V4*aun'xm#jmw.bnh|*Kg{U|~R~ats]dgZ~hz9:;=R\jstnw564<]9%l~k }f.e`|+ekcq%Ftb|Pws]sjqtXojUsc>?03]Qavsk|88:7X> gsd-vc)`kq$h`fv re]sjqtXj`d7<3<>;T2,cw`)zo%lou lljz,vaYwf}xTnd`31?02?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl?6;463\:$kh!rg-dg}(ddbr$~iQnup\flh;;78;7X> gsd-vc)`kq$h`fv re]sjqtXj`dT4U1-dvc(un&mht#mcky-q`Zvi|{UiecQ>219V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^014>S7'nxm"h gbz-gim'{nT|cz}_ckm[6413\:$kh!rg-dg}(ddbr$~iQnup\flhXpfx;<=>=6:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq4566:?1^<"i}f/pe+be&jf`t"|k_qlwvZdnfVrd~=>?2328Q5)`zo$yj"ilx/aoo})ulVzexQhc=2=65=R8&myj#|i/fa{*fjlp&xoS}`{r^e`848582_;#j|i.sd,cf~)keas#jPpovq[be;:78;7X> gsd-vc)`kq$h`fv re]sjqtXoj682>f:W3+bta&{l$knv!cmi{+wbXxg~ySjmP10d8Q5)`zo$yj"ilx/aoo})ulVzexQhc^02b>S7'nxm"h gbz-gim'{nT|cz}_fa\770<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlm7<3<9;T2,cw`)zo%lou lljz,vaYwf}xTknQnssgd8485>2_;#j|i.sd,cf~)keas#jPpovq[beXizxnk1<1279V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqab:46;?0Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiP0378Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aX9;?0Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiP2378Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aX;;30Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiPd0>3:7?<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<2>>3;8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8692?74U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\`4:46;20Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiPd0]36==R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=R?=8:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb6W;837X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3\773<]9%l~k }f.e`|+ekcq%yhR~ats]dgZ~hz9:;??4U1-dvc(un&mht#mcky-tvZvi|{Uiec2?>338Q5)`zo$yj"ilx/aoo})pzVzexQmio>2:77<]9%l~k }f.e`|+ekcq%|~R~ats]amk:56;;0Y=!hrg,qb*adp'iggu!xr^rmpwYeag682?>4U1-dvc(un&mht#mcky-tvZvi|{UiecQ?219V4*aun'xm#jmw.bnh|*quWyd~Rlfn^314>S7'nxm"h gbz-gim'~xT|cz}_ckm[7473\:$kh!rg-dg}(ddbr${Qnup\flhX;;<0Y=!hrg,qb*adp'iggu!xr^rmpwYeagUsc>?0105?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\|jt789;9:6[?/fpe*w`(ojr%oaew/vp\tkruWkceSua}012165=R8&myj#|i/fa{*fjlp&}yS}`{r^e`858582_;#j|i.sd,cf~)keas#z|Ppovq[be;978;7X> gsd-vc)`kq$h`fv ws]sjqtXoj692?>4U1-dvc(un&mht#mcky-tvZvi|{Ulo1=11g9V4*aun'xm#jmw.bnh|*quWyd~Ril_13e?P6(o{l%~k!hcy,`hn~({U{by|Pgb]25c=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[77a3\:$kh!rg-dg}(ddbr${Qnup\cfY4:?1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyij2?>348Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`a;978=7X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh<3<12>S7'nxm"h gbz-gim'~xT|cz}_fa\evtbo595>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]360=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnU:>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]160=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnU8>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5969:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=3=6<=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=1<1289V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9595>55Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5Z6502_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnkRj>_00;?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`Wm;T>?64U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4Y4:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWqey<=>?249V4*aun'xm#jmw.bnh|*quWyd~Ril_ymq4566:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWqey<=>=369V4*aun'xm#jb?.sf,cw7)o{nh>#|kc.Ob`aYulVnhSdQndeqvf5678=9h7X> gsd-vc)`d9$yh"i}1/eq`f4)zmi$Aljk_sf\`fYnWhnoxl?012\g|:66:90Y=!hrg,qb*ak8'xo#j|>.fpgg7(ulj%FxlPdhde[rtXzmUa}:<4:W3+bta&{l$ka>!re-dv4(`zmi9"jl/LqvfZbnnoU|~R|k_uos04543\:$kh!rg-dh5(ul&my=#i}db0-vae(EziSigif^uq[wbX|dz=?95Z0.eqb+ta'nf;"j gs3-cwbd:'xoo"C|uc]gmc`X{UyhRzbp630<>S7'nxm"h gm2-va)`z8$l~im=.sf`+HurjVnbjkQxr^pg[qkwWjs7=3=n;T2,cw`)zo%l`= }d.eq5+aulj8%~im Mrwa[aoanV}ySjPtlr\g|:668;8n6[?/fpe*w`(oe:%~i!hr0,dvae5&{nh#@}zb^fjbcYpzVxoSyc_ymq84869:h0Y=!hrg,qb*ak8'xo#j|>.fpgg7(ulj%FxlPdhde[rtXzmUa}Qwos>0:47502_;#j|i.sd,ci6)zm%l~< hrea1*wbd'{nThnQf_10;?P6(o{l%~k!hl1,q`*au9'myhnS7'nxm"h gm2-va)`z8$l~im=.sf`+wbXljUbS9=>;T2,cw`)zo%l`= }d.eq5+aulj8%~im re]ggZoXe|r;<=<30?16?P6(o{l%~k!hl1,q`*au9'myhn gsd-vc)`d9$yh"i}1/eq`f4)zmi$~iQkc^k\ip~78987=3=<;T2,cw`)zo%l`= }d.eq5+aulj8%~im re]ggZoXe|r;<=<31?3277=R8&myj#|i/fn3*wb(o{;%kjl2/pgg*tcWmiTeRczx1236979::;0Y=!hrg,qb*ak8'xo#j|>.fpgg7(ulj%yhRjl_h]nq}678;692><4U1-dvc(un&mg<#|k/fp2*btck;$yhn!}d^f`[lYj}q:;012?P6(o{l%~k!hl1,q`*au9'myhn0>_RU374=R8&myj#|i/fn3*wb(o{;%kjl2/pgg*tcWmiTeRczx1236929;;1^<"i}f/pe+bj7&{n$k?!gsf`6+tck&xoSimPi^ov|567:5>5=>84U1-dvc(un&mg<#|k/fp2*btck;$yhn!}d^f`[lYj}q:;0]PS54f3\:$kh!rg-dh5(ul&my=#|iwgv,VDKXZMUNBRHXFU31=>S7'nxm"h gm2-va)`z8$yjzh{/SCN[WC@G\^TIC?=b:W3+bta&{l$ka>!re-dv4(un~l#_OB_WCOMAYA_O^:=>=4U1-dvc(un&mg<#|k/fp2*w`pn}%hy|Pfvdw[vrf|lUM_@QIFe302>S7'nxm"h gm2-va)`z8$yjzh{/bwqvZ`pn}Uxxlzj_GQN[C@c9$Ce?55Z0.eqb+ta'nf;"j gs3-vcqa|&i~~Qiwgv\wqgsmVLXARHId0/Jj474;2_;#j|i.sd,ci6)zm%l~< }fvdw+fsuzVl|jyQ|t`vf[CUJWOLo>>84U1-dvc(un&mg<#|k/fp2*w`pn}%hy|Pfvdw[vrf|lUM_@QIFe0.Mk5?3\:$kh!rg-dh5(ul&my=#|iwgv,gptuWo}mxR}{aug\BVKXNOn9!D`>13:8Q5)`zo$yj"ic0/pg+bt6&{l|jy!jmqvz[cqa|Vli>:5Z0.eqb+ta'nf;"j gs3-vcqa|&of|ywPfvdw[l4b3\:$kh!rg-dh5(ul&my=#|iwgv,ahvsqVl|jyQf_np34565n2_;#j|i.sd,ci6)zm%l~< }fvdw+`kw|pUm{kzPi^mq45679;?0Y=!hrg,qb*ak8'xo#j|>.sdtbq)r{lxTzlbfd3;8Q5)`zo$yj"ic0/pg+btf{'xxx~!}al]fiur~WohTe>>4U1-dvc(un&mg<#|k/fpbw+tt|z%ym`Qjmqvz[cdXaVey<=>?369V4*aun'xm#jb?.sf,cwgt&{y"|nm^gntqXnkUbSb|?012240YT_9987X> gsd-vc)`d9$yh"i}ar,qwqu(zhgTi`~{y^da[lYhz9:;< gsd-vc)`d9$yh"i}ar,qwqu(zhgTi`~{y^da[lYhz9:;!re-dvdu)zz~x#ob_dosp|YajVcTc>?01:;5c=R8&myj#|i/fn3*wb(zhgTzlbfd^dtbq443\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|d>95Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu110>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|?8?7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{9208Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkrXpfx7<3?>_HLU[54d3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSua}<0<257e<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Ttb|32?326f=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Usc2<>032b>S7'nxm"h gm2-va)uxg~y#naznu>3:4`<]9%l~k }f.eo4+tc'{zex!lotlw8486n2_;#j|i.sd,ci6)zm%y|cz}/bmvjq:568l0Y=!hrg,qb*ak8'xo#~ats-`kphs4:4:i6[?/fpe*w`(oe:%~i!}povq+firf}U;=h5Z0.eqb+ta'nf;"j rqlwv*eh}g~T=!re-qtkru'je~byQk1=2=67=R8&myj#|i/fn3*wb(zyd~"m`uov\`4:66;80Y=!hrg,qb*ak8'xo#~ats-`kphsWm;7>3<=;T2,cw`)zo%l`= }d.psjqt(kfexRj><2<15>S7'nxm"h gm2-va)uxg~y#naznu]g5Z65;2_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc9V:T=??4U1-dvc(un&mg<#|k/srmpw)dg|dSi?P1318Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_e3\5Z7592_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc9V89?6[?/fpe*w`(oe:%~i!}povq+firf}Uo=R?000;?P6(o{l%~k!hl1,tv*apiz$|y} r`o\bpjkWohTe?;4U1-dvc(un&mg<#y}/fubw+qt|z%ym`Qiumn\m7e<]9%l~k }f.eo4+qu'n}j#y|tr-qehYa}efTeRa}01236c=R8&myj#|i/fn3*rt(o~kx"z}{s.pbiZ`rdeUbSb|?01225=543\:$kh!rg-dh5(pz&m|m~ xsuq,vdkXn|fgSdQ`r123447?WZ];>k5Z0.eqb+ta'nf;"z| gvcp*rus{&xjaRhzlm]j[jt789::8<!ws-dsdu)z~x#ob_gwohZoXg{:;<=;<2d9V4*aun'xm#jb?.vp,crgt&~y"|nm^dvhiYnWfx;<=>63528Q5)`zo$yj"ic0/uq+bqck8$|hnkwt.Ob`aYpzVnjxlQlotlw[lYflm:;<=Qly=3=05=R8&myj#|i/fn3*rt(o~nh=#ykcdzw+HgclV}ySio{a^alqkrXaVkoh=>?0^az8683:2_;#j|i.sd,ci6){%l{im>.vf`a}r(EhnoSz|Pd`vb[firf}UbSljk0123[f;;7;:8;5Z0.eqb+ta'nf;"z| gvf`5+qcklr#@okd^uq[agsiVidyczPi^cg`5678Vir0>0>1^QT415<]9%l~k }f.eo4+qu'n}oo< xdbg{p*KflmU|~Rjnt`]`kphsW`Ujhi>?01]{kw:668;??6[?/fpe*w`(oe:%{!hwea2*rbdmq~$Aljk_vp\`drfWje~byQf_`fg4567Wqey0?0>1518Q5)`zo$yj"ic0/uq+bqck8$|hnkwt.Ob`aYpzVnjxlQlotlw[lYflm:;<=Qwos>0:473?2_;#j|i.sd,ci6){%l{im>.vf`a}r(EhnoSz|Pd`vb[firf}UbSljk0123[}iu4:4:=R]X1558Q5)`zo$yj"ic0/uq+bqck8$|hnkwt.Ob`aYpzVnjxlQlotlw[lYflm:;<=Qwos>0:47X[^88>6[?/fpe*w`(oe:%{!hwea2*rbdmq~$A~{m_ekebZquW{nTx`~9329V4*aun'xm#jb?.vp,crbd9'}oohv{/LqvfZbnnoU|~R|k_uos34503\:$kh!rg-dh5(pz&m|hn?!weaf|q)J{|hThdhi_vp\vaYseyUhu1?1389V4*aun'xm#jb?.vp,crbd9'}oohv{/LqvfZbnnoU|~R|k_uos[f;97;:?l5Z0.eqb+ta'nf;"z| gvf`5+qcklr#@}zb^fjbcYpzVxoSyc_ymq85869:k0Y=!hrg,qb*ak8'}y#jykc0,t`fc|&GxyoQkigd\swYulV~f|Rv`r=3=544a3\:$kh!rg-dh5(pz&m|hn?!weaf|q)caolT{Q}d^vnt969:o1^<"i}f/pe+bj7&~x$kzjl1/ugg`~s'~xThlzn_bmvjqYnW98m7X> gsd-vc)`d9$|~"ixdb3-saebp}%|~Rjnt`]`kphsW`U:>k5Z0.eqb+ta'nf;"z| gvf`5+qcklr#z|Pd`vb[firf}UbS?64U1-dvc(un&mg<#y}/fugg4(pljosx"y}_ecweZeh}g~TeRokd1234949;11^<"i}f/pe+bj7&~x$kzjl1/ugg`~s'~xThlzn_bmvjqYnWhno<=>?<2<2`>S7'nxm"h gm2-sw)uidU|~Rka_h317>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|;>0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|Vidycz<259V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjq05<2_;#j|i.sd,ci6){%||cz}/LalqkrXkfex4==;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[}iu494:=RGAV^21g>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vrd~1?1100`?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWqey0?0>13a8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXpfx7?3?>1g9V4*aun'xm#jb?.vp,suhsz&idycz30?3e?P6(o{l%~k!hl1,tv*qwf}x$ob{at=3=5c=R8&myj#|i/fn3*rt(yd~"m`uov?6;7a3\:$kh!rg-dh5(pz&}{by| cnwmp9599l1^<"i}f/pe+bj7&~x${}`{r.alqkrX88o0Y=!hrg,qb*ak8'}y#z~ats-`kphsW8;n7X> gsd-vc)`d9$|~"ynup,gjsi|V8:i6[?/fpe*w`(oe:%{!xpovq+firf}U8>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th<2?>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e3?5;453\:$kh!rg-dh5(pz&}{by| cnwmpZb64;49>6[?/fpe*w`(oe:%{!xpovq+firf}Uo=1=1209V4*aun'xm#jb?.vp,suhsz&idyczPd0]364=R8&myj#|i/fn3*rt(yd~"m`uov\`4Y6:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl8U9><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th3:74<]9%l~k }f.eo4+qu'~zex!lotlw[a4;97897X> gsd-vc)`d9$|~"ynup,gjsi|Vn90?0=2:W3+bta&{l$ka>!ws-ttkru'je~byQk2=1=64=R8&myj#|i/fn3*rt(yd~"m`uov\`7Y7::1^<"i}f/pe+bj7&~x${}`{r.alqkrXl;U;S<<>;T2,cw`)zo%l`= xr.usjqt(kfexRj=_000?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f1[4Y6:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl;U9><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?Q<229V4*aun'xm#jb?.vp,suhsz&idyczPd3]0[4433\:$kh!rg-dh5(pz&}{by| cnwmpZhh|9:;=<84U1-dvc(un&gna"j`uu]j[5713\:$kh!rg-nah)cg|~TeR?>7:W3+bta&{l$ahc dnww[lY688=0Y=!hrg,qb*kbe&ndyyQf_0323>S7'nxm"h mdo,`jssW`U:><94U1-dvc(un&gna"j`uu]j[456?2_;#j|i.sd,i`k(lfSdQ>4058Q5)`zo$yj"cjm.flqqYnW8?:;6[?/fpe*w`(elg$hb{{_h]2241<]9%l~k }f.ofi*bh}}UbS<9>7:W3+bta&{l$ahc dnww[lY608<0Y=!hrg,qb*kbe&ndyyQf_335?P6(o{l%~k!bel-gkprXaV9::6[?/fpe*w`(elg$hb{{_h]753=R8&myj#|i/lgn+air|VcT9<84U1-dvc(un&gna"j`uu]j[3713\:$kh!rg-nah)cg|~TeR9>6:W3+bta&{l$ahc dnww[lY?9?1^<"i}f/pe+hcj'me~xRgP90g8Q5)`zo$yj"cjm.egi+bj'DxjaR\NM03e?P6(o{l%~k!bel-d`h(ce&Gym`Q]AL335c=R8&myj#|i/lgn+bbj&mg$Aob_SCN547a3\:$kh!rg-nah)`ld$oa"C}al]QEH759o1^<"i}f/pe+hcj'nnf"ic Mscn[WGJ9:;m7X> gsd-vc)jmd%lh` km.OqehYUID;?=k5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF=8?i;T2,cw`)zo%fi`!hdl,gi*KuidUYM@?91g9V4*aun'xm#`kb/ffn*ak(E{kfS_OB163e?P6(o{l%~k!bel-d`h(ce&Gym`Q]AL3;5c=R8&myj#|i/lgn+bbj&mg$Aob_SCN5<7b3\:$kh!rg-nah)`ld$oa"C}al]QEH46m2_;#j|i.sd,i`k(omg%h`!Br`o\VDK49l1^<"i}f/pe+hcj'nnf"ic Mscn[WGJ<8o0Y=!hrg,qb*kbe&moa#jb/LpbiZTFE<;n7X> gsd-vc)jmd%lh` km.OqehYUID<:i6[?/fpe*w`(elg$kic!dl-NvdkXZHG<=h5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF4348Q5)`zo$yj"cjm.egi+bj'V|j~d`key2345:6;78=7X> gsd-vc)jmd%lh` km.]uewoillr;<=>315<12>S7'nxm"h mdo,cak)ld%Tzl|fneg{456748?5>;5Z0.eqb+ta'dof#jjb.eo,[sguagnnt=>?0=35:70<]9%l~k }f.ofi*ace'nf#Rxnrhlga}67896:;3<9;T2,cw`)zo%fi`!hdl,gi*Yqi{cehhv?012?5=85=2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;0<0=5:W3+bta&{l$ahc geo-`h)X~hxbbikw01238785=2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;0>0=5:W3+bta&{l$ahc geo-`h)X~hxbbikw01238185=2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;080=5:W3+bta&{l$ahc geo-`h)X~hxbbikw01238385=2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;0:0=5:W3+bta&{l$ahc geo-`h)X~hxbbikw01238=85=2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;040>e:W3+bta&{l$ahc geo-`h)cg|~Te1>11g9V4*aun'xm#`kb/ffn*ak(lfSd2>0?3e?P6(o{l%~k!bel-d`h(ce&ndyyQf<03=5c=R8&myj#|i/lgn+bbj&mg$hb{{_h>26;7a3\:$kh!rg-nah)`ld$oa"j`uu]j84599o1^<"i}f/pe+hcj'nnf"ic dnww[l:6<7;m7X> gsd-vc)jmd%lh` km.flqqYn48?5=k5Z0.eqb+ta'dof#jjb.eo,`jssW`6::3?i;T2,cw`)zo%fi`!hdl,gi*bh}}Ub0<911g9V4*aun'xm#`kb/ffn*ak(lfSd2>8?3f?P6(o{l%~k!bel-d`h(ce&ndyyQf<0<2a>S7'nxm"h mdo,cak)ld%ocxzPi=0=5`=R8&myj#|i/lgn+bbj&mg$hb{{_h>0:4c<]9%l~k }f.ofi*ace'nf#iazt^k?0;7b3\:$kh!rg-nah)`ld$oa"j`uu]j8086m2_;#j|i.sd,i`k(omg%h`!kotv\m9099l1^<"i}f/pe+hcj'nnf"ic dnww[l:068o0Y=!hrg,qb*kbe&moa#jb/emvpZo;07;n7X> gsd-vc)jmd%lh` km.flqqYn404:h6[?/fpe*w`(elg$kic!dl-gkprXaV::h6[?/fpe*w`(elg$kic!dl-gkprXaV;:i6[?/fpe*w`(elg$kic!dl-gkprXaV;;=h5Z0.eqb+ta'dof#jjb.eo,`jssW`U:=e:W3+bta&{l$ahc geo-`h)cg|~TeR?;1d9V4*aun'xm#`kb/ffn*ak(lfSdQ>50g8Q5)`zo$yj"cjm.egi+bj'me~xRgP173f?P6(o{l%~k!bel-d`h(ce&ndyyQf_052a>S7'nxm"h mdo,cak)ld%ocxzPi^3;5a=R8&myj#|i/lgn+bbj&mg$hb{{_h]15a=R8&myj#|i/lgn+bbj&mg$hb{{_h]05a=R8&myj#|i/lgn+bbj&mg$hb{{_h]75a=R8&myj#|i/lgn+bbj&mg$hb{{_h]65a=R8&myj#|i/lgn+bbj&mg$hb{{_h]55a=R8&myj#|i/lgn+bbj&mg$hb{{_h]45a=R8&myj#|i/lgn+bbj&mg$hb{{_h];5a=R8&myj#|i/lgn+bbj&mg$hb{{_h]:52=R8&myj#|i/scn[wc`g|~Tic?k;T2,cw`)zo%yylck.pg[wusWhyyijS7'nxm"h rrvahn)ulVxxxRm`mc32a>S7'nxm"h rrvahn)ulVxxxR|jg=2=5`=R8&myj#|i/sqwfim(zmUyyQ}ef>2:4c<]9%l~k }f.pppgjl'{nT~~zPrde?6;7c3\:$kh!rg-qwqdkc&xoS}{_sgd[57c3\:$kh!rg-qwqdkc&xoS}{_sgd[47c3\:$kh!rg-qwqdkc&xoS}{_sgd[77c3\:$kh!rg-qwqdkc&}yS}{_`qqab473\:$kh!rg-qwqdkc&}yS}{_`qqabYc9;:0Y=!hrg,qb*tt|kf`#z|Prrv\evtboVn9=n5Z0.eqb+ta'{ynae ws]qwqYdgdh:h6[?/fpe*w`(zz~i`f!xr^pppZehek;:i6[?/fpe*w`(zz~i`f!xr^pppZtbo5:5=h5Z0.eqb+ta'{ynae ws]qwqYumn6:21S_YQHNE`8\ZEHZLUBBKA9;Yfa[Lba3QncS]|fmWgqwlii991Sh`QBakmqR`ttafd:<6Vkm^OjjjtQm{ybccm4amolwqYbey~rn6ocmnqw[cskd?1imnezpe9aefmrxVgj~fk}3:aooa=ci}kTob{at)2*`>bf|hUhcx`{(0+g?agsiVidycz'2(f8`drfWje~by&<)e9geqgXkfex%:&d:fbpdYdg|d0=0i;ecweZeh}g~787>17:famqcuz?1oec&?)79gmk.6!>1oec&>0(58`lh/98#<7iga(00*3>bnf!;8%:5kio*20,1bnf5;92:5kio>27;169gmk:6?730hd`31983:2=cag6:4384dhl?5;0384dhl?7;00(:8`jss 8;"46j`uu*26,>bh}}"::$64dnww,41.02ndyy&>8(58`jss ;#<7iazt)1*3>bh}}"?%:5kotv+1,199gkpr;9:437iazt=37:==cg|~7=807;emvp971611ocxz3161ocxz31?58`jss4;4<7iazt=1=3>bh}}6?2:5kotv?1;169gkpr;1720iigi2oeg1>cjx}s8>6hffn]dakcui}eyS{:P3-"[mioip)ID^H.Heogqeqiu(8:%=#><159emciXpedsS<8w18]1gim4:2lbjbQwloz\53~61V8h`f"iigm\c`hbzh~d~Rx;_2.MKKC+FFDN?oj4fhdl[}jipV;=t<7P2bnh(coagVmnbh|ntnp\r1Y4$riTdl}Piov\gim:8%iTdl}Pssqw95*dW{nTjk~=0.`[mgtW{nThlzn_bmvjq;6$jUoecQxievk94?+kVbjRy}_ecweZeh}g~6=!mPftno[cjfozUyyQyam?2(fYneyfnah`{aukljZr~xl79 nQzsd]figccllnT~hi20-a\swYazl{6=!mPurg\`jssW{y1<"l_tlgaw`kg~Ugcz3?,b]kevYh~lxm`by20-a\twckghnT`lzjnb{>4)eXlfSzgkti?2=)eXezmdbRxnl<3/gZtcWmo{xe3>6-a\lduX}gnn~kb`w<2/gZnf{Vkgab}{_gwoh86+kVbjR||t<3/gZbf|hUhcx`{_vkgpm;2$jUcm~Qxr^c`o86+kVxiRklc<2/gZehedeeSnb`cj?3(fYpzVkhgRb`w<2/gZtcWyd~Ryfduj>0)eX}zoTjzh{_ecweZeh}g~6=!mPh`q\eikh{}Una}zv=1.`[wbXlh~jSnaznu]tmaro5<&hSbxjrgnlsZjh4:'oRy}_qlwvZqnl}b68!mPpsmd[`kw|pUu}k20-a\swYci}kTob{at^uj`qn:=%iT|kco`f\v`at58&hSiazt^pppZpfd4:'oRfns^fbpdYdg|d1="l_qplcZ`rdeUdk|h^lfcdrbWkg1<:#c^uq[acw|a7::!mPpsmd[`kw|pUdk|h^lfcdrbWkg18"l_qplcZcjx}sTxe|jsi]bwvcu|V|j`0:#c^jbwZpfd`n6oi|Vigg55agb`vmib?3f|n~kb`w`9svjaXmdzu<:4psmd[`kw|pUdk|h)2*51=wzfmTi`~{y^vkv`uo 8#:86~}of]fiur~W}byi~f'2(37?uthoVof|ywPtipfwm.4!8<0|ah_dosp|Ys`{oxd1=50?3a?uthoVof|ywPtipfwmYf{zoyx%>&1c9svjaXmdzuRzgrdqk[dutm{~#=$?m;qplcZcjx}sTxe|jsi]bwvcu|!8"=o5rne\ahvsqV~c~h}g_`qpawr/; ;o7}|`g^gntqX|axneQnsrgqp95=87;i7}|`g^gntqX|axneQaefcwa-6.9k1{~biPelrw}ZrozlycSckhaug+5,7e3yxdkRkbpu{\pmtb{aUeijo{e)0*5g=wzfmTi`~{y^vkv`uoWgolmyk'3(3g?uthoVof|ywPtipfwmYimnki1=50?;8twi`Wog`<=4psmd[cskdV~c~h}g(1+27>vugnUmyabPtipfwm.6!890|ah_gwohZrozlyc$?'>3:rqkbYa}efTxe|jsi*0-4311`9svjaXn|fgSyf}erj\j`af|l";%)028vaYci}kTob{at)0*55=ulVnjxlQlotlw,6/682xoSio{a^alqkr/< ;;7jPd`vb[firf}6;2<>4re]geqgXkfex1?1119q`Zbf|hUhcx`{<3<24>tcWmkmRm`uov?7;753{nThlzn_bmvjq:3294:<6|k_ecweZeh}g~783;4re]fj3=ulVxxx>5}su58wgosm{x?7~||t59wvpc>3|doihcov78rdjnl?1|~Rolk79tvZekc8:0{Qkauc\gjsi|!:"==5xr^fbpdYdg|d$<'>0:uq[agsiVidycz'2(33?rtXlh~jSnaznu*0-46<{UomyoPcnwmp-2.991|~Rjnt`]`kphs494:<6y}_ecweZeh}g~7=3??;vp\`drfWje~by2=>028swYci}kTob{at=1=57=pzVnjxlQlotlw81<768:0{Qkauc\gjsi|5>596y}_dl5?rtXzz~vLM~8d`9CD}7=N3>1=v];0;0;7?>=9:82<3;0b?<8:59'672=:;:0q^=j:3:0>=<6;;3;=k4n92f8W0c=:1i1<7?<2822b?g>;l1X?h4=8b83>45519;m6l7=<6;;3;=k4n92f8rQd1290:6<4jezQ74?4?;321=><600d9e<5c3-8:h7;i;W011?4|}?=1=6{98;28y!d72o1i>5850;14>6<4?rB9=o5U39874g=900j644r$c:96=0<,;886?6:;h0ae?6=3f8h47>5$c096fb3:1(o<52bf8jg7=:21d>n;50;&a6?4dl2di=7=4;n0`0?6=,k81>nj4nc390>=h:k91<7*m2;0a<>he93:07b75$c096g>20bo?50:9l633=83.i>7<88:la5?7<3f8=87>5$c0962>65`27194?"e:38<46`m1;18?j41:3:1(o<526:8jg7=<21d>;?50;&a6?4002di=7;4;n054?6=,k81>:64nc392>=h:he93=07b<:e;29 g4=:>20bo?58:9l63c=83.i>7<88:la5??<3f8=h7>5$c0962>;o50;&a6?4002di=7j4;n05=?6=,k81>:64nc39a>=h:?21<7*m2;04<>he93l07b<97;29 g4=:>20bo?51198k73c290/n?4=799mf4<6921d>8m50;&a6?4002di=7?=;:k17c<72-h96?;>;o`2>5=!d52;?:7cl>:398m75d290/n?4=509mf4<432c9?o4?:%`1>7363gh:6954i31b>5<#j;099<5ab086?>o5;00;6)l=:372?kd62?10e?=7:18'f7<5=81en<48;:k172<72-h96?;>;o`2>==<6=4+b38114=ij80276g=4783>!d52;?:7cl>:`98m722290/n?4=509mf47363gh:6n54i360>5<#j;099<5ab08g?>o5<;0;6)l=:372?kd62l10e?:>:18'f7<5=81en<4i;:k105<72-h96?;>;o`2>46<3`88:7>5$c096075<#j;099<5ab0826>=n:ho1<75m20a94?7=83:pD??m;%`;>77d3fkm6=44}c77>5<6290;wE<>b:&a5<1=3n86hktH33a?_5?28a;3:>40=910:87o5108:>43=9:0:47?n:`82=?75200::7?::06956<693w/n54=889'1f<2:2.8o7<77:&0b?4?02.jn7oj;h0af?6=3f82i7>5;h0aa?6=3f8947>5;n0`5?6=3`89n7>5;h0:3?6=,k81>464nc394>=n:0<1<7*m2;0:<>he93;07d<65;29 g4=:020bo?52:9j6<2=83.i>7<68:la5?5<3`8im7>5;n0;`?6=3f8h47>5$c096fb3:1(o<52bf8jg7=:21d>n;50;&a6?4dl2di=7=4;n0`0?6=,k81>nj4nc390>=h:k91<7*m2;0a<>he93:07b75$c096g>ll50;&a6?4fl2di=7?4;h0be?6=,k81>lj4nc396>=n:h31<7*m2;0b`>he93907d>>50;&a6?44;2di=7?4;n01b?6=,k81>>=4nc396>=h:;o1<7*m2;007>he93907b<=d;29 g4=::90bo?54:9l6=g=831d>5:50;9j6d4=83.i>75$c096d5n3:1(o<52`18jg7=;21b>n=50;9j6=d=831b>?m50;9j6a6=831d>oj50;9l6f4=831d>?750;9l6f6=831b>om50;9l630=83.i>7<88:la5?6<3f8=97>5$c0962>;<50;&a6?4002di=7:4;n055?6=,k81>:64nc391>=h:?:1<7*m2;04<>he93<07b<:f;29 g4=:>20bo?57:9l60c=83.i>7<88:la5?><3f8=i7>5$c0962>;l50;&a6?4002di=7m4;n05e?6=,k81>:64nc39`>=h:?31<7*m2;04<>he93o07b<98;29 g4=:>20bo?5f:9l631=83.i>7<88:la5?7732e99i4?:%`1>71?3gh:6:64nc3957=!d52;387cl>:098m7?7290/n?4=929mf4<532c94k4?:%`1>7?43gh:6>54i31e>5<#j;099<5ab083?>o5;l0;6)l=:372?kd62810e?=k:18'f7<5=81en<4=;:k17f<72-h96?;>;o`2>6=!d52;?:7cl>:498m75>290/n?4=509mf4<132c9?54?:%`1>7363gh:6:54i314>5<#j;099<5ab08;?>o5<>0;6)l=:372?kd62010e?:9:18'f7<5=81en<4n;:k100<72-h96?;>;o`2>g=?6=4+b38114=ij80h76g=4283>!d52;?:7cl>:e98m725290/n?4=509mf47363gh:6k54i363>5<#j;099<5ab0824>=n::<1<7*m2;065>he93;:76g=3483>!d52;?:7cl>:008?l45i3:17d75$c096d>65f2`694?"e:38j46`m1;18?l4>k3:1(o<528f8jg7=821b>4l50;&a6?4>l2di=7?4;h0:e?6=,k81>4j4nc396>=n:031<7*m2;0:`>he93907b<7e;29?j44<3:17d50z&a=650;194?6|,k218l5G2338L77e3A9>7)89:3`e?!3f2;1b?44?::k75?6=3fh?6=44}c027?6=;3:15<>{e:9=1<7=50;2x g>=??4H33a?M523-<=6?li;%7b>7=n;00;66g;1;29?jd32900qo<>1;291?6=8r.i47;?;I015>N59k1C?85+6781fc=#=h097d=6:188m6d=831b8<4?::ka7?6=3fh?6=44}c026?6=;3:15<>{e:9<1<7;50;2x g>==91C>??4H33a?M523-<=6?li;%7b>7=n;00;66g<>50;694?6|,k218k5G2338L77e3-?j6?5f3883>>o393:17dl<:188kg2=831vn?>i:187>5<7s-h369h4H302?M46j2.>m7<4i2;94?=n<80;66gm3;29?jd32900qoN59k1/9l4=;h1:>5<>ie<3:17pl=1883>1<729q/n54;f:J164=O:8h0(8o52:k0=?6=3`>:6=44ic194?=hj=0;66sm20:94?2=83:p(o654g9K677<@;;i7);n:39j7<<722c?=7>5;h`0>5<1<75rb01a>5<3290;w)l7:5d8L7463A8:n6*:a;58m6?=831b8<4?::ka7?6=3fh?6=44}c32f?6==3:12900e>j50;9j04<722ci?7>5;n`7>5<55;294~"e03>o7E<=1:J15g=#=h097d=6:188m6b=831b8<4?::ka7?6=3fh?6=44}c32`?6==3:12900e>j50;9j04<722ci?7>5;n`7>5<55;294~"e03>o7E<=1:J15g=#=h097d=6:188m6b=831b8<4?::ka7?6=3fh?6=44}c32b?6==3:12900e>j50;9j04<722ci?7>5;n`7>5<;7>55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c36=?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<n7>55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c36`?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<54;294~"e03>m7E<=1:J15g=#=h097d=6:188m17=831bn>4?::ma0?6=3th::=4?:583>5}#j10?j6F=209K64d<,6g<9;29?l262900eo=50;9lf1<722wi=4k50;794?6|,k218n5G2338L77e3-?j6?5f3883>>o4j3:17d=k:188m17=831dn94?::a5d6=83?1<7>t$c:90f=O:;;0D??m;%7b>7=n;00;66g>o4j3:17d=k:188m17=831dn94?::a5d5=83?1<7>t$c:90f=O:;;0D??m;%7b>7=n;00;66g>o4j3:17d=k:188m17=831dn94?::a5<>=83?1<7>t$c:90f=O:;;0D??m;%7b>7=n;00;66g>o4j3:17d=k:188m17=831dn94?::a5<0=83?1<7>t$c:915=O:;;0D??m;%7b>2=n;00;66g>o4l3:17d:>:188kg2=831vn<9n:187>5<7s-h369l4H302?M46j2.>m7<4i2;94?=n;m0;66g;1;29?jd32900qo?8b;290?6=8r.i47:m;I015>N59k1/9l4=;h1:>5<>ie<3:17pl>7b83>1<729q/n54;b:J164=O:8h0(8o52:k0=?6=3`9o6=44i5394?=hj=0;66sm16f94?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rb0:f>5<2290;w)l7:5a8L7463A8:n6*:a;08m6?=831b?o4?::k0`?6=3`>:6=44oc694?=zj82m6=4::183!d?2<:0D?<>;I02f>"2i3=0e>750;9j7g<722c?=7>5;h`0>5<1<75rb0;3>5<2290;w)l7:5a8L7463A8:n6*:a;08m6?=831b?o4?::k0`?6=3`>:6=44oc694?=zj83:6=4::183!d?2=i0D?<>;I02f>"2i380e>750;9j7g<722c8h7>5;h62>5<1<75rb06e>5<2290;w)l7:428L7463A8:n6*:a;58m6?=831b?o4?::k75?6=3`h86=44oc694?=zj8?96=4::183!d?2=i0D?<>;I02f>"2i380e>750;9j7g<722c8h7>5;h62>5<1<75rb073>5<2290;w)l7:5a8L7463A8:n6*:a;08m6?=831b?o4?::k0`?6=3`>:6=44oc694?=zj8?:6=4::183!d?2=i0D?<>;I02f>"2i380e>750;9j7g<722c8h7>5;h62>5<1<75rbba94?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rbb`94?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rbbc94?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rbb;94?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rbg094?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rbg394?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rbg294?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rbdd94?2=83:p(o654c9K677<@;;i7);n:39j7<<722c8h7>5;h62>5<1<75rb02g>5<3290;w)l7:5`8L7463A8:n6*:a;08m6?=831b?i4?::k75?6=3fh?6=44}c33g?6=<3:12900e>j50;9j04<722ei87>5;|`24g<72=0;6=u+b987f>N5:81C>o413:17d=k:188m17=831dn94?::a55g=83>1<7>t$c:90g=O:;;0D??m;%7b>7=n;00;66g1<7>t$c:90g=O:;;0D??m;%7b>7=n;00;66g1<7>t$c:90g=O:;;0D??m;%7b>7=n;00;66g1<7>t$c:90g=O:;;0D??m;%7b>7=n;00;66g1<7>t$c:90g=O:;;0D??m;%7b>7=n;00;66g1d<@;8:7E<>b:J01>"1>38ij6*:a;08m6?=831b?i4?::k75?6=3fh?6=44}c330?6=<3:15<>ie<3:17pl>0283>1<729q/n54;b:J164=O:8h0D>;4$7496g`<,6g<9;29?l5c2900e9?50;9lf1<722wi==<50;694?6|,k218o5G2338L77e3A9>7)89:3`e?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjml1<7:50;2x g>=??4H33a?M523-<=6?li;%7b>7=n;00;66g1<7>t$c:90g=O:;;0D??m;I16?!012;hm7);n:39j7<<722c8h7>5;h62>5<1<75rbef94?2=83:p(o654c9K677<@;;i7E=:;%45>7da3-?j6?5f3883>>o4l3:17d:>:188kg2=831vnim50;694?6|,k218o5G2338L77e3A9>7)89:3`e?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjm=1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjm<1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjm?1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjm>1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjon1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjoi1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjoh1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zjok1<7:50;2x g>=??4H33a?!3f2;1b?44?::k0`?6=3`>:6=44oc694?=zj8986=4;:183!d?2=h0D?<>;I02f>"2i380e>750;9j7a<722c?=7>5;n`7>5<54;294~"e03>i7E<=1:J15g=#=h097d=6:188m6b=831b8<4?::ma0?6=3th:?l4?:583>5}#j10?n6F=209K64d<,6g<9;29?l5c2900e9?50;9lf1<722wi=>950;694?6|,k218k5G2338L77e3-?j6:5f3883>>o393:17dl<:188kg2=831vn<=9:187>5<7s-h369h4H302?M46j2.>m794i2;94?=n<80;66gm3;29?jd32900qo?i2;291?6=8r.i47:l;I015>N59k1/9l4=;h1:>5<>o393:17bl;:188yg7a;3:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg7am3:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg4783:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg47:3:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg47<3:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg7a=3:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg7a?3:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg7a13:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg7aj3:197>50z&aN59k1/9l4=;h1:>5<>o393:17bl;:188yg7d=3:1h7>50z&a5;h11>5<>o3=3:17d:9:188m11=831b854?::k15`<722c9=k4?::ma3?6=3f>?6=44}c3a=?6=l3:1>o493:17d==:188m65=831b8<4?::k71?6=3`>=6=44i5594?=n<10;66g=1d83>>o59o0;66am7;29?j232900qo?l4;29`?6=8r.i47l:;I015>N59k1b?=4?::k05?6=3`996=44i2194?=n<80;66g;5;29?l212900e9950;9j0=<722c9=h4?::k15c<722ei;7>5;n67>5<5d;294~"e03h>7E<=1:J15g=n;90;66g<1;29?l552900e>=50;9j04<722c?97>5;h65>5<>o59l0;66g=1g83>>ie?3:17b:;:188yg7d?3:1h7>50z&a5;h11>5<>o3=3:17d:9:188m11=831b854?::k15`<722c9=k4?::ma3?6=3f>?6=44}c3`e?6=l3:1>o493:17d==:188m65=831b8<4?::k71?6=3`>=6=44i5594?=n<10;66g=1d83>>o59o0;66am7;29?j232900qo?l8;29`?6=8r.i47l:;I015>N59k1b?=4?::k05?6=3`996=44i2194?=n<80;66g;5;29?l212900e9950;9j0=<722c9=h4?::k15c<722ei;7>5;n67>5<5d;294~"e03h>7E<=1:J15g=n;90;66g<1;29?l552900e>=50;9j04<722c?97>5;h65>5<>o59l0;66g=1g83>>ie?3:17b:;:188yg7dj3:1h7>50z&a5;h11>5<>o3=3:17d:9:188m11=831b854?::k15`<722c9=k4?::ma3?6=3f>?6=44}c3ae?6=l3:1>o493:17d==:188m65=831b8<4?::k71?6=3`>=6=44i5594?=n<10;66g=1d83>>o59o0;66am7;29?j232900qo?md;29`?6=8r.i47l:;I015>N59k1b?=4?::k05?6=3`996=44i2194?=n<80;66g;5;29?l212900e9950;9j0=<722c9=h4?::k15c<722ei;7>5;n67>5<5d;294~"e03h>7E<=1:J15g=n;90;66g<1;29?l552900e>=50;9j04<722c?97>5;h65>5<>o59l0;66g=1g83>>ie?3:17b:;:188yg7ek3:1h7>50z&a5;h11>5<>o3=3:17d:9:188m11=831b854?::k15`<722c9=k4?::ma3?6=3f>?6=44}c3aa?6=l3:1>o493:17d==:188m65=831b8<4?::k71?6=3`>=6=44i5594?=n<10;66g=1d83>>o59o0;66am7;29?j232900qo?mf;29`?6=8r.i47l:;I015>N59k1b?=4?::k05?6=3`996=44i2194?=n<80;66g;5;29?l212900e9950;9j0=<722c9=h4?::k15c<722ei;7>5;n67>5<5d;294~"e03h>7E<=1:J15g=n;90;66g<1;29?l552900e>=50;9j04<722c?97>5;h65>5<>o59l0;66g=1g83>>ie?3:17b:;:188yg7d93:1h7>50z&a5;h11>5<>o3=3:17d:9:188m11=831b854?::k15`<722c9=k4?::ma3?6=3f>?6=44}c3`6?6=l3:1>o493:17d==:188m65=831b8<4?::k71?6=3`>=6=44i5594?=n<10;66g=1d83>>o59o0;66am7;29?j232900qo?l3;29`?6=8r.i47l:;I015>N59k1b?=4?::k05?6=3`996=44i2194?=n<80;66g;5;29?l212900e9950;9j0=<722c9=h4?::k15c<722ei;7>5;n67>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3bb?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3b`?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3bf?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3b=?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3a2900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3a2?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3a0?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3a6?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3b3?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c021?6=;3:1o2>3:17d;8:188kdb=831vn?>n:180>5<7s-h36;>4H302?M46j2.>m7??;h75>5<>{e91=1<7=50;2x g>=>91C>??4H33a?!3f28i0e8850;9j12<722ejh7>5;|`233<72:0;6=u+b9854>N5:81C>N59k1/9l4>c:k62?6=3`?<6=44o`f94?=zjj>1<7=50;2x g>=>91C>??4H33a?!3f28i0e8850;9j12<722ejh7>5;|``7?6=;3:1o2>3:17d;8:188kdb=831vnn<50;194?6|,k21:=5G2338L77e3-?j60;66and;29?xdem3:1?7>50z&a:7>5;h74>5<53;294~"e03<;7E<=1:J15g=#=h0:o6g:6;29?l302900clj50;9~f455290?6=4?{%`;>34<@;8:7E<>b:&6e?443`?=6=44i4594?=n=10;66and;29?xd6010;694?:1y'f=<1:2B9><5G20`8 0g=:81b9;4?::k63?6=3`?36=44o`f94?=zj8>26=4;:183!d?2?80D?<>;I02f>"2i38:7d;9:188m01=831b954?::mb`?6=3th:?44?:483>5}#j10=?6F=209K64d<,>o2?3:17d;7:188m0?=831dmi4?::a5=?=83?1<7>t$c:926=O:;;0D??m;%7b>74>o203:17d;6:188kdb=831vn<:n:186>5<7s-h36;=4H302?M46j2.>m7<=;h75>5<>o213:17bok:188yg74=3:197>50z&a:7>5;h74>5<>ifl3:17pl>2d83>1<729q/n5492:J164=O:8h0(8o5e:k62?6=3`?<6=44i4:94?=him0;66sm16594?3=83:p(o65629K677<@;;i7);n:0`8m00=831b9:4?::k6;I02f>"2i3h0e8850;9j12<722ejh7>5;|`26a<72<0;6=u+b9857>N5:81C>o2>3:17d;8:188m0>=831b944?::mb`?6=3th:>k4?:283>5}#j10=<6F=209K64d<,>o2?3:17bok:188yg70;3:1?7>50z&a:7>5;h74>5<5<4290;w)l7:728L7463A8:n6*:a;0;?l312900e8950;9lea<722wink4?:283>5}#j10=<6F=209K64d<,>o2?3:17bok:188ygd>29086=4?{%`;>36<@;8:7E<>b:&6e?7d3`?=6=44i4594?=him0;66sm10c94?3=83:p(o65629K677<@;;i7);n:058m00=831b9:4?::k6;6=4::183!d?2?90D?<>;I02f>"2i38>7d;9:188m01=831b954?::k6=?6=3fko6=44}c375?6==3:1o2>3:17d;8:188m0>=831b944?::mb`?6=3th::;4?:483>5}#j10=?6F=209K64d<,l5f5783>>o2?3:17d;7:188m0?=831dmi4?::a531=83?1<7>t$c:926=O:;;0D??m;%7b>7g>o203:17d;6:188kdb=831vn<87:186>5<7s-h36;=4H302?M46j2.>m75<>o213:17bok:188yg71=3:197>50z&a:7>5;h74>5<>ifl3:17pl>3e83>0<729q/n5493:J164=O:8h0(8o52`9j13<722c>;7>5;h7;>5<>{e9?o1<7;50;2x g>=>:1C>??4H33a?!3f2;n0e8850;9j12<722c>47>5;h7:>5<5<2290;w)l7:718L7463A8:n6*:a;18m00=831b9:4?::k6=>;1C>??4H33a?!3f2;h0e8850;9j12<722c>47>5;ncg>5<;I02f>"2i38i7d;9:188m01=831b954?::mb`?6=3th:>;4?:483>5}#j10=?6F=209K64d<,n5f5783>>o2?3:17d;7:188m0?=831dmi4?::a57e=83?1<7>t$c:926=O:;;0D??m;%7b>1c>o203:17d;6:188kdb=831vn<5<7s-h36;=4H302?M46j2.>m784i4494?=n=>0;66g:8;29?l3>2900clj50;9~f40d290>6=4?{%`;>35<@;8:7E<>b:&6e?253`?=6=44i4594?=n=10;66g:9;29?jgc2900qo?9b;297?6=8r.i478?;I015>N59k1/9l4m;h75>5<>{e9;91<7;50;2x g>=>:1C>??4H33a?!3f2<1b9;4?::k63?6=3`?36=44i4;94?=him0;66sm16294?3=83:p(o65629K677<@;;i7);n:0g8m00=831b9:4?::k6;I02f>"2i39?7d;9:188m01=831b954?::k6=?6=3fko6=44}c35b?6==3:1o2>3:17d;8:188m0>=831b944?::mb`?6=3th::94?:583>5}#j10=>6F=209K64d<,95f5783>>o2?3:17d;7:188kdb=831vn<=j:186>5<7s-h36;=4H302?M46j2.>m7;>;h75>5<>o213:17bok:188yg7513:197>50z&a:7>5;h74>5<>ifl3:17pl>2983>0<729q/n5493:J164=O:8h0(8o51e9j13<722c>;7>5;h7;>5<>{e9?n1<7;50;2x g>=>:1C>??4H33a?!3f2;o0e8850;9j12<722c>47>5;h7:>5<=>:1C>??4H33a?!3f28l0e8850;9j12<722c>47>5;h7:>5<5<3290;w)l7:708L7463A8:n6*:a;a8m00=831b9:4?::k62900e>l50;9j7a<722c?=7>5;n`7>5<o7>55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c3:b?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c36a?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<47>55;294~"e03>h7E<=1:J15g=#=h097d=6:188m6d=831b?i4?::k75?6=3fh?6=44}c36e?6==3:12900e>l50;9j7a<722c?=7>5;n`7>5<52;294~"e03?i7E<=1:J15g=n=<0;66and;29?xd6<>0;6?4?:1y'f=<2j2B9><5G20`8m03=831dmi4?::a54?=83<1<7>t$c:921=O:;;0D??m;%7b>4d>o203:17d;6:188k0b=831dmi4?::a540=8391<7>t$c:924=O:;;0D??m;%7b>7>>i2l3:17pl>7483>3<729q/n5494:J164=O:8h0(8o5269j13<722c>;7>5;h7;>5<>ifl3:17pl>1983>3<729q/n5494:J164=O:8h0(8o5279j13<722c>;7>5;h7;>5<>ifl3:17pl>6283>0<729q/n5495:J164=O:8h0(8o54:k62?6=3`?<6=44i4:94?=n=00;66a:d;29?xd6;o0;684?:1y'f=<1=2B9><5G20`8 0g=:01b9;4?::k63?6=3`?36=44i4;94?=h=m0;66sm13394?3=83:p(o65649K677<@;;i7);n:3d8m00=831b9:4?::k6;6;;0>463>3886=>;6;<0>563>2d862>;6:m0>:6s|22094?7dsW8886P=289]6f4;_0;a>X51l1U>>?4^313?[45n2T9>h5Q23f897452<901??>:53897612=;01???:538976a2=;01?>j:538977>2=;01??7:538947e2k901650=j:1v?6;:181[4?<27:?:4m4:p6f`=839pR?mi;<3;5?3134;=87;9;|q1e`<72<>pR?oj;<03348;;7=6;<032?5>348:<7=6;<03b?5>348;i7=6;<30f?5>34;:n7=6;<32g?5>34;:h7=6;<32a?5>34;:j7=6;<363?5>34;>57=6;<36f?5>34;>h7=6;<37b?5>34;>>7=6;<364?5>34;>=7=6;6?<5o;1?452f180=>;bn39270??d;1:?877k39270??b;1:?877i39270??5;1:?877<39270??3;1:?877:39270j8:2;89a0=;016h84<9:?g0?5>34;8?7=6;<304?5>34;8m7=6;<303?5>34;8:7=6;<3e6?5>34;m?7=6;<3e`?5>34;mi7=6;<3eb?5>348;<7=6;<035?5>348;>7=6;<037?5>348;87=6;<3e0?5>34;m97=6;<3e2?5>34;m;7=6;<3e34;m57=6;<3ee?5>34;mn7=6;<3eg?5>34;i<7=6;<3bb?5>34;ji7=6;<3b`?5>34;jo7=6;<3bf?5>34;jm7=6;<3b=?5>34;j47=6;<3a34;i;7=6;<3a2?5>34;i97=6;<3a0?5>34;i?7=6;<3a6?5>34;i=7=6;<3b3?5>34;j:7=6;<36g?5>34;>i7=6;<3634;>m7=6;|q15o4=042>g253gy]6f5<5;;86>74=332>6?<5;;96>74=33:>6?<5;;36>74=042>6?<58<;6>74=0;f>6?<58k;6>74=0c1>6?<58k86>74=0;:>6?<58336>74=0;4>6?<583=6>74=05:>6?<58=j6>74=05a>6?<58=h6>74=05g>6?<582n6>74=0:e>6?<583;6>74=0;2>6?<5ji1?452cc80=>;di39270m6:2;89`1=;016i;4<9:?f1?5>34o?6>74=ed97<=:ll08563kd;1:?8bd2:301kj5389>bf<4127mn7=6;6?<58i>6??j;<3a=?46m27:o94=1d9>5f0=:8o01c9815`=:9j31>77b34;im7<>e:?2fa<59l16=ol520g894dd2;;n70?me;02a>;6jo09=h521b2964c<58i:6??j;<3`6?46m27:o>4=1d9>5d2=;016=4h5389>5d7=;01v?mj:181[4d027:;i4m4:p6fe=838pR?m8;<34g?d33ty9oo4?:3y]6f0<58=i6o:4}r0`e?6=:rT9o85216c9f1=z{;i26=4={_0`0>;6?00i86s|26;94?4|V;<=70?m0;`7?xu5?>0;6?uQ277894ga2k>0q~<86;296~X5>=16=lk5b59~w7122909wS<93:?2ea::50;0xZ70534;jo7l;;|q136<72;qU>;?4=0ca>g27>52z\125=:9hk1n95rs352>5<5sW8>j63>a88a0>{t:>:1<77}Y:?o01vP=6e9>5g1=j=1v?6?:181[41k27:n;4m4:p62`=838pR?8m;<3a1?d33ty9;h4?:3y]63g<58h?6o:4}r04`?6=:rT9:4521c19f1=z{;=h6=4={_05<>;6j;0i86s|26`94?4|V;<<70?m1;`7?xu5?h0;6?uQ24f894g02k>0q~<9f;296~X5=j16=l85b59~w7d>2909wSo950;0xZ7d534;:i7l;;|q1f3<72;qU>o?4=03g>g252z\1f5=:98i1n95rs3`7>5<5sW8jj63>1c8a0>{t:<81<7:7p}=5183>7}Y::o01vP=3e9>5f7=<81v?:j:181[44k27:o=4;1:p61b=838pR?=m;<3ab?263ty98n4?:3y]66g<58hn69?4}r07f?6=:rT9?4521cf904=z{;>j6=4={_00<>;6jj0?=6s|25;94?4|V;9<70?mb;62?xu5=k0;6?uQ255894df2=;0q~<:a;296~X52909wS<;5:?2gd<392wx>8650;0xZ72334;h57:>;|q112<72;qU>9=4=0a;>17:7>52z\107=:9j=18<5rs376>5<5sW8?=63>c7875>{t:<>1<7:7p}=5283>7}Y::<01vP=349>5g?=<81v?>8:18084703>:7039i7p}=0983>7}::921n95221c913=z{;;96=4<{<027?26348:=7=m;<026?d33ty9=>4?:3y>645=j=16><;5579~w7612908w03h?70u22039f1=::8818<52207912=z{;:26=4;{<024?d4348;j7l<;<03a?d4348;m7ok;|q14a<728ip1???:c68945e2k901:2f894542:n01<=?:2f8945f2:n01<=8:c1894512k901<<;:458944d2<=01<<<:4;894472<=01<;l:2f8943b2:n01<;7:2f8943f2:n0q~;a939o70h?:2f89``=;m16==j53e9>55e=;m16==l53e9>55g=;m16==;53e9>552=;m16===53e9>554=;m16h:46>j4=e697a=z{;:i6=4=7z?14`4<:50;1x977>2k901??7:c1897722hn0q~<>7;2952}::831n9521739f6=:9?:1n>5218g97a=:9h:1?i521`097a=:9h91?i5218;97a=:9021?i5218597a=:90<1n>5216;97a=:9>k1?i5216`97a=:9>i1?i5216f97a=:91o1?i5219d9f6=:90:1?i5218397a=:9h>1?i5218d97a=:9h;1?i5rs335>5<69r79=54m4:?`g?5c34ii6>j4=bc97a=:k008h63j7;1g?8c12:n01h;53e9>a1<4l27oj7=k;6b<5mn1?i52db80`>;al39o70hl:2f89cd=;m16jl434862>;6:m0>;6s|13294?4|58;i69?4=003>db7>52z?25f<3927:>94nd:p573=838p1298b`>{t9;k1<717<588i6lj4}r36b?6=:8q6=8953c9>50?=;k16=8l53c9>50b=;k16=9h53c9>504=;k16=8>53c9>507=;k16=k<53c9>5c5=;k16=kj53c9>5cc=;k16=kh53c9>656=;k16>=?53c9>654=;k16>==53c9>652=;k16=k:53c9>5c3=;k16=k853c9>5c1=;k16=k653c9>5c?=;k16=ko53c9>5cd=;k16=km53c9>57b=im16=>k5599>50e=;k16=8k53c9>50>=;k16=8o53c9~w42e2903w0?:7;62?873n3h?70?;8;74?87313?370?;a;7;?87393?=70?:8;62?873?3?>7p}>5283>40|58?<6o:4=0a6>13<58h269;4=0a7>13<58i=69;4=0a4>13<58ij69;4=0a;>13<58i269;4=0aa>13<58hj69;4=0`g>13<58hi69;4=0``>13<58hn69;4=0`e>13<58i;69;4=0a2>13<58i969;4=0a0>13<5ko19:5213391<=z{8>h6=48{<36=?2634;><7l;;<372k>012=<012=<01:54894e52=<0101<:6:448942f2<301<=k:448943d2=;0q~?:5;295=}:9:63mc;74?876i3?<70?=9;74?xu68z?21a;<3`1?2?34;i57:7;<3`0?2?34;h:7:7;<3`3?2?34;hm7:7;<3`7:7;<3`7?2?34hh6884=00;>01<589m6894}r356?6=;r7::<4;1:?225<3927::84nd:p536=839p1<8?:c6894>62<=01<8<:458yv7f=3:1>>u218g97g=:9h:1?o521`097g=:9h91?o5218;97g=:9021?o5218597g=:90<1?o5219g97g=:91l1?o5218297g=:90;1?o521b7964`<58h26??i;<3`0?46n27:o;4=1g9>5f1=:8l01c8815c=:9jh1>77a34;ih7<>f:?2fg<59o16=om520d894db2;;m70?mf;02b>;6k909=k521b3964`<58i96??i;<3`7?46n27:4<4nd:?2e1<4j27:5k4i3:1=5u218g9f1=:9j?1?=521c;975=:9j>1?=521b4975=:9j=1?=521bc975=:9j21?=521b;975=:9jh1?=521cc975=:9kn1?=521c`975=:9ki1?=521cg975=:9kl1?=521b2975=:9j;1?=521b0975=:9j91?=52164913=:k=0>;63>7686=>;6>m0>56s|18194?2|58k;69?4=0;4>g2<58<=6884=0c2>17519y>5d6=j=16=n;5309>5g?=;816=n:5309>5f0=;816=n95309>5fg=;816=n65309>5f?=;816=nl5309>5gg=;816=oj5309>5gd=;816=om5309>5gc=;816=oh5309>5f6=;816=n?5309>5f4=;816=n=5309>g1<2>27h?7;8;<343?3?34;=h7;8;|q2=1<72:q6=l<5409>5<>=j=16=;95599~w4?d290:mv3>a38a0>;6k<08>63>b8806>;6k=08>63>c7806>;6k>08>63>c`806>;6k108>63>c8806>;6kk08>63>b`806>;6jm08>63>bc806>;6jj08>63>bd806>;6jo08>63>c1806>;6k808>63>c3806>;6k:08>63l3;75?8e52<=01<8j:458940d2<=01<9?:4;894162<30q~?65;290~;6i:0?=63>988a0>;6>>0>:63>a5875>{t90n1<7?7{<3b7?d334lo69?4=0a6>65<58h26>=4=0a7>65<58i=6>=4=0a4>65<58ij6>=4=0a;>65<58i26>=4=0aa>65<58hj6>=4=0`g>65<58hi6>=4=0``>65<58hn6>=4=0`e>65<58i;6>=4=0a2>65<58i96>=4=0a0>65<5j819;5216291==:9>;1955rs0:g>5<3s4;257:>;<3:5?d334;357;9;<355<>=<816=4>5b59>5=>==?16=575599>535==?1v<6m:18587>?3>:70?7f;`7?87??3?=70?78;74?87?13?270?98;7;?xu60h0;6:u2184904=:91o1n952195912=:9121955219;912=:9?>19:52194910=z{8=36=4={<34=?2634;<:7ok;|q23`<72;q6=:o5409>53b=im1v<9i:181870j3>:70?9e;cg?xu6090;6?u216a904=:9?l1mi5rs04b>5<5s4;;<35f?gc3ty:4?4?:3y>5=c=<816=585ae9~w4>42909w0?7f;62?87??3ko7p}>8583>7}:90:18<5219:9ea=z{82>6=4={<3:5?2634;357ok;|q206<72;q6=9h5409>511=im1v<:9:181872:3>:70?;a;cg?xu6<=0;6?u2142904=:9=21mi5rs066>5<5s4;>=7:>;<37=?gc3tyn?7>55z?`g?2634o<6o:4=c;912=:jh0>;63mb;74?xud03:1:v3lc;`7?870;3?<70?97;74?87103?<70?80;75?87093?=7p}ld;296~;dj3>:70l6:`f8yve0290530==>16=;65589>53b==?16=:;5599~wf`=838p1n75409>fgg<fc<2?27h<7;8;01g2<58>:6874=00;>00<58;=6894=01e>0017<5kl1mi5rsdf94?3|5o;1n952106912=:98k19;5212f912=:9;319;5rsg694?4|5o:18<52c18b`>{tmj0;68u2f18a0>;6<90>463>3e86=>;6900>463>19862>{tn<0;6?u2eg875>;d93ko7p}jb;292~;bn3h?70?;0;7:?87393?<70?>9;7:?87603?<70?=1;7;?xu6880;6?u211f904=:99?1n95rs023>5<5s4;;o7:>;<330?d33ty:<54?:5y>55e=j=16nk4:6:?`4?3134i:6884}rde>5<5s4;;n7:>;<337?d33ty:<:4?:2y>55d=j=16o=4:8:?`5?3?3tymi7>52z?24d<3927:n:c689f7==01vil50;0x9`1=<816hk4m4:p`d<72;q6i;4;1:?ga?d33tyn>7>54z?f2?d334h26884=cc913=:jk0>:6s|d883>7}:m<0?=63kd;`7?xub93:1?v3j5;`7?8df2<201ol5599~wa>=838p1h:5409>`fa152z?241<3927mo7l;;|qe3?6=:r7:<>4;1:?ef?d33tym:7>52z?247<3927mm7l;;|qg7?6=:r7oj7:>;g217<5m<1n95rse394?4|5mn18<52d48a0>{tl90;6?u2db875>;c<3h?7p}j8;296~;c>3>:70ll:`f8yvc>2909w0j::5389gb=im1vho50;0x9a2=<816nh4nd:p55c=838p1km5409>g74nd:p546=838p1ko5409>g1:50;0x94542=;01<=::`f8yv74;3:15v3>328a0>;6;;0>;63>3886<>;6;<0>463>2d86<>;6:m0>563>2g863>;6::0>;63>20863>{t9:;1<7=t=013>17<589j69?4=011>db59z?275i4:8:?26c<2>27:>>4:6:?264<2>2wx=>o50;7x945f2k>01<<;:448944d2<<01<<<:4:894472<<0q~?<8;297~;6;>0?=63>37875>;6;00jh6s|12494?4|589=6o:4=01:>0052z?2b7<3927:n44;4:p5a`=838p1c5870>{t9l31<7g2<58k<69?4}r3g3?6=:r7:ji4;1:?2g0<3<2wx=ho50;0x94`c2k>01:538yv7c03:1>v3>fd875>;6k?0?86s|1d`94?4|58ln6o:4=0`1>1752z?2bc<3927:o:4;4:p5`e=838p1c9870>{t9ln1<7g2<58h?69?4}r3gf?6=:r79<<4;1:?2g<<3<2wx=hk50;0x97662k>01v3=03875>;6kh0?86s|1dd94?4|5;:96o:4=0`5>1752z?146<3927:oo4;4:p5c6=838p1?><:c6894d02=;0q~?ke;296~;58=0?=63>b`870>{t9o;1<7g2<58h369?4}r3``?6=:r7:j94;1:?2fg<3<2wx=h>50;0x94`32k>01v3>f4875>;6jj0?86s|1d394?4|58l>6o:4=0c:>1752z?2b3<3927:ni4;4:p5`4=838p10?=63>bd870>{t9l91<7g2<58ki69?4}r3g5?6=:r7:j54;1:?2fc<3<2wx=h:50;0x94`?2k>01v3>f8875>;6k90?86s|1d794?4|58l26o:4=0cg>1752z?2bd<3927:o<4;4:p5`0=838p1c3870>{t9l=1<7g2<58km69?4}r3g1?6=:r7:jn4;1:?2g6<3<2wx=h650;0x94`d2k>011?o521c197g=:9k81?o521c397g=:9h=1?o521`497g=:9;o1mi5rs04:>5<3s4;<;7ok;<35a?3>34;=n7;9;<35b?3>3ty:8?4?:2y>57`=im16=?:5599>57d==?1v5<5s4;:87;9;<36g?d33ty:=>4?:5y>542=im16=?85579>57e==116=>h5599~w4722909w0?>a;7;?876>3?o7p}>1683>1}:98k1945213491==:9;31955210:9ea=z{8;:6=4={<32e?gc34;9n7;6;|q21=<72=q6=9>5579>50>=j=16=<75569>54>==11v<;n:18787383?<70?:a;`7?87613?=70?>8;7:?xu6<90;6?u21529ea=:9:l1945rs062>5<5s4;?=7ok;<30a?303ty::;4?:3y>530=im16=;;5579~w4002909w0?97;cg?871=3?<7p}>6983>7}:9?21mi5217791==z{8<86=4={<351?3>34;=?7;k;|q42wx=::50;1x940b2<201<8i:44894122hn0q~?>2;290~;6:=0>563>27863>;6:k0>;63>188b`>{t>00;6>u213491<=:9;91mi5213:91==z{191<70?<58;368j4}r5:>5<5s4;9o7ok;<31f?3?3ty3>7>52z?22f<2127:;84:d:p3d<72;q6=;m5ae9>53d==>1v:l50;0x94172hn01<8i:4:8yv1d2909w0?81;cg?871n3?<7p}8d;296~;6>=0jh63>6286=>{t?l0;6?u212g91<=:9:l19i5rs9394?4|58826874=03:>0b=4:8:?264<2l2wx=4h50;0x94?a2k>01<9::448yv7f93:1>v3>a08a0>;6?<0>;6s|14g94?4|58?n6o:4=035>00>h4$33b>=?<7>52z\17`=:;>09?h5+20c9=5=z{;>m6=4={_00`>;4?388h6*=1`8:f>{t:=o1<7a;c1?xu5vP=3`9>72<5;h1/>75?3-8:m78k;|q10<<72;qU>>94=259661<,;;j6;k4}r06f?6=:rT98:52368102=#:8k1:k5rs37b>5<5sW8?:63<7;072>"59h0<<6s|24;94?4|V;>>70=8:366?!46i3=:7p}=5983>7}Y:=>01>952568 77f2>80q~<:7;296~X5<:16?:4=429'64g=?:1v?;9:181[43:278;7<;2:&15d<0<2wx>8;50;0xZ726349<6?:>;%02e?123ty9994?:3y]616<5:=1>9>4$33b>20?7>52z\173=:;>09?;5+20c932=z{;>36=4={_001>;4?38896*=1`84<>{t:ho1<7a;:7?xu5jh0;6?uQ2cc8961=:kk0(??n:978yv4ek3:1>vP=bb9>72<5jj1/>7ea3-8:m767;|q13<<72;qU>;84=259630<,;;j65o4}r043?6=:rT9:852368120=#:8k14o5rs355>5<5sW8=863<7;050>"59h03o6s|26794?4|V;<870=8:340?!46i32o7p}=7583>7}Y:?801>952708 77f21o0q~<83;296~X5>816?:4=609'64g=0o1v?9=:181[418278;7<90:&15d<>92wx>:?50;0xZ73a349<6?;i;%02e??53ty9;=4?:3y]60c<5:=1>8k4$33b><57>52z\12`=:;>09:h5+20c9=1=z{;2:6=4={_05`>;4?38=h6*=1`8:1>{t:1:1<7a;;5?xu5?o0;6?uQ27`8961=:?h0(??n:858yv40m3:1>vP=6`9>72<5>h1/>70?3-8:m77n;|q13g<72;qU>;94=259631<,;;j64m4}r04e?6=:rT99i5236811a=#:8k15i5rs34e>5<5sW8>o63<7;06g>"59h02i6s|29694?4|V;2?70=8:3:7?!46i33m7p}=8`83>7}Y:1k01>9529c8 77f2h:0q~o850;0xZ7d6349<6?l>;%02e?g33ty9n84?:3y]6g6<5:=1>o>4$33b>d352z\1ec=:;>09mk5+20c9e3=z{;in6=4={_0`<>;4?38h46*=1`8b3>{t:ji1<7a;c;?xu5kk0;6?uQ2b48961=:j<0(??n:`;8yv4di3:1>vP=c49>72<5k<1/>2909wSb:m2g0=838pD??m;|l5f2<72;qC>5<5sA8:n6sa6cc94?4|@;;i7p`9bc83>7}O:8h0qc8mc;296~N59k1vb;lk:181M46j2we:ok50;0xL77e3td=nk4?:3yK64d52zJ15g=zf?i:6=4={I02f>{i>j81<7vF=1c9~j3e22909wE<>b:m2f0=838pD??m;|l5g2<72;qC>5<5sA8:n6sa6bc94?4|@;;i7p`9cc83>7}O:8h0qc8lc;296~N59k1vb;mk:181M46j2we:nk50;0xL77e3td=ok4?:3yK64d52zJ15g=zf?n:6=4={I02f>{i>m81<7vF=1c9~j3b22909wE<>b:m2a0=838pD??m;|l5`2<72;qC>5<5sA8:n6sa6ec94?4|@;;i7p`9dc83>7}O:8h0qc8kc;296~N59k1vb;jk:181M46j2we:ik50;0xL77e3td=hk4?:3yK64d52zJ15g=zf?o:6=4={I02f>{i>l81<7vF=1c9~j3c22909wE<>b:m2`0=838pD??m;|l5a2<72;qC>5<5sA8:n6sa6dc94?4|@;;i7p`9ec83>7}O:8h0qc;l8;295~N59k1vb8hi:182M46j2we:=>50;3xL77e3td=<<4?:0yK64d7>51zJ15g=zf?:86=4>{I02f>{i>9>1<7?tH33a?xh18<0;63:1=vF=1c9~j360290:wE<>b:m25>=83;pD??m;|l54<<728qC>5<6sA8:n6sa61a94?7|@;;i7p`90e83>4}O:8h0qc8?e;295~N59k1vb;>i:182M46j2we:<>50;3xL77e3td==<4?:0yK64d7>51zJ15g=zf?;86=4>{I02f>{i>8>1<7?tH33a?xh19<0;63:1=vF=1c9~j370290:wE<>b:m24>=83;pD??m;|l55<<728qC>5<6sA8:n6sa60a94?7|@;;i7p`91e83>4}O:8h0qc8>e;295~N59k1vb;?i:182M46j2we:?>50;3xL77e3td=><4?:0yK64d7>51zJ15g=zf?886=4>{I02f>{i>;>1<7?tH33a?xh1:<0;63:1=vF=1c9~j340290:wE<>b:m27>=83;pD??m;|l56<<728qC>5<6sA8:n6sa63a94?7|@;;i7p`92e83>4}O:8h0qc8=e;295~N59k1vb;>50;3xL77e3td=?<4?:0yK64d7>51zJ15g=zf?986=4>{I02f>{i>:>1<7?tH33a?xh1;<0;63:1=vF=1c9~j350290:wE<>b:m26>=83;pD??m;|l57<<728qC>5<6sA8:n6sa62a94?7|@;;i7p`93e83>4}O:8h0qc850;3xL77e3td=8<4?:0yK64d7>51zJ15g=zf?>86=4>{I02f>{i>=>1<7?tH33a?xh1<<0;63:1=vF=1c9~j320290:wE<>b:m21>=83;pD??m;|l50<<728qC>5<6sA8:n6sa65a94?7|@;;i7p`94e83>4}O:8h0qc8;e;295~N59k1vb;:i:182M46j2we:8>50;3xL77e3td=9<4?:0yK64d>7>51zJ15g=zf??86=4>{I02f>{i><>1<7?tH33a?xh1=<0;63:1=vF=1c9~j330290:wE<>b:m20>=83;pD??m;|l51<<728qC>5<6sA8:n6sa64a94?7|@;;i7p`95e83>4}O:8h0qc8:e;295~N59k1vb;;i:182M46j2we:;>50;3xL77e3td=:<4?:0yK64d7>51zJ15g=zf?<86=4>{I02f>{i>?>1<7?tH33a?xh1><0;63:1=vF=1c9~j300290:wE<>b:m23>=83;pD??m;|l52<<728qC>5<6sA8:n6sa67a94?7|@;;i7p`96e83>4}O:8h0qc89e;295~N59k1vb;8i:182M46j2we::>50;3xL77e3td=;<4?:0yK64d7>51zJ15g=zf?=86=4>{I02f>{i>>>1<7?tH33a?xh1?<0;63:1=vF=1c9~j310290:wE<>b:m22>=83;pD??m;|l53<<728qC>5<6sA8:n6sa66a94?7|@;;i7p`97e83>4}O:8h0qc88e;295~N59k1vb;9i:182M46j2we:5>50;3xL77e3td=4<4?:0yK64d7>51zJ15g=zf?286=4>{I02f>{i>1>1<7?tH33a?xh10<0;63:1=vF=1c9~j3>0290:wE<>b:m2=>=83;pD??m;|l5<<<728qC>5<6sA8:n6sa69a94?7|@;;i7p`98e83>4}O:8h0qc87e;295~N59k1vb;6i:182M46j2we:4>50;3xL77e3td=5<4?:0yK64d7>51zJ15g=zf?386=4>{I02f>{i>0>1<7?tH33a?xh11<0;6>3:1=vF=1c9~j3?0290:wE<>b:m2<>=83;pD??m;|l5=<<728qC>5<6sA8:n6sa68a94?7|@;;i7p`99e83>4}O:8h0qc86e;295~N59k1vb;7i:182M46j2we:l>50;3xL77e3td=m<4?:0yK64d7>51zJ15g=zf?k86=4>{I02f>{i>h>1<7?tH33a?xh1i<0;63:1=vF=1c9~j3g0290:wE<>b:m2d>=83;pD??m;|l5e<<728qC>5<6sA8:n6sa6`a94?7|@;;i7p`9ae83>4}O:8h0qc8ne;295~N59k1vb;oi:182M46j2we:o>50;3xL77e3td=n<4?:0yK64d7>51zJ15g=zf?h86=4>{I02f>{i>k>1<7?tH33a?x{zuIJHw:jn:6ffgc05=tJKNv>r@ARxyEF \ No newline at end of file diff --git a/coregen/fifo_xlnx_16x19_2clk.v b/coregen/fifo_xlnx_16x19_2clk.v new file mode 100644 index 000000000..1d633384b --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk.v @@ -0,0 +1,169 @@ +/******************************************************************************* +* This file is owned and controlled by Xilinx and must be used * +* solely for design, simulation, implementation and creation of * +* design files limited to Xilinx devices or technologies. Use * +* with non-Xilinx devices or technologies is expressly prohibited * +* and immediately terminates your license. * +* * +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" * +* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR * +* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION * +* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION * +* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS * +* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, * +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE * +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY * +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE * +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR * +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF * +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * +* FOR A PARTICULAR PURPOSE. * +* * +* Xilinx products are not intended for use in life support * +* appliances, devices, or systems. Use in such applications are * +* expressly prohibited. * +* * +* (c) Copyright 1995-2007 Xilinx, Inc. * +* All rights reserved. * +*******************************************************************************/ +// The synthesis directives "translate_off/translate_on" specified below are +// supported by Xilinx, Mentor Graphics and Synplicity synthesis +// tools. Ensure they are correct for your synthesis tool(s). + +// You must compile the wrapper file fifo_xlnx_16x19_2clk.v when simulating +// the core, fifo_xlnx_16x19_2clk. When compiling the wrapper file, be sure to +// reference the XilinxCoreLib Verilog simulation library. For detailed +// instructions, please refer to the "CORE Generator Help". + +`timescale 1ns/1ps + +module fifo_xlnx_16x19_2clk( + din, + rd_clk, + rd_en, + rst, + wr_clk, + wr_en, + dout, + empty, + full, + rd_data_count, + wr_data_count); + + +input [18 : 0] din; +input rd_clk; +input rd_en; +input rst; +input wr_clk; +input wr_en; +output [18 : 0] dout; +output empty; +output full; +output [4 : 0] rd_data_count; +output [4 : 0] wr_data_count; + +// synthesis translate_off + + FIFO_GENERATOR_V4_3 #( + .C_COMMON_CLOCK(0), + .C_COUNT_TYPE(0), + .C_DATA_COUNT_WIDTH(5), + .C_DEFAULT_VALUE("BlankString"), + .C_DIN_WIDTH(19), + .C_DOUT_RST_VAL("0"), + .C_DOUT_WIDTH(19), + .C_ENABLE_RLOCS(0), + .C_FAMILY("spartan3"), + .C_FULL_FLAGS_RST_VAL(1), + .C_HAS_ALMOST_EMPTY(0), + .C_HAS_ALMOST_FULL(0), + .C_HAS_BACKUP(0), + .C_HAS_DATA_COUNT(0), + .C_HAS_INT_CLK(0), + .C_HAS_MEMINIT_FILE(0), + .C_HAS_OVERFLOW(0), + .C_HAS_RD_DATA_COUNT(1), + .C_HAS_RD_RST(0), + .C_HAS_RST(1), + .C_HAS_SRST(0), + .C_HAS_UNDERFLOW(0), + .C_HAS_VALID(0), + .C_HAS_WR_ACK(0), + .C_HAS_WR_DATA_COUNT(1), + .C_HAS_WR_RST(0), + .C_IMPLEMENTATION_TYPE(2), + .C_INIT_WR_PNTR_VAL(0), + .C_MEMORY_TYPE(2), + .C_MIF_FILE_NAME("BlankString"), + .C_MSGON_VAL(1), + .C_OPTIMIZATION_MODE(0), + .C_OVERFLOW_LOW(0), + .C_PRELOAD_LATENCY(0), + .C_PRELOAD_REGS(1), + .C_PRIM_FIFO_TYPE("512x36"), + .C_PROG_EMPTY_THRESH_ASSERT_VAL(4), + .C_PROG_EMPTY_THRESH_NEGATE_VAL(5), + .C_PROG_EMPTY_TYPE(0), + .C_PROG_FULL_THRESH_ASSERT_VAL(15), + .C_PROG_FULL_THRESH_NEGATE_VAL(14), + .C_PROG_FULL_TYPE(0), + .C_RD_DATA_COUNT_WIDTH(5), + .C_RD_DEPTH(16), + .C_RD_FREQ(1), + .C_RD_PNTR_WIDTH(4), + .C_UNDERFLOW_LOW(0), + .C_USE_DOUT_RST(1), + .C_USE_ECC(0), + .C_USE_EMBEDDED_REG(0), + .C_USE_FIFO16_FLAGS(0), + .C_USE_FWFT_DATA_COUNT(1), + .C_VALID_LOW(0), + .C_WR_ACK_LOW(0), + .C_WR_DATA_COUNT_WIDTH(5), + .C_WR_DEPTH(16), + .C_WR_FREQ(1), + .C_WR_PNTR_WIDTH(4), + .C_WR_RESPONSE_LATENCY(1)) + inst ( + .DIN(din), + .RD_CLK(rd_clk), + .RD_EN(rd_en), + .RST(rst), + .WR_CLK(wr_clk), + .WR_EN(wr_en), + .DOUT(dout), + .EMPTY(empty), + .FULL(full), + .RD_DATA_COUNT(rd_data_count), + .WR_DATA_COUNT(wr_data_count), + .CLK(), + .INT_CLK(), + .BACKUP(), + .BACKUP_MARKER(), + .PROG_EMPTY_THRESH(), + .PROG_EMPTY_THRESH_ASSERT(), + .PROG_EMPTY_THRESH_NEGATE(), + .PROG_FULL_THRESH(), + .PROG_FULL_THRESH_ASSERT(), + .PROG_FULL_THRESH_NEGATE(), + .RD_RST(), + .SRST(), + .WR_RST(), + .ALMOST_EMPTY(), + .ALMOST_FULL(), + .DATA_COUNT(), + .OVERFLOW(), + .PROG_EMPTY(), + .PROG_FULL(), + .VALID(), + .UNDERFLOW(), + .WR_ACK(), + .SBITERR(), + .DBITERR()); + + +// synthesis translate_on + +endmodule + diff --git a/coregen/fifo_xlnx_16x19_2clk.veo b/coregen/fifo_xlnx_16x19_2clk.veo new file mode 100644 index 000000000..2e9af1efa --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk.veo @@ -0,0 +1,53 @@ +/******************************************************************************* +* This file is owned and controlled by Xilinx and must be used * +* solely for design, simulation, implementation and creation of * +* design files limited to Xilinx devices or technologies. Use * +* with non-Xilinx devices or technologies is expressly prohibited * +* and immediately terminates your license. * +* * +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" * +* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR * +* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION * +* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION * +* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS * +* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, * +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE * +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY * +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE * +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR * +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF * +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * +* FOR A PARTICULAR PURPOSE. * +* * +* Xilinx products are not intended for use in life support * +* appliances, devices, or systems. Use in such applications are * +* expressly prohibited. * +* * +* (c) Copyright 1995-2007 Xilinx, Inc. * +* All rights reserved. * +*******************************************************************************/ +// The following must be inserted into your Verilog file for this +// core to be instantiated. Change the instance name and port connections +// (in parentheses) to your own signal names. + +//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG +fifo_xlnx_16x19_2clk YourInstanceName ( + .din(din), // Bus [18 : 0] + .rd_clk(rd_clk), + .rd_en(rd_en), + .rst(rst), + .wr_clk(wr_clk), + .wr_en(wr_en), + .dout(dout), // Bus [18 : 0] + .empty(empty), + .full(full), + .rd_data_count(rd_data_count), // Bus [4 : 0] + .wr_data_count(wr_data_count)); // Bus [4 : 0] + +// INST_TAG_END ------ End INSTANTIATION Template --------- + +// You must compile the wrapper file fifo_xlnx_16x19_2clk.v when simulating +// the core, fifo_xlnx_16x19_2clk. When compiling the wrapper file, be sure to +// reference the XilinxCoreLib Verilog simulation library. For detailed +// instructions, please refer to the "CORE Generator Help". + diff --git a/coregen/fifo_xlnx_16x19_2clk.xco b/coregen/fifo_xlnx_16x19_2clk.xco new file mode 100644 index 000000000..d0f638026 --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk.xco @@ -0,0 +1,82 @@ +############################################################## +# +# Xilinx Core Generator version K.39 +# Date: Fri Sep 11 04:33:27 2009 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# BEGIN Project Options +SET addpads = False +SET asysymbol = False +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = False +SET designentry = Verilog +SET device = xc3s2000 +SET devicefamily = spartan3 +SET flowvendor = Other +SET formalverification = False +SET foundationsym = False +SET implementationfiletype = Ngc +SET package = fg456 +SET removerpms = False +SET simulationfiles = Behavioral +SET speedgrade = -5 +SET verilogsim = True +SET vhdlsim = False +# END Project Options +# BEGIN Select +SELECT Fifo_Generator family Xilinx,_Inc. 4.3 +# END Select +# BEGIN Parameters +CSET almost_empty_flag=false +CSET almost_full_flag=false +CSET component_name=fifo_xlnx_16x19_2clk +CSET data_count=false +CSET data_count_width=5 +CSET disable_timing_violations=false +CSET dout_reset_value=0 +CSET empty_threshold_assert_value=4 +CSET empty_threshold_negate_value=5 +CSET enable_ecc=false +CSET enable_int_clk=false +CSET fifo_implementation=Independent_Clocks_Distributed_RAM +CSET full_flags_reset_value=1 +CSET full_threshold_assert_value=15 +CSET full_threshold_negate_value=14 +CSET input_data_width=19 +CSET input_depth=16 +CSET output_data_width=19 +CSET output_depth=16 +CSET overflow_flag=false +CSET overflow_sense=Active_High +CSET performance_options=First_Word_Fall_Through +CSET programmable_empty_type=No_Programmable_Empty_Threshold +CSET programmable_full_type=No_Programmable_Full_Threshold +CSET read_clock_frequency=1 +CSET read_data_count=true +CSET read_data_count_width=5 +CSET reset_pin=true +CSET reset_type=Asynchronous_Reset +CSET underflow_flag=false +CSET underflow_sense=Active_High +CSET use_dout_reset=true +CSET use_embedded_registers=false +CSET use_extra_logic=true +CSET valid_flag=false +CSET valid_sense=Active_High +CSET write_acknowledge_flag=false +CSET write_acknowledge_sense=Active_High +CSET write_clock_frequency=1 +CSET write_data_count=true +CSET write_data_count_width=5 +# END Parameters +GENERATE +# CRC: 60b85dda + diff --git a/coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.lso b/coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.lso new file mode 100644 index 000000000..f1a6f7899 --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.lso @@ -0,0 +1,3 @@ +blkmemdp_v6_2 +blk_mem_gen_v2_6 +fifo_generator_v4_3 diff --git a/coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt b/coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt new file mode 100644 index 000000000..ef33fff67 --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt @@ -0,0 +1,103 @@ + + + + + + +
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + +
+
+ + + +
+
+
+
+
+
+
+
+ + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + +
+
+
+
+
+ + + +
+ + + diff --git a/coregen/fifo_xlnx_16x19_2clk_flist.txt b/coregen/fifo_xlnx_16x19_2clk_flist.txt new file mode 100644 index 000000000..5e1a6ed35 --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk_flist.txt @@ -0,0 +1,8 @@ +# Output products list for +fifo_xlnx_16x19_2clk.ngc +fifo_xlnx_16x19_2clk.v +fifo_xlnx_16x19_2clk.veo +fifo_xlnx_16x19_2clk.xco +fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt +fifo_xlnx_16x19_2clk_flist.txt +fifo_xlnx_16x19_2clk_xmdf.tcl diff --git a/coregen/fifo_xlnx_16x19_2clk_readme.txt b/coregen/fifo_xlnx_16x19_2clk_readme.txt new file mode 100644 index 000000000..1b5976555 --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk_readme.txt @@ -0,0 +1,39 @@ +The following files were generated for 'fifo_xlnx_16x19_2clk' in directory +/home/matt/gnuradio.git/usrp2/fpga/coregen/: + +fifo_xlnx_16x19_2clk.ngc: + Binary Xilinx implementation netlist file containing the information + required to implement the module in a Xilinx (R) FPGA. + +fifo_xlnx_16x19_2clk.v: + Verilog wrapper file provided to support functional simulation. + This file contains simulation model customization data that is + passed to a parameterized simulation model for the core. + +fifo_xlnx_16x19_2clk.veo: + VEO template file containing code that can be used as a model for + instantiating a CORE Generator module in a Verilog design. + +fifo_xlnx_16x19_2clk.xco: + CORE Generator input file containing the parameters used to + regenerate a core. + +fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt: + Please see the core data sheet. + +fifo_xlnx_16x19_2clk_flist.txt: + Text file listing all of the output files produced when a customized + core was generated in the CORE Generator. + +fifo_xlnx_16x19_2clk_readme.txt: + Text file indicating the files generated and how they are used. + +fifo_xlnx_16x19_2clk_xmdf.tcl: + ISE Project Navigator interface file. ISE uses this file to determine + how the files output by CORE Generator for the core can be integrated + into your ISE project. + + +Please see the Xilinx CORE Generator online help for further details on +generated files and how to use them. + diff --git a/coregen/fifo_xlnx_16x19_2clk_xmdf.tcl b/coregen/fifo_xlnx_16x19_2clk_xmdf.tcl new file mode 100644 index 000000000..8d633e9c2 --- /dev/null +++ b/coregen/fifo_xlnx_16x19_2clk_xmdf.tcl @@ -0,0 +1,68 @@ +# The package naming convention is _xmdf +package provide fifo_xlnx_16x19_2clk_xmdf 1.0 + +# This includes some utilities that support common XMDF operations +package require utilities_xmdf + +# Define a namespace for this package. The name of the name space +# is _xmdf +namespace eval ::fifo_xlnx_16x19_2clk_xmdf { +# Use this to define any statics +} + +# Function called by client to rebuild the params and port arrays +# Optional when the use context does not require the param or ports +# arrays to be available. +proc ::fifo_xlnx_16x19_2clk_xmdf::xmdfInit { instance } { +# Variable containg name of library into which module is compiled +# Recommendation: +# Required +utilities_xmdf::xmdfSetData $instance Module Attributes Name fifo_xlnx_16x19_2clk +} +# ::fifo_xlnx_16x19_2clk_xmdf::xmdfInit + +# Function called by client to fill in all the xmdf* data variables +# based on the current settings of the parameters +proc ::fifo_xlnx_16x19_2clk_xmdf::xmdfApplyParams { instance } { + +set fcount 0 +# Array containing libraries that are assumed to exist +# Examples include unisim and xilinxcorelib +# Optional +# In this example, we assume that the unisim library will +# be magically +# available to the simulation and synthesis tool +utilities_xmdf::xmdfSetData $instance FileSet $fcount type logical_library +utilities_xmdf::xmdfSetData $instance FileSet $fcount logical_library unisim +incr fcount + +utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_16x19_2clk.ngc +utilities_xmdf::xmdfSetData $instance FileSet $fcount type ngc +incr fcount + +utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_16x19_2clk.v +utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog +incr fcount + +utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_16x19_2clk.veo +utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog_template +incr fcount + +utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_16x19_2clk.xco +utilities_xmdf::xmdfSetData $instance FileSet $fcount type coregen_ip +incr fcount + +utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_16x19_2clk_fifo_generator_v4_3_xst_1.ngc_xst.xrpt +utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView +incr fcount + +utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_16x19_2clk_xmdf.tcl +utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView +incr fcount + +utilities_xmdf::xmdfSetData $instance FileSet $fcount associated_module fifo_xlnx_16x19_2clk +incr fcount + +} + +# ::gen_comp_name_xmdf::xmdfApplyParams -- cgit v1.2.3 From 037332cb6b8618d79e6eb6b20e2a19160e5ace62 Mon Sep 17 00:00:00 2001 From: Matt Ettus Date: Wed, 30 Sep 2009 17:35:14 -0700 Subject: Copied wb_1master back from quad radio more sane config options, should be exactly the same memory map --- control_lib/wb_1master.v | 318 ++++++++++++++++++++++++++--------------------- top/u2_core/u2_core.v | 143 +++++++++------------ 2 files changed, 238 insertions(+), 223 deletions(-) (limited to 'control_lib') diff --git a/control_lib/wb_1master.v b/control_lib/wb_1master.v index e56ba1fb2..fb313efae 100644 --- a/control_lib/wb_1master.v +++ b/control_lib/wb_1master.v @@ -38,26 +38,40 @@ // Up to 8 slaves share a Wishbone Bus connection to 1 master module wb_1master - #(parameter s0_addr_w = 4, // slave 0 address decode width - parameter s0_addr = 4'h0, // slave 0 address - parameter s1_addr_w = 4 , // slave 1 address decode width - parameter s1_addr = 4'h1, // slave 1 address - parameter s215_addr_w = 8 , // slave 2 to slave 7 address decode width - parameter s2_addr = 8'h92, // slave 2 address - parameter s3_addr = 8'h93, // slave 3 address - parameter s4_addr = 8'h94, // slave 4 address - parameter s5_addr = 8'h95, // slave 5 address - parameter s6_addr = 8'h96, // slave 6 address - parameter s7_addr = 8'h97, // slave 7 address - parameter s8_addr = 8'h98, // slave 7 address - parameter s9_addr = 8'h99, // slave 7 address - parameter s10_addr = 8'h9a, // slave 7 address - parameter s11_addr = 8'h9b, // slave 7 address - parameter s12_addr = 8'h9c, // slave 7 address - parameter s13_addr = 8'h9d, // slave 7 address - parameter s14_addr = 8'h9e, // slave 7 address - parameter s15_addr = 8'h9f, // slave 7 address - + #(parameter decode_w = 8, // address decode width + parameter s0_addr = 8'h0, // slave 0 address + parameter s0_mask = 8'h0, // slave 0 don't cares + parameter s1_addr = 8'h0, // slave 1 address + parameter s1_mask = 8'h0, // slave 1 don't cares + parameter s2_addr = 8'h0, // slave 2 address + parameter s2_mask = 8'h0, // slave 2 don't cares + parameter s3_addr = 8'h0, // slave 3 address + parameter s3_mask = 8'h0, // slave 3 don't cares + parameter s4_addr = 8'h0, // slave 4 address + parameter s4_mask = 8'h0, // slave 4 don't cares + parameter s5_addr = 8'h0, // slave 5 address + parameter s5_mask = 8'h0, // slave 5 don't cares + parameter s6_addr = 8'h0, // slave 6 address + parameter s6_mask = 8'h0, // slave 6 don't cares + parameter s7_addr = 8'h0, // slave 7 address + parameter s7_mask = 8'h0, // slave 7 don't cares + parameter s8_addr = 8'h0, // slave 8 address + parameter s8_mask = 8'h0, // slave 8 don't cares + parameter s9_addr = 8'h0, // slave 9 address + parameter s9_mask = 8'h0, // slave 9 don't cares + parameter sa_addr = 8'h0, // slave a address + parameter sa_mask = 8'h0, // slave a don't cares + parameter sb_addr = 8'h0, // slave b address + parameter sb_mask = 8'h0, // slave b don't cares + parameter sc_addr = 8'h0, // slave c address + parameter sc_mask = 8'h0, // slave c don't cares + parameter sd_addr = 8'h0, // slave d address + parameter sd_mask = 8'h0, // slave d don't cares + parameter se_addr = 8'h0, // slave e address + parameter se_mask = 8'h0, // slave e don't cares + parameter sf_addr = 8'h0, // slave f address + parameter sf_mask = 8'h0, // slave f don't cares + parameter dw = 32, // Data bus Width parameter aw = 32, // Address bus Width parameter sw = 4) // Number of Select Lines @@ -188,71 +202,71 @@ input s9_err_i, input s9_rty_i, - input [dw-1:0] s10_dat_i, - output [dw-1:0] s10_dat_o, - output [aw-1:0] s10_adr_o, - output [sw-1:0] s10_sel_o, - output s10_we_o, - output s10_cyc_o, - output s10_stb_o, - input s10_ack_i, - input s10_err_i, - input s10_rty_i, + input [dw-1:0] sa_dat_i, + output [dw-1:0] sa_dat_o, + output [aw-1:0] sa_adr_o, + output [sw-1:0] sa_sel_o, + output sa_we_o, + output sa_cyc_o, + output sa_stb_o, + input sa_ack_i, + input sa_err_i, + input sa_rty_i, - input [dw-1:0] s11_dat_i, - output [dw-1:0] s11_dat_o, - output [aw-1:0] s11_adr_o, - output [sw-1:0] s11_sel_o, - output s11_we_o, - output s11_cyc_o, - output s11_stb_o, - input s11_ack_i, - input s11_err_i, - input s11_rty_i, + input [dw-1:0] sb_dat_i, + output [dw-1:0] sb_dat_o, + output [aw-1:0] sb_adr_o, + output [sw-1:0] sb_sel_o, + output sb_we_o, + output sb_cyc_o, + output sb_stb_o, + input sb_ack_i, + input sb_err_i, + input sb_rty_i, - input [dw-1:0] s12_dat_i, - output [dw-1:0] s12_dat_o, - output [aw-1:0] s12_adr_o, - output [sw-1:0] s12_sel_o, - output s12_we_o, - output s12_cyc_o, - output s12_stb_o, - input s12_ack_i, - input s12_err_i, - input s12_rty_i, + input [dw-1:0] sc_dat_i, + output [dw-1:0] sc_dat_o, + output [aw-1:0] sc_adr_o, + output [sw-1:0] sc_sel_o, + output sc_we_o, + output sc_cyc_o, + output sc_stb_o, + input sc_ack_i, + input sc_err_i, + input sc_rty_i, - input [dw-1:0] s13_dat_i, - output [dw-1:0] s13_dat_o, - output [aw-1:0] s13_adr_o, - output [sw-1:0] s13_sel_o, - output s13_we_o, - output s13_cyc_o, - output s13_stb_o, - input s13_ack_i, - input s13_err_i, - input s13_rty_i, + input [dw-1:0] sd_dat_i, + output [dw-1:0] sd_dat_o, + output [aw-1:0] sd_adr_o, + output [sw-1:0] sd_sel_o, + output sd_we_o, + output sd_cyc_o, + output sd_stb_o, + input sd_ack_i, + input sd_err_i, + input sd_rty_i, - input [dw-1:0] s14_dat_i, - output [dw-1:0] s14_dat_o, - output [aw-1:0] s14_adr_o, - output [sw-1:0] s14_sel_o, - output s14_we_o, - output s14_cyc_o, - output s14_stb_o, - input s14_ack_i, - input s14_err_i, - input s14_rty_i, + input [dw-1:0] se_dat_i, + output [dw-1:0] se_dat_o, + output [aw-1:0] se_adr_o, + output [sw-1:0] se_sel_o, + output se_we_o, + output se_cyc_o, + output se_stb_o, + input se_ack_i, + input se_err_i, + input se_rty_i, - input [dw-1:0] s15_dat_i, - output [dw-1:0] s15_dat_o, - output [aw-1:0] s15_adr_o, - output [sw-1:0] s15_sel_o, - output s15_we_o, - output s15_cyc_o, - output s15_stb_o, - input s15_ack_i, - input s15_err_i, - input s15_rty_i + input [dw-1:0] sf_dat_i, + output [dw-1:0] sf_dat_o, + output [aw-1:0] sf_adr_o, + output [sw-1:0] sf_sel_o, + output sf_we_o, + output sf_cyc_o, + output sf_stb_o, + input sf_ack_i, + input sf_err_i, + input sf_rty_i ); // //////////////////////////////////////////////////////////////// @@ -278,22 +292,22 @@ 128 : i_dat_s <= s7_dat_i; 256 : i_dat_s <= s8_dat_i; 512 : i_dat_s <= s9_dat_i; - 1024 : i_dat_s <= s10_dat_i; - 2048 : i_dat_s <= s11_dat_i; - 4096 : i_dat_s <= s12_dat_i; - 8192 : i_dat_s <= s13_dat_i; - 16384 : i_dat_s <= s14_dat_i; - 32768 : i_dat_s <= s15_dat_i; + 1024 : i_dat_s <= sa_dat_i; + 2048 : i_dat_s <= sb_dat_i; + 4096 : i_dat_s <= sc_dat_i; + 8192 : i_dat_s <= sd_dat_i; + 16384 : i_dat_s <= se_dat_i; + 32768 : i_dat_s <= sf_dat_i; default : i_dat_s <= s0_dat_i; endcase // case(ssel_dec) assign {m0_ack_o, m0_err_o, m0_rty_o} = {s0_ack_i | s1_ack_i | s2_ack_i | s3_ack_i | s4_ack_i | s5_ack_i | s6_ack_i | s7_ack_i | - s8_ack_i | s9_ack_i | s10_ack_i | s11_ack_i | s12_ack_i | s13_ack_i | s14_ack_i | s15_ack_i , + s8_ack_i | s9_ack_i | sa_ack_i | sb_ack_i | sc_ack_i | sd_ack_i | se_ack_i | sf_ack_i , s0_err_i | s1_err_i | s2_err_i | s3_err_i | s4_err_i | s5_err_i | s6_err_i | s7_err_i | - s8_err_i | s9_err_i | s10_err_i | s11_err_i | s12_err_i | s13_err_i | s14_err_i | s15_err_i , + s8_err_i | s9_err_i | sa_err_i | sb_err_i | sc_err_i | sd_err_i | se_err_i | sf_err_i , s0_rty_i | s1_rty_i | s2_rty_i | s3_rty_i | s4_rty_i | s5_rty_i | s6_rty_i | s7_rty_i | - s8_rty_i | s9_rty_i | s10_rty_i | s11_rty_i | s12_rty_i | s13_rty_i | s14_rty_i | s15_rty_i }; + s8_rty_i | s9_rty_i | sa_rty_i | sb_rty_i | sc_rty_i | sd_rty_i | se_rty_i | sf_rty_i }; // Slave output interfaces assign s0_adr_o = m0_adr_i; @@ -366,65 +380,85 @@ assign s9_cyc_o = m0_cyc_i; assign s9_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[9]; - assign s10_adr_o = m0_adr_i; - assign s10_sel_o = m0_sel_i; - assign s10_dat_o = m0_dat_i; - assign s10_we_o = m0_we_i; - assign s10_cyc_o = m0_cyc_i; - assign s10_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[10]; + assign sa_adr_o = m0_adr_i; + assign sa_sel_o = m0_sel_i; + assign sa_dat_o = m0_dat_i; + assign sa_we_o = m0_we_i; + assign sa_cyc_o = m0_cyc_i; + assign sa_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[10]; - assign s11_adr_o = m0_adr_i; - assign s11_sel_o = m0_sel_i; - assign s11_dat_o = m0_dat_i; - assign s11_we_o = m0_we_i; - assign s11_cyc_o = m0_cyc_i; - assign s11_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[11]; + assign sb_adr_o = m0_adr_i; + assign sb_sel_o = m0_sel_i; + assign sb_dat_o = m0_dat_i; + assign sb_we_o = m0_we_i; + assign sb_cyc_o = m0_cyc_i; + assign sb_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[11]; - assign s12_adr_o = m0_adr_i; - assign s12_sel_o = m0_sel_i; - assign s12_dat_o = m0_dat_i; - assign s12_we_o = m0_we_i; - assign s12_cyc_o = m0_cyc_i; - assign s12_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[12]; + assign sc_adr_o = m0_adr_i; + assign sc_sel_o = m0_sel_i; + assign sc_dat_o = m0_dat_i; + assign sc_we_o = m0_we_i; + assign sc_cyc_o = m0_cyc_i; + assign sc_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[12]; - assign s13_adr_o = m0_adr_i; - assign s13_sel_o = m0_sel_i; - assign s13_dat_o = m0_dat_i; - assign s13_we_o = m0_we_i; - assign s13_cyc_o = m0_cyc_i; - assign s13_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[13]; + assign sd_adr_o = m0_adr_i; + assign sd_sel_o = m0_sel_i; + assign sd_dat_o = m0_dat_i; + assign sd_we_o = m0_we_i; + assign sd_cyc_o = m0_cyc_i; + assign sd_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[13]; - assign s14_adr_o = m0_adr_i; - assign s14_sel_o = m0_sel_i; - assign s14_dat_o = m0_dat_i; - assign s14_we_o = m0_we_i; - assign s14_cyc_o = m0_cyc_i; - assign s14_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[14]; + assign se_adr_o = m0_adr_i; + assign se_sel_o = m0_sel_i; + assign se_dat_o = m0_dat_i; + assign se_we_o = m0_we_i; + assign se_cyc_o = m0_cyc_i; + assign se_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[14]; - assign s15_adr_o = m0_adr_i; - assign s15_sel_o = m0_sel_i; - assign s15_dat_o = m0_dat_i; - assign s15_we_o = m0_we_i; - assign s15_cyc_o = m0_cyc_i; - assign s15_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[15]; + assign sf_adr_o = m0_adr_i; + assign sf_sel_o = m0_sel_i; + assign sf_dat_o = m0_dat_i; + assign sf_we_o = m0_we_i; + assign sf_cyc_o = m0_cyc_i; + assign sf_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[15]; // Address decode logic // WARNING -- must make sure these are mutually exclusive! - assign ssel_dec[0] = (m0_adr_i[aw -1 : aw - s0_addr_w ] == s0_addr); - assign ssel_dec[1] = (m0_adr_i[aw -1 : aw - s1_addr_w ] == s1_addr); - assign ssel_dec[2] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s2_addr); - assign ssel_dec[3] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s3_addr); - assign ssel_dec[4] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s4_addr); - assign ssel_dec[5] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s5_addr); - assign ssel_dec[6] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s6_addr); - assign ssel_dec[7] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s7_addr); - assign ssel_dec[8] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s8_addr); - assign ssel_dec[9] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s9_addr); - assign ssel_dec[10] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s10_addr); - assign ssel_dec[11] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s11_addr); - assign ssel_dec[12] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s12_addr); - assign ssel_dec[13] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s13_addr); - assign ssel_dec[14] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s14_addr); - assign ssel_dec[15] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s15_addr); - + + + assign ssel_dec[0] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s0_addr) & s0_mask); + assign ssel_dec[1] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s1_addr) & s1_mask); + assign ssel_dec[2] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s2_addr) & s2_mask); + assign ssel_dec[3] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s3_addr) & s3_mask); + assign ssel_dec[4] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s4_addr) & s4_mask); + assign ssel_dec[5] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s5_addr) & s5_mask); + assign ssel_dec[6] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s6_addr) & s6_mask); + assign ssel_dec[7] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s7_addr) & s7_mask); + assign ssel_dec[8] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s8_addr) & s8_mask); + assign ssel_dec[9] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s9_addr) & s9_mask); + assign ssel_dec[10] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sa_addr) & sa_mask); + assign ssel_dec[11] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sb_addr) & sb_mask); + assign ssel_dec[12] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sc_addr) & sc_mask); + assign ssel_dec[13] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sd_addr) & sd_mask); + assign ssel_dec[14] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ se_addr) & se_mask); + assign ssel_dec[15] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sf_addr) & sf_mask); + +/* + assign ssel_dec[0] = (m0_adr_i[aw -1 : aw - decode_w ] == s0_addr); + assign ssel_dec[1] = (m0_adr_i[aw -1 : aw - decode_w ] == s1_addr); + assign ssel_dec[2] = (m0_adr_i[aw -1 : aw - decode_w ] == s2_addr); + assign ssel_dec[3] = (m0_adr_i[aw -1 : aw - decode_w ] == s3_addr); + assign ssel_dec[4] = (m0_adr_i[aw -1 : aw - decode_w ] == s4_addr); + assign ssel_dec[5] = (m0_adr_i[aw -1 : aw - decode_w ] == s5_addr); + assign ssel_dec[6] = (m0_adr_i[aw -1 : aw - decode_w ] == s6_addr); + assign ssel_dec[7] = (m0_adr_i[aw -1 : aw - decode_w ] == s7_addr); + assign ssel_dec[8] = (m0_adr_i[aw -1 : aw - decode_w ] == s8_addr); + assign ssel_dec[9] = (m0_adr_i[aw -1 : aw - decode_w ] == s9_addr); + assign ssel_dec[10] = (m0_adr_i[aw -1 : aw - decode_w ] == sa_addr); + assign ssel_dec[11] = (m0_adr_i[aw -1 : aw - decode_w ] == sb_addr); + assign ssel_dec[12] = (m0_adr_i[aw -1 : aw - decode_w ] == sc_addr); + assign ssel_dec[13] = (m0_adr_i[aw -1 : aw - decode_w ] == sd_addr); + assign ssel_dec[14] = (m0_adr_i[aw -1 : aw - decode_w ] == se_addr); + assign ssel_dec[15] = (m0_adr_i[aw -1 : aw - decode_w ] == sf_addr); + */ endmodule // wb_1master diff --git a/top/u2_core/u2_core.v b/top/u2_core/u2_core.v index f12b5af4d..5718366d5 100755 --- a/top/u2_core/u2_core.v +++ b/top/u2_core/u2_core.v @@ -168,57 +168,68 @@ module u2_core wire [dw-1:0] m0_dat_o, m0_dat_i; wire [dw-1:0] s0_dat_o, s1_dat_o, s0_dat_i, s1_dat_i, s2_dat_o, s3_dat_o, s2_dat_i, s3_dat_i, s4_dat_o, s5_dat_o, s4_dat_i, s5_dat_i, s6_dat_o, s7_dat_o, s6_dat_i, s7_dat_i, - s8_dat_o, s9_dat_o, s8_dat_i, s9_dat_i, s10_dat_o, s10_dat_i, s11_dat_i, s11_dat_o, - s12_dat_i, s12_dat_o, s13_dat_i, s13_dat_o, s14_dat_i, s14_dat_o; - wire [aw-1:0] m0_adr,s0_adr,s1_adr,s2_adr,s3_adr,s4_adr,s5_adr,s6_adr,s7_adr,s8_adr,s9_adr,s10_adr,s11_adr,s12_adr, s13_adr, s14_adr; - wire [sw-1:0] m0_sel,s0_sel,s1_sel,s2_sel,s3_sel,s4_sel,s5_sel,s6_sel,s7_sel,s8_sel,s9_sel,s10_sel,s11_sel,s12_sel, s13_sel, s14_sel; - wire m0_ack,s0_ack,s1_ack,s2_ack,s3_ack,s4_ack,s5_ack,s6_ack,s7_ack,s8_ack,s9_ack,s10_ack,s11_ack,s12_ack, s13_ack, s14_ack; - wire m0_stb,s0_stb,s1_stb,s2_stb,s3_stb,s4_stb,s5_stb,s6_stb,s7_stb,s8_stb,s9_stb,s10_stb,s11_stb,s12_stb, s13_stb, s14_stb; - wire m0_cyc,s0_cyc,s1_cyc,s2_cyc,s3_cyc,s4_cyc,s5_cyc,s6_cyc,s7_cyc,s8_cyc,s9_cyc,s10_cyc,s11_cyc,s12_cyc, s13_cyc, s14_cyc; - wire m0_err,s0_err,s1_err,s2_err,s3_err,s4_err,s5_err,s6_err,s7_err,s8_err,s9_err,s10_err,s11_err,s12_err, s13_err, s14_err; - wire m0_rty,s0_rty,s1_rty,s2_rty,s3_rty,s4_rty,s5_rty,s6_rty,s7_rty,s8_rty,s9_rty,s10_rty,s11_rty,s12_rty, s13_rty, s14_rty; - wire m0_we,s0_we,s1_we,s2_we,s3_we,s4_we,s5_we,s6_we,s7_we,s8_we,s9_we,s10_we,s11_we,s12_we,s13_we, s14_we; - - wb_1master #(.s0_addr_w(1),.s0_addr(1'b0),.s1_addr_w(2),.s1_addr(2'b10), - .s215_addr_w(6),.s2_addr(6'b1100_00),.s3_addr(6'b1100_01),.s4_addr(6'b1100_10), - .s5_addr(6'b1100_11),.s6_addr(6'b1101_00),.s7_addr(6'b1101_01),.s8_addr(6'b1101_10), - .s9_addr(6'b1101_11),.s10_addr(6'b1110_00),.s11_addr(6'b1110_01),.s12_addr(6'b1110_10), - .s13_addr(6'b1110_11),.s14_addr(6'b1111_00),.s15_addr(6'b1111_01), + s8_dat_o, s9_dat_o, s8_dat_i, s9_dat_i, sa_dat_o, sa_dat_i, sb_dat_i, sb_dat_o, + sc_dat_i, sc_dat_o, sd_dat_i, sd_dat_o, se_dat_i, se_dat_o; + wire [aw-1:0] m0_adr,s0_adr,s1_adr,s2_adr,s3_adr,s4_adr,s5_adr,s6_adr,s7_adr,s8_adr,s9_adr,sa_adr,sb_adr,sc_adr, sd_adr, se_adr; + wire [sw-1:0] m0_sel,s0_sel,s1_sel,s2_sel,s3_sel,s4_sel,s5_sel,s6_sel,s7_sel,s8_sel,s9_sel,sa_sel,sb_sel,sc_sel, sd_sel, se_sel; + wire m0_ack,s0_ack,s1_ack,s2_ack,s3_ack,s4_ack,s5_ack,s6_ack,s7_ack,s8_ack,s9_ack,sa_ack,sb_ack,sc_ack, sd_ack, se_ack; + wire m0_stb,s0_stb,s1_stb,s2_stb,s3_stb,s4_stb,s5_stb,s6_stb,s7_stb,s8_stb,s9_stb,sa_stb,sb_stb,sc_stb, sd_stb, se_stb; + wire m0_cyc,s0_cyc,s1_cyc,s2_cyc,s3_cyc,s4_cyc,s5_cyc,s6_cyc,s7_cyc,s8_cyc,s9_cyc,sa_cyc,sb_cyc,sc_cyc, sd_cyc, se_cyc; + wire m0_err, m0_rty; + wire m0_we,s0_we,s1_we,s2_we,s3_we,s4_we,s5_we,s6_we,s7_we,s8_we,s9_we,sa_we,sb_we,sc_we,sd_we, se_we; + + wb_1master #(.decode_w(6), + .s0_addr(6'b0000_00),.s0_mask(6'b100000), + .s1_addr(6'b1000_00),.s1_mask(6'b110000), + .s2_addr(6'b1100_00),.s2_mask(6'b111111), + .s3_addr(6'b1100_01),.s3_mask(6'b111111), + .s4_addr(6'b1100_10),.s4_mask(6'b111111), + .s5_addr(6'b1100_11),.s5_mask(6'b111111), + .s6_addr(6'b1101_00),.s6_mask(6'b111111), + .s7_addr(6'b1101_01),.s7_mask(6'b111111), + .s8_addr(6'b1101_10),.s8_mask(6'b111111), + .s9_addr(6'b1101_11),.s9_mask(6'b111111), + .sa_addr(6'b1110_00),.sa_mask(6'b111111), + .sb_addr(6'b1110_01),.sb_mask(6'b111111), + .sc_addr(6'b1110_10),.sc_mask(6'b111111), + .sd_addr(6'b1110_11),.sd_mask(6'b111111), + .se_addr(6'b1111_00),.se_mask(6'b111111), + .sf_addr(6'b1111_01),.sf_mask(6'b111111), .dw(dw),.aw(aw),.sw(sw)) wb_1master (.clk_i(wb_clk),.rst_i(wb_rst), .m0_dat_o(m0_dat_o),.m0_ack_o(m0_ack),.m0_err_o(m0_err),.m0_rty_o(m0_rty),.m0_dat_i(m0_dat_i), .m0_adr_i(m0_adr),.m0_sel_i(m0_sel),.m0_we_i(m0_we),.m0_cyc_i(m0_cyc),.m0_stb_i(m0_stb), .s0_dat_o(s0_dat_o),.s0_adr_o(s0_adr),.s0_sel_o(s0_sel),.s0_we_o (s0_we),.s0_cyc_o(s0_cyc),.s0_stb_o(s0_stb), - .s0_dat_i(s0_dat_i),.s0_ack_i(s0_ack),.s0_err_i(s0_err),.s0_rty_i(s0_rty), + .s0_dat_i(s0_dat_i),.s0_ack_i(s0_ack),.s0_err_i(0),.s0_rty_i(0), .s1_dat_o(s1_dat_o),.s1_adr_o(s1_adr),.s1_sel_o(s1_sel),.s1_we_o (s1_we),.s1_cyc_o(s1_cyc),.s1_stb_o(s1_stb), - .s1_dat_i(s1_dat_i),.s1_ack_i(s1_ack),.s1_err_i(s1_err),.s1_rty_i(s1_rty), + .s1_dat_i(s1_dat_i),.s1_ack_i(s1_ack),.s1_err_i(0),.s1_rty_i(0), .s2_dat_o(s2_dat_o),.s2_adr_o(s2_adr),.s2_sel_o(s2_sel),.s2_we_o (s2_we),.s2_cyc_o(s2_cyc),.s2_stb_o(s2_stb), - .s2_dat_i(s2_dat_i),.s2_ack_i(s2_ack),.s2_err_i(s2_err),.s2_rty_i(s2_rty), + .s2_dat_i(s2_dat_i),.s2_ack_i(s2_ack),.s2_err_i(0),.s2_rty_i(0), .s3_dat_o(s3_dat_o),.s3_adr_o(s3_adr),.s3_sel_o(s3_sel),.s3_we_o (s3_we),.s3_cyc_o(s3_cyc),.s3_stb_o(s3_stb), - .s3_dat_i(s3_dat_i),.s3_ack_i(s3_ack),.s3_err_i(s3_err),.s3_rty_i(s3_rty), + .s3_dat_i(s3_dat_i),.s3_ack_i(s3_ack),.s3_err_i(0),.s3_rty_i(0), .s4_dat_o(s4_dat_o),.s4_adr_o(s4_adr),.s4_sel_o(s4_sel),.s4_we_o (s4_we),.s4_cyc_o(s4_cyc),.s4_stb_o(s4_stb), - .s4_dat_i(s4_dat_i),.s4_ack_i(s4_ack),.s4_err_i(s4_err),.s4_rty_i(s4_rty), + .s4_dat_i(s4_dat_i),.s4_ack_i(s4_ack),.s4_err_i(0),.s4_rty_i(0), .s5_dat_o(s5_dat_o),.s5_adr_o(s5_adr),.s5_sel_o(s5_sel),.s5_we_o (s5_we),.s5_cyc_o(s5_cyc),.s5_stb_o(s5_stb), - .s5_dat_i(s5_dat_i),.s5_ack_i(s5_ack),.s5_err_i(s5_err),.s5_rty_i(s5_rty), + .s5_dat_i(s5_dat_i),.s5_ack_i(s5_ack),.s5_err_i(0),.s5_rty_i(0), .s6_dat_o(s6_dat_o),.s6_adr_o(s6_adr),.s6_sel_o(s6_sel),.s6_we_o (s6_we),.s6_cyc_o(s6_cyc),.s6_stb_o(s6_stb), - .s6_dat_i(s6_dat_i),.s6_ack_i(s6_ack),.s6_err_i(s6_err),.s6_rty_i(s6_rty), + .s6_dat_i(s6_dat_i),.s6_ack_i(s6_ack),.s6_err_i(0),.s6_rty_i(0), .s7_dat_o(s7_dat_o),.s7_adr_o(s7_adr),.s7_sel_o(s7_sel),.s7_we_o (s7_we),.s7_cyc_o(s7_cyc),.s7_stb_o(s7_stb), - .s7_dat_i(s7_dat_i),.s7_ack_i(s7_ack),.s7_err_i(s7_err),.s7_rty_i(s7_rty), + .s7_dat_i(s7_dat_i),.s7_ack_i(s7_ack),.s7_err_i(0),.s7_rty_i(0), .s8_dat_o(s8_dat_o),.s8_adr_o(s8_adr),.s8_sel_o(s8_sel),.s8_we_o (s8_we),.s8_cyc_o(s8_cyc),.s8_stb_o(s8_stb), - .s8_dat_i(s8_dat_i),.s8_ack_i(s8_ack),.s8_err_i(s8_err),.s8_rty_i(s8_rty), + .s8_dat_i(s8_dat_i),.s8_ack_i(s8_ack),.s8_err_i(0),.s8_rty_i(0), .s9_dat_o(s9_dat_o),.s9_adr_o(s9_adr),.s9_sel_o(s9_sel),.s9_we_o (s9_we),.s9_cyc_o(s9_cyc),.s9_stb_o(s9_stb), - .s9_dat_i(s9_dat_i),.s9_ack_i(s9_ack),.s9_err_i(s9_err),.s9_rty_i(s9_rty), - .s10_dat_o(s10_dat_o),.s10_adr_o(s10_adr),.s10_sel_o(s10_sel),.s10_we_o(s10_we),.s10_cyc_o(s10_cyc),.s10_stb_o(s10_stb), - .s10_dat_i(s10_dat_i),.s10_ack_i(s10_ack),.s10_err_i(s10_err),.s10_rty_i(s10_rty), - .s11_dat_o(s11_dat_o),.s11_adr_o(s11_adr),.s11_sel_o(s11_sel),.s11_we_o(s11_we),.s11_cyc_o(s11_cyc),.s11_stb_o(s11_stb), - .s11_dat_i(s11_dat_i),.s11_ack_i(s11_ack),.s11_err_i(s11_err),.s11_rty_i(s11_rty), - .s12_dat_o(s12_dat_o),.s12_adr_o(s12_adr),.s12_sel_o(s12_sel),.s12_we_o(s12_we),.s12_cyc_o(s12_cyc),.s12_stb_o(s12_stb), - .s12_dat_i(s12_dat_i),.s12_ack_i(s12_ack),.s12_err_i(s12_err),.s12_rty_i(s12_rty), - .s13_dat_o(s13_dat_o),.s13_adr_o(s13_adr),.s13_sel_o(s13_sel),.s13_we_o(s13_we),.s13_cyc_o(s13_cyc),.s13_stb_o(s13_stb), - .s13_dat_i(s13_dat_i),.s13_ack_i(s13_ack),.s13_err_i(s13_err),.s13_rty_i(s13_rty), - .s14_dat_o(s14_dat_o),.s14_adr_o(s14_adr),.s14_sel_o(s14_sel),.s14_we_o(s14_we),.s14_cyc_o(s14_cyc),.s14_stb_o(s14_stb), - .s14_dat_i(s14_dat_i),.s14_ack_i(s14_ack),.s14_err_i(s14_err),.s14_rty_i(s14_rty), - .s15_dat_i(0),.s15_ack_i(0),.s15_err_i(0),.s15_rty_i(0) ); + .s9_dat_i(s9_dat_i),.s9_ack_i(s9_ack),.s9_err_i(0),.s9_rty_i(0), + .sa_dat_o(sa_dat_o),.sa_adr_o(sa_adr),.sa_sel_o(sa_sel),.sa_we_o(sa_we),.sa_cyc_o(sa_cyc),.sa_stb_o(sa_stb), + .sa_dat_i(sa_dat_i),.sa_ack_i(sa_ack),.sa_err_i(0),.sa_rty_i(0), + .sb_dat_o(sb_dat_o),.sb_adr_o(sb_adr),.sb_sel_o(sb_sel),.sb_we_o(sb_we),.sb_cyc_o(sb_cyc),.sb_stb_o(sb_stb), + .sb_dat_i(sb_dat_i),.sb_ack_i(sb_ack),.sb_err_i(0),.sb_rty_i(0), + .sc_dat_o(sc_dat_o),.sc_adr_o(sc_adr),.sc_sel_o(sc_sel),.sc_we_o(sc_we),.sc_cyc_o(sc_cyc),.sc_stb_o(sc_stb), + .sc_dat_i(sc_dat_i),.sc_ack_i(sc_ack),.sc_err_i(0),.sc_rty_i(0), + .sd_dat_o(sd_dat_o),.sd_adr_o(sd_adr),.sd_sel_o(sd_sel),.sd_we_o(sd_we),.sd_cyc_o(sd_cyc),.sd_stb_o(sd_stb), + .sd_dat_i(sd_dat_i),.sd_ack_i(sd_ack),.sd_err_i(0),.sd_rty_i(0), + .se_dat_o(se_dat_o),.se_adr_o(se_adr),.se_sel_o(se_sel),.se_we_o(se_we),.se_cyc_o(se_cyc),.se_stb_o(se_stb), + .se_dat_i(se_dat_i),.se_ack_i(se_ack),.se_err_i(0),.se_rty_i(0), + .sf_dat_i(0),.sf_ack_i(0),.sf_err_i(0),.sf_rty_i(0) ); ////////////////////////////////////////////////////////////////////////////////////////// // Reset Controller @@ -300,9 +311,6 @@ module u2_core .dwb_we_i(s0_we), .dwb_ack_o(s0_ack), .dwb_stb_i(s0_stb), .dwb_sel_i(s0_sel), .flush_icache(flush_icache)); - assign s0_err = 1'b0; - assign s0_rty = 1'b0; - setting_reg #(.my_addr(7)) sr_icache (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr), .in(set_data),.out(),.changed(flush_icache)); @@ -322,7 +330,7 @@ module u2_core buffer_pool buffer_pool (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst), .wb_we_i(s1_we),.wb_stb_i(s1_stb),.wb_adr_i(s1_adr),.wb_dat_i(s1_dat_o), - .wb_dat_o(s1_dat_i),.wb_ack_o(s1_ack),.wb_err_o(s1_err),.wb_rty_o(s1_rty), + .wb_dat_o(s1_dat_i),.wb_ack_o(s1_ack),.wb_err_o(),.wb_rty_o(), .stream_clk(dsp_clk), .stream_rst(dsp_rst), .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), @@ -355,12 +363,10 @@ module u2_core spi_top shared_spi (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(s2_adr[4:0]),.wb_dat_i(s2_dat_o), .wb_dat_o(s2_dat_i),.wb_sel_i(s2_sel),.wb_we_i(s2_we),.wb_stb_i(s2_stb), - .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(s2_err),.wb_int_o(spi_int), + .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(),.wb_int_o(spi_int), .ss_pad_o({sen_tx_db,sen_tx_adc,sen_tx_dac,sen_rx_db,sen_rx_adc,sen_rx_dac,sen_dac,sen_clk}), .sclk_pad_o(sclk),.mosi_pad_o(mosi),.miso_pad_i(miso) ); - assign s2_rty = 1'b0; - // I2C -- Slave #3 i2c_master_top #(.ARST_LVL(1)) i2c (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.arst_i(1'b0), @@ -371,8 +377,6 @@ module u2_core .sda_pad_i(sda_pad_i),.sda_pad_o(sda_pad_o),.sda_padoen_o(sda_pad_oen_o) ); assign s3_dat_i[31:8] = 24'd0; - assign s3_err = 1'b0; - assign s3_rty = 1'b0; // GPIOs -- Slave #4 nsgpio nsgpio(.clk_i(wb_clk),.rst_i(wb_rst), @@ -380,8 +384,6 @@ module u2_core .dat_i(s4_dat_o),.dat_o(s4_dat_i),.ack_o(s4_ack), .atr(atr_lines),.debug_0(debug_gpio_0),.debug_1(debug_gpio_1), .gpio( {io_tx,io_rx} ) ); - assign s4_err = 1'b0; - assign s4_rty = 1'b0; // Buffer Pool Status -- Slave #5 wb_readback_mux buff_pool_status @@ -398,9 +400,6 @@ module u2_core .word11(32'b0),.word12(32'b0),.word13(32'b0),.word14(32'b0),.word15(32'b0) ); - assign s5_err = 1'b0; - assign s5_rty = 1'b0; - // Slave, #6 Ethernet MAC, see below // Settings Bus -- Slave #7 @@ -409,8 +408,6 @@ module u2_core .wb_stb_i(s7_stb),.wb_we_i(s7_we),.wb_ack_o(s7_ack), .sys_clk(dsp_clk),.strobe(set_stb),.addr(set_addr),.data(set_data)); - assign s7_err = 1'b0; - assign s7_rty = 1'b0; assign s7_dat_i = 32'd0; // Output control lines @@ -476,9 +473,6 @@ module u2_core .tx_fifo_occupied(),.tx_fifo_full(),.tx_fifo_empty(), .debug0(debug_mac0),.debug1(debug_mac1) ); - assign s6_err = 1'b0; - assign s6_rty = 1'b0; - mac_rxfifo_int mac_rxfifo_int (.clk(dsp_clk),.rst(dsp_rst), .Rx_mac_empty(Rx_mac_empty),.Rx_mac_rd(Rx_mac_rd),.Rx_mac_data(Rx_mac_data), @@ -506,8 +500,6 @@ module u2_core (.clk_i(wb_clk),.rst_i(wb_rst),.cyc_i(s8_cyc),.stb_i(s8_stb),.adr_i(s8_adr[3:2]), .we_i(s8_we),.dat_i(s8_dat_o),.dat_o(s8_dat_i),.ack_o(s8_ack),.int_o(proc_int), .irq(irq) ); - assign s8_err = 0; - assign s8_rty = 0; // ///////////////////////////////////////////////////////////////////////// // Master Timer, Slave #9 @@ -518,22 +510,17 @@ module u2_core .cyc_i(s9_cyc),.stb_i(s9_stb),.adr_i(s9_adr[4:2]), .we_i(s9_we),.dat_i(s9_dat_o),.dat_o(s9_dat_i),.ack_o(s9_ack), .sys_clk_i(dsp_clk),.master_time_i(master_time),.int_o(timer_int) ); - assign s9_err = 0; - assign s9_rty = 0; // ///////////////////////////////////////////////////////////////////////// // UART, Slave #10 simple_uart #(.TXDEPTH(3),.RXDEPTH(3)) uart // depth of 3 is 128 entries (.clk_i(wb_clk),.rst_i(wb_rst), - .we_i(s10_we),.stb_i(s10_stb),.cyc_i(s10_cyc),.ack_o(s10_ack), - .adr_i(s10_adr[4:2]),.dat_i(s10_dat_o),.dat_o(s10_dat_i), + .we_i(sa_we),.stb_i(sa_stb),.cyc_i(sa_cyc),.ack_o(sa_ack), + .adr_i(sa_adr[4:2]),.dat_i(sa_dat_o),.dat_o(sa_dat_i), .rx_int_o(uart_rx_int),.tx_int_o(uart_tx_int), .tx_o(uart_tx_o),.rx_i(uart_rx_i),.baud_o(uart_baud_o)); - assign s10_err = 0; - assign s10_rty = 0; - // ///////////////////////////////////////////////////////////////////////// // ATR Controller, Slave #11 @@ -544,11 +531,9 @@ module u2_core atr_controller atr_controller (.clk_i(wb_clk),.rst_i(wb_rst), - .adr_i(s11_adr[5:0]),.sel_i(s11_sel),.dat_i(s11_dat_o),.dat_o(s11_dat_i), - .we_i(s11_we),.stb_i(s11_stb),.cyc_i(s11_cyc),.ack_o(s11_ack), + .adr_i(sb_adr[5:0]),.sel_i(sb_sel),.dat_i(sb_dat_o),.dat_o(sb_dat_i), + .we_i(sb_we),.stb_i(sb_stb),.cyc_i(sb_cyc),.ack_o(sb_ack), .run_rx(run_rx_d1),.run_tx(run_tx),.ctrl_lines(atr_lines) ); - assign s11_err = 0; - assign s11_rty = 0; // ////////////////////////////////////////////////////////////////////////// // Time Sync, Slave #12 @@ -562,14 +547,12 @@ module u2_core wire pps_o; time_sync time_sync (.wb_clk_i(wb_clk),.rst_i(wb_rst), - .cyc_i(s12_cyc),.stb_i(s12_stb),.adr_i(s12_adr[4:2]), - .we_i(s12_we),.dat_i(s12_dat_o),.dat_o(s12_dat_i),.ack_o(s12_ack), + .cyc_i(sc_cyc),.stb_i(sc_stb),.adr_i(sc_adr[4:2]), + .we_i(sc_we),.dat_i(sc_dat_o),.dat_o(sc_dat_i),.ack_o(sc_ack), .sys_clk_i(dsp_clk),.master_time_o(master_time), .pps_posedge(pps_posedge),.pps_negedge(pps_negedge), .exp_pps_in(exp_pps_in),.exp_pps_out(exp_pps_out), .int_o(pps_int),.epoch_o(epoch),.pps_o(pps_o) ); - assign s12_err = 0; - assign s12_rty = 0; // ///////////////////////////////////////////////////////////////////////// // SD Card Reader / Writer, Slave #13 @@ -577,11 +560,10 @@ module u2_core sd_spi_wb sd_spi_wb (.clk(wb_clk),.rst(wb_rst), .sd_clk(sd_clk),.sd_csn(sd_csn),.sd_mosi(sd_mosi),.sd_miso(sd_miso), - .wb_cyc_i(s13_cyc),.wb_stb_i(s13_stb),.wb_we_i(s13_we), - .wb_adr_i(s13_adr[3:2]),.wb_dat_i(s13_dat_o),.wb_dat_o(s13_dat_i), - .wb_ack_o(s13_ack) ); - assign s13_err = 0; - assign s13_rty = 0; + .wb_cyc_i(sd_cyc),.wb_stb_i(sd_stb),.wb_we_i(sd_we), + .wb_adr_i(sd_adr[3:2]),.wb_dat_i(sd_dat_o),.wb_dat_o(sd_dat_i), + .wb_ack_o(sd_ack) ); + // ///////////////////////////////////////////////////////////////////////// // DSP wire [31:0] sample_rx, sample_tx; @@ -655,8 +637,8 @@ module u2_core wb_bridge_16_32 bridge (.wb_clk(wb_clk),.wb_rst(wb_rst), - .A_cyc_i(s14_cyc),.A_stb_i(s14_stb),.A_we_i(s14_we),.A_sel_i(s14_sel), - .A_adr_i(s14_adr),.A_dat_i(s14_dat_o),.A_dat_o(s14_dat_i),.A_ack_o(s14_ack), + .A_cyc_i(se_cyc),.A_stb_i(se_stb),.A_we_i(se_we),.A_sel_i(se_sel), + .A_adr_i(se_adr),.A_dat_i(se_dat_o),.A_dat_o(se_dat_i),.A_ack_o(se_ack), .B_cyc_o(bridge_cyc),.B_stb_o(bridge_stb),.B_we_o(bridge_we),.B_sel_o(bridge_sel), .B_adr_o(bridge_adr),.B_dat_o(bus2ram),.B_dat_i(ram2bus),.B_ack_i(bridge_ack)); @@ -668,7 +650,6 @@ module u2_core .sram_bw(),.sram_adv(RAM_LDn),.sram_ce(RAM_CENn),.sram_oe(RAM_OEn), .sram_mode(),.sram_zz() ); - assign s14_err = 0; assign s14_rty = 0; assign RAM_CE1n = 0; assign RAM_D[17:16] = 2'bzz; -- cgit v1.2.3