📄 opb_ipif_slv_ps2_reg_dual.v
字号:
//-------------------------------------------------------------------------// OPB Slave IPIF with PS2 Control Register Protocol Interface - Module//-------------------------------------------------------------------------//// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"// SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR// XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION// AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION// OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS// IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,// AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE// FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY// WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE// IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR// REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF// INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS// FOR A PARTICULAR PURPOSE.// // (c) Copyright 2004 Xilinx, Inc.// All rights reserved.// //-------------------------------------------------------------------------// Filename: opb_ipif_slv_ps2_reg_dual.v// // Description: // This module implements an IPIF with a slave simple Control Register // interface. //// Design Notes:// The IP interface has a 32 bit data path with a 32 bit address bus.// This design pipelines the signals going into or out of the IP to// provide better timing and allow higher clock frequencies at the// expense of greater access latency. ////-------------------------------------------------------------------------// Structure: // -- opb_ipif_slv_ps2_reg_dual.v////-------------------------------------------------------------------------// Author: KD// History:// KD 5/15/01 -- EA 2 Release// BF 5/17/01 -- Modified for IIC Control Register IPIF// WPH 10/10/01 -- Modified for PS2 Control Register IPIF// //-------------------------------------------------------------------------// Naming Conventions:// active low signals: "*_n"// clock signals: "clk", "clk_div#", "clk_#x" // reset signals: "rst", "rst_n" // generics/parameters: "C_*" // user defined types: "*_TYPE" // state machine next state: "*_ns" // state machine current state: "*_cs" // combinatorial signals: "*_com" // pipelined or register delay signals: "*_d#" // counter signals: "*cnt*"// clock enable signals: "*_ce" // internal version of output port "*_i"// device pins: "*_pin" // ports: - Names begin w/ Uppercase // processes: "*_PROCESS" // component instantiations: "<ENTITY_>I_<#|FUNC>//-------------------------------------------------------------------------///////////////////////////////////////////////////////////////////////////// Module Declaration///////////////////////////////////////////////////////////////////////////module opb_ipif_slv_ps2_reg_dual ( // OPB Slave Signals OPB_ABus, // I [0:31] OPB_BE, // I [0:3] OPB_Clk, // I OPB_DBus, // I [0:31] OPB_RNW, // I OPB_Rst, // I OPB_select, // I OPB_seqAddr, // I Sl_DBus, // O [0:31] Sl_DBusEn, // O Sl_errAck, // O Sl_retry, // O Sl_toutSup, // O Sl_xferAck, // O Sys_Intr1, // O Sys_Intr2, // O // IP Related Signals IP2Bus_Data, // I [0:7] IP2Bus_Error, // I IP2Bus_RdAck, // I IP2Bus_Retry, // I IP2Bus_ToutSup, // I IP2Bus_WrAck, // I IP2Bus_Intr1, // I IP2Bus_Intr2, // I Bus2IP_Addr, // O [0:31] Bus2IP_RegCE, // O [0:15] Bus2IP_Data, // O [0:7] Bus2IP_RdReq, // O Bus2IP_WrReq // O ); ///////////////////////////////////////////////////////////////////////////// Port Declarations/////////////////////////////////////////////////////////////////////////// // OPB Slave Signals input [0:31] OPB_ABus; input [0:3] OPB_BE; input OPB_Clk; input [0:31] OPB_DBus; input OPB_RNW; input OPB_Rst; input OPB_select; input OPB_seqAddr; output [0:31] Sl_DBus; output Sl_DBusEn; output Sl_errAck; output Sl_retry; output Sl_toutSup; output Sl_xferAck; output Sys_Intr1; output Sys_Intr2; // IP Related Signals input [0:7] IP2Bus_Data; input IP2Bus_Error; input IP2Bus_RdAck; input IP2Bus_Retry; input IP2Bus_ToutSup; input IP2Bus_WrAck; input IP2Bus_Intr1; input IP2Bus_Intr2; output [0:31] Bus2IP_Addr; output [0:15] Bus2IP_RegCE; output [0:7] Bus2IP_Data; output Bus2IP_RdReq; output Bus2IP_WrReq;///////////////////////////////////////////////////////////////////////////// Parameter Declarations/////////////////////////////////////////////////////////////////////////// parameter C_PS2_BAR = 32'ha900_0000;///////////////////////////////////////////////////////////////////////////// Signal Declarations/////////////////////////////////////////////////////////////////////////// wire addr_decode_hit; reg addr_hit; wire addr_hit_clear; reg [0:31] Bus2IP_Addr; reg [0:3] Bus2IP_BE; reg [0:7] Bus2IP_Data; reg [0:15] Bus2IP_RegCE; reg gen_xfer_ack; reg ip_retry_req; reg ip_tout_sup_req; reg opb_req_clr; reg opb_rnw_d1; reg reg_ce_d1; reg [0:7] Sl_DBus_int; reg Sl_errAck;///////////////////////////////////////////////////////////////////////////// Main Body of Code///////////////////////////////////////////////////////////////////////////// logic to decode addresses.assign addr_decode_hit = (OPB_ABus[0:18] == C_PS2_BAR[31:13]) & // PS2 #1 access offset 0 or (OPB_ABus[20:25] == C_PS2_BAR[11:6]); // PS2 #2 access offset 0x1000// Address decode use 1 extra cycleassign addr_hit_clear = ~OPB_select | Sl_xferAck | Sl_retry | OPB_Rst; always @(posedge OPB_Clk) if (addr_hit_clear) addr_hit <= 1'b0; else addr_hit <= addr_decode_hit;always @(posedge OPB_Clk) opb_rnw_d1 <= OPB_RNW;// Generate OPB Slave xferAckassign Sl_xferAck = gen_xfer_ack;// Send Back toutSup or Retry if IP requests itassign Sl_toutSup = ip_tout_sup_req;assign Sl_retry = ip_retry_req; always @(posedge OPB_Clk)begin Bus2IP_Addr <= OPB_ABus; Bus2IP_BE <= OPB_BE; Bus2IP_Data <= OPB_DBus[0:7]; // Hard coded 8 bit regs, params laterend// Pipeline response signals from IP to OPB - organize for 1 level of logic maxalways @(posedge OPB_Clk) if (OPB_Rst | ~OPB_select | ~addr_hit | opb_req_clr) begin gen_xfer_ack <= 1'b0; ip_tout_sup_req <= 1'b0; ip_retry_req <= 1'b0; opb_req_clr <= 1'b0; end else begin gen_xfer_ack <= ((opb_rnw_d1)? IP2Bus_RdAck : IP2Bus_WrAck) & addr_decode_hit; ip_tout_sup_req <= IP2Bus_ToutSup; ip_retry_req <= IP2Bus_Retry & addr_decode_hit; opb_req_clr <= ((opb_rnw_d1)? IP2Bus_RdAck : IP2Bus_WrAck) | IP2Bus_Retry; end// Decode PS2 Controller Registersalways @(posedge OPB_Clk) begin Bus2IP_RegCE[0] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h0; Bus2IP_RegCE[1] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h1; Bus2IP_RegCE[2] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h2; Bus2IP_RegCE[3] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h3; Bus2IP_RegCE[4] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h4; Bus2IP_RegCE[5] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h5; Bus2IP_RegCE[6] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h6; Bus2IP_RegCE[7] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h7; Bus2IP_RegCE[8] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h8; Bus2IP_RegCE[9] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'h9; Bus2IP_RegCE[10] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'hA; Bus2IP_RegCE[11] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'hB; Bus2IP_RegCE[12] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'hC; Bus2IP_RegCE[13] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'hD; Bus2IP_RegCE[14] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'hE; Bus2IP_RegCE[15] <= {OPB_ABus[19], OPB_ABus[27:29]} == 4'hF; endalways @(posedge OPB_Clk) reg_ce_d1 <= addr_hit & ~opb_req_clr;// Process Rd/Wr Requestsassign Bus2IP_RdReq = addr_hit & ~opb_req_clr & opb_rnw_d1 & ~reg_ce_d1;assign Bus2IP_WrReq = addr_hit & ~opb_req_clr & ~opb_rnw_d1 & ~reg_ce_d1;// ML align to 0:7, MB aling to 24:31// Read Data Return always @(posedge OPB_Clk) if ( ~IP2Bus_RdAck | OPB_Rst) Sl_DBus_int[0:7] <= 8'h00; else Sl_DBus_int[0:7] <= IP2Bus_Data[0:7]; assign Sl_DBus = {Sl_DBus_int, 24'h0};// Since Sl_DBus is already gated off when not active, Sl_DBusEn is// set to 1 so it can be optimized away if it is AND'ed with Sl_DBusassign Sl_DBusEn = 1'b1;// ErrAck Returnalways @(posedge OPB_Clk) if (OPB_Rst | ((opb_rnw_d1)? ~IP2Bus_RdAck : ~IP2Bus_WrAck)) Sl_errAck <= 1'b0; else Sl_errAck <= addr_hit & ~opb_req_clr & IP2Bus_Error;// Pass along interruptsassign Sys_Intr1 = IP2Bus_Intr1;assign Sys_Intr2 = IP2Bus_Intr2;endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -