diff options
Diffstat (limited to 'fpga/usrp2/control_lib/nsgpio.v')
| -rw-r--r-- | fpga/usrp2/control_lib/nsgpio.v | 93 | 
1 files changed, 93 insertions, 0 deletions
| diff --git a/fpga/usrp2/control_lib/nsgpio.v b/fpga/usrp2/control_lib/nsgpio.v new file mode 100644 index 000000000..6c6873fee --- /dev/null +++ b/fpga/usrp2/control_lib/nsgpio.v @@ -0,0 +1,93 @@ +// Modified from code originally by Richard Herveille, his copyright is below + +///////////////////////////////////////////////////////////////////// +////                                                             //// +////  OpenCores Simple General Purpose IO core                   //// +////                                                             //// +////  Author: Richard Herveille                                  //// +////          richard@asics.ws                                   //// +////          www.asics.ws                                       //// +////                                                             //// +///////////////////////////////////////////////////////////////////// +////                                                             //// +//// Copyright (C) 2002 Richard Herveille                        //// +////                    richard@asics.ws                         //// +////                                                             //// +//// This source file may be used and distributed without        //// +//// restriction provided that this copyright statement is not   //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer.//// +////                                                             //// +////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     //// +//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   //// +//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   //// +//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      //// +//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         //// +//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    //// +//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   //// +//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        //// +//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  //// +//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  //// +//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  //// +//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         //// +//// POSSIBILITY OF SUCH DAMAGE.                                 //// +////                                                             //// +///////////////////////////////////////////////////////////////////// + + +module nsgpio +  (input clk_i, input rst_i,  +   input cyc_i, input stb_i, input [4:0] adr_i, input we_i, input [31:0] dat_i,  +   output reg [31:0] dat_o, output reg ack_o, +   input tx, input rx, inout [31:0] gpio +   ); + +   integer n; +   reg [31:0] ddr; +   reg [31:0] idle_out, rx_out, tx_out, fdx_out; +   reg [31:0] rgpio, igpio; +    +   wire 	wb_acc = cyc_i & stb_i;            // WISHBONE access +   wire 	wb_wr  = wb_acc & we_i;            // WISHBONE write access + +   always @(posedge clk_i or posedge rst_i) +     if (rst_i) +       ddr <= 0; +     else if (wb_wr) +       case( adr_i[4:2] ) +	 3'b000 :  +           idle_out <= dat_i; +	 3'b001 : +	   rx_out <= dat_i; +	 3'b010 : +	   tx_out <= dat_i; +	 3'b011 : +	   fdx_out <= dat_i; +	 3'b100 : +	   ddr <= dat_i; +       endcase // case ( adr_i[4:2] ) +       +   always @(posedge clk_i) +     dat_o <= gpio; +    +   always @(posedge clk_i or posedge rst_i) +     if (rst_i) +       ack_o <= 1'b0; +     else +       ack_o <= wb_acc & !ack_o; + +   always @(posedge clk_i) +     case({tx,rx}) +       2'b00 : rgpio <= idle_out; +       2'b01 : rgpio <= rx_out; +       2'b10 : rgpio <= tx_out; +       2'b11 : rgpio <= fdx_out; +     endcase // case ({tx,rx}) +    +   always @* +     for(n=0;n<32;n=n+1) +       igpio[n] <= ddr[n] ? rgpio[n] : 1'bz; + +   assign     gpio = igpio; +    +endmodule | 
