diff options
author | Martin Braun <martin.braun@ettus.com> | 2014-10-07 11:25:20 +0200 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2014-10-07 11:25:20 +0200 |
commit | fd3e84941de463fa1a7ebab0a69515b4bf2614cd (patch) | |
tree | 3fa721a13d41d2c0451d663a59a220a38fd5e614 /fpga/usrp2/fifo | |
parent | 3b66804e41891e358c790b453a7a59ec7462dba4 (diff) | |
download | uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.tar.gz uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.tar.bz2 uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.zip |
Removed copy of FPGA source files.
Diffstat (limited to 'fpga/usrp2/fifo')
45 files changed, 0 insertions, 5056 deletions
diff --git a/fpga/usrp2/fifo/.gitignore b/fpga/usrp2/fifo/.gitignore deleted file mode 100644 index 866f1faad..000000000 --- a/fpga/usrp2/fifo/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.vcd -*.lxt -a.out diff --git a/fpga/usrp2/fifo/Makefile.srcs b/fpga/usrp2/fifo/Makefile.srcs deleted file mode 100644 index 55ba0be2a..000000000 --- a/fpga/usrp2/fifo/Makefile.srcs +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright 2010-2012 Ettus Research LLC -# - -################################################## -# FIFO Sources -################################################## -FIFO_SRCS = $(abspath $(addprefix $(BASE_DIR)/../fifo/, \ -add_routing_header.v \ -buffer_int.v \ -buffer_int2.v \ -buffer_pool.v \ -crossbar36.v \ -dsp_framer36.v \ -fifo_2clock.v \ -fifo_2clock_cascade.v \ -ll8_shortfifo.v \ -fifo_short.v \ -fifo_long.v \ -fifo_cascade.v \ -fifo36_to_ll8.v \ -ll8_to_fifo36.v \ -fifo19_to_ll8.v \ -ll8_to_fifo19.v \ -fifo36_to_fifo19.v \ -fifo19_to_fifo36.v \ -fifo19_mux.v \ -fifo36_mux.v \ -fifo36_demux.v \ -packet_router.v \ -splitter36.v \ -valve36.v \ -fifo_pacer.v \ -packet_dispatcher36_x3.v \ -packet_dispatcher36_x4.v \ -packet_generator32.v \ -packet_generator.v \ -packet_verifier32.v \ -packet_verifier.v \ -fifo19_pad.v \ -packet_padder36.v \ -)) diff --git a/fpga/usrp2/fifo/add_routing_header.v b/fpga/usrp2/fifo/add_routing_header.v deleted file mode 100644 index ee6a635f5..000000000 --- a/fpga/usrp2/fifo/add_routing_header.v +++ /dev/null @@ -1,47 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - -module add_routing_header - #(parameter PORT_SEL = 0, - parameter PROT_ENG_FLAGS = 1) - (input clk, input reset, input clear, - input [35:0] data_i, input src_rdy_i, output dst_rdy_o, - output [35:0] data_o, output src_rdy_o, input dst_rdy_i); - - reg [1:0] line; - wire [1:0] port_sel_bits = PORT_SEL; - wire [15:0] len = data_i[15:0]; - - always @(posedge clk) - if(reset) - line <= PROT_ENG_FLAGS ? 0 : 1; - else - if(src_rdy_o & dst_rdy_i) - if(data_o[33]) - line <= PROT_ENG_FLAGS ? 0 : 1; - else - if(line != 3) - line <= line + 1; - - assign data_o = (line == 0) ? {4'b0001, 13'b0, port_sel_bits, 1'b1, len[13:0],2'b00} : - (line == 1) ? {3'b000, (PROT_ENG_FLAGS ? 1'b0: 1'b1), data_i[31:0]} : - data_i[35:0]; - - assign dst_rdy_o = dst_rdy_i & (line != 0); - assign src_rdy_o = src_rdy_i; - -endmodule // add_routing_header diff --git a/fpga/usrp2/fifo/buffer_int.v b/fpga/usrp2/fifo/buffer_int.v deleted file mode 100644 index c068226ec..000000000 --- a/fpga/usrp2/fifo/buffer_int.v +++ /dev/null @@ -1,184 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// 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 BUF_NUM = 0, - parameter BUF_SIZE = 9) - (// 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 [BUF_SIZE-1:0] addr_o, - output [31:0] dat_to_buf, - input [31:0] dat_from_buf, - - // Write FIFO Interface - input [31:0] wr_data_i, - input [3:0] wr_flags_i, - input wr_ready_i, - output wr_ready_o, - - // Read FIFO Interface - output [31:0] rd_data_o, - output [3:0] rd_flags_o, - output rd_ready_o, - input rd_ready_i - ); - - 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] == BUF_NUM)) - ctrl_reg <= ctrl_word; - - wire [BUF_SIZE-1:0] firstline = ctrl_reg[BUF_SIZE-1:0]; - wire [BUF_SIZE-1:0] lastline = ctrl_reg[2*BUF_SIZE-1:BUF_SIZE]; - - 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 ? - - 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; - reg rd_sop, rd_eop; - wire wr_sop, wr_eop, wr_error; - reg [1:0] rd_occ; - wire [1:0] wr_occ; - - always @(posedge clk) - if(rst) - begin - state <= IDLE; - rd_sop <= 0; - rd_eop <= 0; - rd_occ <= 0; - end - else - if(clear) - begin - state <= IDLE; - rd_sop <= 0; - rd_eop <= 0; - rd_occ <= 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; - end - - PRE_READ : - begin - state <= READING; - addr_o <= addr_o + 1; - rd_occ <= 2'b00; - rd_sop <= 1; - rd_eop <= 0; - end - - READING : - if(rd_ready_i) - begin - rd_sop <= 0; - addr_o <= addr_o + 1; - if(addr_o == lastline) - begin - rd_eop <= 1; - // FIXME assign occ here - rd_occ <= 0; - end - else - rd_eop <= 0; - if(rd_eop) - state <= DONE; - end - - WRITING : - begin - if(wr_ready_i) - begin - addr_o <= addr_o + 1; - if(wr_error) - begin - state <= ERROR; - // Save OCC flags here - end - else if((addr_o == lastline)||wr_eop) - state <= DONE; - end // if (wr_ready_i) - end // case: WRITING - - endcase // case(state) - - assign dat_to_buf = wr_data_i; - assign rd_data_o = dat_from_buf; - - assign rd_flags_o = { rd_occ[1:0], rd_eop, rd_sop }; - assign rd_ready_o = (state == READING); - - assign wr_sop = wr_flags_i[0]; - assign wr_eop = wr_flags_i[1]; - assign wr_occ = wr_flags_i[3:2]; - assign wr_error = wr_sop & wr_eop; - assign wr_ready_o = (state == WRITING); - - assign we_o = (state == WRITING); - //assign we_o = (state == WRITING) && wr_ready_i; // always write to avoid timing issue - - assign en_o = ~((state==READING)& ~rd_ready_i); // FIXME potential critical path - - assign done = (state == DONE); - assign error = (state == ERROR); - assign idle = (state == IDLE); - -endmodule // buffer_int diff --git a/fpga/usrp2/fifo/buffer_int2.v b/fpga/usrp2/fifo/buffer_int2.v deleted file mode 100644 index 7dd528dd5..000000000 --- a/fpga/usrp2/fifo/buffer_int2.v +++ /dev/null @@ -1,194 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// 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_int2 - #(parameter BASE = 0, - parameter BUF_SIZE = 9) - (input clk, input rst, - input set_stb, input [7:0] set_addr, input [31:0] set_data, - output [31:0] status, - - // Wishbone interface to RAM - 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, - - // Write FIFO Interface - input [35:0] wr_data_i, - input wr_ready_i, - output wr_ready_o, - - // Read FIFO Interface - output [35:0] rd_data_o, - output rd_ready_o, - input rd_ready_i - ); - - reg [15:0] rd_addr, wr_addr; // Handle pkt bigger than buffer - wire [15:0] rd_addr_next = rd_addr + 1; - reg [15:0] rd_length; - - wire [31:0] ctrl; - wire wr_done, wr_error, wr_idle; - wire rd_done, rd_error, rd_idle; - wire we, en, go; - - wire read = ctrl[3]; - wire rd_clear = ctrl[2]; - wire write = ctrl[1]; - wire wr_clear = ctrl[0]; - - reg [2:0] rd_state, wr_state; - reg rd_sop, rd_eop; - wire wr_sop, wr_eop; - reg [1:0] rd_occ; - wire [1:0] wr_occ; - - 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; - - // read state machine - always @(posedge clk) - if(rst | (rd_clear & go)) - begin - rd_state <= IDLE; - rd_sop <= 0; - rd_eop <= 0; - rd_occ <= 0; - end - else - case(rd_state) - IDLE : - if(go & read) - begin - rd_addr <= 0; - rd_state <= PRE_READ; - rd_length <= ctrl[31:16]; - end - - PRE_READ : - begin - rd_state <= READING; - rd_addr <= rd_addr_next; - rd_occ <= 2'b00; - rd_sop <= 1; - rd_eop <= 0; - end - - READING : - if(rd_ready_i) - begin - rd_sop <= 0; - rd_addr <= rd_addr_next; - if(rd_addr_next == rd_length) - begin - rd_eop <= 1; - // FIXME assign occ here - rd_occ <= 0; - end - else - rd_eop <= 0; - if(rd_eop) - rd_state <= DONE; - end - - endcase // case(rd_state) - - // write state machine - always @(posedge clk) - if(rst | (wr_clear & go)) - wr_state <= IDLE; - else - case(wr_state) - IDLE : - if(go & write) - begin - wr_addr <= 0; - wr_state <= WRITING; - end - - WRITING : - if(wr_ready_i) - begin - wr_addr <= wr_addr + 1; - if(wr_sop & wr_eop) - wr_state <= ERROR; // Should save OCC flags here - else if(wr_eop) - wr_state <= DONE; - end // if (wr_ready_i) - endcase // case(wr_state) - - assign rd_data_o[35:32] = { rd_occ[1:0], rd_eop, rd_sop }; - assign rd_ready_o = (rd_state == READING); - - assign wr_sop = wr_data_i[32]; - assign wr_eop = wr_data_i[33]; - assign wr_occ = wr_data_i[35:34]; - assign wr_ready_o = (wr_state == WRITING); - - assign we = (wr_state == WRITING); // always write to avoid timing issue - assign en = ~((rd_state==READING)& ~rd_ready_i); // FIXME potential critical path - - assign rd_done = (rd_state == DONE); - assign wr_done = (wr_state == DONE); - assign rd_error = (rd_state == ERROR); - assign wr_error = (wr_state == ERROR); - assign rd_idle = (rd_state == IDLE); - assign wr_idle = (wr_state == IDLE); - - wire [BUF_SIZE-1:0] wr_addr_clip = (|wr_addr[15:BUF_SIZE]) ? {BUF_SIZE{1'b1}} : wr_addr[BUF_SIZE-1:0]; - - ram_2port #(.DWIDTH(32),.AWIDTH(BUF_SIZE)) buffer_in // CPU reads here - (.clka(wb_clk_i),.ena(wb_stb_i),.wea(1'b0), - .addra(wb_adr_i[BUF_SIZE+1:2]),.dia(0),.doa(wb_dat_o), - .clkb(clk),.enb(1'b1),.web(we), - .addrb(wr_addr_clip),.dib(wr_data_i[31:0]),.dob()); - - ram_2port #(.DWIDTH(32),.AWIDTH(BUF_SIZE)) buffer_out // CPU writes here - (.clka(wb_clk_i),.ena(wb_stb_i),.wea(wb_we_i), - .addra(wb_adr_i[BUF_SIZE+1:2]),.dia(wb_dat_i),.doa(), - .clkb(clk),.enb(en),.web(1'b0), - .addrb(rd_addr[BUF_SIZE-1:0]),.dib(0),.dob(rd_data_o[31:0])); - - always @(posedge wb_clk_i) - if(wb_rst_i) - wb_ack_o <= 0; - else - wb_ack_o <= wb_stb_i & ~wb_ack_o; - - setting_reg #(.my_addr(BASE)) - sreg(.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),.in(set_data), - .out(ctrl),.changed(go)); - - assign status = { wr_addr, - 8'b0,1'b0,rd_idle,rd_error,rd_done, 1'b0,wr_idle,wr_error,wr_done}; - -endmodule // buffer_int2 diff --git a/fpga/usrp2/fifo/buffer_int_tb.v b/fpga/usrp2/fifo/buffer_int_tb.v deleted file mode 100644 index 44f8be0a0..000000000 --- a/fpga/usrp2/fifo/buffer_int_tb.v +++ /dev/null @@ -1,435 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -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_data_o; - wire [3:0] rd_flags_o; - wire rd_sop_o, rd_eop_o; - reg rd_error_i = 0, rd_read_i = 0; - - reg [31:0] wr_data_i = 0; - wire [3:0] wr_flags_i; - reg wr_eop_i = 0, wr_sop_i = 0; - reg wr_write_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; - - assign wr_flags_i = {2'b00, wr_eop_i, wr_sop_i}; - assign rd_sop_o = rd_flags_o[0]; - assign rd_eop_o = rd_flags_o[1]; - - 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_data_i(wr_data_i), .wr_flags_i(wr_flags_i), .wr_write_i(wr_write_i), .wr_ready_o(wr_ready_o), - - // Read FIFO Interface - .rd_data_o(rd_data_o), .rd_flags_o(rd_flags_o), .rd_ready_o(rd_ready_o), .rd_read_i(rd_read_i) - ); - - 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 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 at same time as last."); - while(!rd_sop_o) - @(posedge clk); - ReadLines(2,0); - ReadALine; - 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(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,1,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(45,200); - $display("Testing Partial Write, 0 wait states, then done and write simultaneously"); - while(!wr_ready_o) - @(posedge clk); - wr_sop_i <= 1; wr_eop_i <= 0; - WriteLines(6,0,301); - wr_sop_i <= 0; wr_eop_i <= 1; - WriteALine(400); - wr_sop_i <= 0; wr_eop_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_sop_i <= 1; wr_eop_i <= 1; - WriteALine(400); - @(posedge clk); - repeat (10) - @(posedge clk); - wr_sop_i <= 0; wr_eop_i <= 0; - - 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); - wr_sop_i <= 1; wr_eop_i <= 0; - WriteALine(400); - wr_sop_i <= 0; wr_eop_i <= 0; - WriteLines(3,0,2000); - wr_sop_i <= 0; wr_eop_i <= 1; - WriteALine(400); - wr_sop_i <= 0; wr_eop_i <= 0; - 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_data_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_data_i, wr_ready_o, wr_full_o); - - initial begin - $dumpfile("buffer_int_tb.lxt"); - $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 - while(~rd_ready_o) - @(posedge clk); - #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 - while(~wr_ready_o) - @(posedge clk); - #1 wr_write_i <= 1; - wr_data_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/fpga/usrp2/fifo/buffer_pool.v b/fpga/usrp2/fifo/buffer_pool.v deleted file mode 100644 index 48f5bd69c..000000000 --- a/fpga/usrp2/fifo/buffer_pool.v +++ /dev/null @@ -1,300 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// 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) - -// BUF_SIZE is in address lines (i.e. log2 of number of lines). -// For S3 it should be 9 (512 words, 2KB) -// For V5 it should be at least 10 (1024 words, 4KB) or 11 (2048 words, 8KB) - -module buffer_pool - #(parameter BUF_SIZE = 9, - parameter SET_ADDR = 64) - (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_data_i, input [3:0] wr0_flags_i, input wr0_ready_i, output wr0_ready_o, - input [31:0] wr1_data_i, input [3:0] wr1_flags_i, input wr1_ready_i, output wr1_ready_o, - input [31:0] wr2_data_i, input [3:0] wr2_flags_i, input wr2_ready_i, output wr2_ready_o, - input [31:0] wr3_data_i, input [3:0] wr3_flags_i, input wr3_ready_i, output wr3_ready_o, - - // Read Interfaces - output [31:0] rd0_data_o, output [3:0] rd0_flags_o, output rd0_ready_o, input rd0_ready_i, - output [31:0] rd1_data_o, output [3:0] rd1_flags_o, output rd1_ready_o, input rd1_ready_i, - output [31:0] rd2_data_o, output [3:0] rd2_flags_o, output rd2_ready_o, input rd2_ready_i, - output [31:0] rd3_data_o, output [3:0] rd3_flags_o, output rd3_ready_o, input rd3_ready_i - ); - - wire [7:0] sel_a; - - wire [BUF_SIZE-1:0] buf_addra = wb_adr_i[BUF_SIZE+1:2]; // ignore address 1:0, 32-bit access only - wire [2:0] which_buf = wb_adr_i[BUF_SIZE+4:BUF_SIZE+2]; // address 15:14 selects the buffer pool - - 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 [BUF_SIZE-1:0] buf_addrb[0:7]; - wire [31:0] buf_dib[0:7]; - wire [31:0] buf_dob[0:7]; - - wire [31:0] wr_data_i[0:7]; - wire [3:0] wr_flags_i[0:7]; - wire [7:0] wr_ready_i; - wire [7:0] wr_ready_o; - - wire [31:0] rd_data_o[0:7]; - wire [3:0] rd_flags_o[0:7]; - wire [7:0] rd_ready_o; - wire [7:0] rd_ready_i; - - assign status = {8'd0,idle[7:0],error[7:0],done[7:0]}; - - assign s0 = buf_addrb[0]; - assign s1 = buf_addrb[1]; - assign s2 = buf_addrb[2]; - assign s3 = buf_addrb[3]; - assign s4 = buf_addrb[4]; - assign s5 = buf_addrb[5]; - assign s6 = buf_addrb[6]; - assign s7 = buf_addrb[7]; - - wire [31:0] fifo_ctrl; - setting_reg #(.my_addr(SET_ADDR)) - 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(BUF_SIZE)) 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 #(.BUF_NUM(i),.BUF_SIZE(BUF_SIZE)) buffer_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_data_i(wr_data_i[i]), - .wr_flags_i(wr_flags_i[i]), - .wr_ready_i(wr_ready_i[i]), - .wr_ready_o(wr_ready_o[i]), - .rd_data_o(rd_data_o[i]), - .rd_flags_o(rd_flags_o[i]), - .rd_ready_o(rd_ready_o[i]), - .rd_ready_i(rd_ready_i[i]) ); - mux4 #(.WIDTH(37)) - mux4_wr (.en(~port[i][2]),.sel(port[i][1:0]), - .i0({wr0_data_i,wr0_flags_i,wr0_ready_i}), - .i1({wr1_data_i,wr1_flags_i,wr1_ready_i}), - .i2({wr2_data_i,wr2_flags_i,wr2_ready_i}), - .i3({wr3_data_i,wr3_flags_i,wr3_ready_i}), - .o({wr_data_i[i],wr_flags_i[i],wr_ready_i[i]}) ); - mux4 #(.WIDTH(1)) - mux4_rd (.en(~port[i][2]),.sel(port[i][1:0]), - .i0(rd0_ready_i),.i1(rd1_ready_i),.i2(rd2_ready_i),.i3(rd3_ready_i), - .o(rd_ready_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_wr0(.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_wr1(.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_wr2(.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_wr3(.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(37)) - mux8_rd0(.en(~read_src[0][3]),.sel(read_src[0][2:0]), - .i0({rd_data_o[0],rd_flags_o[0],rd_ready_o[0]}), - .i1({rd_data_o[1],rd_flags_o[1],rd_ready_o[1]}), - .i2({rd_data_o[2],rd_flags_o[2],rd_ready_o[2]}), - .i3({rd_data_o[3],rd_flags_o[3],rd_ready_o[3]}), - .i4({rd_data_o[4],rd_flags_o[4],rd_ready_o[4]}), - .i5({rd_data_o[5],rd_flags_o[5],rd_ready_o[5]}), - .i6({rd_data_o[6],rd_flags_o[6],rd_ready_o[6]}), - .i7({rd_data_o[7],rd_flags_o[7],rd_ready_o[7]}), - .o({rd0_data_o,rd0_flags_o,rd0_ready_o})); - - mux8 #(.WIDTH(37)) - mux8_rd1(.en(~read_src[1][3]),.sel(read_src[1][2:0]), - .i0({rd_data_o[0],rd_flags_o[0],rd_ready_o[0]}), - .i1({rd_data_o[1],rd_flags_o[1],rd_ready_o[1]}), - .i2({rd_data_o[2],rd_flags_o[2],rd_ready_o[2]}), - .i3({rd_data_o[3],rd_flags_o[3],rd_ready_o[3]}), - .i4({rd_data_o[4],rd_flags_o[4],rd_ready_o[4]}), - .i5({rd_data_o[5],rd_flags_o[5],rd_ready_o[5]}), - .i6({rd_data_o[6],rd_flags_o[6],rd_ready_o[6]}), - .i7({rd_data_o[7],rd_flags_o[7],rd_ready_o[7]}), - .o({rd1_data_o,rd1_flags_o,rd1_ready_o})); - - mux8 #(.WIDTH(37)) - mux8_rd2(.en(~read_src[2][3]),.sel(read_src[2][2:0]), - .i0({rd_data_o[0],rd_flags_o[0],rd_ready_o[0]}), - .i1({rd_data_o[1],rd_flags_o[1],rd_ready_o[1]}), - .i2({rd_data_o[2],rd_flags_o[2],rd_ready_o[2]}), - .i3({rd_data_o[3],rd_flags_o[3],rd_ready_o[3]}), - .i4({rd_data_o[4],rd_flags_o[4],rd_ready_o[4]}), - .i5({rd_data_o[5],rd_flags_o[5],rd_ready_o[5]}), - .i6({rd_data_o[6],rd_flags_o[6],rd_ready_o[6]}), - .i7({rd_data_o[7],rd_flags_o[7],rd_ready_o[7]}), - .o({rd2_data_o,rd2_flags_o,rd2_ready_o})); - - mux8 #(.WIDTH(37)) - mux8_rd3(.en(~read_src[3][3]),.sel(read_src[3][2:0]), - .i0({rd_data_o[0],rd_flags_o[0],rd_ready_o[0]}), - .i1({rd_data_o[1],rd_flags_o[1],rd_ready_o[1]}), - .i2({rd_data_o[2],rd_flags_o[2],rd_ready_o[2]}), - .i3({rd_data_o[3],rd_flags_o[3],rd_ready_o[3]}), - .i4({rd_data_o[4],rd_flags_o[4],rd_ready_o[4]}), - .i5({rd_data_o[5],rd_flags_o[5],rd_ready_o[5]}), - .i6({rd_data_o[6],rd_flags_o[6],rd_ready_o[6]}), - .i7({rd_data_o[7],rd_flags_o[7],rd_ready_o[7]}), - .o({rd3_data_o,rd3_flags_o,rd3_ready_o})); - - assign sys_int_o = (|error) | (|done); - -endmodule // buffer_pool diff --git a/fpga/usrp2/fifo/buffer_pool_tb.v b/fpga/usrp2/fifo/buffer_pool_tb.v deleted file mode 100644 index 0ee76689e..000000000 --- a/fpga/usrp2/fifo/buffer_pool_tb.v +++ /dev/null @@ -1,75 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -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_data, wr1_data, wr2_data, wr3_data; - wire [31:0] rd0_data, rd1_data, rd2_data, rd3_data; - wire [3:0] wr0_flags, wr1_flags, wr2_flags, wr3_flags; - wire [3:0] rd0_flags, rd1_flags, rd2_flags, rd3_flags; - wire wr0_ready, wr1_ready, wr2_ready, wr3_ready; - wire rd0_ready, rd1_ready, rd2_ready, rd3_ready; - wire wr0_write, wr1_write, wr2_write, wr3_write; - wire rd0_read, rd1_read, rd2_read, rd3_read; - - 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_data_i(wr0_data), .wr0_write_i(wr0_write), .wr0_flags_i(wr0_flags), .wr0_ready_o(wr0_ready), - .wr1_data_i(wr1_data), .wr1_write_i(wr1_write), .wr1_flags_i(wr1_flags), .wr1_ready_o(wr1_ready), - .wr2_data_i(wr2_data), .wr2_write_i(wr2_write), .wr2_flags_i(wr2_flags), .wr2_ready_o(wr2_ready), - .wr3_data_i(wr3_data), .wr3_write_i(wr3_write), .wr3_flags_i(wr3_flags), .wr3_ready_o(wr3_ready), - - .rd0_data_o(rd0_data), .rd0_read_i(rd0_read), .rd0_flags_o(rd0_flags), .rd0_ready_o(rd0_ready), - .rd1_data_o(rd1_data), .rd1_read_i(rd1_read), .rd1_flags_o(rd1_flags), .rd1_ready_o(rd1_ready), - .rd2_data_o(rd2_data), .rd2_read_i(rd2_read), .rd2_flags_o(rd2_flags), .rd2_ready_o(rd2_ready), - .rd3_data_o(rd3_data), .rd3_read_i(rd3_read), .rd3_flags_o(rd3_flags), .rd3_ready_o(rd3_ready) - ); - -endmodule // buffer_pool_tb diff --git a/fpga/usrp2/fifo/crossbar36.v b/fpga/usrp2/fifo/crossbar36.v deleted file mode 100644 index 4e2aed7ce..000000000 --- a/fpga/usrp2/fifo/crossbar36.v +++ /dev/null @@ -1,59 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module crossbar36 - (input clk, input reset, input clear, - input cross, - input [35:0] data0_i, input src0_rdy_i, output dst0_rdy_o, - input [35:0] data1_i, input src1_rdy_i, output dst1_rdy_o, - output [35:0] data0_o, output src0_rdy_o, input dst0_rdy_i, - output [35:0] data1_o, output src1_rdy_o, input dst1_rdy_i); - - reg cross_int, active0, active1; - wire active0_next = (src0_rdy_i & dst0_rdy_o)? ~data0_i[33] : active0; - wire active1_next = (src1_rdy_i & dst1_rdy_o)? ~data1_i[33] : active1; - - assign data0_o = cross_int ? data1_i : data0_i; - assign data1_o = cross_int ? data0_i : data1_i; - - assign src0_rdy_o = cross_int ? src1_rdy_i : src0_rdy_i; - assign src1_rdy_o = cross_int ? src0_rdy_i : src1_rdy_i; - - assign dst0_rdy_o = cross_int ? dst1_rdy_i : dst0_rdy_i; - assign dst1_rdy_o = cross_int ? dst0_rdy_i : dst1_rdy_i; - - always @(posedge clk) - if(reset | clear) - active0 <= 0; - else - active0 <= active0_next; - - always @(posedge clk) - if(reset | clear) - active1 <= 0; - else - active1 <= active1_next; - - always @(posedge clk) - if(reset | clear) - cross_int <= 0; - else if(~active0_next & ~active1_next) - cross_int <= cross; - -endmodule // crossbar36 diff --git a/fpga/usrp2/fifo/dsp_framer36.v b/fpga/usrp2/fifo/dsp_framer36.v deleted file mode 100644 index ef7395551..000000000 --- a/fpga/usrp2/fifo/dsp_framer36.v +++ /dev/null @@ -1,89 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// This has 3 functions: -// Correct the VITA packet length -// [optional] Frame DSP packets with an header line to be handled by the protocol machine -// Hold on to the packet until there is a complete one before allowing to leave - -module dsp_framer36 - #(parameter BUF_SIZE = 9, - parameter PORT_SEL = 0, - parameter PROT_ENG_FLAGS = 1) - (input clk, input reset, input clear, - input [35:0] data_i, input src_rdy_i, output dst_rdy_o, - output [35:0] data_o, output src_rdy_o, input dst_rdy_i); - - wire dfifo_in_dst_rdy, dfifo_in_src_rdy, dfifo_out_dst_rdy, dfifo_out_src_rdy; - wire tfifo_in_dst_rdy, tfifo_in_src_rdy, tfifo_out_dst_rdy, tfifo_out_src_rdy; - - wire do_xfer_in = dfifo_in_src_rdy & dfifo_in_dst_rdy; - wire do_xfer_out = src_rdy_o & dst_rdy_i; - - wire have_space = dfifo_in_dst_rdy & tfifo_in_dst_rdy; - reg [15:0] pkt_len_in, pkt_len_out; - wire [15:0] tfifo_data; - wire [35:0] dfifo_out_data; - - assign dst_rdy_o = have_space; - assign dfifo_in_src_rdy = src_rdy_i & have_space; - - fifo_cascade #(.WIDTH(36), .SIZE(BUF_SIZE)) dfifo - (.clk(clk), .reset(reset), .clear(clear), - .datain(data_i), .src_rdy_i(dfifo_in_src_rdy), .dst_rdy_o(dfifo_in_dst_rdy), - .dataout(dfifo_out_data), .src_rdy_o(dfifo_out_src_rdy), .dst_rdy_i(dfifo_out_dst_rdy) ); - - fifo_short #(.WIDTH(16)) tfifo - (.clk(clk), .reset(reset), .clear(clear), - .datain(pkt_len_in), .src_rdy_i(tfifo_in_src_rdy), .dst_rdy_o(tfifo_in_dst_rdy), - .dataout(tfifo_data), .src_rdy_o(tfifo_out_src_rdy), .dst_rdy_i(tfifo_out_dst_rdy), - .space(), .occupied() ); - - // FIXME won't handle single-line packets, will show wrong length - always @(posedge clk) - if(reset | clear) - pkt_len_in <= 0; - else if(do_xfer_in) - if(data_i[32]) // sof - pkt_len_in <= 2; // fixes off by one since number is stored before increment - else - pkt_len_in <= pkt_len_in + 1; - - assign tfifo_in_src_rdy = do_xfer_in & data_i[33]; // store length when at eof in - assign tfifo_out_dst_rdy = do_xfer_out & data_o[33]; // remove length from list at eof out - - always @(posedge clk) - if(reset | clear) - pkt_len_out <= (PROT_ENG_FLAGS ? 1'b0 : 1'b1); - else if(do_xfer_out) - if(dfifo_out_data[33]) // eof - pkt_len_out <= (PROT_ENG_FLAGS ? 1'b0 : 1'b1); - else - pkt_len_out <= pkt_len_out + 1; - - assign dfifo_out_dst_rdy = do_xfer_out & (pkt_len_out != 0); - - wire [1:0] port_sel_bits = PORT_SEL; - - assign data_o = (pkt_len_out == 0) ? {3'b000, 1'b1, 13'b0, port_sel_bits, 1'b1, tfifo_data[13:0],2'b00} : - (pkt_len_out == 1) ? {3'b000, (PROT_ENG_FLAGS ? 1'b0: 1'b1), dfifo_out_data[31:16],tfifo_data} : - {dfifo_out_data[35:33], 1'b0, dfifo_out_data[31:0] }; - - assign src_rdy_o = dfifo_out_src_rdy & tfifo_out_src_rdy; - -endmodule // dsp_framer36 diff --git a/fpga/usrp2/fifo/fifo19_mux.v b/fpga/usrp2/fifo/fifo19_mux.v deleted file mode 100644 index a23ac2bb4..000000000 --- a/fpga/usrp2/fifo/fifo19_mux.v +++ /dev/null @@ -1,94 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Mux packets from multiple FIFO interfaces onto a single one. -// Can alternate or give priority to one port (port 0) -// In prio mode, port 1 will never get access if port 0 is always busy - -module fifo19_mux - #(parameter prio = 0) - (input clk, input reset, input clear, - input [18:0] data0_i, input src0_rdy_i, output dst0_rdy_o, - input [18:0] data1_i, input src1_rdy_i, output dst1_rdy_o, - output [18:0] data_o, output src_rdy_o, input dst_rdy_i); - - wire [18:0] data0_int, data1_int; - wire src0_rdy_int, dst0_rdy_int, src1_rdy_int, dst1_rdy_int; - - fifo_short #(.WIDTH(19)) mux_fifo_in0 - (.clk(clk), .reset(reset), .clear(clear), - .datain(data0_i), .src_rdy_i(src0_rdy_i), .dst_rdy_o(dst0_rdy_o), - .dataout(data0_int), .src_rdy_o(src0_rdy_int), .dst_rdy_i(dst0_rdy_int)); - - fifo_short #(.WIDTH(19)) mux_fifo_in1 - (.clk(clk), .reset(reset), .clear(clear), - .datain(data1_i), .src_rdy_i(src1_rdy_i), .dst_rdy_o(dst1_rdy_o), - .dataout(data1_int), .src_rdy_o(src1_rdy_int), .dst_rdy_i(dst1_rdy_int)); - - localparam MUX_IDLE0 = 0; - localparam MUX_DATA0 = 1; - localparam MUX_IDLE1 = 2; - localparam MUX_DATA1 = 3; - - reg [1:0] state; - - wire eof0 = data0_int[17]; - wire eof1 = data1_int[17]; - - wire [18:0] data_int; - wire src_rdy_int, dst_rdy_int; - - always @(posedge clk) - if(reset | clear) - state <= MUX_IDLE0; - else - case(state) - MUX_IDLE0 : - if(src0_rdy_int) - state <= MUX_DATA0; - else if(src1_rdy_int) - state <= MUX_DATA1; - - MUX_DATA0 : - if(src0_rdy_int & dst_rdy_int & eof0) - state <= prio ? MUX_IDLE0 : MUX_IDLE1; - - MUX_IDLE1 : - if(src1_rdy_int) - state <= MUX_DATA1; - else if(src0_rdy_int) - state <= MUX_DATA0; - - MUX_DATA1 : - if(src1_rdy_int & dst_rdy_int & eof1) - state <= MUX_IDLE0; - - default : - state <= MUX_IDLE0; - endcase // case (state) - - assign dst0_rdy_int = (state==MUX_DATA0) ? dst_rdy_int : 0; - assign dst1_rdy_int = (state==MUX_DATA1) ? dst_rdy_int : 0; - assign src_rdy_int = (state==MUX_DATA0) ? src0_rdy_int : (state==MUX_DATA1) ? src1_rdy_int : 0; - assign data_int = (state==MUX_DATA0) ? data0_int : data1_int; - - fifo_short #(.WIDTH(19)) mux_fifo - (.clk(clk), .reset(reset), .clear(clear), - .datain(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int), - .dataout(data_o), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i)); -endmodule // fifo19_mux diff --git a/fpga/usrp2/fifo/fifo19_pad.v b/fpga/usrp2/fifo/fifo19_pad.v deleted file mode 100644 index bb6e1fa92..000000000 --- a/fpga/usrp2/fifo/fifo19_pad.v +++ /dev/null @@ -1,83 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Pads a packet out to the minimum length -// Packets already longer than min length are unchanged - - -module fifo19_pad - #(parameter LENGTH=16, - parameter PAD_VALUE=0) - (input clk, input reset, input clear, - input [18:0] data_i, - input src_rdy_i, - output dst_rdy_o, - output [18:0] data_o, - output src_rdy_o, - input dst_rdy_i); - - reg [15:0] count; - reg [1:0] pad_state; - localparam PAD_IDLE = 0; - localparam PAD_TOOSHORT = 1; - localparam PAD_LONGENOUGH = 2; - localparam PAD_PADDING = 3; - - always @(posedge clk) - if(reset | clear) - pad_state <= PAD_IDLE; - else - case(pad_state) - PAD_IDLE : - begin - count <= 1; - pad_state <= PAD_TOOSHORT; - end - PAD_TOOSHORT : - if(src_rdy_i & dst_rdy_i) - begin - count <= count + 1; - if(data_i[17]) - pad_state <= PAD_PADDING; - else if(count == (LENGTH-1)) - pad_state <= PAD_LONGENOUGH; - end - PAD_PADDING : - if(dst_rdy_i) - begin - count <= count + 1; - if(count == LENGTH) - pad_state <= PAD_IDLE; - end - PAD_LONGENOUGH : - if(src_rdy_i & dst_rdy_i & data_i[17]) - pad_state <= PAD_IDLE; - endcase // case (pad_state) - - wire passthru = (pad_state == PAD_TOOSHORT) | (pad_state == PAD_LONGENOUGH); - - assign dst_rdy_o = passthru ? dst_rdy_i : 1'b0; - assign src_rdy_o = passthru ? src_rdy_i : (pad_state == PAD_PADDING); - - assign data_o[15:0] = (pad_state == PAD_PADDING) ? PAD_VALUE : data_i[15:0]; - assign data_o[16] = (count == 1); - assign data_o[17] = (pad_state == PAD_LONGENOUGH) ? data_i[17] : (count == LENGTH); - assign data_o[18] = (pad_state == PAD_LONGENOUGH) ? data_i[18] : 1'b0; - - -endmodule // fifo19_pad diff --git a/fpga/usrp2/fifo/fifo19_to_fifo36.v b/fpga/usrp2/fifo/fifo19_to_fifo36.v deleted file mode 100644 index 32734405a..000000000 --- a/fpga/usrp2/fifo/fifo19_to_fifo36.v +++ /dev/null @@ -1,127 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Parameter LE tells us if we are little-endian. -// Little-endian means send lower 16 bits first. -// Default is big endian (network order), send upper bits first. - -module fifo19_to_fifo36 - #(parameter LE=0) - (input clk, input reset, input clear, - input [18:0] f19_datain, - input f19_src_rdy_i, - output f19_dst_rdy_o, - - output [35:0] f36_dataout, - output f36_src_rdy_o, - input f36_dst_rdy_i, - output [31:0] debug - ); - - // Shortfifo on input to guarantee no deadlock - wire [18:0] f19_data_int; - wire f19_src_rdy_int, f19_dst_rdy_int; - - fifo_short #(.WIDTH(19)) head_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f19_datain), .src_rdy_i(f19_src_rdy_i), .dst_rdy_o(f19_dst_rdy_o), - .dataout(f19_data_int), .src_rdy_o(f19_src_rdy_int), .dst_rdy_i(f19_dst_rdy_int), - .space(),.occupied() ); - - // Actual f19 to f36 which could deadlock if not connected to shortfifos - reg f36_sof_int, f36_eof_int; - reg [1:0] f36_occ_int; - wire [35:0] f36_data_int; - wire f36_src_rdy_int, f36_dst_rdy_int; - - reg [1:0] state; - reg [15:0] dat0, dat1; - - wire f19_sof_int = f19_data_int[16]; - wire f19_eof_int = f19_data_int[17]; - wire f19_occ_int = f19_data_int[18]; - - wire xfer_out = f36_src_rdy_int & f36_dst_rdy_int; - - always @(posedge clk) - if(f19_src_rdy_int & ((state==0)|xfer_out)) - f36_sof_int <= f19_sof_int; - - always @(posedge clk) - if(f19_src_rdy_int & ((state != 2)|xfer_out)) - f36_eof_int <= f19_eof_int; - - always @(posedge clk) - if(reset) - begin - state <= 0; - f36_occ_int <= 0; - end - else - if(f19_src_rdy_int) - case(state) - 0 : - begin - dat0 <= f19_data_int; - if(f19_eof_int) - begin - state <= 2; - f36_occ_int <= f19_occ_int ? 2'b01 : 2'b10; - end - else - state <= 1; - end - 1 : - begin - dat1 <= f19_data_int; - state <= 2; - if(f19_eof_int) - f36_occ_int <= f19_occ_int ? 2'b11 : 2'b00; - end - 2 : - if(xfer_out) - begin - dat0 <= f19_data_int; - if(f19_eof_int) // remain in state 2 if we are at eof - f36_occ_int <= f19_occ_int ? 2'b01 : 2'b10; - else - state <= 1; - end - endcase // case(state) - else - if(xfer_out) - begin - state <= 0; - f36_occ_int <= 0; - end - - assign f19_dst_rdy_int = xfer_out | (state != 2); - assign f36_data_int = LE ? {f36_occ_int,f36_eof_int,f36_sof_int,dat1,dat0} : - {f36_occ_int,f36_eof_int,f36_sof_int,dat0,dat1}; - assign f36_src_rdy_int = (state == 2); - - assign debug = state; - - // Shortfifo on output to guarantee no deadlock - fifo_short #(.WIDTH(36)) tail_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f36_data_int), .src_rdy_i(f36_src_rdy_int), .dst_rdy_o(f36_dst_rdy_int), - .dataout(f36_dataout), .src_rdy_o(f36_src_rdy_o), .dst_rdy_i(f36_dst_rdy_i), - .space(),.occupied() ); - -endmodule // fifo19_to_fifo36 diff --git a/fpga/usrp2/fifo/fifo19_to_ll8.v b/fpga/usrp2/fifo/fifo19_to_ll8.v deleted file mode 100644 index 1ebb140c2..000000000 --- a/fpga/usrp2/fifo/fifo19_to_ll8.v +++ /dev/null @@ -1,70 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -module fifo19_to_ll8 - (input clk, input reset, input clear, - input [18:0] f19_data, - input f19_src_rdy_i, - output f19_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 f19_sof = f19_data[16]; - wire f19_eof = f19_data[17]; - wire f19_occ = f19_data[18]; - - wire advance, end_early; - reg 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 = f19_data[15:8]; - 1 : ll_data = f19_data[7:0]; - default : ll_data = f19_data[15:8]; - endcase // case (state) - - assign ll_sof = (state==0) & f19_sof; - assign ll_eof = f19_eof & ((f19_occ==1)|(state==1)); - - assign ll_src_rdy = f19_src_rdy_i; - - assign advance = ll_src_rdy & ll_dst_rdy; - assign f19_dst_rdy_o = advance & ((state==1)|ll_eof); - -endmodule // fifo19_to_ll8 - diff --git a/fpga/usrp2/fifo/fifo36_demux.v b/fpga/usrp2/fifo/fifo36_demux.v deleted file mode 100644 index 6f516691a..000000000 --- a/fpga/usrp2/fifo/fifo36_demux.v +++ /dev/null @@ -1,67 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Demux packets from a fifo based on the contents of the first line -// If first line matches the parameter and mask, send to data1, otherwise send to data0 - -module fifo36_demux - #(parameter match_data = 0, - parameter match_mask = 0) - (input clk, input reset, input clear, - input [35:0] data_i, input src_rdy_i, output dst_rdy_o, - output [35:0] data0_o, output src0_rdy_o, input dst0_rdy_i, - output [35:0] data1_o, output src1_rdy_o, input dst1_rdy_i); - - localparam DMX_IDLE = 0; - localparam DMX_DATA0 = 1; - localparam DMX_DATA1 = 2; - - reg [1:0] state; - - wire match = |( (data_i ^ match_data) & match_mask ); - wire eof = data_i[33]; - - always @(posedge clk) - if(reset | clear) - state <= DMX_IDLE; - else - case(state) - DMX_IDLE : - if(src_rdy_i) - if(match) - state <= DMX_DATA1; - else - state <= DMX_DATA0; - DMX_DATA0 : - if(src_rdy_i & dst0_rdy_i & eof) - state <= DMX_IDLE; - DMX_DATA1 : - if(src_rdy_i & dst1_rdy_i & eof) - state <= DMX_IDLE; - default : - state <= DMX_IDLE; - endcase // case (state) - - assign dst_rdy_o = (state==DMX_IDLE) ? 0 : (state==DMX_DATA0) ? dst0_rdy_i : dst1_rdy_i; - assign src0_rdy_o = (state==DMX_DATA0) ? src_rdy_i : 0; - assign src1_rdy_o = (state==DMX_DATA1) ? src_rdy_i : 0; - - assign data0_o = data_i; - assign data1_o = data_i; - -endmodule // fifo36_demux diff --git a/fpga/usrp2/fifo/fifo36_mux.v b/fpga/usrp2/fifo/fifo36_mux.v deleted file mode 100644 index cf7b2b4d1..000000000 --- a/fpga/usrp2/fifo/fifo36_mux.v +++ /dev/null @@ -1,94 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Mux packets from multiple FIFO interfaces onto a single one. -// Can alternate or give priority to one port (port 0) -// In prio mode, port 1 will never get access if port 0 is always busy - -module fifo36_mux - #(parameter prio = 0) - (input clk, input reset, input clear, - input [35:0] data0_i, input src0_rdy_i, output dst0_rdy_o, - input [35:0] data1_i, input src1_rdy_i, output dst1_rdy_o, - output [35:0] data_o, output src_rdy_o, input dst_rdy_i); - - wire [35:0] data0_int, data1_int; - wire src0_rdy_int, dst0_rdy_int, src1_rdy_int, dst1_rdy_int; - - fifo_short #(.WIDTH(36)) mux_fifo_in0 - (.clk(clk), .reset(reset), .clear(clear), - .datain(data0_i), .src_rdy_i(src0_rdy_i), .dst_rdy_o(dst0_rdy_o), - .dataout(data0_int), .src_rdy_o(src0_rdy_int), .dst_rdy_i(dst0_rdy_int)); - - fifo_short #(.WIDTH(36)) mux_fifo_in1 - (.clk(clk), .reset(reset), .clear(clear), - .datain(data1_i), .src_rdy_i(src1_rdy_i), .dst_rdy_o(dst1_rdy_o), - .dataout(data1_int), .src_rdy_o(src1_rdy_int), .dst_rdy_i(dst1_rdy_int)); - - localparam MUX_IDLE0 = 0; - localparam MUX_DATA0 = 1; - localparam MUX_IDLE1 = 2; - localparam MUX_DATA1 = 3; - - reg [1:0] state; - - wire eof0 = data0_int[33]; - wire eof1 = data1_int[33]; - - wire [35:0] data_int; - wire src_rdy_int, dst_rdy_int; - - always @(posedge clk) - if(reset | clear) - state <= MUX_IDLE0; - else - case(state) - MUX_IDLE0 : - if(src0_rdy_int) - state <= MUX_DATA0; - else if(src1_rdy_int) - state <= MUX_DATA1; - - MUX_DATA0 : - if(src0_rdy_int & dst_rdy_int & eof0) - state <= prio ? MUX_IDLE0 : MUX_IDLE1; - - MUX_IDLE1 : - if(src1_rdy_int) - state <= MUX_DATA1; - else if(src0_rdy_int) - state <= MUX_DATA0; - - MUX_DATA1 : - if(src1_rdy_int & dst_rdy_int & eof1) - state <= MUX_IDLE0; - - default : - state <= MUX_IDLE0; - endcase // case (state) - - assign dst0_rdy_int = (state==MUX_DATA0) ? dst_rdy_int : 0; - assign dst1_rdy_int = (state==MUX_DATA1) ? dst_rdy_int : 0; - assign src_rdy_int = (state==MUX_DATA0) ? src0_rdy_int : (state==MUX_DATA1) ? src1_rdy_int : 0; - assign data_int = (state==MUX_DATA0) ? data0_int : data1_int; - - fifo_short #(.WIDTH(36)) mux_fifo - (.clk(clk), .reset(reset), .clear(clear), - .datain(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int), - .dataout(data_o), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i)); -endmodule // fifo36_demux diff --git a/fpga/usrp2/fifo/fifo36_to_fifo19.v b/fpga/usrp2/fifo/fifo36_to_fifo19.v deleted file mode 100644 index cb93e10ad..000000000 --- a/fpga/usrp2/fifo/fifo36_to_fifo19.v +++ /dev/null @@ -1,80 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Parameter LE tells us if we are little-endian. -// Little-endian means send lower 16 bits first. -// Default is big endian (network order), send upper bits first. - -module fifo36_to_fifo19 - #(parameter LE=0) - (input clk, input reset, input clear, - input [35:0] f36_datain, - input f36_src_rdy_i, - output f36_dst_rdy_o, - - output [18:0] f19_dataout, - output f19_src_rdy_o, - input f19_dst_rdy_i ); - - wire [18:0] f19_data_int; - wire f19_src_rdy_int, f19_dst_rdy_int; - wire [35:0] f36_data_int; - wire f36_src_rdy_int, f36_dst_rdy_int; - - // Shortfifo on input to guarantee no deadlock - fifo_short #(.WIDTH(36)) head_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f36_datain), .src_rdy_i(f36_src_rdy_i), .dst_rdy_o(f36_dst_rdy_o), - .dataout(f36_data_int), .src_rdy_o(f36_src_rdy_int), .dst_rdy_i(f36_dst_rdy_int), - .space(),.occupied() ); - - // Main fifo36_to_fifo19, needs shortfifos to guarantee no deadlock - wire [1:0] f36_occ_int = f36_data_int[35:34]; - wire f36_sof_int = f36_data_int[32]; - wire f36_eof_int = f36_data_int[33]; - - reg phase; - wire half_line = f36_eof_int & ((f36_occ_int==1)|(f36_occ_int==2)); - - assign f19_data_int[15:0] = (LE ^ phase) ? f36_data_int[15:0] : f36_data_int[31:16]; - assign f19_data_int[16] = phase ? 0 : f36_sof_int; - assign f19_data_int[17] = phase ? f36_eof_int : half_line; - assign f19_data_int[18] = f19_data_int[17] & ((f36_occ_int==1)|(f36_occ_int==3)); - - assign f19_src_rdy_int = f36_src_rdy_int; - assign f36_dst_rdy_int = (phase | half_line) & f19_dst_rdy_int; - - wire f19_xfer = f19_src_rdy_int & f19_dst_rdy_int; - wire f36_xfer = f36_src_rdy_int & f36_dst_rdy_int; - - always @(posedge clk) - if(reset) - phase <= 0; - else if(f36_xfer) - phase <= 0; - else if(f19_xfer) - phase <= 1; - - // Shortfifo on output to guarantee no deadlock - fifo_short #(.WIDTH(19)) tail_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f19_data_int), .src_rdy_i(f19_src_rdy_int), .dst_rdy_o(f19_dst_rdy_int), - .dataout(f19_dataout), .src_rdy_o(f19_src_rdy_o), .dst_rdy_i(f19_dst_rdy_i), - .space(),.occupied() ); - -endmodule // fifo36_to_fifo19 diff --git a/fpga/usrp2/fifo/fifo36_to_fifo72.v b/fpga/usrp2/fifo/fifo36_to_fifo72.v deleted file mode 100644 index 237149cc2..000000000 --- a/fpga/usrp2/fifo/fifo36_to_fifo72.v +++ /dev/null @@ -1,142 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Parameter LE tells us if we are little-endian. -// Little-endian means send lower 16 bits first. -// Default is big endian (network order), send upper bits first. - -module fifo36_to_fifo72 - #(parameter LE=0) - (input clk, input reset, input clear, - input [35:0] f36_datain, - input f36_src_rdy_i, - output f36_dst_rdy_o, - - output [71:0] f72_dataout, - output f72_src_rdy_o, - input f72_dst_rdy_i, - output [31:0] debug - ); - - // Shortfifo on input to guarantee no deadlock - wire [35:0] f36_data_int; - wire f36_src_rdy_int, f36_dst_rdy_int; - - fifo_short #(.WIDTH(36)) head_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f36_datain), .src_rdy_i(f36_src_rdy_i), .dst_rdy_o(f36_dst_rdy_o), - .dataout(f36_data_int), .src_rdy_o(f36_src_rdy_int), .dst_rdy_i(f36_dst_rdy_int), - .space(),.occupied() ); - - // Actual f36 to f72 which could deadlock if not connected to shortfifos - reg f72_sof_int, f72_eof_int; - reg [2:0] f72_occ_int; - wire [71:0] f72_data_int; - wire f72_src_rdy_int, f72_dst_rdy_int; - - reg [1:0] state; - reg [31:0] dat0, dat1; - - wire f36_sof_int = f36_data_int[32]; - wire f36_eof_int = f36_data_int[33]; - wire [1:0] f36_occ_int = f36_data_int[35:34]; - - wire xfer_out = f72_src_rdy_int & f72_dst_rdy_int; - - always @(posedge clk) - if(f36_src_rdy_int & ((state==0)|xfer_out)) - f72_sof_int <= f36_sof_int; - - always @(posedge clk) - if(f36_src_rdy_int & ((state != 2)|xfer_out)) - f72_eof_int <= f36_eof_int; - - always @(posedge clk) - if(reset) - begin - state <= 0; - f72_occ_int <= 0; - end - else - if(f36_src_rdy_int) - case(state) - 0 : - begin - dat0 <= f36_data_int; - if(f36_eof_int) - begin - state <= 2; - case (f36_occ_int) - 0 : f72_occ_int <= 3'd4; - 1 : f72_occ_int <= 3'd1; - 2 : f72_occ_int <= 3'd2; - 3 : f72_occ_int <= 3'd3; - endcase // case (f36_occ_int) - end - else - state <= 1; - end - 1 : - begin - dat1 <= f36_data_int; - state <= 2; - if(f36_eof_int) - case (f36_occ_int) - 0 : f72_occ_int <= 3'd0; - 1 : f72_occ_int <= 3'd5; - 2 : f72_occ_int <= 3'd6; - 3 : f72_occ_int <= 3'd7; - endcase // case (f36_occ_int) - end - 2 : - if(xfer_out) - begin - dat0 <= f36_data_int; - if(f36_eof_int) // remain in state 2 if we are at eof - case (f36_occ_int) - 0 : f72_occ_int <= 3'd4; - 1 : f72_occ_int <= 3'd1; - 2 : f72_occ_int <= 3'd2; - 3 : f72_occ_int <= 3'd3; - endcase // case (f36_occ_int) - else - state <= 1; - end - endcase // case(state) - else - if(xfer_out) - begin - state <= 0; - f72_occ_int <= 0; - end - - assign f36_dst_rdy_int = xfer_out | (state != 2); - assign f72_data_int = LE ? {3'b000,f72_occ_int[2:0],f72_eof_int,f72_sof_int,dat1,dat0} : - {3'b000,f72_occ_int[2:0],f72_eof_int,f72_sof_int,dat0,dat1}; - assign f72_src_rdy_int = (state == 2); - - assign debug = state; - - // Shortfifo on output to guarantee no deadlock - fifo_short #(.WIDTH(72)) tail_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f72_data_int), .src_rdy_i(f72_src_rdy_int), .dst_rdy_o(f72_dst_rdy_int), - .dataout(f72_dataout), .src_rdy_o(f72_src_rdy_o), .dst_rdy_i(f72_dst_rdy_i), - .space(),.occupied() ); - -endmodule // fifo36_to_fifo72 diff --git a/fpga/usrp2/fifo/fifo36_to_ll8.v b/fpga/usrp2/fifo/fifo36_to_ll8.v deleted file mode 100644 index 5c2da812f..000000000 --- a/fpga/usrp2/fifo/fifo36_to_ll8.v +++ /dev/null @@ -1,92 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -module fifo36_to_ll8 - (input clk, input reset, input clear, - input [35:0] f36_data, - input f36_src_rdy_i, - output f36_dst_rdy_o, - - output [7:0] ll_data, - output ll_sof, - output ll_eof, - output ll_src_rdy, - input ll_dst_rdy, - - output [31:0] debug); - - // Shortfifo on input to guarantee no deadlock - wire [35:0] f36_data_int; - wire f36_src_rdy_int, f36_dst_rdy_int; - reg [7:0] ll_data_int; - wire ll_sof_int, ll_eof_int, ll_src_rdy_int, ll_dst_rdy_int; - - fifo_short #(.WIDTH(36)) head_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f36_data), .src_rdy_i(f36_src_rdy_i), .dst_rdy_o(f36_dst_rdy_o), - .dataout(f36_data_int), .src_rdy_o(f36_src_rdy_int), .dst_rdy_i(f36_dst_rdy_int), - .space(),.occupied() ); - - // Actual fifo36 to ll8, can deadlock if not connected to shortfifo - wire [1:0] f36_occ_int = f36_data_int[35:34]; - wire f36_sof_int = f36_data_int[32]; - wire f36_eof_int = f36_data_int[33]; - 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_int) - state <= 0; - else - state <= state + 1; - - always @* - case(state) - 0 : ll_data_int = f36_data_int[31:24]; - 1 : ll_data_int = f36_data_int[23:16]; - 2 : ll_data_int = f36_data_int[15:8]; - 3 : ll_data_int = f36_data_int[7:0]; - default : ll_data_int = f36_data_int[31:24]; - endcase // case (state) - - assign ll_sof_int = (state==0) & f36_sof_int; - assign ll_eof_int = f36_eof_int & (((state==0)&(f36_occ_int==1)) | - ((state==1)&(f36_occ_int==2)) | - ((state==2)&(f36_occ_int==3)) | - (state==3)); - - assign ll_src_rdy_int = f36_src_rdy_int; - - assign advance = ll_src_rdy_int & ll_dst_rdy_int; - assign f36_dst_rdy_int= advance & ((state==3)|ll_eof_int); - - // Short FIFO on output to guarantee no deadlock - ll8_shortfifo tail_fifo - (.clk(clk), .reset(reset), .clear(clear), - .datain(ll_data_int), .sof_i(ll_sof_int), .eof_i(ll_eof_int), - .error_i(0), .src_rdy_i(ll_src_rdy_int), .dst_rdy_o(ll_dst_rdy_int), - .dataout(ll_data), .sof_o(ll_sof), .eof_o(ll_eof), - .error_o(), .src_rdy_o(ll_src_rdy), .dst_rdy_i(ll_dst_rdy)); - -endmodule // fifo36_to_ll8 diff --git a/fpga/usrp2/fifo/fifo72_to_fifo36.v b/fpga/usrp2/fifo/fifo72_to_fifo36.v deleted file mode 100644 index c365f0196..000000000 --- a/fpga/usrp2/fifo/fifo72_to_fifo36.v +++ /dev/null @@ -1,80 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Parameter LE tells us if we are little-endian. -// Little-endian means send lower 16 bits first. -// Default is big endian (network order), send upper bits first. - -module fifo72_to_fifo36 - #(parameter LE=0) - (input clk, input reset, input clear, - input [71:0] f72_datain, - input f72_src_rdy_i, - output f72_dst_rdy_o, - - output [35:0] f36_dataout, - output f36_src_rdy_o, - input f36_dst_rdy_i ); - - wire [35:0] f36_data_int; - wire f36_src_rdy_int, f36_dst_rdy_int; - wire [71:0] f72_data_int; - wire f72_src_rdy_int, f72_dst_rdy_int; - - // Shortfifo on input to guarantee no deadlock - fifo_short #(.WIDTH(72)) head_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f72_datain), .src_rdy_i(f72_src_rdy_i), .dst_rdy_o(f72_dst_rdy_o), - .dataout(f72_data_int), .src_rdy_o(f72_src_rdy_int), .dst_rdy_i(f72_dst_rdy_int), - .space(),.occupied() ); - - // Main fifo72_to_fifo36, needs shortfifos to guarantee no deadlock - wire [2:0] f72_occ_int = f72_data_int[68:66]; - wire f72_sof_int = f72_data_int[64]; - wire f72_eof_int = f72_data_int[65]; - - reg phase; - wire half_line = f72_eof_int & ( (f72_occ_int==1)|(f72_occ_int==2)|(f72_occ_int==3)|(f72_occ_int==4) ); - - assign f36_data_int[31:0] = (LE ^ phase) ? f72_data_int[31:0] : f72_data_int[63:32]; - assign f36_data_int[32] = phase ? 0 : f72_sof_int; - assign f36_data_int[33] = phase ? f72_eof_int : half_line; - assign f36_data_int[35:34] = f36_data_int[33] ? f72_occ_int[1:0] : 2'b00; - - assign f36_src_rdy_int = f72_src_rdy_int; - assign f72_dst_rdy_int = (phase | half_line) & f36_dst_rdy_int; - - wire f36_xfer = f36_src_rdy_int & f36_dst_rdy_int; - wire f72_xfer = f72_src_rdy_int & f72_dst_rdy_int; - - always @(posedge clk) - if(reset) - phase <= 0; - else if(f72_xfer) - phase <= 0; - else if(f36_xfer) - phase <= 1; - - // Shortfifo on output to guarantee no deadlock - fifo_short #(.WIDTH(36)) tail_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f36_data_int), .src_rdy_i(f36_src_rdy_int), .dst_rdy_o(f36_dst_rdy_int), - .dataout(f36_dataout), .src_rdy_o(f36_src_rdy_o), .dst_rdy_i(f36_dst_rdy_i), - .space(),.occupied() ); - -endmodule // fifo72_to_fifo36 diff --git a/fpga/usrp2/fifo/fifo_19to36_tb.v b/fpga/usrp2/fifo/fifo_19to36_tb.v deleted file mode 100644 index 143b92b1b..000000000 --- a/fpga/usrp2/fifo/fifo_19to36_tb.v +++ /dev/null @@ -1,99 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - -module fifo_tb(); - - reg clk = 0; - reg rst = 1; - reg clear = 0; - initial #1000 rst = 0; - always #50 clk = ~clk; - - reg [18:0] f19a; - wire [18:0] f19b, f19c, f19d; - wire [35:0] f36a, f36b; - - reg f19a_sr = 0; - wire f19b_sr, f19c_sr, f19d_sr, f36a_sr, f36b_sr; - wire f19a_dr, f19b_dr, f19c_dr, f19d_dr, f36a_dr, f36b_dr; - - fifo_short #(.WIDTH(19)) fifo_short1 - (.clk(clk),.reset(rst),.clear(clear), - .datain(f19a),.src_rdy_i(f19a_sr),.dst_rdy_o(f19a_dr), - .dataout(f19b),.src_rdy_o(f19b_sr),.dst_rdy_i(f19b_dr) ); - - fifo19_to_fifo36 fifo19_to_fifo36 - (.clk(clk),.reset(rst),.clear(clear), - .f19_datain(f19b),.f19_src_rdy_i(f19b_sr),.f19_dst_rdy_o(f19b_dr), - .f36_dataout(f36a),.f36_src_rdy_o(f36a_sr),.f36_dst_rdy_i(f36a_dr) ); - - fifo_short #(.WIDTH(36)) fifo_short2 - (.clk(clk),.reset(rst),.clear(clear), - .datain(f36a),.src_rdy_i(f36a_sr),.dst_rdy_o(f36a_dr), - .dataout(f36b),.src_rdy_o(f36b_sr),.dst_rdy_i(f36b_dr) ); - - fifo36_to_fifo19 fifo36_to_fifo19 - (.clk(clk),.reset(rst),.clear(clear), - .f36_datain(f36b),.f36_src_rdy_i(f36b_sr),.f36_dst_rdy_o(f36b_dr), - .f19_dataout(f19c),.f19_src_rdy_o(f19c_sr),.f19_dst_rdy_i(f19c_dr) ); - - fifo_short #(.WIDTH(19)) fifo_short3 - (.clk(clk),.reset(rst),.clear(clear), - .datain(f19c),.src_rdy_i(f19c_sr),.dst_rdy_o(f19c_dr), - .dataout(f19d),.src_rdy_o(f19d_sr),.dst_rdy_i(f19d_dr) ); - - assign f19d_dr = 1; - - always @(posedge clk) - if(f19a_sr & f19a_dr) - $display("18IN: %h", f19a); - - always @(posedge clk) - if(f19d_sr & f19d_dr) - $display(" 18OUT: %h", f19d); - - always @(posedge clk) - if(f36b_sr & f36b_dr) - $display(" 36: %h", f36b); - - initial $dumpfile("fifo_tb.vcd"); - initial $dumpvars(0,fifo_tb); - - initial - begin - @(negedge rst); - @(posedge clk); - repeat (2) - begin - f19a <= 19'h1_AA01; - f19a_sr <= 1; - @(posedge clk); - f19a <= 19'h0_AA02; - repeat (4) - begin - @(posedge clk); - f19a <= f19a + 1; - end - f19a[18:16] <= 3'b010; - @(posedge clk); - f19a_sr <= 0; - f19a <= 19'h7_FFFF; - @(posedge clk); - end - #20000 $finish; - end -endmodule // longfifo_tb diff --git a/fpga/usrp2/fifo/fifo_2clock.v b/fpga/usrp2/fifo/fifo_2clock.v deleted file mode 100644 index 98aab18a5..000000000 --- a/fpga/usrp2/fifo/fifo_2clock.v +++ /dev/null @@ -1,141 +0,0 @@ -// -// Copyright 2011-2012 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// FIXME ignores the AWIDTH (fifo size) parameter - -module fifo_2clock - #(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: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; - - generate - if((WIDTH <= 36) && (WIDTH > 19)) begin - wire [35:0] data_in_wide, data_out_wide; - assign data_in_wide[WIDTH-1:0] = datain; - assign dataout = data_out_wide[WIDTH-1:0]; - if(SIZE==9) - fifo_xlnx_512x36_2clk fifo_xlnx_512x36_2clk - (.rst(arst), - .wr_clk(wclk),.din(data_in_wide),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(data_out_wide),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - else if(SIZE==11) - fifo_xlnx_2Kx36_2clk fifo_xlnx_2Kx36_2clk - (.rst(arst), - .wr_clk(wclk),.din(data_in_wide),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(data_out_wide),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - else if(SIZE==6) - fifo_xlnx_64x36_2clk fifo_xlnx_64x36_2clk - (.rst(arst), - .wr_clk(wclk),.din(data_in_wide),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(data_out_wide),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - else - fifo_xlnx_512x36_2clk fifo_xlnx_512x36_2clk - (.rst(arst), - .wr_clk(wclk),.din(data_in_wide),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(data_out_wide),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - end - else if((WIDTH <= 19) && (SIZE <= 4)) begin - wire [18:0] data_in_wide, data_out_wide; - assign data_in_wide[WIDTH-1:0] = datain; - assign dataout = data_out_wide[WIDTH-1:0]; - fifo_xlnx_16x19_2clk fifo_xlnx_16x19_2clk - (.rst(arst), - .wr_clk(wclk),.din(data_in_wide),.full(full),.wr_en(write),.wr_data_count(level_wclk), - .rd_clk(rclk),.dout(data_out_wide),.empty(empty),.rd_en(read),.rd_data_count(level_rclk) ); - end - endgenerate - - assign occupied = {{(16-SIZE-1){1'b0}},level_rclk}; - assign space = ((1<<SIZE)+1)-level_wclk; - -endmodule // fifo_2clock - -/* -`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/fpga/usrp2/fifo/fifo_2clock_cascade.v b/fpga/usrp2/fifo/fifo_2clock_cascade.v deleted file mode 100644 index 49cac7097..000000000 --- a/fpga/usrp2/fifo/fifo_2clock_cascade.v +++ /dev/null @@ -1,58 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -module fifo_2clock_cascade - #(parameter WIDTH=32, SIZE=9) - (input wclk, input [WIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, - output [15:0] space, output [15:0] short_space, - input rclk, output [WIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, - output [15:0] occupied, output [15:0] short_occupied, - input arst); - - wire [WIDTH-1:0] data_int1, data_int2; - wire src_rdy_int1, src_rdy_int2, dst_rdy_int1, dst_rdy_int2; - wire [SIZE-1:0] level_wclk, level_rclk; - wire [4:0] s1_space, s1_occupied, s2_space, s2_occupied; - wire [15:0] l_space, l_occupied; - - fifo_short #(.WIDTH(WIDTH)) 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), - .space(s1_space), .occupied(s1_occupied) ); - - 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) ); - - fifo_short #(.WIDTH(WIDTH)) 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), - .space(s2_space), .occupied(s2_occupied)); - - // Be conservative -- Only advertise space from input side of fifo, occupied from output side - assign space = {11'b0,s1_space} + l_space; - assign occupied = {11'b0,s2_occupied} + l_occupied; - - // For the fifo_extram, we only want to know the immediately adjacent space - assign short_space = {11'b0,s1_space}; - assign short_occupied = {11'b0,s2_occupied}; - -endmodule // fifo_2clock_cascade diff --git a/fpga/usrp2/fifo/fifo_cascade.v b/fpga/usrp2/fifo/fifo_cascade.v deleted file mode 100644 index 5a79c4090..000000000 --- a/fpga/usrp2/fifo/fifo_cascade.v +++ /dev/null @@ -1,69 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -// 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 fifo_cascade - #(parameter WIDTH=32, SIZE=9) - (input clk, input reset, input clear, - input [WIDTH-1:0] datain, - input src_rdy_i, - output dst_rdy_o, - output [WIDTH-1:0] dataout, - output src_rdy_o, - input dst_rdy_i, - output [15:0] space, - output [15:0] occupied); - - wire [WIDTH-1:0] data_int, data_int2; - wire src_rdy_1, dst_rdy_1, src_rdy_2, dst_rdy_2; - - wire [4:0] s1_space, s1_occupied, s2_space, s2_occupied; - wire [15:0] l_space, l_occupied; - - fifo_short #(.WIDTH(WIDTH)) head_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(datain), .src_rdy_i(src_rdy_i), .dst_rdy_o(dst_rdy_o), - .dataout(data_int), .src_rdy_o(src_rdy_1), .dst_rdy_i(dst_rdy_1), - .space(s1_space),.occupied(s1_occupied) ); - - fifo_long #(.WIDTH(WIDTH),.SIZE(SIZE)) middle_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(data_int), .src_rdy_i(src_rdy_1), .dst_rdy_o(dst_rdy_1), - .dataout(data_int2), .src_rdy_o(src_rdy_2), .dst_rdy_i(dst_rdy_2), - .space(l_space),.occupied(l_occupied) ); - - fifo_short #(.WIDTH(WIDTH)) tail_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(data_int2), .src_rdy_i(src_rdy_2), .dst_rdy_o(dst_rdy_2), - .dataout(dataout), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i), - .space(s2_space),.occupied(s2_occupied) ); - - 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/fpga/usrp2/fifo/fifo_long.v b/fpga/usrp2/fifo/fifo_long.v deleted file mode 100644 index c4f0a1cc2..000000000 --- a/fpga/usrp2/fifo/fifo_long.v +++ /dev/null @@ -1,165 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// FIFO intended to be interchangeable with shortfifo, but -// based on block ram instead of SRL16's -// only one clock domain - -// Port A is write port, Port B is read port - -module fifo_long - #(parameter WIDTH=32, SIZE=9) - (input clk, input reset, input clear, - input [WIDTH-1:0] datain, - input src_rdy_i, - output dst_rdy_o, - output [WIDTH-1:0] dataout, - output src_rdy_o, - input dst_rdy_i, - - output reg [15:0] space, - output reg [15:0] occupied); - - wire write = src_rdy_i & dst_rdy_o; - wire read = dst_rdy_i & src_rdy_o; - wire full, empty; - - assign dst_rdy_o = ~full; - assign src_rdy_o = ~empty; - - // Read side states - localparam EMPTY = 0; - localparam PRE_READ = 1; - localparam READING = 2; - - reg [SIZE-1:0] wr_addr, rd_addr; - reg [1:0] read_state; - - reg empty_reg, full_reg; - always @(posedge clk) - if(reset) - wr_addr <= 0; - else if(clear) - wr_addr <= 0; - else if(write) - wr_addr <= wr_addr + 1; - - ram_2port #(.DWIDTH(WIDTH),.AWIDTH(SIZE)) - ram (.clka(clk), - .ena(1'b1), - .wea(write), - .addra(wr_addr), - .dia(datain), - .doa(), - - .clkb(clk), - .enb((read_state==PRE_READ)|read), - .web(0), - .addrb(rd_addr), - .dib({WIDTH{1'b1}}), - .dob(dataout)); - - always @(posedge clk) - if(reset) - begin - read_state <= EMPTY; - rd_addr <= 0; - empty_reg <= 1; - end - else - if(clear) - begin - read_state <= EMPTY; - rd_addr <= 0; - empty_reg <= 1; - end - else - case(read_state) - EMPTY : - if(write) - begin - //rd_addr <= wr_addr; - read_state <= PRE_READ; - end - PRE_READ : - begin - read_state <= READING; - empty_reg <= 0; - rd_addr <= rd_addr + 1; - end - - READING : - if(read) - if(rd_addr == wr_addr) - begin - empty_reg <= 1; - if(write) - read_state <= PRE_READ; - else - read_state <= EMPTY; - end - else - rd_addr <= rd_addr + 1; - endcase // case(read_state) - - wire [SIZE-1:0] dont_write_past_me = rd_addr - 3; - wire becoming_full = wr_addr == dont_write_past_me; - - always @(posedge clk) - if(reset) - full_reg <= 0; - else if(clear) - full_reg <= 0; - else if(read & ~write) - full_reg <= 0; - //else if(write & ~read & (wr_addr == (rd_addr-3))) - else if(write & ~read & becoming_full) - full_reg <= 1; - - //assign empty = (read_state != READING); - assign empty = empty_reg; - - // assign full = ((rd_addr - 1) == wr_addr); - assign full = full_reg; - - ////////////////////////////////////////////// - // space and occupied are for diagnostics only - // not guaranteed exact - - localparam NUMLINES = (1<<SIZE)-2; - always @(posedge clk) - if(reset) - space <= NUMLINES; - else if(clear) - space <= NUMLINES; - else if(read & ~write) - space <= space + 1; - else if(write & ~read) - space <= space - 1; - - always @(posedge clk) - if(reset) - occupied <= 0; - else if(clear) - occupied <= 0; - else if(read & ~write) - occupied <= occupied - 1; - else if(write & ~read) - occupied <= occupied + 1; - -endmodule // fifo_long diff --git a/fpga/usrp2/fifo/fifo_pacer.v b/fpga/usrp2/fifo/fifo_pacer.v deleted file mode 100644 index 3e3fbf8b8..000000000 --- a/fpga/usrp2/fifo/fifo_pacer.v +++ /dev/null @@ -1,41 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module fifo_pacer - (input clk, - input reset, - input [7:0] rate, - input enable, - input src1_rdy_i, output dst1_rdy_o, - output src2_rdy_o, input dst2_rdy_i, - output underrun, overrun); - - wire strobe; - - cic_strober strober (.clock(clk), .reset(reset), .enable(enable), - .rate(rate), .strobe_fast(1), .strobe_slow(strobe)); - - wire all_ready = src1_rdy_i & dst2_rdy_i; - assign dst1_rdy_o = all_ready & strobe; - assign src2_rdy_o = dst1_rdy_o; - - assign underrun = strobe & ~src1_rdy_i; - assign overrun = strobe & ~dst2_rdy_i; - -endmodule // fifo_pacer diff --git a/fpga/usrp2/fifo/fifo_short.v b/fpga/usrp2/fifo/fifo_short.v deleted file mode 100644 index 32f26beef..000000000 --- a/fpga/usrp2/fifo/fifo_short.v +++ /dev/null @@ -1,112 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -module fifo_short - #(parameter WIDTH=32) - (input clk, input reset, input clear, - input [WIDTH-1:0] datain, - input src_rdy_i, - output dst_rdy_o, - output [WIDTH-1:0] dataout, - output src_rdy_o, - input dst_rdy_i, - - output reg [4:0] space, - output reg [4:0] occupied); - - reg full, empty; - wire write = src_rdy_i & dst_rdy_o; - wire read = dst_rdy_i & src_rdy_o; - - assign dst_rdy_o = ~full; - assign src_rdy_o = ~empty; - - reg [3:0] a; - genvar i; - - generate - for (i=0;i<WIDTH;i=i+1) - begin : gen_srl16 - SRL16E - srl16e(.Q(dataout[i]), - .A0(a[0]),.A1(a[1]),.A2(a[2]),.A3(a[3]), - .CE(write),.CLK(clk),.D(datain[i])); - end - endgenerate - - always @(posedge clk) - if(reset) - begin - a <= 0; - empty <= 1; - full <= 0; - end - else if(clear) - begin - a <= 0; - empty <= 1; - full<= 0; - end - else if(read & ~write) - begin - full <= 0; - if(a==0) - empty <= 1; - else - a <= a - 1; - end - else if(write & ~read) - begin - empty <= 0; - if(~empty) - a <= a + 1; - if(a == 14) - full <= 1; - end - - // NOTE will fail if you write into a full fifo or read from an empty one - - ////////////////////////////////////////////////////////////// - // space and occupied are used for diagnostics, not - // guaranteed correct - - //assign space = full ? 0 : empty ? 16 : 15-a; - //assign occupied = empty ? 0 : full ? 16 : a+1; - - always @(posedge clk) - if(reset) - space <= 16; - else if(clear) - space <= 16; - else if(read & ~write) - space <= space + 1; - else if(write & ~read) - space <= space - 1; - - always @(posedge clk) - if(reset) - occupied <= 0; - else if(clear) - occupied <= 0; - else if(read & ~write) - occupied <= occupied - 1; - else if(write & ~read) - occupied <= occupied + 1; - -endmodule // fifo_short - diff --git a/fpga/usrp2/fifo/fifo_spec.txt b/fpga/usrp2/fifo/fifo_spec.txt deleted file mode 100644 index 133b9fa8e..000000000 --- a/fpga/usrp2/fifo/fifo_spec.txt +++ /dev/null @@ -1,36 +0,0 @@ - - -FIFO and Buffer Interface Spec - -Buffer Interface Data Wires -- matches fifo36 - DATA[31:0] - FLAGS[3:0] - Bit 0 SOP - Bit 1 EOP - If SOP=1 && EOP=1, OCC contains error flags - Bits 3:2 OCC[1:0] --> 00 = all 4 bytes - 01 = 1 byte - 10 = 2 bytes - 11 = 3 bytes - -fifo36 --> {OCC[1:0],EOP,SOP,DATA[31:0]} - OCC same as buffer interface - -fifo19 --> {OCC,EOP,SOP,DATA[15:0]} - Doesn't fit well into BRAM, dist RAM ok - OCC = 1 means last word is half full - = 0 means last word is full - -fifo18 --> {EOP,SOP,DATA[15:0]} - No half-word capability? Should we drop sop instead? - -Control Wires - Data into FIFO - SRC_RDY_i Upstream has data for me - DST_RDY_o I have space - Transfer occurs if SRC_RDI_i && DST_RDY_o - -Control Wires - Data out of FIFO - SRC_RDY_o I have data for downstream - DST_RDY_i Downstream has space - Transfer occurs if SRC_RDI_o && DST_RDY_i - diff --git a/fpga/usrp2/fifo/fifo_tb.v b/fpga/usrp2/fifo/fifo_tb.v deleted file mode 100644 index c63c201d0..000000000 --- a/fpga/usrp2/fifo/fifo_tb.v +++ /dev/null @@ -1,72 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - -module fifo_tb(); - - reg clk = 0; - reg rst = 1; - reg clear = 0; - initial #1000 rst = 0; - always #50 clk = ~clk; - - reg [31:0] f36_data = 0; - reg [1:0] f36_occ = 0; - reg f36_sof = 0, f36_eof = 0; - reg f36_src_rdy; - wire f36_dst_rdy; - - wire [7:0] ll_data; - wire ll_src_rdy, ll_dst_rdy, ll_sof, ll_eof; - wire [35:0] err_dat; - wire err_src_rdy, err_dst_rdy; - - fifo36_to_ll8 fifo36_to_ll8 - (.clk(clk),.reset(rst),.clear(clear), - .f36_data({f36_occ,f36_eof,f36_sof,f36_data}),.f36_src_rdy_i(f36_src_rdy),.f36_dst_rdy_o(f36_dst_rdy), - .ll_data(ll_data),.ll_sof(ll_sof),.ll_eof(ll_eof), - .ll_src_rdy(ll_src_rdy),.ll_dst_rdy(ll_dst_rdy)); - - assign ll_dst_rdy = 1; - - always @(posedge clk) - if(ll_src_rdy) - $display("LL: SOF %d, EOF %d, DAT %x",ll_sof,ll_eof,ll_data); - - initial $dumpfile("fifo_tb.vcd"); - initial $dumpvars(0,fifo_tb); - - initial - begin - @(negedge rst); - @(posedge clk); - @(posedge clk); - @(posedge clk); - @(posedge clk); - f36_src_rdy <= 1; - {f36_occ,f36_eof,f36_sof,f36_data} <= { 2'b00,1'b0,1'b1,32'h00010203}; - @(posedge clk); - {f36_occ,f36_eof,f36_sof,f36_data} <= { 2'b00,1'b0,1'b0,32'h04050607}; - @(posedge clk); - {f36_occ,f36_eof,f36_sof,f36_data} <= { 2'b00,1'b0,1'b0,32'h08090a0b}; - @(posedge clk); - {f36_occ,f36_eof,f36_sof,f36_data} <= { 2'b11,1'b1,1'b0,32'h0c0d0e0f}; - @(posedge clk); - f36_src_rdy <= 0; - end - - initial #4000 $finish; -endmodule // longfifo_tb diff --git a/fpga/usrp2/fifo/ll8_shortfifo.v b/fpga/usrp2/fifo/ll8_shortfifo.v deleted file mode 100644 index 49b3a3139..000000000 --- a/fpga/usrp2/fifo/ll8_shortfifo.v +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -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/fpga/usrp2/fifo/ll8_to_fifo19.v b/fpga/usrp2/fifo/ll8_to_fifo19.v deleted file mode 100644 index 4503d0c3d..000000000 --- a/fpga/usrp2/fifo/ll8_to_fifo19.v +++ /dev/null @@ -1,104 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -module ll8_to_fifo19 - (input clk, input reset, input clear, - input [7:0] ll_data, - input ll_sof, - input ll_eof, - input ll_src_rdy, - output ll_dst_rdy, - - output [18:0] f19_data, - output f19_src_rdy_o, - input f19_dst_rdy_i ); - - // Short FIFO on input to guarantee no deadlock - wire [7:0] ll_data_int; - wire ll_sof_int, ll_eof_int, ll_src_rdy_int, ll_dst_rdy_int; - - ll8_shortfifo head_fifo - (.clk(clk), .reset(reset), .clear(clear), - .datain(ll_data), .sof_i(ll_sof), .eof_i(ll_eof), - .error_i(0), .src_rdy_i(ll_src_rdy), .dst_rdy_o(ll_dst_rdy), - .dataout(ll_data_int), .sof_o(ll_sof_int), .eof_o(ll_eof_int), - .error_o(), .src_rdy_o(ll_src_rdy_int), .dst_rdy_i(ll_dst_rdy_int)); - - // Actual ll8_to_fifo19 which could deadlock if not connected to a shortfifo - localparam XFER_EMPTY = 0; - localparam XFER_HALF = 1; - localparam XFER_HALF_WRITE = 3; - - wire [18:0] f19_data_int; - wire f19_sof_int, f19_eof_int, f19_occ_int, f19_src_rdy_int, f19_dst_rdy_int; - - wire xfer_out = f19_src_rdy_int & f19_dst_rdy_int; - wire xfer_in = ll_src_rdy_int & ll_dst_rdy_int; - reg hold_sof; - - reg [1:0] state; - reg [7:0] hold_reg; - - always @(posedge clk) - if(ll_src_rdy_int & (state==XFER_EMPTY)) - hold_reg <= ll_data_int; - - always @(posedge clk) - if(ll_sof_int & (state==XFER_EMPTY)) - hold_sof <= 1; - else if(xfer_out) - hold_sof <= 0; - - always @(posedge clk) - if(reset | clear) - state <= XFER_EMPTY; - else - case(state) - XFER_EMPTY : - if(ll_src_rdy_int) - if(ll_eof_int) - state <= XFER_HALF_WRITE; - else - state <= XFER_HALF; - XFER_HALF : - if(ll_src_rdy_int & f19_dst_rdy_int) - state <= XFER_EMPTY; - XFER_HALF_WRITE : - if(f19_dst_rdy_int) - state <= XFER_EMPTY; - endcase // case (state) - - assign ll_dst_rdy_int = (state==XFER_EMPTY) | ((state==XFER_HALF)&f19_dst_rdy_int); - assign f19_src_rdy_int= (state==XFER_HALF_WRITE) | ((state==XFER_HALF)&ll_src_rdy_int); - - assign f19_sof_int = hold_sof | (ll_sof_int & (state==XFER_HALF)); - assign f19_eof_int = (state == XFER_HALF_WRITE) | ll_eof_int; - assign f19_occ_int = (state == XFER_HALF_WRITE); - - assign f19_data_int = {f19_occ_int,f19_eof_int,f19_sof_int,hold_reg,ll_data_int}; - - // Shortfifo on output to guarantee no deadlock - fifo_short #(.WIDTH(19)) tail_fifo - (.clk(clk),.reset(reset),.clear(clear), - .datain(f19_data_int), .src_rdy_i(f19_src_rdy_int), .dst_rdy_o(f19_dst_rdy_int), - .dataout(f19_data), .src_rdy_o(f19_src_rdy_o), .dst_rdy_i(f19_dst_rdy_i), - .space(),.occupied() ); - - -endmodule // ll8_to_fifo19 - diff --git a/fpga/usrp2/fifo/ll8_to_fifo36.v b/fpga/usrp2/fifo/ll8_to_fifo36.v deleted file mode 100644 index b26f745d2..000000000 --- a/fpga/usrp2/fifo/ll8_to_fifo36.v +++ /dev/null @@ -1,114 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -module ll8_to_fifo36 - (input clk, input reset, input clear, - input [7:0] ll_data, - input ll_sof_n, - input ll_eof_n, - input ll_src_rdy_n, - output ll_dst_rdy_n, - - output [35:0] f36_data, - output f36_src_rdy_o, - input f36_dst_rdy_i ); - - wire f36_write = f36_src_rdy_o & f36_dst_rdy_i; - - // Why anybody would use active low in an FPGA is beyond me... - wire ll_sof = ~ll_sof_n; - wire ll_eof = ~ll_eof_n; - wire ll_src_rdy = ~ll_src_rdy_n; - wire ll_dst_rdy; - assign ll_dst_rdy_n = ~ll_dst_rdy; - - reg f36_sof, f36_eof; - reg [1:0] f36_occ; - - - reg [2:0] state; - reg [7:0] dat0, dat1, dat2, dat3; - - always @(posedge clk) - if(ll_src_rdy & ((state==0)|f36_write)) - f36_sof <= ll_sof; - - always @(posedge clk) - if(ll_src_rdy & ((state !=4)|f36_write)) - f36_eof <= ll_eof; - - always @(posedge clk) - if(ll_eof) - f36_occ <= state[1:0] + 1; - else - f36_occ <= 0; - - always @(posedge clk) - if(reset) - state <= 0; - else - if(ll_src_rdy) - case(state) - 0 : - if(ll_eof) - state <= 4; - else - state <= 1; - 1 : - if(ll_eof) - state <= 4; - else - state <= 2; - 2 : - if(ll_eof) - state <= 4; - else - state <= 3; - 3 : state <= 4; - 4 : - if(f36_dst_rdy_i) - if(ll_eof) - state <= 4; - else - state <= 1; - endcase // case(state) - else - if(f36_write) - state <= 0; - - always @(posedge clk) - if(ll_src_rdy & (state==3)) - dat3 <= ll_data; - - always @(posedge clk) - if(ll_src_rdy & (state==2)) - dat2 <= ll_data; - - always @(posedge clk) - if(ll_src_rdy & (state==1)) - dat1 <= ll_data; - - always @(posedge clk) - if(ll_src_rdy & ((state==0) | f36_write)) - dat0 <= ll_data; - - assign ll_dst_rdy = f36_dst_rdy_i | (state != 4); - assign f36_data = {f36_occ,f36_eof,f36_sof,dat0,dat1,dat2,dat3}; // FIXME endianess - assign f36_src_rdy_o = (state == 4); - -endmodule // ll8_to_fifo36 diff --git a/fpga/usrp2/fifo/packet32_tb.v b/fpga/usrp2/fifo/packet32_tb.v deleted file mode 100644 index 8a7cfcec5..000000000 --- a/fpga/usrp2/fifo/packet32_tb.v +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module packet32_tb(); - - wire [35:0] data; - wire src_rdy, dst_rdy; - - wire clear = 0; - reg clk = 0; - reg reset = 1; - - always #10 clk <= ~clk; - initial #1000 reset <= 0; - - initial $dumpfile("packet32_tb.vcd"); - initial $dumpvars(0,packet32_tb); - - wire [31:0] total, crc_err, seq_err, len_err; - - packet_generator32 pkt_gen (.clk(clk), .reset(reset), .clear(clear), - .data_o(data), .src_rdy_o(src_rdy), .dst_rdy_i(dst_rdy)); - - packet_verifier32 pkt_ver (.clk(clk), .reset(reset), .clear(clear), - .data_i(data), .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy), - .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err)); - -endmodule // packet32_tb diff --git a/fpga/usrp2/fifo/packet_dispatcher36_x3.v b/fpga/usrp2/fifo/packet_dispatcher36_x3.v deleted file mode 100644 index 0f9e752c8..000000000 --- a/fpga/usrp2/fifo/packet_dispatcher36_x3.v +++ /dev/null @@ -1,294 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// Packet dispatcher with fifo36 interface and 3 outputs. -// -// The packet dispatcher expects 2-byte padded ethernet frames. -// The frames will be inspected at ethernet, IPv4, UDP, and VRT layers. -// Packets are dispatched into the following streams: -// * tx dsp stream -// * to cpu stream -// * to external stream -// * to both cpu and external -// -// The following registers are used for dispatcher control: -// * base + 0 = this ipv4 address (32 bits) -// * base + 1 = udp dst port (lower 16 bits) -// - -module packet_dispatcher36_x3 - #( - parameter BASE = 0 - ) - ( - //clocking and reset interface: - input clk, input rst, input clr, - - //setting register interface: - input set_stb, input [7:0] set_addr, input [31:0] set_data, - - //input stream interfaces: - input [35:0] com_inp_data, input com_inp_valid, output com_inp_ready, - - //output stream interfaces: - output [35:0] ext_out_data, output ext_out_valid, input ext_out_ready, - output [35:0] dsp_out_data, output dsp_out_valid, input dsp_out_ready, - output [35:0] cpu_out_data, output cpu_out_valid, input cpu_out_ready - ); - - //setting register to program the IP address - wire [31:0] my_ip_addr; - setting_reg #(.my_addr(BASE+0)) sreg_ip_addr( - .clk(clk),.rst(rst), - .strobe(set_stb),.addr(set_addr),.in(set_data), - .out(my_ip_addr),.changed() - ); - - //setting register to program the UDP DSP port - wire [15:0] dsp_udp_port; - setting_reg #(.my_addr(BASE+1), .width(16)) sreg_data_port( - .clk(clk),.rst(rst), - .strobe(set_stb),.addr(set_addr),.in(set_data), - .out(dsp_udp_port),.changed() - ); - - //////////////////////////////////////////////////////////////////// - // Communication input inspector - // - inspect com input and send it to DSP, EXT, CPU, or BOTH - //////////////////////////////////////////////////////////////////// - localparam PD_STATE_READ_COM_PRE = 0; - localparam PD_STATE_READ_COM = 1; - localparam PD_STATE_WRITE_REGS = 2; - localparam PD_STATE_WRITE_LIVE = 3; - - localparam PD_DEST_DSP = 0; - localparam PD_DEST_EXT = 1; - localparam PD_DEST_CPU = 2; - localparam PD_DEST_BOF = 3; - - localparam PD_MAX_NUM_DREGS = 13; //padded_eth + ip + udp + seq + vrt_hdr - localparam PD_DREGS_DSP_OFFSET = 11; //offset to start dsp at - - //output inspector interfaces - wire [35:0] pd_out_dsp_data; - wire pd_out_dsp_valid; - wire pd_out_dsp_ready; - - wire [35:0] pd_out_ext_data; - wire pd_out_ext_valid; - wire pd_out_ext_ready; - - wire [35:0] pd_out_cpu_data; - wire pd_out_cpu_valid; - wire pd_out_cpu_ready; - - wire [35:0] pd_out_bof_data; - wire pd_out_bof_valid; - wire pd_out_bof_ready; - - reg [1:0] pd_state; - reg [1:0] pd_dest; - reg [3:0] pd_dreg_count; //data registers to buffer headers - wire [3:0] pd_dreg_count_next = pd_dreg_count + 1'b1; - wire pd_dreg_counter_done = (pd_dreg_count_next == PD_MAX_NUM_DREGS)? 1'b1 : 1'b0; - reg [35:0] pd_dregs [PD_MAX_NUM_DREGS-1:0]; - - reg is_eth_dst_mac_bcast; - reg is_eth_type_ipv4; - reg is_eth_ipv4_proto_udp; - reg is_eth_ipv4_dst_addr_here; - reg is_eth_udp_dst_port_here; - wire is_vrt_size_zero = (com_inp_data[15:0] == 16'h0); //needed on the same cycle, so it cant be registered - - //Inspector output flags special case: - //Inject SOF into flags at first DSP line. - wire [3:0] pd_out_flags = ( - (pd_dreg_count == PD_DREGS_DSP_OFFSET) && - (pd_dest == PD_DEST_DSP) - )? 4'b0001 : pd_dregs[pd_dreg_count][35:32]; - - //The communication inspector ouput data and valid signals: - //Mux between com input and data registers based on the state. - wire [35:0] pd_out_data = (pd_state == PD_STATE_WRITE_REGS)? - {pd_out_flags, pd_dregs[pd_dreg_count][31:0]} : com_inp_data - ; - wire pd_out_valid = - (pd_state == PD_STATE_WRITE_REGS)? 1'b1 : ( - (pd_state == PD_STATE_WRITE_LIVE)? com_inp_valid : ( - 1'b0)); - - //The communication inspector ouput ready signal: - //Mux between the various destination ready signals. - wire pd_out_ready = - (pd_dest == PD_DEST_DSP)? pd_out_dsp_ready : ( - (pd_dest == PD_DEST_EXT)? pd_out_ext_ready : ( - (pd_dest == PD_DEST_CPU)? pd_out_cpu_ready : ( - (pd_dest == PD_DEST_BOF)? pd_out_bof_ready : ( - 1'b0)))); - - //Always connected output data lines. - assign pd_out_dsp_data = pd_out_data; - assign pd_out_ext_data = pd_out_data; - assign pd_out_cpu_data = pd_out_data; - assign pd_out_bof_data = pd_out_data; - - //Destination output valid signals: - //Comes from inspector valid when destination is selected, and otherwise low. - assign pd_out_dsp_valid = (pd_dest == PD_DEST_DSP)? pd_out_valid : 1'b0; - assign pd_out_ext_valid = (pd_dest == PD_DEST_EXT)? pd_out_valid : 1'b0; - assign pd_out_cpu_valid = (pd_dest == PD_DEST_CPU)? pd_out_valid : 1'b0; - assign pd_out_bof_valid = (pd_dest == PD_DEST_BOF)? pd_out_valid : 1'b0; - - //The communication inspector ouput ready signal: - //Always ready when storing to data registers, - //comes from inspector ready output when live, - //and otherwise low. - assign com_inp_ready = - (pd_state == PD_STATE_READ_COM_PRE) ? 1'b1 : ( - (pd_state == PD_STATE_READ_COM) ? 1'b1 : ( - (pd_state == PD_STATE_WRITE_LIVE) ? pd_out_ready : ( - 1'b0))); - - //inspect the incoming data and mark register booleans - always @(posedge clk) - if (com_inp_ready & com_inp_valid) begin - case(pd_dreg_count) - 0: begin - is_eth_dst_mac_bcast <= (com_inp_data[15:0] == 16'hffff); - end - 1: begin - is_eth_dst_mac_bcast <= is_eth_dst_mac_bcast && (com_inp_data[31:0] == 32'hffffffff); - end - 3: begin - is_eth_type_ipv4 <= (com_inp_data[15:0] == 16'h800); - end - 6: begin - is_eth_ipv4_proto_udp <= (com_inp_data[23:16] == 8'h11); - end - 8: begin - is_eth_ipv4_dst_addr_here <= (com_inp_data[31:0] == my_ip_addr); - end - 9: begin - is_eth_udp_dst_port_here <= (com_inp_data[15:0] == dsp_udp_port); - end - endcase //pd_dreg_count - end - - always @(posedge clk) - if(rst | clr) begin - pd_state <= PD_STATE_READ_COM_PRE; - pd_dreg_count <= 0; - end - else begin - case(pd_state) - PD_STATE_READ_COM_PRE: begin - if (com_inp_ready & com_inp_valid & com_inp_data[32]) begin - pd_state <= PD_STATE_READ_COM; - pd_dreg_count <= pd_dreg_count_next; - pd_dregs[pd_dreg_count] <= com_inp_data; - end - end - - PD_STATE_READ_COM: begin - if (com_inp_ready & com_inp_valid) begin - pd_dregs[pd_dreg_count] <= com_inp_data; - if (pd_dreg_counter_done | com_inp_data[33]) begin - pd_state <= PD_STATE_WRITE_REGS; - pd_dreg_count <= 0; - - //---------- begin inspection decision -----------// - //EOF or bcast or not IPv4 or not UDP: - if ( - com_inp_data[33] || is_eth_dst_mac_bcast || - ~is_eth_type_ipv4 || ~is_eth_ipv4_proto_udp - ) begin - pd_dest <= PD_DEST_BOF; - end - - //not my IP address: - else if (~is_eth_ipv4_dst_addr_here) begin - pd_dest <= PD_DEST_EXT; - end - - //UDP data port and VRT: - else if (is_eth_udp_dst_port_here && ~is_vrt_size_zero) begin - pd_dest <= PD_DEST_DSP; - pd_dreg_count <= PD_DREGS_DSP_OFFSET; - end - - //other: - else begin - pd_dest <= PD_DEST_CPU; - end - //---------- end inspection decision -------------// - - end - else begin - pd_dreg_count <= pd_dreg_count_next; - end - end - end - - PD_STATE_WRITE_REGS: begin - if (pd_out_ready & pd_out_valid) begin - if (pd_out_data[33]) begin - pd_state <= PD_STATE_READ_COM_PRE; - pd_dreg_count <= 0; - end - else if (pd_dreg_counter_done) begin - pd_state <= PD_STATE_WRITE_LIVE; - pd_dreg_count <= 0; - end - else begin - pd_dreg_count <= pd_dreg_count_next; - end - end - end - - PD_STATE_WRITE_LIVE: begin - if (pd_out_ready & pd_out_valid & pd_out_data[33]) begin - pd_state <= PD_STATE_READ_COM_PRE; - end - end - - endcase //pd_state - end - - //connect this fast-path signals directly to the DSP out - assign dsp_out_data = pd_out_dsp_data; - assign dsp_out_valid = pd_out_dsp_valid; - assign pd_out_dsp_ready = dsp_out_ready; - - //////////////////////////////////////////////////////////////////// - // Splitter and output muxes for the bof packets - // - split the bof packets into two streams - // - mux split packets into cpu out and ext out - //////////////////////////////////////////////////////////////////// - - //dummy signals to join the the splitter and muxes below - wire [35:0] _split_to_ext_data, _split_to_cpu_data; - wire _split_to_ext_valid, _split_to_cpu_valid; - wire _split_to_ext_ready, _split_to_cpu_ready; - - splitter36 bof_out_splitter( - .clk(clk), .rst(rst), .clr(clr), - .inp_data(pd_out_bof_data), .inp_valid(pd_out_bof_valid), .inp_ready(pd_out_bof_ready), - .out0_data(_split_to_ext_data), .out0_valid(_split_to_ext_valid), .out0_ready(_split_to_ext_ready), - .out1_data(_split_to_cpu_data), .out1_valid(_split_to_cpu_valid), .out1_ready(_split_to_cpu_ready) - ); - - fifo36_mux ext_out_mux( - .clk(clk), .reset(rst), .clear(clr), - .data0_i(pd_out_ext_data), .src0_rdy_i(pd_out_ext_valid), .dst0_rdy_o(pd_out_ext_ready), - .data1_i(_split_to_ext_data), .src1_rdy_i(_split_to_ext_valid), .dst1_rdy_o(_split_to_ext_ready), - .data_o(ext_out_data), .src_rdy_o(ext_out_valid), .dst_rdy_i(ext_out_ready) - ); - - fifo36_mux cpu_out_mux( - .clk(clk), .reset(rst), .clear(clr), - .data0_i(pd_out_cpu_data), .src0_rdy_i(pd_out_cpu_valid), .dst0_rdy_o(pd_out_cpu_ready), - .data1_i(_split_to_cpu_data), .src1_rdy_i(_split_to_cpu_valid), .dst1_rdy_o(_split_to_cpu_ready), - .data_o(cpu_out_data), .src_rdy_o(cpu_out_valid), .dst_rdy_i(cpu_out_ready) - ); - -endmodule // packet_dispatcher36_x3 diff --git a/fpga/usrp2/fifo/packet_dispatcher36_x4.v b/fpga/usrp2/fifo/packet_dispatcher36_x4.v deleted file mode 100644 index 7eedb3e74..000000000 --- a/fpga/usrp2/fifo/packet_dispatcher36_x4.v +++ /dev/null @@ -1,316 +0,0 @@ -// -// Copyright 2011-2012 Ettus Research LLC -// -// Packet dispatcher with fifo36 interface and 4 outputs. -// -// The packet dispatcher expects 2-byte padded ethernet frames. -// The frames will be inspected at ethernet, IPv4, UDP, and VRT layers. -// Packets are dispatched into the following streams: -// * tx dsp stream -// * tx control stream -// * to cpu stream -// * to external stream -// * to both cpu and external -// -// The following registers are used for dispatcher control: -// * base + 0 = this ipv4 address (32 bits) -// * base + 1 = udp control port (upper 16 bits), udp dsp port (lower 16 bits) -// - -module packet_dispatcher36_x4 - #( - parameter BASE = 0 - ) - ( - //clocking and reset interface: - input clk, input rst, input clr, - - //setting register interface: - input set_stb, input [7:0] set_addr, input [31:0] set_data, - - //input stream interfaces: - input [35:0] com_inp_data, input com_inp_valid, output com_inp_ready, - - //output stream interfaces: - output [35:0] ext_out_data, output ext_out_valid, input ext_out_ready, - output [35:0] dsp_out_data, output dsp_out_valid, input dsp_out_ready, - output [35:0] ctl_out_data, output ctl_out_valid, input ctl_out_ready, - output [35:0] cpu_out_data, output cpu_out_valid, input cpu_out_ready - ); - - //setting register to program the IP address - wire [31:0] my_ip_addr; - setting_reg #(.my_addr(BASE+0)) sreg_ip_addr( - .clk(clk),.rst(rst), - .strobe(set_stb),.addr(set_addr),.in(set_data), - .out(my_ip_addr),.changed() - ); - - //setting register to program the UDP DSP port - wire [15:0] dsp_udp_port, ctl_udp_port; - setting_reg #(.my_addr(BASE+1), .width(32)) sreg_data_port( - .clk(clk),.rst(rst), - .strobe(set_stb),.addr(set_addr),.in(set_data), - .out({ctl_udp_port, dsp_udp_port}),.changed() - ); - - //////////////////////////////////////////////////////////////////// - // Communication input inspector - // - inspect com input and send it to DSP, EXT, CPU, or BOTH - //////////////////////////////////////////////////////////////////// - localparam PD_STATE_READ_COM_PRE = 0; - localparam PD_STATE_READ_COM = 1; - localparam PD_STATE_WRITE_REGS = 2; - localparam PD_STATE_WRITE_LIVE = 3; - - localparam PD_DEST_DSP = 0; - localparam PD_DEST_EXT = 1; - localparam PD_DEST_CPU = 2; - localparam PD_DEST_BOF = 3; - localparam PD_DEST_CTL = 4; - - localparam PD_MAX_NUM_DREGS = 13; //padded_eth + ip + udp + seq + vrt_hdr - localparam PD_DREGS_DSP_OFFSET = 11; //offset to start dsp at - - //output inspector interfaces - wire [35:0] pd_out_dsp_data; - wire pd_out_dsp_valid; - wire pd_out_dsp_ready; - - wire [35:0] pd_out_ext_data; - wire pd_out_ext_valid; - wire pd_out_ext_ready; - - wire [35:0] pd_out_cpu_data; - wire pd_out_cpu_valid; - wire pd_out_cpu_ready; - - wire [35:0] pd_out_bof_data; - wire pd_out_bof_valid; - wire pd_out_bof_ready; - - wire [35:0] pd_out_ctl_data; - wire pd_out_ctl_valid; - wire pd_out_ctl_ready; - - reg [1:0] pd_state; - reg [2:0] pd_dest; - reg [3:0] pd_dreg_count; //data registers to buffer headers - wire [3:0] pd_dreg_count_next = pd_dreg_count + 1'b1; - wire pd_dreg_counter_done = (pd_dreg_count_next == PD_MAX_NUM_DREGS)? 1'b1 : 1'b0; - reg [35:0] pd_dregs [PD_MAX_NUM_DREGS-1:0]; - - reg is_eth_dst_mac_bcast; - reg is_eth_type_ipv4; - reg is_eth_ipv4_proto_udp; - reg is_eth_ipv4_dst_addr_here; - reg is_eth_udp_dsp_port_here; - reg is_eth_udp_ctl_port_here; - wire is_vrt_size_zero = (com_inp_data[15:0] == 16'h0); //needed on the same cycle, so it cant be registered - - //Inspector output flags special case: - //Inject SOF into flags at first DSP line. - wire [3:0] pd_out_flags = ( - (pd_dreg_count == PD_DREGS_DSP_OFFSET) && - (pd_dest == PD_DEST_DSP) - )? 4'b0001 : pd_dregs[pd_dreg_count][35:32]; - - //The communication inspector ouput data and valid signals: - //Mux between com input and data registers based on the state. - wire [35:0] pd_out_data = (pd_state == PD_STATE_WRITE_REGS)? - {pd_out_flags, pd_dregs[pd_dreg_count][31:0]} : com_inp_data - ; - wire pd_out_valid = - (pd_state == PD_STATE_WRITE_REGS)? 1'b1 : ( - (pd_state == PD_STATE_WRITE_LIVE)? com_inp_valid : ( - 1'b0)); - - //The communication inspector ouput ready signal: - //Mux between the various destination ready signals. - wire pd_out_ready = - (pd_dest == PD_DEST_DSP)? pd_out_dsp_ready : ( - (pd_dest == PD_DEST_EXT)? pd_out_ext_ready : ( - (pd_dest == PD_DEST_CPU)? pd_out_cpu_ready : ( - (pd_dest == PD_DEST_BOF)? pd_out_bof_ready : ( - (pd_dest == PD_DEST_CTL)? pd_out_ctl_ready : ( - 1'b0))))); - - //Always connected output data lines. - assign pd_out_dsp_data = pd_out_data; - assign pd_out_ext_data = pd_out_data; - assign pd_out_cpu_data = pd_out_data; - assign pd_out_bof_data = pd_out_data; - assign pd_out_ctl_data = pd_out_data; - - //Destination output valid signals: - //Comes from inspector valid when destination is selected, and otherwise low. - assign pd_out_dsp_valid = (pd_dest == PD_DEST_DSP)? pd_out_valid : 1'b0; - assign pd_out_ext_valid = (pd_dest == PD_DEST_EXT)? pd_out_valid : 1'b0; - assign pd_out_cpu_valid = (pd_dest == PD_DEST_CPU)? pd_out_valid : 1'b0; - assign pd_out_bof_valid = (pd_dest == PD_DEST_BOF)? pd_out_valid : 1'b0; - assign pd_out_ctl_valid = (pd_dest == PD_DEST_CTL)? pd_out_valid : 1'b0; - - //The communication inspector ouput ready signal: - //Always ready when storing to data registers, - //comes from inspector ready output when live, - //and otherwise low. - assign com_inp_ready = - (pd_state == PD_STATE_READ_COM_PRE) ? 1'b1 : ( - (pd_state == PD_STATE_READ_COM) ? 1'b1 : ( - (pd_state == PD_STATE_WRITE_LIVE) ? pd_out_ready : ( - 1'b0))); - - //inspect the incoming data and mark register booleans - always @(posedge clk) - if (com_inp_ready & com_inp_valid) begin - case(pd_dreg_count) - 0: begin - is_eth_dst_mac_bcast <= (com_inp_data[15:0] == 16'hffff); - end - 1: begin - is_eth_dst_mac_bcast <= is_eth_dst_mac_bcast && (com_inp_data[31:0] == 32'hffffffff); - end - 3: begin - is_eth_type_ipv4 <= (com_inp_data[15:0] == 16'h800); - end - 6: begin - is_eth_ipv4_proto_udp <= (com_inp_data[23:16] == 8'h11); - end - 8: begin - is_eth_ipv4_dst_addr_here <= (com_inp_data[31:0] == my_ip_addr); - end - 9: begin - is_eth_udp_dsp_port_here <= (com_inp_data[15:0] == dsp_udp_port); - is_eth_udp_ctl_port_here <= (com_inp_data[15:0] == ctl_udp_port); - end - endcase //pd_dreg_count - end - - always @(posedge clk) - if(rst | clr) begin - pd_state <= PD_STATE_READ_COM_PRE; - pd_dreg_count <= 0; - end - else begin - case(pd_state) - PD_STATE_READ_COM_PRE: begin - if (com_inp_ready & com_inp_valid & com_inp_data[32]) begin - pd_state <= PD_STATE_READ_COM; - pd_dreg_count <= pd_dreg_count_next; - pd_dregs[pd_dreg_count] <= com_inp_data; - end - end - - PD_STATE_READ_COM: begin - if (com_inp_ready & com_inp_valid) begin - pd_dregs[pd_dreg_count] <= com_inp_data; - if (pd_dreg_counter_done | com_inp_data[33]) begin - pd_state <= PD_STATE_WRITE_REGS; - pd_dreg_count <= 0; - - //---------- begin inspection decision -----------// - //EOF or bcast or not IPv4 or not UDP: - if ( - com_inp_data[33] || is_eth_dst_mac_bcast || - ~is_eth_type_ipv4 || ~is_eth_ipv4_proto_udp - ) begin - pd_dest <= PD_DEST_BOF; - end - - //not my IP address: - else if (~is_eth_ipv4_dst_addr_here) begin - pd_dest <= PD_DEST_EXT; - end - - //UDP control port and VRT: - else if (is_eth_udp_ctl_port_here && ~is_vrt_size_zero) begin - pd_dest <= PD_DEST_CTL; - pd_dreg_count <= PD_DREGS_DSP_OFFSET; - end - - //UDP data port and VRT: - else if (is_eth_udp_dsp_port_here && ~is_vrt_size_zero) begin - pd_dest <= PD_DEST_DSP; - pd_dreg_count <= PD_DREGS_DSP_OFFSET; - end - - //other: - else begin - pd_dest <= PD_DEST_CPU; - end - //---------- end inspection decision -------------// - - end - else begin - pd_dreg_count <= pd_dreg_count_next; - end - end - end - - PD_STATE_WRITE_REGS: begin - if (pd_out_ready & pd_out_valid) begin - if (pd_out_data[33]) begin - pd_state <= PD_STATE_READ_COM_PRE; - pd_dreg_count <= 0; - end - else if (pd_dreg_counter_done) begin - pd_state <= PD_STATE_WRITE_LIVE; - pd_dreg_count <= 0; - end - else begin - pd_dreg_count <= pd_dreg_count_next; - end - end - end - - PD_STATE_WRITE_LIVE: begin - if (pd_out_ready & pd_out_valid & pd_out_data[33]) begin - pd_state <= PD_STATE_READ_COM_PRE; - end - end - - endcase //pd_state - end - - //connect this fast-path signals directly to the DSP out - assign dsp_out_data = pd_out_dsp_data; - assign dsp_out_valid = pd_out_dsp_valid; - assign pd_out_dsp_ready = dsp_out_ready; - - assign ctl_out_data = pd_out_ctl_data; - assign ctl_out_valid = pd_out_ctl_valid; - assign pd_out_ctl_ready = ctl_out_ready; - - //////////////////////////////////////////////////////////////////// - // Splitter and output muxes for the bof packets - // - split the bof packets into two streams - // - mux split packets into cpu out and ext out - //////////////////////////////////////////////////////////////////// - - //dummy signals to join the the splitter and muxes below - wire [35:0] _split_to_ext_data, _split_to_cpu_data; - wire _split_to_ext_valid, _split_to_cpu_valid; - wire _split_to_ext_ready, _split_to_cpu_ready; - - splitter36 bof_out_splitter( - .clk(clk), .rst(rst), .clr(clr), - .inp_data(pd_out_bof_data), .inp_valid(pd_out_bof_valid), .inp_ready(pd_out_bof_ready), - .out0_data(_split_to_ext_data), .out0_valid(_split_to_ext_valid), .out0_ready(_split_to_ext_ready), - .out1_data(_split_to_cpu_data), .out1_valid(_split_to_cpu_valid), .out1_ready(_split_to_cpu_ready) - ); - - fifo36_mux ext_out_mux( - .clk(clk), .reset(rst), .clear(clr), - .data0_i(pd_out_ext_data), .src0_rdy_i(pd_out_ext_valid), .dst0_rdy_o(pd_out_ext_ready), - .data1_i(_split_to_ext_data), .src1_rdy_i(_split_to_ext_valid), .dst1_rdy_o(_split_to_ext_ready), - .data_o(ext_out_data), .src_rdy_o(ext_out_valid), .dst_rdy_i(ext_out_ready) - ); - - fifo36_mux cpu_out_mux( - .clk(clk), .reset(rst), .clear(clr), - .data0_i(pd_out_cpu_data), .src0_rdy_i(pd_out_cpu_valid), .dst0_rdy_o(pd_out_cpu_ready), - .data1_i(_split_to_cpu_data), .src1_rdy_i(_split_to_cpu_valid), .dst1_rdy_o(_split_to_cpu_ready), - .data_o(cpu_out_data), .src_rdy_o(cpu_out_valid), .dst_rdy_i(cpu_out_ready) - ); - -endmodule // packet_dispatcher36_x3 diff --git a/fpga/usrp2/fifo/packet_generator.v b/fpga/usrp2/fifo/packet_generator.v deleted file mode 100644 index 5e9d3c2ab..000000000 --- a/fpga/usrp2/fifo/packet_generator.v +++ /dev/null @@ -1,100 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module packet_generator - (input clk, input reset, input clear, - output reg [7:0] data_o, output sof_o, output eof_o, - input [127:0] header, - output src_rdy_o, input dst_rdy_i); - - localparam len = 32'd2000; - - reg [31:0] state; - reg [31:0] seq; - reg [31:0] crc_out; - wire calc_crc = src_rdy_o & dst_rdy_i & ~(state[31:2] == 30'h3FFF_FFFF); - - - always @(posedge clk) - if(reset | clear) - seq <= 0; - else - if(eof_o & src_rdy_o & dst_rdy_i) - seq <= seq + 1; - - always @(posedge clk) - if(reset | clear) - state <= 0; - else - if(src_rdy_o & dst_rdy_i) - if(state == (len - 1)) - state <= 32'hFFFF_FFFC; - else - state <= state + 1; - - always @* - case(state) - 0 : data_o <= len[31:24]; - 1 : data_o <= len[23:16]; - 2 : data_o <= len[15:8]; - 3 : data_o <= len[7:0]; - 4 : data_o <= seq[31:24]; - 5 : data_o <= seq[23:16]; - 6 : data_o <= seq[15:8]; - 7 : data_o <= seq[7:0]; - 8 : data_o <= header[7:0]; - 9 : data_o <= header[15:8]; - 10 : data_o <= header[23:16]; - 11 : data_o <= header[31:24]; - 12 : data_o <= header[39:32]; - 13 : data_o <= header[47:40]; - 14 : data_o <= header[55:48]; - 15 : data_o <= header[63:56]; - 16 : data_o <= header[71:64]; - 17 : data_o <= header[79:72]; - 18 : data_o <= header[87:80]; - 19 : data_o <= header[95:88]; - 20 : data_o <= header[103:96]; - 21 : data_o <= header[111:104]; - 22 : data_o <= header[119:112]; - 23 : data_o <= header[127:120]; - - 32'hFFFF_FFFC : data_o <= crc_out[31:24]; - 32'hFFFF_FFFD : data_o <= crc_out[23:16]; - 32'hFFFF_FFFE : data_o <= crc_out[15:8]; - 32'hFFFF_FFFF : data_o <= crc_out[7:0]; - default : data_o <= state[7:0]; - endcase // case (state) - - assign src_rdy_o = 1; - assign sof_o = (state == 0); - assign eof_o = (state == 32'hFFFF_FFFF); - - wire clear_crc = eof_o & src_rdy_o & dst_rdy_i; - -// crc crc(.clk(clk), .reset(reset), .clear(clear_crc), .data(data_o), -// .calc(calc_crc), .crc_out(crc_out), .match()); - always @(posedge clk) - if(reset | clear | clear_crc) - crc_out <= 0; - else - if(calc_crc) - crc_out <= crc_out + data_o; - -endmodule // packet_generator diff --git a/fpga/usrp2/fifo/packet_generator32.v b/fpga/usrp2/fifo/packet_generator32.v deleted file mode 100644 index 7b4e3bd57..000000000 --- a/fpga/usrp2/fifo/packet_generator32.v +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module packet_generator32 - (input clk, input reset, input clear, - input [127:0] header, - output [35:0] data_o, output src_rdy_o, input dst_rdy_i); - - wire [7:0] ll_data; - wire ll_sof, ll_eof, ll_src_rdy, ll_dst_rdy_n; - - packet_generator pkt_gen - (.clk(clk), .reset(reset), .clear(clear), - .data_o(ll_data), .sof_o(ll_sof), .eof_o(ll_eof), - .header(header), - .src_rdy_o(ll_src_rdy), .dst_rdy_i(~ll_dst_rdy_n)); - - ll8_to_fifo36 ll8_to_f36 - (.clk(clk), .reset(reset), .clear(clear), - .ll_data(ll_data), .ll_sof_n(~ll_sof), .ll_eof_n(~ll_eof), - .ll_src_rdy_n(~ll_src_rdy), .ll_dst_rdy_n(ll_dst_rdy_n), - .f36_data(data_o), .f36_src_rdy_o(src_rdy_o), .f36_dst_rdy_i(dst_rdy_i)); - -endmodule // packet_generator32 diff --git a/fpga/usrp2/fifo/packet_padder36.v b/fpga/usrp2/fifo/packet_padder36.v deleted file mode 100644 index 6ded38781..000000000 --- a/fpga/usrp2/fifo/packet_padder36.v +++ /dev/null @@ -1,155 +0,0 @@ -// -// Copyright 2011-2012 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - -// The packet padder 36 for use with RX VITA stream output. -// Packet padder understands the concept of USB LUTs, -// and will forward packets through the interface, -// adding zero padding as needed to properly flush. -// The padder will never write a packet across a LUT boundary. -// When flushing, padder writes out zeros until the LUT boundary. -// Requires that the input line0 be a VITA header, and SOF set. -// Flush when the LUT is partially filled and timeout is reached, -// or when the LUT is partially filled and the DSP is inactive. - -module packet_padder36 -#( - parameter BASE = 0, - - //default is 16K LUT - parameter DEFAULT_LINES32 = 4096, - - //default about 1ms at 64MHz clock - parameter DEFAULT_IDLE_CYC = 65536 -) -( - input clk, input reset, - - //setting bus - input set_stb, input [7:0] set_addr, input [31:0] set_data, - - //input interface - input [35:0] data_i, - input src_rdy_i, - output dst_rdy_o, - - //output interface - output [35:0] data_o, - output src_rdy_o, - input dst_rdy_i, - - input always_flush -); - - wire lut_lines_changed; - wire [15:0] max_lut_lines32; - setting_reg #(.my_addr(BASE+0),.width(16),.at_reset(DEFAULT_LINES32)) sr_num_lines( - .clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data), - .out(max_lut_lines32),.changed(lut_lines_changed)); - - wire idle_cyc_changed; - wire [17:0] idle_flush_cycles; - setting_reg #(.my_addr(BASE+1),.width(18),.at_reset(DEFAULT_IDLE_CYC)) sr_flush_cyc( - .clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data), - .out(idle_flush_cycles),.changed(idle_cyc_changed)); - - //state machine definitions - localparam STATE_READ_HDR = 0; - localparam STATE_WRITE_HDR = 1; - localparam STATE_FORWARD = 2; - localparam STATE_WRITE_PAD = 3; - reg [1:0] state; - - //keep track of the outgoing lines - reg [15:0] line_count; - wire line_count_done = line_count == 1; - wire lut_is_empty = line_count == max_lut_lines32; - always @(posedge clk) begin - if (reset || lut_lines_changed) begin - line_count <= max_lut_lines32; - end - else if (src_rdy_o && dst_rdy_i) begin - line_count <= (line_count_done)? max_lut_lines32 : line_count - 1; - end - end - - //count the number of cycles since RX data so we can force a flush - reg [17:0] non_rx_cycles; - wire idle_timeout = (non_rx_cycles == idle_flush_cycles); - always @(posedge clk) begin - if(reset || state != STATE_READ_HDR || idle_cyc_changed) begin - non_rx_cycles <= 0; - end - else if (~idle_timeout) begin - non_rx_cycles <= non_rx_cycles + 1; - end - end - - //flush when we have written data to a LUT and either idle or non active DSP - wire force_flush = ~lut_is_empty && (idle_timeout || always_flush); - - //the padding state machine - reg [31:0] vita_hdr; - reg has_vita_hdr; - always @(posedge clk) begin - if (reset) begin - state <= STATE_READ_HDR; - end - else case(state) - - STATE_READ_HDR: begin - if (src_rdy_i && dst_rdy_o && data_i[32]) begin - vita_hdr <= data_i[31:0]; - has_vita_hdr <= 1; - state <= (data_i[15:0] > line_count)? STATE_WRITE_PAD : STATE_WRITE_HDR; - end - else if (force_flush) begin - has_vita_hdr <= 0; - state <= STATE_WRITE_PAD; - end - end - - STATE_WRITE_HDR: begin - if (src_rdy_o && dst_rdy_i) begin - state <= STATE_FORWARD; - end - end - - STATE_FORWARD: begin - if (src_rdy_i && dst_rdy_o && data_i[33]) begin - state <= STATE_READ_HDR; - end - end - - STATE_WRITE_PAD: begin - if (src_rdy_o && dst_rdy_i && line_count_done) begin - state <= (has_vita_hdr)? STATE_WRITE_HDR : STATE_READ_HDR; - end - end - - endcase //state - end - - //assign outgoing signals - assign dst_rdy_o = (state == STATE_READ_HDR)? 1 : ((state == STATE_FORWARD)? dst_rdy_i : 0); - assign src_rdy_o = (state == STATE_WRITE_HDR || state == STATE_WRITE_PAD)? 1 : ((state == STATE_FORWARD )? src_rdy_i : 0); - assign data_o = (state == STATE_WRITE_HDR)? {4'b0001, vita_hdr} : ((state == STATE_FORWARD)? data_i : 0); - -endmodule // packet_padder36 - - - - diff --git a/fpga/usrp2/fifo/packet_router.v b/fpga/usrp2/fifo/packet_router.v deleted file mode 100644 index 4c0fe14b1..000000000 --- a/fpga/usrp2/fifo/packet_router.v +++ /dev/null @@ -1,326 +0,0 @@ -// -// Copyright 2011-2012 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - -module packet_router - #( - parameter BUF_SIZE = 9, - parameter UDP_BASE = 0, - parameter CTRL_BASE = 0 - ) - ( - //wishbone interface for memory mapped CPU frames - 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 wb_ack_o, - output wb_err_o, - output wb_rty_o, - - //setting register interface - input set_stb, input [7:0] set_addr, input [31:0] set_data, - - input stream_clk, - input stream_rst, - input stream_clr, - - //output status register - output [31:0] status, - - output sys_int_o, //want an interrupt? - - output [31:0] debug, - - // Input Interfaces (in to router) - input [35:0] ser_inp_data, input ser_inp_valid, output ser_inp_ready, - input [35:0] dsp0_inp_data, input dsp0_inp_valid, output dsp0_inp_ready, - input [35:0] dsp1_inp_data, input dsp1_inp_valid, output dsp1_inp_ready, - input [35:0] eth_inp_data, input eth_inp_valid, output eth_inp_ready, - input [35:0] err_inp_data, input err_inp_valid, output err_inp_ready, - input [35:0] ctl_inp_data, input ctl_inp_valid, output ctl_inp_ready, - - // Output Interfaces (out of router) - output [35:0] ser_out_data, output ser_out_valid, input ser_out_ready, - output [35:0] dsp_out_data, output dsp_out_valid, input dsp_out_ready, - output [35:0] ctl_out_data, output ctl_out_valid, input ctl_out_ready, - output [35:0] eth_out_data, output eth_out_valid, input eth_out_ready - ); - - assign wb_err_o = 1'b0; // Unused for now - assign wb_rty_o = 1'b0; // Unused for now - - //////////////////////////////////////////////////////////////////// - // CPU interface to this packet router - //////////////////////////////////////////////////////////////////// - wire [35:0] cpu_inp_data, cpu_out_data; - wire cpu_inp_valid, cpu_out_valid; - wire cpu_inp_ready, cpu_out_ready; - - //////////////////////////////////////////////////////////////////// - // Communication interfaces - //////////////////////////////////////////////////////////////////// - wire [35:0] com_inp_data, com_out_data, udp_out_data; - wire com_inp_valid, com_out_valid, udp_out_valid; - wire com_inp_ready, com_out_ready, udp_out_ready; - - //////////////////////////////////////////////////////////////////// - // Control signals (setting registers and status signals) - // - handshake lines for the CPU communication - // - setting registers to program the inspector - //////////////////////////////////////////////////////////////////// - - //setting register for mode control - wire [31:0] _sreg_mode_ctrl; - wire master_mode_flag; - - setting_reg #(.my_addr(CTRL_BASE+0), .width(1)) sreg_mode_ctrl( - .clk(stream_clk),.rst(stream_rst), - .strobe(set_stb),.addr(set_addr),.in(set_data), - .out(master_mode_flag),.changed() - ); - - //assign status output signals - wire [31:0] cpu_iface_status; - assign status = { - cpu_iface_status[31:9], master_mode_flag, cpu_iface_status[7:0] - }; - - //////////////////////////////////////////////////////////////////// - // Communication input source crossbar - // When in master mode: - // - serdes input -> comm output combiner - // - ethernet input -> comm input inspector - // When in slave mode: - // - serdes input -> comm input inspector - // - ethernet input -> null sink - //////////////////////////////////////////////////////////////////// - - //streaming signals from the crossbar to the combiner - wire [35:0] ext_inp_data; - wire ext_inp_valid; - wire ext_inp_ready; - - //dummy signals for valve/xbar below - wire [35:0] _eth_inp_data; - wire _eth_inp_valid; - wire _eth_inp_ready; - - // dummy signals to connect fifo_short - wire [35:0] _com_inp_data; - wire _com_inp_valid; - wire _com_inp_ready; - - valve36 eth_inp_valve ( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), .shutoff(~master_mode_flag), - .data_i(eth_inp_data), .src_rdy_i(eth_inp_valid), .dst_rdy_o(eth_inp_ready), - .data_o(_eth_inp_data), .src_rdy_o(_eth_inp_valid), .dst_rdy_i(_eth_inp_ready) - ); - - crossbar36 com_inp_xbar ( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), .cross(~master_mode_flag), - .data0_i(_eth_inp_data), .src0_rdy_i(_eth_inp_valid), .dst0_rdy_o(_eth_inp_ready), - .data1_i(ser_inp_data), .src1_rdy_i(ser_inp_valid), .dst1_rdy_o(ser_inp_ready), - .data0_o(_com_inp_data), .src0_rdy_o(_com_inp_valid), .dst0_rdy_i(_com_inp_ready), - .data1_o(ext_inp_data), .src1_rdy_o(ext_inp_valid), .dst1_rdy_i(ext_inp_ready) - ); - - // short fifo in the packet inspection path to help timing - fifo_short #(.WIDTH(36)) com_inp_fifo - (.clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .datain(_com_inp_data), .src_rdy_i(_com_inp_valid), .dst_rdy_o(_com_inp_ready), - .dataout(com_inp_data), .src_rdy_o(com_inp_valid), .dst_rdy_i(com_inp_ready), - .space(), .occupied() ); - - //////////////////////////////////////////////////////////////////// - // Communication output sink crossbar - // When in master mode: - // - comm output -> ethernet output - // - insp output -> serdes output - // When in slave mode: - // - com output -> serdes output - // - insp output -> null sink - //////////////////////////////////////////////////////////////////// - - //streaming signals from the inspector to the crossbar - wire [35:0] ext_out_data; - wire ext_out_valid; - wire ext_out_ready; - - //dummy signals for valve/xbar below - wire [35:0] _eth_out_data; - wire _eth_out_valid; - wire _eth_out_ready; - - crossbar36 com_out_xbar ( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), .cross(~master_mode_flag), - .data0_i(com_out_data), .src0_rdy_i(com_out_valid), .dst0_rdy_o(com_out_ready), - .data1_i(ext_out_data), .src1_rdy_i(ext_out_valid), .dst1_rdy_o(ext_out_ready), - .data0_o(_eth_out_data), .src0_rdy_o(_eth_out_valid), .dst0_rdy_i(_eth_out_ready), - .data1_o(ser_out_data), .src1_rdy_o(ser_out_valid), .dst1_rdy_i(ser_out_ready) - ); - - valve36 eth_out_valve ( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), .shutoff(~master_mode_flag), - .data_i(_eth_out_data), .src_rdy_i(_eth_out_valid), .dst_rdy_o(_eth_out_ready), - .data_o(eth_out_data), .src_rdy_o(eth_out_valid), .dst_rdy_i(eth_out_ready) - ); - - //////////////////////////////////////////////////////////////////// - // Communication output source combiner (feeds UDP proto machine) - // - DSP input - // - CPU input - // - ERR input - //////////////////////////////////////////////////////////////////// - - //dummy signals to join the the muxes below - wire [35:0] _combiner0_data, _combiner1_data, _combiner2_data; - wire _combiner0_valid, _combiner1_valid, _combiner2_valid; - wire _combiner0_ready, _combiner1_ready, _combiner2_ready; - - fifo36_mux #(.prio(0)) // No priority, fair sharing - _com_output_combiner0( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .data0_i(err_inp_data), .src0_rdy_i(err_inp_valid), .dst0_rdy_o(err_inp_ready), - .data1_i(cpu_inp_data), .src1_rdy_i(cpu_inp_valid), .dst1_rdy_o(cpu_inp_ready), - .data_o(_combiner0_data), .src_rdy_o(_combiner0_valid), .dst_rdy_i(_combiner0_ready) - ); - - fifo36_mux #(.prio(0)) // No priority, fair sharing - _com_output_combiner2( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .data0_i(_combiner0_data), .src0_rdy_i(_combiner0_valid), .dst0_rdy_o(_combiner0_ready), - .data1_i(ctl_inp_data), .src1_rdy_i(ctl_inp_valid), .dst1_rdy_o(ctl_inp_ready), - .data_o(_combiner2_data), .src_rdy_o(_combiner2_valid), .dst_rdy_i(_combiner2_ready) - ); - - fifo36_mux #(.prio(0)) // No priority, fair sharing - _com_output_combiner1( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .data0_i(dsp0_inp_data), .src0_rdy_i(dsp0_inp_valid), .dst0_rdy_o(dsp0_inp_ready), - .data1_i(dsp1_inp_data), .src1_rdy_i(dsp1_inp_valid), .dst1_rdy_o(dsp1_inp_ready), - .data_o(_combiner1_data), .src_rdy_o(_combiner1_valid), .dst_rdy_i(_combiner1_ready) - ); - - fifo36_mux #(.prio(1)) // Give priority to err/cpu over dsp - com_output_source( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .data0_i(_combiner2_data), .src0_rdy_i(_combiner2_valid), .dst0_rdy_o(_combiner2_ready), - .data1_i(_combiner1_data), .src1_rdy_i(_combiner1_valid), .dst1_rdy_o(_combiner1_ready), - .data_o(udp_out_data), .src_rdy_o(udp_out_valid), .dst_rdy_i(udp_out_ready) - ); - - //////////////////////////////////////////////////////////////////// - // Interface CPU to memory mapped wishbone - // - Uses 1 setting register - //////////////////////////////////////////////////////////////////// - buffer_int2 #(.BASE(CTRL_BASE+3), .BUF_SIZE(BUF_SIZE)) cpu_to_wb( - .clk(stream_clk), .rst(stream_rst | stream_clr), - .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), - .status(cpu_iface_status), - // Wishbone interface to RAM - .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), - // Write FIFO Interface (from PR and into WB) - .wr_data_i(cpu_out_data), - .wr_ready_i(cpu_out_valid), - .wr_ready_o(cpu_out_ready), - // Read FIFO Interface (from WB and into PR) - .rd_data_o(cpu_inp_data), - .rd_ready_o(cpu_inp_valid), - .rd_ready_i(cpu_inp_ready) - ); - - //////////////////////////////////////////////////////////////////// - // Packet Dispatcher - // - Uses 2 setting registers - // - provide buffering before cpu for random + small packet bursts - //////////////////////////////////////////////////////////////////// - wire [35:0] _cpu_out_data; - wire _cpu_out_valid; - wire _cpu_out_ready; - - packet_dispatcher36_x4 #(.BASE(CTRL_BASE+1)) packet_dispatcher( - .clk(stream_clk), .rst(stream_rst), .clr(stream_clr), - .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), - .com_inp_data(com_inp_data), .com_inp_valid(com_inp_valid), .com_inp_ready(com_inp_ready), - .ext_out_data(ext_out_data), .ext_out_valid(ext_out_valid), .ext_out_ready(ext_out_ready), - .dsp_out_data(dsp_out_data), .dsp_out_valid(dsp_out_valid), .dsp_out_ready(dsp_out_ready), - .ctl_out_data(ctl_out_data), .ctl_out_valid(ctl_out_valid), .ctl_out_ready(ctl_out_ready), - .cpu_out_data(_cpu_out_data), .cpu_out_valid(_cpu_out_valid), .cpu_out_ready(_cpu_out_ready) - ); - - fifo_cascade #(.WIDTH(36), .SIZE(9/*512 lines plenty for short pkts*/)) cpu_out_fifo ( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .datain(_cpu_out_data), .src_rdy_i(_cpu_out_valid), .dst_rdy_o(_cpu_out_ready), - .dataout(cpu_out_data), .src_rdy_o(cpu_out_valid), .dst_rdy_i(cpu_out_ready) - ); - - //////////////////////////////////////////////////////////////////// - // UDP TX Protocol machine - //////////////////////////////////////////////////////////////////// - - //dummy signals to connect the components below - wire [35:0] _com_out_data; - wire _com_out_valid, _com_out_ready; - - prot_eng_tx #(.BASE(UDP_BASE)) udp_prot_eng_tx - (.clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), - .datain(udp_out_data), .src_rdy_i(udp_out_valid), .dst_rdy_o(udp_out_ready), - .dataout(_com_out_data), .src_rdy_o(_com_out_valid), .dst_rdy_i(_com_out_ready) ); - - fifo36_mux com_out_mux( - .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), - .data0_i(ext_inp_data), .src0_rdy_i(ext_inp_valid), .dst0_rdy_o(ext_inp_ready), - .data1_i(_com_out_data), .src1_rdy_i(_com_out_valid), .dst1_rdy_o(_com_out_ready), - .data_o(com_out_data), .src_rdy_o(com_out_valid), .dst_rdy_i(com_out_ready) - ); - - //////////////////////////////////////////////////////////////////// - // Assign debugs - //////////////////////////////////////////////////////////////////// - - assign debug = { - //inputs to the router (12) - dsp0_inp_ready, dsp0_inp_valid, - dsp1_inp_ready, dsp1_inp_valid, - err_inp_ready, err_inp_valid, - ser_inp_ready, ser_inp_valid, - eth_inp_ready, eth_inp_valid, - cpu_inp_ready, cpu_inp_valid, - - //outputs from the router (8) - dsp_out_ready, dsp_out_valid, - ser_out_ready, ser_out_valid, - eth_out_ready, eth_out_valid, - cpu_out_ready, cpu_out_valid, - - //other interfaces (8) - ext_inp_ready, ext_inp_valid, - com_out_ready, com_out_valid, - ext_out_ready, ext_out_valid, - com_inp_ready, com_inp_valid, - - 4'b0 - }; - -endmodule // packet_router diff --git a/fpga/usrp2/fifo/packet_tb.v b/fpga/usrp2/fifo/packet_tb.v deleted file mode 100644 index ec0665e0a..000000000 --- a/fpga/usrp2/fifo/packet_tb.v +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module packet_tb(); - - wire [7:0] data; - wire sof, eof, src_rdy, dst_rdy; - - wire clear = 0; - reg clk = 0; - reg reset = 1; - - always #10 clk <= ~clk; - initial #1000 reset <= 0; - - initial $dumpfile("packet_tb.vcd"); - initial $dumpvars(0,packet_tb); - - wire [31:0] total, crc_err, seq_err, len_err; - - packet_generator pkt_gen (.clk(clk), .reset(reset), .clear(clear), - .data_o(data), .sof_o(sof), .eof_o(eof), - .src_rdy_o(src_rdy), .dst_rdy_i(dst_rdy)); - - packet_verifier pkt_ver (.clk(clk), .reset(reset), .clear(clear), - .data_i(data), .sof_i(sof), .eof_i(eof), - .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy), - .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err)); - -endmodule // packet_tb diff --git a/fpga/usrp2/fifo/packet_verifier.v b/fpga/usrp2/fifo/packet_verifier.v deleted file mode 100644 index 3cc7b0a04..000000000 --- a/fpga/usrp2/fifo/packet_verifier.v +++ /dev/null @@ -1,78 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -// Packet format -- -// Line 1 -- Length, 32 bits -// Line 2 -- Sequence number, 32 bits -// Last line -- CRC, 32 bits - -module packet_verifier - (input clk, input reset, input clear, - input [7:0] data_i, input sof_i, input eof_i, input src_rdy_i, output dst_rdy_o, - - output reg [31:0] total, - output reg [31:0] crc_err, - output reg [31:0] seq_err, - output reg [31:0] len_err); - - reg [31:0] seq_num; - reg [31:0] length; - wire first_byte, last_byte; - reg second_byte, last_byte_d1; - wire match_crc; - wire calc_crc = src_rdy_i & dst_rdy_o; - - crc crc(.clk(clk), .reset(reset), .clear(last_byte_d1), .data(data_i), - .calc(calc_crc), .crc_out(), .match(match_crc)); - - assign first_byte = src_rdy_i & dst_rdy_o & sof_i; - assign last_byte = src_rdy_i & dst_rdy_o & eof_i; - assign dst_rdy_o = ~last_byte_d1; - - // stubs for now - wire match_seq = 1; - wire match_len = 1; - - always @(posedge clk) - if(reset | clear) - last_byte_d1 <= 0; - else - last_byte_d1 <= last_byte; - - always @(posedge clk) - if(reset | clear) - begin - total <= 0; - crc_err <= 0; - seq_err <= 0; - len_err <= 0; - end - else - if(last_byte_d1) - begin - total <= total + 1; - if(~match_crc) - crc_err <= crc_err + 1; - else if(~match_seq) - seq_err <= seq_err + 1; - else if(~match_len) - seq_err <= len_err + 1; - end - -endmodule // packet_verifier diff --git a/fpga/usrp2/fifo/packet_verifier32.v b/fpga/usrp2/fifo/packet_verifier32.v deleted file mode 100644 index 3579a9bcf..000000000 --- a/fpga/usrp2/fifo/packet_verifier32.v +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module packet_verifier32 - (input clk, input reset, input clear, - input [35:0] data_i, input src_rdy_i, output dst_rdy_o, - output [31:0] total, output [31:0] crc_err, output [31:0] seq_err, output [31:0] len_err); - - wire [7:0] ll_data; - wire ll_sof, ll_eof, ll_src_rdy, ll_dst_rdy; - - fifo36_to_ll8 f36_to_ll8 - (.clk(clk), .reset(reset), .clear(clear), - .f36_data(data_i), .f36_src_rdy_i(src_rdy_i), .f36_dst_rdy_o(dst_rdy_o), - .ll_data(ll_data), .ll_sof(ll_sof), .ll_eof(ll_eof), - .ll_src_rdy(ll_src_rdy), .ll_dst_rdy(ll_dst_rdy)); - - packet_verifier pkt_ver - (.clk(clk), .reset(reset), .clear(clear), - .data_i(ll_data), .sof_i(ll_sof), .eof_i(ll_eof), - .src_rdy_i(ll_src_rdy), .dst_rdy_o(ll_dst_rdy), - .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err)); - -endmodule // packet_verifier32 diff --git a/fpga/usrp2/fifo/resp_packet_padder36.v b/fpga/usrp2/fifo/resp_packet_padder36.v deleted file mode 100644 index 18fc18291..000000000 --- a/fpga/usrp2/fifo/resp_packet_padder36.v +++ /dev/null @@ -1,88 +0,0 @@ -// -// Copyright 2011-2012 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - -// PAD to NUM LINES - -module resp_packet_padder36 -#( - parameter NUM_LINES32 = 128 -) -( - input clk, input reset, - - //input interface - input [35:0] data_i, - input src_rdy_i, - output dst_rdy_o, - - //output interface - output [35:0] data_o, - output src_rdy_o, - input dst_rdy_i -); - - localparam STATE_FWD = 0; - localparam STATE_PAD = 1; - reg state; - - reg [15:0] counter; - - always @(posedge clk) begin - if (reset) begin - counter <= 0; - end - else if (src_rdy_o && dst_rdy_i) begin - if (data_o[33]) counter <= 0; - else counter <= counter + 1; - end - end - - always @(posedge clk) begin - if (reset) begin - state <= STATE_FWD; - end - else case(state) - - STATE_FWD: begin - if (src_rdy_i && dst_rdy_o && data_i[33] && ~data_o[33]) begin - state <= STATE_PAD; - end - end - - STATE_PAD: begin - if (src_rdy_o && dst_rdy_i && data_o[33]) begin - state <= STATE_FWD; - end - end - - endcase //state - end - - //assign data out - assign data_o[31:0] = (state == STATE_FWD)? data_i[31:0] : {32'b0}; - wire eof = (counter == (NUM_LINES32-1)); - assign data_o[35:32] = {data_i[35:34], eof, data_i[32]}; - - //assign ready - assign src_rdy_o = (state == STATE_FWD)? src_rdy_i : 1'b1; - assign dst_rdy_o = (state == STATE_FWD)? dst_rdy_i : 1'b0; - -endmodule // resp_packet_padder36 - - - - diff --git a/fpga/usrp2/fifo/splitter36.v b/fpga/usrp2/fifo/splitter36.v deleted file mode 100644 index d002d7afd..000000000 --- a/fpga/usrp2/fifo/splitter36.v +++ /dev/null @@ -1,85 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - -// Split packets from a fifo based interface so it goes out identically on two interfaces - -module splitter36 - ( - input clk, input rst, input clr, - input [35:0] inp_data, input inp_valid, output inp_ready, - output [35:0] out0_data, output out0_valid, input out0_ready, - output [35:0] out1_data, output out1_valid, input out1_ready - ); - - localparam STATE_COPY_BOTH = 0; - localparam STATE_COPY_ZERO = 1; - localparam STATE_COPY_ONE = 2; - - reg [1:0] state; - reg [35:0] data_reg; - - assign out0_data = (state == STATE_COPY_BOTH)? inp_data : data_reg; - assign out1_data = (state == STATE_COPY_BOTH)? inp_data : data_reg; - - assign out0_valid = - (state == STATE_COPY_BOTH)? inp_valid : ( - (state == STATE_COPY_ZERO)? 1'b1 : ( - 1'b0)); - - assign out1_valid = - (state == STATE_COPY_BOTH)? inp_valid : ( - (state == STATE_COPY_ONE)? 1'b1 : ( - 1'b0)); - - assign inp_ready = (state == STATE_COPY_BOTH)? (out0_ready | out1_ready) : 1'b0; - - always @(posedge clk) - if (rst | clr) begin - state <= STATE_COPY_BOTH; - end - else begin - case (state) - - STATE_COPY_BOTH: begin - if ((out0_valid & out0_ready) & ~(out1_valid & out1_ready)) begin - state <= STATE_COPY_ONE; - end - else if (~(out0_valid & out0_ready) & (out1_valid & out1_ready)) begin - state <= STATE_COPY_ZERO; - end - data_reg <= inp_data; - end - - STATE_COPY_ZERO: begin - if (out0_valid & out0_ready) begin - state <= STATE_COPY_BOTH; - end - end - - STATE_COPY_ONE: begin - if (out1_valid & out1_ready) begin - state <= STATE_COPY_BOTH; - end - end - - endcase //state - end - - - -endmodule //splitter36 diff --git a/fpga/usrp2/fifo/valve36.v b/fpga/usrp2/fifo/valve36.v deleted file mode 100644 index 795fe511e..000000000 --- a/fpga/usrp2/fifo/valve36.v +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright 2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - - - -module valve36 - (input clk, input reset, input clear, - input shutoff, - input [35:0] data_i, input src_rdy_i, output dst_rdy_o, - output [35:0] data_o, output src_rdy_o, input dst_rdy_i); - - reg shutoff_int, active; - wire active_next = (src_rdy_i & dst_rdy_o)? ~data_i[33] : active; - - assign data_o = data_i; - - assign dst_rdy_o = shutoff_int ? 1'b1 : dst_rdy_i; - assign src_rdy_o = shutoff_int ? 1'b0 : src_rdy_i; - - always @(posedge clk) - if(reset | clear) - active <= 0; - else - active <= active_next; - - always @(posedge clk) - if(reset | clear) - shutoff_int <= 0; - else if(~active_next) - shutoff_int <= shutoff; - -endmodule // valve36 |