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/usrp3/lib/wishbone/axi_stream_to_wb.v | |
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/usrp3/lib/wishbone/axi_stream_to_wb.v')
-rw-r--r-- | fpga/usrp3/lib/wishbone/axi_stream_to_wb.v | 263 |
1 files changed, 0 insertions, 263 deletions
diff --git a/fpga/usrp3/lib/wishbone/axi_stream_to_wb.v b/fpga/usrp3/lib/wishbone/axi_stream_to_wb.v deleted file mode 100644 index 15bdc0982..000000000 --- a/fpga/usrp3/lib/wishbone/axi_stream_to_wb.v +++ /dev/null @@ -1,263 +0,0 @@ -// -// Copyright 2012 Ettus Research LLC -// - - -// AXI stream to/from wishbone -// Input is an axi stream which wites into a BRAM. -// Output is an axi stream which reads from a BRAM. -// This RAM can also be accessed from a wishbone interface. - -// From the wishbone interface we need to be able to: - -// Ask the module if a completed packet is available. -// Read number of bytes/lines in the BRAM. -// Release the completed packet. - -// Ask the module if an outgoing slot is available. -// Write number of bytes/lines in the BRAM. -// Release the completed packet. - -module axi_stream_to_wb -#( - parameter AWIDTH = 13, //WB addr width and buffering size in bytes - parameter UWIDTH = 4, //stream user width - parameter CTRL_ADDR = 0 //ctrl/status register -) -( - //-- the wishbone interface - input clk_i, input rst_i, - input we_i, input stb_i, input cyc_i, output reg ack_o, - input [AWIDTH-1:0] adr_i, input [31:0] dat_i, output reg [31:0] dat_o, - - //-- the axi stream interface input - input [63:0] rx_tdata, - input [3:0] rx_tuser, - input rx_tlast, - input rx_tvalid, - output rx_tready, - - //-- the axi stream interface output - output [63:0] tx_tdata, - output [3:0] tx_tuser, - output tx_tlast, - output tx_tvalid, - input tx_tready, - - output [31:0] debug_rx, - output [31:0] debug_tx -); - - reg stb_i_del; - always @(posedge clk_i) begin - if (rst_i) stb_i_del <= 0; - else stb_i_del <= stb_i; - end - - reg ack_o_del; - always @(posedge clk_i) begin - if (rst_i) ack_o_del <= 0; - else ack_o_del <= ack_o; - end - - //drive the ack signal - always @(posedge clk_i) begin - if (rst_i) ack_o <= 0; - else if (we_i) ack_o <= stb_i & ~ack_o; - else ack_o <= stb_i & stb_i_del & ~ack_o & ~ack_o_del; - end - - //control registers, status - reg [AWIDTH-1:0] tx_bytes, rx_bytes; - reg tx_error, rx_error; - wire rx_state_flag, tx_state_flag; - reg rx_proc_flag, tx_proc_flag; - - //assign status - wire [31:0] status; - assign status[31] = rx_state_flag; - assign status[30] = tx_state_flag; - assign status[29] = rx_error; - assign status[AWIDTH-1:0] = rx_bytes; - - // Create some piplining to break timing paths. - reg ctrl_addressed; - always @(posedge clk_i) - if (rst_i) - ctrl_addressed <= 1'b0; - else if(adr_i == CTRL_ADDR) - ctrl_addressed <= 1'b1; - else - ctrl_addressed <= 1'b0; - - //assign control - always @(posedge clk_i) begin - if (rst_i) begin - rx_proc_flag <= 0; - tx_proc_flag <= 0; - tx_error <= 0; - tx_bytes <= 0; - end - else if (we_i && ack_o && ctrl_addressed) begin - rx_proc_flag <= dat_i[31]; - tx_proc_flag <= dat_i[30]; - tx_error <= dat_i[29]; - tx_bytes <= dat_i[AWIDTH-1:0]; - end - end - - //------------------------------------------------------------------ - //-- block ram interface between wb and input stream - //------------------------------------------------------------------ - reg [AWIDTH-4:0] rx_counter; - wire [63:0] rx_bram_data64; - ram_2port #(.DWIDTH(64), .AWIDTH(AWIDTH-3)) input_stream_bram - ( - .clka(clk_i), .ena(rx_tready), .wea(rx_tvalid), - .addra(rx_counter), .dia(rx_tdata), .doa(), - .clkb(clk_i), .enb(stb_i), .web(1'b0), - .addrb(adr_i[AWIDTH-1:3]), .dib({64{1'b1}}), .dob(rx_bram_data64) - ); - - //select the data source, status, or upper/lower 32 from bram - wire [31:0] dat_o_pipeline; - assign dat_o_pipeline = ctrl_addressed ? status : ((!adr_i[2])? rx_bram_data64[63:32]: rx_bram_data64[31:0]); - always @(posedge clk_i) begin - dat_o <= dat_o_pipeline; - end - - //------------------------------------------------------------------ - //-- block ram interface between wb and output stream - //------------------------------------------------------------------ - reg [AWIDTH-4:0] tx_counter; - wire enb_out; - wire [63:0] tx_bram_data64; - ram_2port #(.DWIDTH(64), .AWIDTH(AWIDTH-3)) output_stream_bram - ( - .clka(clk_i), .ena(enb_out), .wea(1'b0), - .addra(tx_counter), .dia({64{1'b1}}), .doa(tx_tdata), - .clkb(clk_i), .enb(stb_i), .web(we_i && adr_i[2]), - .addrb(adr_i[AWIDTH-1:3]), .dib(tx_bram_data64), .dob() - ); - - //write 64 bit chunks, so register the lower write - reg [31:0] dat_i_reg; - always @(posedge clk_i) begin - if (we_i && stb_i && !adr_i[2]) dat_i_reg <= dat_i; - end - assign tx_bram_data64 = {dat_i_reg, dat_i}; - - //------------------------------------------------------------------ - //-- state machine to drive input stream - //------------------------------------------------------------------ - localparam RX_STATE_READY = 0; //waits for proc flag 0 - localparam RX_STATE_WRITE = 1; //writes stream to bram - localparam RX_STATE_RELEASE = 2; //waits for proc to flag 1 - reg [1:0] rx_state; - - always @(posedge clk_i) begin - if (rst_i) begin - rx_state <= RX_STATE_READY; - rx_counter <= 0; - rx_error <= 0; - rx_bytes <= 0; - end - else case (rx_state) - - RX_STATE_READY: begin - if (!rx_proc_flag) rx_state <= RX_STATE_WRITE; - rx_counter <= 0; - end - - RX_STATE_WRITE: begin - if (rx_tready && rx_tvalid) begin - rx_counter <= rx_counter + 1'b1; - if (rx_tlast) begin - rx_state <= RX_STATE_RELEASE; - rx_bytes <= {rx_counter + 1'b1, rx_tuser[2:0]}; - rx_error <= rx_tuser[3]; - end - end - end - - RX_STATE_RELEASE: begin - if (rx_proc_flag) rx_state <= RX_STATE_READY; - rx_counter <= 0; - end - - default: rx_state <= RX_STATE_READY; - endcase //rx_state - end - - //flag tells the processor when it can grab some input buffer - assign rx_state_flag = (rx_state == RX_STATE_RELEASE); - - //always ready to accept input data in the write state - assign rx_tready = (rx_state == RX_STATE_WRITE); - - //------------------------------------------------------------------ - //-- state machine to drive output stream - //------------------------------------------------------------------ - localparam TX_STATE_READY = 0; //waits for proc flag 0 - localparam TX_STATE_WRITE = 1; //writes bram to stream - localparam TX_STATE_RELEASE = 2; //waits for proc to flag 1 - reg [1:0] tx_state; - - always @(posedge clk_i) begin - if (rst_i) begin - tx_state <= TX_STATE_READY; - tx_counter <= 0; - end - else case (tx_state) - - TX_STATE_READY: begin - if (tx_proc_flag) begin - tx_state <= TX_STATE_WRITE; - tx_counter <= 1; - end - else tx_counter <= 0; - end - - TX_STATE_WRITE: begin - if (tx_tready && tx_tvalid) begin - tx_counter <= tx_counter + 1'b1; - if (tx_tlast) begin - tx_state <= TX_STATE_RELEASE; - end - end - end - - TX_STATE_RELEASE: begin - if (!tx_proc_flag) tx_state <= TX_STATE_READY; - tx_counter <= 0; - end - - default: tx_state <= TX_STATE_READY; - endcase //tx_state - end - - //flag tells the processor when it can grab available out buffer - assign tx_state_flag = (tx_state == TX_STATE_READY); - - //the output user bus assignment (non-zero only at end) - assign tx_tuser = (tx_tlast)? {tx_error, tx_bytes[2:0]} : 4'b0; - - //end of frame signal - assign tx_tlast = (tx_counter == tx_bytes[AWIDTH-1:3]); - - //output is always valid in state write - assign tx_tvalid = (tx_state == TX_STATE_WRITE); - - //enable the read so we can pre-read due to read 1 cycle delay - assign enb_out = (tx_state == TX_STATE_WRITE)? (tx_tvalid && tx_tready) : 1'b1; - - assign debug_rx = { - rx_state, rx_tlast, rx_tvalid, rx_tready, rx_tuser[2:0], //8 - rx_proc_flag, rx_state_flag, rx_tdata[21:0] //24 - }; - assign debug_tx = { - tx_state, tx_tlast, tx_tvalid, tx_tready, tx_tuser[2:0], //8 - tx_proc_flag, tx_state_flag, tx_tdata[21:0] //24 - }; - -endmodule //axi_stream_to_wb |