| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- //-----------------------------------------------------------------------------
- //
- // (c) Copyright 2010-2011 Xilinx, Inc. All rights reserved.
- //
- // This file contains confidential and proprietary information
- // of Xilinx, Inc. and is protected under U.S. and
- // international copyright and other intellectual property
- // laws.
- //
- // DISCLAIMER
- // This disclaimer is not a license and does not grant any
- // rights to the materials distributed herewith. Except as
- // otherwise provided in a valid license issued to you by
- // Xilinx, and to the maximum extent permitted by applicable
- // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
- // WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
- // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
- // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
- // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
- // (2) Xilinx shall not be liable (whether in contract or tort,
- // including negligence, or under any other theory of
- // liability) for any loss or damage of any kind or nature
- // related to, arising under or in connection with these
- // materials, including for any direct, or any indirect,
- // special, incidental, or consequential loss or damage
- // (including loss of data, profits, goodwill, or any type of
- // loss or damage suffered as a result of any action brought
- // by a third party) even if such damage or loss was
- // reasonably foreseeable or Xilinx had been advised of the
- // possibility of the same.
- //
- // CRITICAL APPLICATIONS
- // Xilinx products are not designed or intended to be fail-
- // safe, or for use in any application requiring fail-safe
- // performance, such as life-support or safety devices or
- // systems, Class III medical devices, nuclear facilities,
- // applications related to the deployment of airbags, or any
- // other applications that could lead to death, personal
- // injury, or severe property or environmental damage
- // (individually and collectively, "Critical
- // Applications"). Customer assumes the sole risk and
- // liability of any use of Xilinx products in Critical
- // Applications, subject only to applicable laws and
- // regulations governing limitations on product liability.
- //
- // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
- // PART OF THIS FILE AT ALL TIMES.
- //
- //-----------------------------------------------------------------------------
- // Project : Series-7 Integrated Block for PCI Express
- // File : PIO_EP.v
- // Version : 3.3
- //
- // Description: Endpoint Programmed I/O module.
- // Consists of Receive and Transmit modules and a Memory Aperture
- //
- //------------------------------------------------------------------------------
- `timescale 1ps/1ps
- (* DowngradeIPIdentifiedWarnings = "yes" *)
- module PIO_EP #(
- parameter C_DATA_WIDTH = 64, // RX/TX interface data width
- // Do not override parameters below this line
- parameter KEEP_WIDTH = C_DATA_WIDTH / 8, // TSTRB width
- parameter TCQ = 1
- ) (
- input clk,
- input clk_50,
- input rst_n,
- // AXIS TX
- input s_axis_tx_tready,
- output [C_DATA_WIDTH-1:0] s_axis_tx_tdata,
- output [KEEP_WIDTH-1:0] s_axis_tx_tkeep,
- output s_axis_tx_tlast,
- output s_axis_tx_tvalid,
- output tx_src_dsc,
- //AXIS RX
- input [C_DATA_WIDTH-1:0] m_axis_rx_tdata,
- input [KEEP_WIDTH-1:0] m_axis_rx_tkeep,
- input m_axis_rx_tlast,
- input m_axis_rx_tvalid,
- output m_axis_rx_tready,
- input [21:0] m_axis_rx_tuser,
- output req_compl,
- output compl_done,
- input [15:0] cfg_completer_id,
- input [31:0] Data_i,
- output [31:0] Cmd_o,
- output [7:0] Addr_o,
- output ReadReq_o,
- output WrReq_o
- );
- // Local wires
- wire [10:0] rd_addr;
- wire [3:0] rd_be;
- wire [31:0] rd_data;
- wire [10:0] wr_addr;
- wire [7:0] wr_be;
- (* DONT_TOUCH = "yes" *) wire [31:0] wr_data;
- wire wr_en;
- wire wr_busy;
- wire req_compl_int;
- wire req_compl_wd;
- wire compl_done_int;
- wire [2:0] req_tc;
- wire req_td;
- wire req_ep;
- wire [1:0] req_attr;
- wire [9:0] req_len;
- wire [15:0] req_rid;
- wire [7:0] req_tag;
- wire [7:0] req_be;
- wire [12:0] req_addr;
- //
- // ENDPOINT MEMORY : 8KB memory aperture implemented in FPGA BlockRAM(*)
- //
- PIO_EP_MEM_ACCESS #(
- .TCQ( TCQ )
- ) EP_MEM_inst (
-
- .clk(clk), // I
- .rst_n(rst_n), // I
-
- // Read Port
-
- .rd_addr(rd_addr), // I [10:0]
- .rd_be(rd_be), // I [3:0]
- .rd_data(), // O [31:0]
-
- // Write Port
-
- .wr_addr(wr_addr), // I [10:0]
- .wr_be(wr_be), // I [7:0]
- .wr_data(wr_data), // I [31:0]
- .wr_en(wr_en), // I
- .wr_busy(wr_busy) // O
- );
- //
- // Local-Link Receive Controller
- //
- PIO_RX_ENGINE #(
- .C_DATA_WIDTH( C_DATA_WIDTH ),
- .KEEP_WIDTH( KEEP_WIDTH ),
- .TCQ( TCQ )
- ) EP_RX_inst (
- .clk(clk), // I
- .rst_n(rst_n), // I
- // AXIS RX
- .m_axis_rx_tdata( m_axis_rx_tdata ), // I
- .m_axis_rx_tkeep( m_axis_rx_tkeep ), // I
- .m_axis_rx_tlast( m_axis_rx_tlast ), // I
- .m_axis_rx_tvalid( m_axis_rx_tvalid ), // I
- .m_axis_rx_tready( m_axis_rx_tready ), // O
- .m_axis_rx_tuser ( m_axis_rx_tuser ), // I
- // Handshake with Tx engine
- .req_compl(req_compl_int), // O
- .req_compl_wd(req_compl_wd), // O
- .compl_done(compl_done_int), // I
- .req_tc(req_tc), // O [2:0]
- .req_td(req_td), // O
- .req_ep(req_ep), // O
- .req_attr(req_attr), // O [1:0]
- .req_len(req_len), // O [9:0]
- .req_rid(req_rid), // O [15:0]
- .req_tag(req_tag), // O [7:0]
- .req_be(req_be), // O [7:0]
- .req_addr(req_addr), // O [12:0]
-
- // Memory Write Port
- .wr_addr(wr_addr), // O [10:0]
- .wr_be(wr_be),
- .wr_data_msb(wr_data), // O [31:0]
- .wr_en(wr_en), // O
- .wr_busy(wr_busy) // I
- );
- // IntermediateLogic IntermediateLogic
- // (
- // .Clk100_i(clk),
- // .Clk50_i(clk_50),
- // .Rst_i(~rst_n),
- // .MeasEnd_i(MeasEnd_i),
- // .ReadReq_i(req_compl_int),
- // .ValToCfgReg_i(valToCfgReg),
- // .CfgData_i(wr_data),
-
- // .ValToMeasData_i(valToMeasData),
- // .MeasData_i(MeasData_i),
-
- // .StartMeasCmd_o(StartMeasCmd_o),
- // .Data_o(rd_data)
- // );
- //
- // Local-Link Transmit Controller
- //
- PIO_TX_ENGINE #(
- .C_DATA_WIDTH( C_DATA_WIDTH ),
- .KEEP_WIDTH( KEEP_WIDTH ),
- .TCQ( TCQ )
- )EP_TX_inst(
- .clk(clk), // I
- .rst_n(rst_n), // I
- // AXIS Tx
- .s_axis_tx_tready( s_axis_tx_tready ), // I
- .s_axis_tx_tdata( s_axis_tx_tdata ), // O
- .s_axis_tx_tkeep( s_axis_tx_tkeep ), // O
- .s_axis_tx_tlast( s_axis_tx_tlast ), // O
- .s_axis_tx_tvalid( s_axis_tx_tvalid ), // O
- .tx_src_dsc( tx_src_dsc ), // O
- // Handshake with Rx engine
- .req_compl(req_compl_int), // I
- .req_compl_wd(req_compl_wd), // I
- .compl_done(compl_done_int), // 0
- .req_tc(req_tc), // I [2:0]
- .req_td(req_td), // I
- .req_ep(req_ep), // I
- .req_attr(req_attr), // I [1:0]
- .req_len(req_len), // I [9:0]
- .req_rid(req_rid), // I [15:0]
- .req_tag(req_tag), // I [7:0]
- .req_be(req_be), // I [7:0]
- .req_addr(req_addr), // I [12:0]
- // Read Port
- .rd_addr(), // O [10:0]
- .rd_be(), // O [3:0]
- .rd_data(Data_i), // I [31:0]
- .completer_id(cfg_completer_id) // I [15:0]
- );
- assign req_compl = req_compl_int;
- assign compl_done = compl_done_int;
- assign Cmd_o = wr_data;
- assign Addr_o = wr_addr[10:2];
- assign ReadReq_o = req_compl_int;
- assign WrReq_o = wr_en;
- endmodule // PIO_EP
|