📄 ps2_reg.v
字号:
////////////////////////////////////////////////////////////////////////////////// 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: ps2_reg.v//// Description: PS/2 memory mapped registers//////////////////////////////////////////////////////////////////////////////// Structure: // ////////////////////////////////////////////////////////////////////////////////// History:// wph 10/10/01////////////////////////////////////////////////////////////////////////////////// Naming Conventions:// active low signals: "*_n"// clock signals: "clk", "clk_div#", "clk_#x" // Rst signals: "rst", "rst_n" // generics: "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 with Uppercase // processes: "*_PROCESS" // component instantiations: "<ENTITY_>I_<#|FUNC>//////////////////////////////////////////////////////////////////////////////module ps2_reg( //global signal Clk, // I system clock Rst, // I system reset //IPIF Signals Bus2IP_RegCE, // I [0:7] Bus2IP_Data, // I [0:7] Bus2IP_RdReq, // I Bus2IP_WrReq, // I IP2Bus_Data, // O [0:7] IP2Bus_Error, // O IP2Bus_RdAck, // O IP2Bus_Retry, // O IP2Bus_ToutSup, // O IP2Bus_WrAck, // O IP2Bus_Intr, // O //interface signal for memory mapped registers srst, // O global rest + software reset, send to ps2_sie rx_full_sta, // O rx_full_set, // I rx_err_set, // I rx_ovf_set, // I tx_full_sta, // O tx_full_clr, // I tx_ack_set, // I tx_noack_set, // I wdt_tout_set, // I tx_data, // O [0:7] rx_data // I [0:7] );/////////////////////////////////////////////////////////////////////////////////ports///////////////////////////////////////////////////////////////////////////////input Clk; // I system clockinput Rst; // I system reset //IPIF Signalsinput [0:7] Bus2IP_RegCE; // I [0:7] input [0:7] Bus2IP_Data; // I [0:7]input Bus2IP_RdReq; // Iinput Bus2IP_WrReq; // Ioutput [0:7] IP2Bus_Data; // O [0:7]output IP2Bus_Error; // Ooutput IP2Bus_RdAck; // Ooutput IP2Bus_Retry; // Ooutput IP2Bus_ToutSup; // Ooutput IP2Bus_WrAck; // Ooutput IP2Bus_Intr; // O //interface signal for memory mapped registersoutput srst; // O global rest + software reset, send to ps2_sieoutput rx_full_sta; // Oinput rx_full_set; // Iinput rx_err_set; // Iinput rx_ovf_set; // Ioutput tx_full_sta; // Oinput tx_full_clr; // Iinput tx_ack_set; // Iinput tx_noack_set; // I input wdt_tout_set; // Ioutput [0:7] tx_data; // O [0:7]input [0:7] rx_data; // I [0:7]/////////////////////////////////////////////////////////////////////////////////wires///////////////////////////////////////////////////////////////////////////////wire srst_ce; wire sta_ce; wire tx_data_ce; wire rx_data_ce; wire ints_ce; wire intc_ce ; wire intms_ce ; wire intmc_ce ; wire Bus2IP_Data_srst_d;wire Bus2IP_Data_wdt_tout; wire Bus2IP_Data_tx_noack; wire Bus2IP_Data_tx_ack; wire Bus2IP_Data_rx_ovf; wire Bus2IP_Data_rx_err; wire Bus2IP_Data_rx_full; reg Bus2IP_RdReq_d1; reg Bus2IP_WrReq_d1; reg IP2Bus_RdAck; reg IP2Bus_WrAck; reg srst_q; reg [0:7] tx_data_q; reg [0:7] rx_data_q; wire rx_full_sta;wire int_rx_full_q;wire int_rx_err_q;wire int_rx_ovf_q;wire int_tx_ack_q;wire int_tx_noack_q;wire int_wdt_tout_q;wire intm_rx_full_q;wire intm_rx_err_q;wire intm_rx_ovf_q;wire intm_tx_ack_q;wire intm_tx_noack_q;wire intm_wdt_tout_q;/////////////////////////////////////////////////////////////////////////////////begin///////////////////////////////////////////////////////////////////////////////assign srst_ce = Bus2IP_RegCE[0]; // 00 R/W SRST (Soft Reset) bit7assign sta_ce = Bus2IP_RegCE[1]; // 04 R/W STR (Status Register) bit6:7assign rx_data_ce = Bus2IP_RegCE[2]; // 08 R/(W) RXR (RX Register bit) bit0:7assign tx_data_ce = Bus2IP_RegCE[3]; // 0c R/W TXR (TX Register) bit0:7assign ints_ce = Bus2IP_RegCE[4]; // 10 R INTSTA (Interrupt Status) bit2:7assign intc_ce = Bus2IP_RegCE[5]; // 14 R/W INTCLR (Interrupt Clear) bit2:7assign intms_ce = Bus2IP_RegCE[6]; // 18 R/W INTMSET(Interrupt Mask Set) bit2:7assign intmc_ce = Bus2IP_RegCE[7]; // 1c R/W INTMCLR(Interrupt Mask Clr) bit2:7assign Bus2IP_Data_srst_d = Bus2IP_Data[7];// Interrupt bits// rx_full, rx_err, rx_ovf, tx_ack, tx_noack, wdt_tout// 2 3 4 5 6 7assign Bus2IP_Data_wdt_tout = Bus2IP_Data[7];assign Bus2IP_Data_tx_noack = Bus2IP_Data[6];assign Bus2IP_Data_tx_ack = Bus2IP_Data[5];assign Bus2IP_Data_rx_ovf = Bus2IP_Data[4];assign Bus2IP_Data_rx_err = Bus2IP_Data[3];assign Bus2IP_Data_rx_full = Bus2IP_Data[2];assign IP2Bus_Data = (srst_ce) ? {7'h0, srst_q} : (sta_ce) ? {6'h0, tx_full_sta, rx_full_sta} : (rx_data_ce) ? rx_data_q: (tx_data_ce) ? tx_data_q: (ints_ce | intc_ce) ? {2'h0,int_rx_full_q, int_rx_err_q, int_rx_ovf_q, int_tx_ack_q, int_tx_noack_q, int_wdt_tout_q}: (intms_ce |intmc_ce) ? {2'h0,intm_rx_full_q, intm_rx_err_q, intm_rx_ovf_q, intm_tx_ack_q, intm_tx_noack_q,intm_wdt_tout_q}: 8'h00;//Generate Ack signal after Req edge is detectalways @ (posedge Clk)begin if (Rst) begin Bus2IP_RdReq_d1 <= 0; Bus2IP_WrReq_d1 <= 0; end else begin Bus2IP_RdReq_d1 <= Bus2IP_RdReq; Bus2IP_WrReq_d1 <= Bus2IP_WrReq; endendalways @ (posedge Clk)begin if (Rst) begin IP2Bus_RdAck <= 0; IP2Bus_WrAck <= 0; end else begin IP2Bus_RdAck <= (Bus2IP_RdReq & (~ Bus2IP_RdReq_d1) ); IP2Bus_WrAck <= (Bus2IP_WrReq & (~ Bus2IP_WrReq_d1) ); endend//------------------------------------------//Signals not used//------------------------------------------assign IP2Bus_Error = 1'b0;assign IP2Bus_Retry = 1'b0;assign IP2Bus_ToutSup = 1'b0;//------------------------------------------//SRST//Software Reset //------------------------------------------always @ (posedge Clk)begin if (Rst) srst_q <= 0; else if (srst_ce && Bus2IP_WrReq) srst_q <= Bus2IP_Data_srst_d; end assign srst = srst_q || Rst; //------------------------------------------//TX_DATA//TX data register and full//------------------------------------------//tx_data//write by Hostalways @ (posedge Clk)begin if (Rst) tx_data_q <= 0; else if (tx_data_ce && Bus2IP_WrReq) tx_data_q <= Bus2IP_Data; endassign tx_data = tx_data_q;//could be memory mapped, but read-only//tx_data full register//set when host writes into TX_DATA register//Cleared by ps2_sie when finished transmissionFDRE tx_data_fl_reg (.C (Clk),.R (srst || tx_full_clr),.CE (tx_data_ce && Bus2IP_WrReq),.D (1'b1),.Q (tx_full_sta));//------------------------------------------//RX_DATA//RX data register and full register//------------------------------------------//Written by ps2_sie after receiving a byte packet//Or Written by Host if it wants (rare)always @ (posedge Clk)begin if (Rst) rx_data_q <= 0; else if (rx_full_set) rx_data_q <= rx_data; else if (rx_data_ce && Bus2IP_WrReq) rx_data_q <= Bus2IP_Data;end //could be memory mapped, but read-only//rx_data full register//set when ps2_sie (host write into RX_DATA register won't change it!)//cleared by when host reads RX_DATAFDRE rx_data_fl_reg (.C (Clk),.R (srst || (rx_data_ce && Bus2IP_RdReq)),//.CE (rx_full_set || (rx_data_ce && Bus2IP_WrReq)),.CE (rx_full_set),.D (1'b1),.Q (rx_full_sta));//------------------------------------------//Interrupt Register (Set and Clear)//rx_full, rx_err, rx_ovf, tx_ack, tx_noack, wdt_tout//mask=1 interrupt enabled//mask=0 interrupt disabled (PowerOn)//------------------------------------------FDRE int_rx_full_reg (.C (Clk),.R (srst || (intc_ce && Bus2IP_WrReq && Bus2IP_Data_rx_full)),.CE (rx_full_set||(ints_ce && Bus2IP_WrReq && Bus2IP_Data_rx_full)),.D (1'b1),.Q (int_rx_full_q));FDRE int_rx_err_reg (.C (Clk),.R (srst || (intc_ce && Bus2IP_WrReq && Bus2IP_Data_rx_err)),.CE (rx_err_set||(ints_ce && Bus2IP_WrReq && Bus2IP_Data_rx_err)),.D (1'b1),.Q (int_rx_err_q));FDRE int_rx_ovf_reg (.C (Clk),.R (srst || (intc_ce && Bus2IP_WrReq && Bus2IP_Data_rx_ovf)),.CE (rx_ovf_set||(ints_ce && Bus2IP_WrReq && Bus2IP_Data_rx_ovf)),.D (1'b1),.Q (int_rx_ovf_q));FDRE int_tx_ack_reg (.C (Clk),.R (srst || (intc_ce && Bus2IP_WrReq && Bus2IP_Data_tx_ack)),.CE (tx_ack_set||(ints_ce && Bus2IP_WrReq && Bus2IP_Data_tx_ack)),.D (1'b1),.Q (int_tx_ack_q));FDRE int_tx_noack_reg (.C (Clk),.R (srst || (intc_ce && Bus2IP_WrReq && Bus2IP_Data_tx_noack)),.CE (tx_noack_set||(ints_ce && Bus2IP_WrReq && Bus2IP_Data_tx_noack)),.D (1'b1),.Q (int_tx_noack_q));FDRE int_wdt_tout_reg (.C (Clk),.R (srst || (intc_ce && Bus2IP_WrReq && Bus2IP_Data_wdt_tout)),.CE (wdt_tout_set||(ints_ce && Bus2IP_WrReq && Bus2IP_Data_wdt_tout)),.D (1'b1),.Q (int_wdt_tout_q));//------------------------------------------//Interrupt Mask Register (Set and Clear)//rx_full, rx_err, rx_ovf, tx_ack, tx_noack, wdt_tout//mask=1 interrupt enabled//mask=0 interrupt disabled (PowerOn)//------------------------------------------FDRE intm_rx_full_reg (.C (Clk),.R (Rst || (intmc_ce && Bus2IP_WrReq && Bus2IP_Data_rx_full)),.CE (intms_ce && Bus2IP_WrReq && Bus2IP_Data_rx_full),.D (1'b1),.Q (intm_rx_full_q));FDRE intm_rx_err_reg (.C (Clk),.R (Rst || (intmc_ce && Bus2IP_WrReq && Bus2IP_Data_rx_err)),.CE (intms_ce && Bus2IP_WrReq && Bus2IP_Data_rx_err),.D (1'b1),.Q (intm_rx_err_q));FDRE intm_rx_ovf_reg (.C (Clk),.R (Rst || (intmc_ce && Bus2IP_WrReq && Bus2IP_Data_rx_ovf)),.CE (intms_ce && Bus2IP_WrReq && Bus2IP_Data_rx_ovf),.D (1'b1),.Q (intm_rx_ovf_q));FDRE intm_tx_ack_reg (.C (Clk),.R (Rst || (intmc_ce && Bus2IP_WrReq && Bus2IP_Data_tx_ack)),.CE (intms_ce && Bus2IP_WrReq && Bus2IP_Data_tx_ack),.D (1'b1),.Q (intm_tx_ack_q));FDRE intm_tx_noack_reg (.C (Clk),.R (Rst || (intmc_ce && Bus2IP_WrReq && Bus2IP_Data_tx_noack)),.CE (intms_ce && Bus2IP_WrReq && Bus2IP_Data_tx_noack),.D (1'b1),.Q (intm_tx_noack_q));FDRE intm_wdt_tout_reg (.C (Clk),.R (Rst || (intmc_ce && Bus2IP_WrReq && Bus2IP_Data_wdt_tout)),.CE (intms_ce && Bus2IP_WrReq && Bus2IP_Data_wdt_tout),.D (1'b1),.Q (intm_wdt_tout_q));//------------------------------------------//Interrupt signal//rx_full, rx_err, rx_ovf, tx_ack, tx_noack, wdt_tout//mask=1 interrupt enabled//mask=0 interrupt disabled (PowerOn)//------------------------------------------assign IP2Bus_Intr =(int_rx_full_q & intm_rx_full_q ) |(int_rx_err_q & intm_rx_err_q ) |(int_rx_ovf_q & intm_rx_ovf_q ) |(int_tx_ack_q & intm_tx_ack_q ) |(int_tx_noack_q & intm_tx_noack_q ) |(int_wdt_tout_q & intm_wdt_tout_q );endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -