Sat, 06 Aug 2011 01:43:24 +0100
Update to latest Lattice code dump (LM32 V3.8, GPIO V3.2)
Version : 3.2
Mod. Data : Jun 6, 2010
Changes Made : 1. Provide capability to read/write bytes (when GPIO larger than 8 bits wide)
2. Provide capability to use a 32-bit or 8-bit data bus on the WISHBONE slave port
3. Perform a big-endian to little-endian conversion in hardware
| document/gpio.htm | file | annotate | diff | revisions | |
| document/gpio.pdf | file | annotate | diff | revisions | |
| drivers/peripheral.mk | file | annotate | diff | revisions | |
| gpio.xml | file | annotate | diff | revisions | |
| rtl/verilog/gpio.v | file | annotate | diff | revisions | |
| rtl/verilog/tpio.v | file | annotate | diff | revisions |
1.1 diff -r 267b5a25932f -r dfc32cad81ba document/gpio.htm 1.2 --- a/document/gpio.htm Fri Aug 13 10:41:29 2010 +0100 1.3 +++ b/document/gpio.htm Sat Aug 06 01:43:24 2011 +0100 1.4 @@ -113,10 +113,10 @@ 1.5 writeIntopicBar(4); 1.6 //--> 1.7 </script> 1.8 -<h1>LatticeMico32 GPIO <a title="View Data Sheet" href="gpio.pdf" target="_blank" onmouseover="if ((parseInt(navigator.appVersion) == 4) && (navigator.appName == 'Netscape')) ehlp_showtip(this,event,'View Data Sheet');" onmouseout="if ((parseInt(navigator.appVersion) == 4) && (navigator.appName == 'Netscape')) ehlp_hidetip();"><img src="ds_icon_ast.jpg" x-maintain-ratio="TRUE" width="29px" height="31px" border="0" class="img_whs1"></a></h1> 1.9 +<h1>LatticeMico GPIO <a title="View Data Sheet" href="gpio.pdf" target="_blank" onmouseover="if ((parseInt(navigator.appVersion) == 4) && (navigator.appName == 'Netscape')) ehlp_showtip(this,event,'View Data Sheet');" onmouseout="if ((parseInt(navigator.appVersion) == 4) && (navigator.appName == 'Netscape')) ehlp_hidetip();"><img src="ds_icon_ast.jpg" x-maintain-ratio="TRUE" width="29px" height="31px" border="0" class="img_whs1"></a></h1> 1.10 1.11 -<p>The LatticeMico32 general-purpose input/output core (GPIO) provides 1.12 - a memory-mapped interface between a WISHBONE slave port and general-purpose 1.13 +<p>The LatticeMico general-purpose input/output core (GPIO) provides a 1.14 + memory-mapped interface between a WISHBONE slave port and general-purpose 1.15 I/O ports. The I/O ports can connect to either on-chip or off-chip logic.</p> 1.16 1.17 <p class="whs2">*If the data sheet fails to open, see the 1.18 @@ -144,6 +144,22 @@ 1.19 <tr valign="top" class="whs6"> 1.20 <td colspan="1" rowspan="1" width="85px" class="whs9"> 1.21 <p class=Table 1.22 + style="font-weight: normal;">3.3</td> 1.23 +<td colspan="1" rowspan="1" width="505px" class="whs10"> 1.24 +<p class=Table>Added software support for LatticeMico8. 1.25 +</td></tr> 1.26 + 1.27 +<tr valign="top" class="whs6"> 1.28 +<td colspan="1" rowspan="1" width="85px" class="whs9"> 1.29 +<p class=Table 1.30 + style="font-weight: normal;">3.2 (8.1 SP1)</td> 1.31 +<td colspan="1" rowspan="1" width="505px" class="whs10"> 1.32 +<p class=Table>WISHBONE data bus size is configurable to 8 or 32 bits. 1.33 + Register map is updated to accommodate 8/32-bit WISHBONE data bus. </td></tr> 1.34 + 1.35 +<tr valign="top" class="whs6"> 1.36 +<td colspan="1" rowspan="1" width="85px" class="whs9"> 1.37 +<p class=Table 1.38 style="font-weight: normal;">3.1 (7.2)</td> 1.39 <td colspan="1" rowspan="1" width="505px" class="whs10"> 1.40 <p class=Table>Updated the Edge Capture Register clean method</p> 1.41 @@ -313,6 +329,19 @@ 1.42 <td colspan="1" rowspan="1" width="503px" class="whs17"> 1.43 <p class=Table>Generates an IRQ on high-to-low transitions. This option 1.44 is deselected by default.</td></tr> 1.45 + 1.46 +<tr valign="top" class="whs13"> 1.47 +<td colspan="2" rowspan="1" width="85px" class="whs16"> 1.48 +<p class=Table 1.49 + style="font-weight: bold;">WISHBONE Configuration</td> 1.50 +</tr> 1.51 + 1.52 +<tr valign="top" class="whs13"> 1.53 +<td colspan="1" rowspan="1" width="85px" class="whs16"> 1.54 +<p class=Table>WISHBONE Data Bus Width</td> 1.55 +<td colspan="1" rowspan="1" width="503px" class="whs17"> 1.56 +<p class=Table>Specifies the WISHBONE data bus width in bits. Supported 1.57 + values are 8 and 32. The default is 32.</td></tr> 1.58 </table> 1.59 1.60
2.1 diff -r 267b5a25932f -r dfc32cad81ba document/gpio.pdf 2.2 Binary file document/gpio.pdf has changed
3.1 diff -r 267b5a25932f -r dfc32cad81ba drivers/peripheral.mk 3.2 --- a/drivers/peripheral.mk Fri Aug 13 10:41:29 2010 +0100 3.3 +++ b/drivers/peripheral.mk Sat Aug 06 01:43:24 2011 +0100 3.4 @@ -2,9 +2,7 @@ 3.5 # Identify source-paths for this device's driver-sources, 3.6 # compiled when building the library 3.7 #--------------------------------------------------------- 3.8 -LIBRARY_C_SRCS += MicoGPIO.c \ 3.9 - MicoGPIOService.c \ 3.10 - LCD.c 3.11 +LIBRARY_C_SRCS += MicoGPIOService.c 3.12 3.13 LIBRARY_ASM_SRCS += 3.14
4.1 diff -r 267b5a25932f -r dfc32cad81ba gpio.xml 4.2 --- a/gpio.xml Fri Aug 13 10:41:29 2010 +0100 4.3 +++ b/gpio.xml Sat Aug 06 01:43:24 2011 +0100 4.4 @@ -1,5 +1,5 @@ 4.5 <?xml version="1.0" encoding="UTF-8"?> 4.6 -<Component Name="gpio" Text="GPIO" Type="IO" Ver="3.1" Help="gpio\document\gpio.htm"> 4.7 +<Component Name="gpio" Text="GPIO" Type="IO" Ver="3.3" Help="gpio\document\gpio.htm" Processor="LM32,LM8" LatticeFamily="All" Device="All"> 4.8 <MasterSlavePorts> 4.9 <SlavePort Prefix="GPIO" Name="GP I/O Port" Type="DATA,DMAR,DMAW"/> 4.10 </MasterSlavePorts> 4.11 @@ -14,32 +14,48 @@ 4.12 <ExternalPort Name="PIO_IO" Type="inout" Width="DATA_WIDTH" Condition="TRISTATE_PORTS" /> 4.13 </ExternalPorts> 4.14 <DeviceDriver InitRoutine="MicoGPIOInit" StructName="MicoGPIOCtx_t"> 4.15 - <DDInclude Include = "LookupServices.h"/> 4.16 - <DDstruct> 4.17 - <DDSElem MemberName = "name" MemberType = "const char*" Type = "Parm" Value = "InstanceName" Format="string"/> 4.18 - <DDSElem MemberName = "base" MemberType = "unsigned int" Type = "Parm" Value = "BASE_ADDRESS" /> 4.19 - <DDSElem MemberName = "lookupReg" MemberType = "DeviceReg_t" Type="uninitialized" Value=""/> 4.20 - <DDSElem MemberName = "intrLevel" MemberType = "unsigned int" Type = "Interrupt" Value = "IRQ_LEVEL" /> 4.21 - <DDSElem MemberName = "output_only" MemberType = "unsigned int" Type = "Parm" Value = "OUTPUT_PORTS_ONLY" /> 4.22 - <DDSElem MemberName = "input_only" MemberType = "unsigned int" Type = "Parm" Value = "INPUT_PORTS_ONLY" /> 4.23 - <DDSElem MemberName = "in_and_out" MemberType = "unsigned int" Type = "Parm" Value = "BOTH_INPUT_AND_OUTPUT" /> 4.24 - <DDSElem MemberName = "tristate" MemberType = "unsigned int" Type = "Parm" Value = "TRISTATE_PORTS" /> 4.25 - <DDSElem MemberName = "data_width" MemberType = "unsigned int" Type = "Parm" Value = "DATA_WIDTH" /> 4.26 - <DDSElem MemberName = "input_width" MemberType = "unsigned int" Type = "Parm" Value = "INPUT_WIDTH" /> 4.27 - <DDSElem MemberName = "output_width" MemberType = "unsigned int" Type = "Parm" Value = "OUTPUT_WIDTH" /> 4.28 - <DDSElem MemberName = "intr_enable" MemberType = "unsigned int" Type = "Parm" Value = "IRQ_MODE" /> 4.29 - <DDSElem MemberName = "prev" MemberType = "void *" Type = "uninitialized" Value = "" /> 4.30 - <DDSElem MemberName = "next" MemberType = "void *" Type = "uninitialized" Value = "" /> 4.31 + <DDInclude Include = "LookupServices.h" Processor="LM32"/> 4.32 + <DDInclude Include = "stddef.h" Processor="LM8"/> 4.33 + <DDIRQ IRQAPI="MicoGPIOISR" Parameter="InstanceName" Include="MicoGPIO.h" Processor="LM8"/> 4.34 + <DDPreProcessor Name="__MICOGPIO_USER_IRQ_HANDLER__" Processor="LM8"/> 4.35 + <DDstruct> 4.36 + <DDSElem MemberName = "name" MemberType = "const char*" Type = "Parm" Value = "InstanceName" Format="string" Processor="LM32,LM8"/> 4.37 + <DDSElem MemberName = "base" MemberType = "unsigned int" Type = "Parm" Value = "BASE_ADDRESS" Processor="LM32"/> 4.38 + <DDSElem MemberName = "base" MemberType = "size_t" Type = "Parm" Value = "BASE_ADDRESS" Processor="LM8"/> 4.39 + <DDSElem MemberName = "lookupReg" MemberType = "DeviceReg_t" Type="uninitialized" Value="" Processor="LM32"/> 4.40 + <DDSElem MemberName = "intrLevel" MemberType = "unsigned int" Type = "Interrupt" Value = "IRQ_LEVEL" Processor="LM32"/> 4.41 + <DDSElem MemberName = "intrLevel" MemberType = "unsigned char" Type = "Interrupt" Value = "IRQ_LEVEL" Processor="LM8"/> 4.42 + <DDSElem MemberName = "output_only" MemberType = "unsigned int" Type = "Parm" Value = "OUTPUT_PORTS_ONLY" Processor="LM32"/> 4.43 + <DDSElem MemberName = "output_only" MemberType = "unsigned int" Type = "Parm" Value = "OUTPUT_PORTS_ONLY" Processor="LM8"/> 4.44 + <DDSElem MemberName = "input_only" MemberType = "unsigned int" Type = "Parm" Value = "INPUT_PORTS_ONLY" Processor="LM32"/> 4.45 + <DDSElem MemberName = "input_only" MemberType = "unsigned char" Type = "Parm" Value = "INPUT_PORTS_ONLY" Processor="LM8"/> 4.46 + <DDSElem MemberName = "in_and_out" MemberType = "unsigned int" Type = "Parm" Value = "BOTH_INPUT_AND_OUTPUT" Processor="LM32"/> 4.47 + <DDSElem MemberName = "in_and_out" MemberType = "unsigned char" Type = "Parm" Value = "BOTH_INPUT_AND_OUTPUT" Processor="LM8"/> 4.48 + <DDSElem MemberName = "tristate" MemberType = "unsigned int" Type = "Parm" Value = "TRISTATE_PORTS" Processor="LM32"/> 4.49 + <DDSElem MemberName = "tristate" MemberType = "unsigned char" Type = "Parm" Value = "TRISTATE_PORTS" Processor="LM8"/> 4.50 + <DDSElem MemberName = "data_width" MemberType = "unsigned int" Type = "Parm" Value = "DATA_WIDTH" Processor="LM32"/> 4.51 + <DDSElem MemberName = "data_width" MemberType = "unsigned char" Type = "Parm" Value = "DATA_WIDTH" Processor="LM8"/> 4.52 + <DDSElem MemberName = "input_width" MemberType = "unsigned int" Type = "Parm" Value = "INPUT_WIDTH" Processor="LM32"/> 4.53 + <DDSElem MemberName = "input_width" MemberType = "unsigned char" Type = "Parm" Value = "INPUT_WIDTH" Processor="LM8"/> 4.54 + <DDSElem MemberName = "output_width" MemberType = "unsigned int" Type = "Parm" Value = "OUTPUT_WIDTH" Processor="LM32"/> 4.55 + <DDSElem MemberName = "output_width" MemberType = "unsigned char" Type = "Parm" Value = "OUTPUT_WIDTH" Processor="LM8"/> 4.56 + <DDSElem MemberName = "intr_enable" MemberType = "unsigned int" Type = "Parm" Value = "IRQ_MODE" Processor="LM32"/> 4.57 + <DDSElem MemberName = "intr_enable" MemberType = "unsigned char" Type = "Parm" Value = "IRQ_MODE" Processor="LM8"/> 4.58 + <DDSElem MemberName = "wb_data_size" MemberType = "unsigned int" Type = "Parm" Value = "WB_DAT_WIDTH" Processor="LM32"/> 4.59 + <DDSElem MemberName = "prev" MemberType = "void *" Type = "uninitialized" Value = "" Processor="LM32"/> 4.60 + <DDSElem MemberName = "next" MemberType = "void *" Type = "uninitialized" Value = "" Processor="LM32"/> 4.61 </DDstruct> 4.62 </DeviceDriver> 4.63 <Files> 4.64 - <File Name="../components/gpio/rtl/verilog/gpio.v" /> 4.65 - <File Name="../components/gpio/rtl/verilog/tpio.v" /> 4.66 + <File Name="../components/gpio/rtl/verilog/gpio.v"/> 4.67 + <File Name="../components/gpio/rtl/verilog/tpio.v"/> 4.68 </Files> 4.69 <Parms> 4.70 - <Parm Name="InstanceName" Value="gpio" Type="string" isiname="true" Text="Instance Name"/> 4.71 - <Parm Name="BASE_ADDRESS" Value="0x80000000" Type="Integer" isba="true" Text="Base Address"/> 4.72 - <Parm Name="SIZE" Value="128" Type="Integer" issize="true" Text="Size" Enable="false"/> 4.73 + <Parm Name="InstanceName" Value="gpio" Type="string" isiname="true" Text="Instance Name"/> 4.74 + <Parm Name="BASE_ADDRESS" Value="0x80000000" Type="Integer" isba="true" Text="Base Address"/> 4.75 + <Parm Name="SIZE" Value="16" Type="Integer" issize="true" Text="Size" Enable="false"/> 4.76 + <Parm Name="WB_DAT_WIDTH" Port="GPIO" Type="List" ListValues="8,32" OType="Integer" Value="32" Text="WISHBONE Data Bus Width" isparm="true"/> 4.77 + <Parm Name="WB_ADR_WIDTH" Port="GPIO" Type="Integer" OType="Integer" Value="4" Text="WISHBONE Address Bus Width" isparm="true"/> 4.78 <Parm Name="ADDRESS_LOCK" Type="Define" Value="undef" Text="Lock Address"/> 4.79 <Parm Name="DISABLE" Type="Define" Value="undef" isuse="true" Text="Disable Component"/> 4.80 <Parm Name="OUTPUT_PORTS_ONLY" Type="define" Value="def" GROUP="XFER_MODE" Text="Output Ports Only" isparm="true" /> 4.81 @@ -50,8 +66,8 @@ 4.82 <Parm Name="INPUT_WIDTH" Type="Integer" ValueRange="1-32" Value="1" Condition="BOTH_INPUT_AND_OUTPUT" Text="Input Width" isparm="true"/> 4.83 <Parm Name="OUTPUT_WIDTH" Type="Integer" ValueRange="1-32" Value="1" Condition="BOTH_INPUT_AND_OUTPUT" Text="Output Width" isparm="true"/> 4.84 <Parm Name="IRQ_MODE" Type="define" Value="undef" Text="IRQ Mode" isparm="true"/> 4.85 - <Parm Name="LEVEL" Type="define" Value="undef" GROUP="IMODE" Condition="IRQ_MODE" Text="Level" isparm="true"/> 4.86 - <Parm Name="EDGE" Type="define" Value="def" GROUP="IMODE" Condition="IRQ_MODE" Text="Edge" isparm="true"/> 4.87 + <Parm Name="LEVEL" Type="define" Value="undef" GROUP="IMODE" Condition="IRQ_MODE" Text="Level Sensitive" isparm="true"/> 4.88 + <Parm Name="EDGE" Type="define" Value="def" GROUP="IMODE" Condition="IRQ_MODE" Text="Edge Sensitive" isparm="true"/> 4.89 <Parm Name="EITHER_EDGE_IRQ" Type="define" Value="undef" Group="EMODE" Condition="EDGE" Text="Either Edge" isparm="true"/> 4.90 <Parm Name="POSE_EDGE_IRQ" Type="define" Value="def" Group="EMODE" Condition="EDGE" Text="Postive Edge" isparm="true"/> 4.91 <Parm Name="NEGE_EDGE_IRQ" Type="define" Value="undef" Group="EMODE" Condition="EDGE" Text="Negative Edge" isparm="true"/> 4.92 @@ -59,25 +75,29 @@ 4.93 <GUIS Columns="2" Help="component_help\lm32.htm" Name="GPIO"> 4.94 <GUI Widget="Text" Span="1" Name="InstanceName" Width="40"/> 4.95 <GUI Widget="Text" Span="1" Name="BASE_ADDRESS"/> 4.96 - <GUI Widget="Group" Span="1" Name="XFER_MODE" Text="Port Types" Columns="1"/> 4.97 + 4.98 + <GUI Widget="Group" Span="1" Name="XFER_MODE" Text="Port Types" Columns="1"/> 4.99 <GUI Widget="Radio" Span="1" Name="OUTPUT_PORTS_ONLY"/> 4.100 <GUI Widget="Radio" Span="1" Name="INPUT_PORTS_ONLY"/> 4.101 <GUI Widget="Radio" Span="1" Name="TRISTATE_PORTS"/> 4.102 <GUI Widget="Radio" Span="1" Name="BOTH_INPUT_AND_OUTPUT"/> 4.103 - 4.104 - <GUI Widget="Group" Span="1" Text="Port Width" Columns="2"/> 4.105 + 4.106 + <GUI Widget="Group" Span="1" Text="Input/Output Port Widths" Columns="2"/> 4.107 <GUI Widget="Spinner" Span="1" Name="DATA_WIDTH"/> 4.108 <GUI Widget="Spinner" Span="1" Name="INPUT_WIDTH"/> 4.109 <GUI Widget="Spinner" Span="1" Name="OUTPUT_WIDTH"/> 4.110 - 4.111 - <GUI Widget="Group" Span="1" Name="IRQ_MODE" Text="IRQ Mode" Columns="1"/> 4.112 + 4.113 + <GUI Widget="Group" Span="2" Name="IRQ_MODE" Text="IRQ Mode" Columns="3"/> 4.114 <GUI Widget="Check" Span="1" Name="IRQ_MODE"/> 4.115 <GUI Widget="Radio" Span="1" Name="LEVEL"/> 4.116 <GUI Widget="Radio" Span="1" Name="EDGE"/> 4.117 - 4.118 - <GUI Widget="Group" Span="1" Text="Edge Response" Columns="1"/> 4.119 + 4.120 + <GUI Widget="Group" Span="2" Text="Edge Response" Columns="3"/> 4.121 <GUI Widget="Radio" Span="1" Name="EITHER_EDGE_IRQ"/> 4.122 <GUI Widget="Radio" Span="1" Name="POSE_EDGE_IRQ"/> 4.123 <GUI Widget="Radio" Span="1" Name="NEGE_EDGE_IRQ"/> 4.124 + 4.125 + <GUI Widget="Group" Span="2" Text="WISHBONE Configuration" Columns="2"/> 4.126 + <GUI Widget="Combo" Span="1" Name="WB_DAT_WIDTH" Port="GPIO"/> 4.127 </GUIS> 4.128 </Component>
5.1 diff -r 267b5a25932f -r dfc32cad81ba rtl/verilog/gpio.v 5.2 --- a/rtl/verilog/gpio.v Fri Aug 13 10:41:29 2010 +0100 5.3 +++ b/rtl/verilog/gpio.v Sat Aug 06 01:43:24 2011 +0100 5.4 @@ -1,18 +1,39 @@ 5.5 -// ============================================================================= 5.6 -// COPYRIGHT NOTICE 5.7 -// Copyright 2004 (c) Lattice Semiconductor Corporation 5.8 -// ALL RIGHTS RESERVED 5.9 -// This confidential and proprietary software may be used only as authorised by 5.10 -// a licensing agreement from Lattice Semiconductor Corporation. 5.11 -// The entire notice above must be reproduced on all authorized copies and 5.12 -// copies may only be made to the extent permitted by a licensing agreement from 5.13 -// Lattice Semiconductor Corporation. 5.14 +// ================================================================== 5.15 +// >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< 5.16 +// ------------------------------------------------------------------ 5.17 +// Copyright (c) 2006-2011 by Lattice Semiconductor Corporation 5.18 +// ALL RIGHTS RESERVED 5.19 +// ------------------------------------------------------------------ 5.20 +// 5.21 +// IMPORTANT: THIS FILE IS AUTO-GENERATED BY THE LATTICEMICO SYSTEM. 5.22 +// 5.23 +// Permission: 5.24 +// 5.25 +// Lattice Semiconductor grants permission to use this code 5.26 +// pursuant to the terms of the Lattice Semiconductor Corporation 5.27 +// Open Source License Agreement. 5.28 +// 5.29 +// Disclaimer: 5.30 // 5.31 -// Lattice Semiconductor Corporation TEL : 1-800-Lattice (USA and Canada) 5.32 -// 5555 NE Moore Court 408-826-6000 (other locations) 5.33 -// Hillsboro, OR 97124 web : http://www.latticesemi.com/ 5.34 -// U.S.A email: techsupport@latticesemi.com 5.35 -// =============================================================================/ 5.36 +// Lattice Semiconductor provides no warranty regarding the use or 5.37 +// functionality of this code. It is the user's responsibility to 5.38 +// verify the user’s design for consistency and functionality through 5.39 +// the use of formal verification methods. 5.40 +// 5.41 +// -------------------------------------------------------------------- 5.42 +// 5.43 +// Lattice Semiconductor Corporation 5.44 +// 5555 NE Moore Court 5.45 +// Hillsboro, OR 97214 5.46 +// U.S.A 5.47 +// 5.48 +// TEL: 1-800-Lattice (USA and Canada) 5.49 +// 503-286-8001 (other locations) 5.50 +// 5.51 +// web: http://www.latticesemi.com/ 5.52 +// email: techsupport@latticesemi.com 5.53 +// 5.54 +// -------------------------------------------------------------------- 5.55 // FILE DETAILS 5.56 // Project : GPIO for LM32 5.57 // File : gpio.v 5.58 @@ -34,346 +55,1782 @@ 5.59 // Mod. Date : 11 Oct. 2008 5.60 // Changes Made : Update the Edge Capture Register clean method 5.61 // Make IRQ Mask register readable 5.62 +// 5.63 +// Version : 3.2 5.64 +// Mod. Data : Jun 6, 2010 5.65 +// Changes Made : 1. Provide capability to read/write bytes (when GPIO larger 5.66 +// than 8 bits wide) 5.67 +// 2. Provide capability to use a 32-bit or 8-bit data bus on 5.68 +// the WISHBONE slave port 5.69 +// 3. Perform a big-endian to little-endian conversion in 5.70 +// hardware 5.71 // ============================================================================= 5.72 `ifndef GPIO_V 5.73 `define GPIO_V 5.74 `timescale 1ns/100 ps 5.75 `include "system_conf.v" 5.76 -module gpio #(parameter DATA_WIDTH = 16, 5.77 - parameter INPUT_WIDTH = 16, 5.78 - parameter OUTPUT_WIDTH = 16, 5.79 - parameter IRQ_MODE = 0, 5.80 - parameter LEVEL = 0, 5.81 - parameter EDGE = 0, 5.82 - parameter POSE_EDGE_IRQ = 0, 5.83 - parameter NEGE_EDGE_IRQ = 0, 5.84 - parameter EITHER_EDGE_IRQ = 0, 5.85 - parameter INPUT_PORTS_ONLY = 1, 5.86 - parameter OUTPUT_PORTS_ONLY = 0, 5.87 - parameter BOTH_INPUT_AND_OUTPUT = 0, 5.88 - parameter TRISTATE_PORTS = 0) 5.89 - ( 5.90 - //system clock and reset 5.91 - CLK_I, 5.92 - RST_I, 5.93 - //wishbone interface signals 5.94 - GPIO_ADR_I, 5.95 - GPIO_CYC_I, 5.96 - GPIO_DAT_I, 5.97 - GPIO_SEL_I, 5.98 - GPIO_STB_I, 5.99 - GPIO_WE_I, 5.100 - GPIO_LOCK_I, 5.101 - GPIO_CTI_I, 5.102 - GPIO_BTE_I, 5.103 - GPIO_ACK_O, 5.104 - GPIO_RTY_O, 5.105 - GPIO_DAT_O, 5.106 - GPIO_ERR_O, 5.107 - IRQ_O, //bit_or of all IRQs 5.108 - //PIO side 5.109 - PIO_IN, 5.110 - PIO_OUT, 5.111 - PIO_IO, 5.112 - PIO_BOTH_IN, 5.113 - PIO_BOTH_OUT 5.114 - ); 5.115 - 5.116 -//--------------------------------------------------------------------- 5.117 -// inputs 5.118 - // 5.119 - input CLK_I; 5.120 - input RST_I; 5.121 - input [31:0] GPIO_ADR_I; 5.122 - input GPIO_CYC_I; 5.123 - input [31:0] GPIO_DAT_I; 5.124 - input [3:0] GPIO_SEL_I; 5.125 - input GPIO_STB_I; 5.126 - input GPIO_WE_I; 5.127 - input GPIO_LOCK_I; 5.128 - input [2:0] GPIO_CTI_I; 5.129 - input [1:0] GPIO_BTE_I; 5.130 - input [DATA_WIDTH-1:0] PIO_IN; 5.131 - input [INPUT_WIDTH-1:0] PIO_BOTH_IN; 5.132 -//--------------------------------------------------------------------- 5.133 -// outputs 5.134 -// 5.135 - output GPIO_ACK_O; 5.136 - output GPIO_RTY_O; 5.137 - output [31:0] GPIO_DAT_O; 5.138 - output GPIO_ERR_O; 5.139 - output IRQ_O; 5.140 - output [DATA_WIDTH-1:0] PIO_OUT; 5.141 - output [OUTPUT_WIDTH-1:0] PIO_BOTH_OUT; 5.142 -//---------------- 5.143 -//inout mode 5.144 - inout [DATA_WIDTH-1:0] PIO_IO; 5.145 -//---------------- 5.146 -//process 5.147 +module gpio 5.148 + #( 5.149 + parameter GPIO_WB_DAT_WIDTH = 32, 5.150 + parameter GPIO_WB_ADR_WIDTH = 4, 5.151 + parameter DATA_WIDTH = 16, 5.152 + parameter INPUT_WIDTH = 16, 5.153 + parameter OUTPUT_WIDTH = 16, 5.154 + parameter IRQ_MODE = 0, 5.155 + parameter LEVEL = 0, 5.156 + parameter EDGE = 0, 5.157 + parameter POSE_EDGE_IRQ = 0, 5.158 + parameter NEGE_EDGE_IRQ = 0, 5.159 + parameter EITHER_EDGE_IRQ = 0, 5.160 + parameter INPUT_PORTS_ONLY = 1, 5.161 + parameter OUTPUT_PORTS_ONLY = 0, 5.162 + parameter BOTH_INPUT_AND_OUTPUT = 0, 5.163 + parameter TRISTATE_PORTS = 0 5.164 + ) 5.165 + ( 5.166 + // system clock and reset 5.167 + input CLK_I, 5.168 + input RST_I, 5.169 + 5.170 + // wishbone interface signals 5.171 + input GPIO_CYC_I, 5.172 + input GPIO_STB_I, 5.173 + input GPIO_WE_I, 5.174 + input GPIO_LOCK_I, 5.175 + input [2:0] GPIO_CTI_I, 5.176 + input [1:0] GPIO_BTE_I, 5.177 + input [GPIO_WB_ADR_WIDTH-1:0] GPIO_ADR_I, 5.178 + input [GPIO_WB_DAT_WIDTH-1:0] GPIO_DAT_I, 5.179 + input [GPIO_WB_DAT_WIDTH/8-1:0] GPIO_SEL_I, 5.180 + output reg GPIO_ACK_O, 5.181 + output GPIO_ERR_O, 5.182 + output GPIO_RTY_O, 5.183 + output [GPIO_WB_DAT_WIDTH-1:0] GPIO_DAT_O, 5.184 + 5.185 + output IRQ_O, 5.186 + 5.187 + // PIO side 5.188 + input [DATA_WIDTH-1:0] PIO_IN, 5.189 + input [INPUT_WIDTH-1:0] PIO_BOTH_IN, 5.190 + output [DATA_WIDTH-1:0] PIO_OUT, 5.191 + output [OUTPUT_WIDTH-1:0] PIO_BOTH_OUT, 5.192 + inout [DATA_WIDTH-1:0] PIO_IO 5.193 + ); 5.194 5.195 - parameter UDLY = 1; 5.196 + // The incoming data bus is big-endian and the internal memory-mapped registers of GPIO 5.197 + // component are little-endian. Performing a big-endian to little-endian conversion! 5.198 + wire [GPIO_WB_DAT_WIDTH-1:0] GPIO_DAT_I_switch, GPIO_DAT_O_switch; 5.199 + wire [GPIO_WB_DAT_WIDTH/8-1:0] GPIO_SEL_I_switch; 5.200 + generate 5.201 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.202 + assign GPIO_DAT_I_switch = GPIO_DAT_I; 5.203 + assign GPIO_SEL_I_switch = GPIO_SEL_I; 5.204 + assign GPIO_DAT_O = GPIO_DAT_O_switch; 5.205 + end 5.206 + else begin 5.207 + assign GPIO_DAT_I_switch = {GPIO_DAT_I[7:0], GPIO_DAT_I[15:8], GPIO_DAT_I[23:16], GPIO_DAT_I[31:24]}; 5.208 + assign GPIO_SEL_I_switch = {GPIO_SEL_I[0], GPIO_SEL_I[1], GPIO_SEL_I[2], GPIO_SEL_I[3]}; 5.209 + assign GPIO_DAT_O = {GPIO_DAT_O_switch[7:0], GPIO_DAT_O_switch[15:8], GPIO_DAT_O_switch[23:16], GPIO_DAT_O_switch[31:24]}; 5.210 + end 5.211 + endgenerate 5.212 + 5.213 + reg [OUTPUT_WIDTH-1:0] PIO_DATAO; 5.214 + reg [INPUT_WIDTH-1:0] PIO_DATAI; 5.215 + wire ADR_0, ADR_4, ADR_8, ADR_C; 5.216 + wire [DATA_WIDTH-1:0] tpio_out; 5.217 + 5.218 + wire PIO_DATA_WR_EN; 5.219 + wire PIO_DATA_WR_EN_0, PIO_DATA_WR_EN_1, PIO_DATA_WR_EN_2, PIO_DATA_WR_EN_3; 5.220 5.221 - wire ADR_0; 5.222 - wire ADR_4; 5.223 - wire ADR_8; 5.224 - wire ADR_C; 5.225 - wire read_addr_0; 5.226 - wire read_addr_4; 5.227 - wire read_addr_8; 5.228 - wire read_addr_C; 5.229 - wire GPIO_RTY_O; 5.230 - wire GPIO_ERR_O; 5.231 - wire [31:0] GPIO_DAT_O; 5.232 - wire IRQ_O; 5.233 - wire [DATA_WIDTH-1:0] PIO_OUT; 5.234 - wire [OUTPUT_WIDTH-1:0] PIO_BOTH_OUT; 5.235 - wire [DATA_WIDTH-1:0] tpio_out; 5.236 - wire PIO_DATA_WR_EN; 5.237 - wire PIO_TRI_WR_EN; 5.238 - wire IRQ_MASK_WR_EN; 5.239 - wire EDGE_CAP_WR_EN; 5.240 - wire PIO_DATA_RE_EN; 5.241 - wire PIO_TRI_RE_EN; 5.242 - wire IRQ_MASK_RE_EN; 5.243 - wire [DATA_WIDTH-1:0] IRQ_TRI_TEMP; 5.244 - reg [DATA_WIDTH-1:0] PIO_DATA; 5.245 - reg [DATA_WIDTH-1:0] IRQ_MASK; 5.246 - reg [INPUT_WIDTH-1:0] IRQ_MASK_BOTH; 5.247 - reg [DATA_WIDTH-1:0] IRQ_TEMP; 5.248 - reg [INPUT_WIDTH-1:0] IRQ_TEMP_BOTH; 5.249 - reg [DATA_WIDTH-1:0] EDGE_CAPTURE; 5.250 - reg [INPUT_WIDTH-1:0] EDGE_CAPTURE_BOTH; 5.251 - reg [DATA_WIDTH-1:0] PIO_DATA_DLY; 5.252 - reg [INPUT_WIDTH-1:0] PIO_DATA_DLY_BOTH; 5.253 - reg [OUTPUT_WIDTH-1:0] PIO_DATAO; 5.254 - reg [INPUT_WIDTH-1 :0] PIO_DATAI; 5.255 - reg GPIO_ACK_O; 5.256 - 5.257 + wire PIO_TRI_WR_EN; 5.258 + wire PIO_TRI_WR_EN_0, PIO_TRI_WR_EN_1, PIO_TRI_WR_EN_2, PIO_TRI_WR_EN_3; 5.259 + 5.260 + wire IRQ_MASK_WR_EN; 5.261 + wire IRQ_MASK_WR_EN_0, IRQ_MASK_WR_EN_1, IRQ_MASK_WR_EN_2, IRQ_MASK_WR_EN_3; 5.262 + 5.263 + wire EDGE_CAP_WR_EN; 5.264 + wire EDGE_CAP_WR_EN_0, EDGE_CAP_WR_EN_1, EDGE_CAP_WR_EN_2, EDGE_CAP_WR_EN_3; 5.265 + 5.266 + wire PIO_DATA_RE_EN; 5.267 + wire PIO_TRI_RE_EN; 5.268 + wire IRQ_MASK_RE_EN; 5.269 + wire [DATA_WIDTH-1:0] IRQ_TRI_TEMP; 5.270 + reg [DATA_WIDTH-1:0] PIO_DATA; 5.271 + reg [DATA_WIDTH-1:0] IRQ_MASK; 5.272 + reg [INPUT_WIDTH-1:0] IRQ_MASK_BOTH; 5.273 + reg [DATA_WIDTH-1:0] IRQ_TEMP; 5.274 + reg [INPUT_WIDTH-1:0] IRQ_TEMP_BOTH; 5.275 + reg [DATA_WIDTH-1:0] EDGE_CAPTURE; 5.276 + reg [INPUT_WIDTH-1:0] EDGE_CAPTURE_BOTH; 5.277 + reg [DATA_WIDTH-1:0] PIO_DATA_DLY; 5.278 + reg [INPUT_WIDTH-1:0] PIO_DATA_DLY_BOTH; 5.279 + 5.280 + parameter UDLY = 1; 5.281 + 5.282 assign GPIO_RTY_O = 1'b0; 5.283 assign GPIO_ERR_O = 1'b0; 5.284 - assign ADR_0 = (GPIO_ADR_I[3:0] == 4'b0000 ? 1'b1 : 0); // IO Data 5.285 - assign ADR_4 = (GPIO_ADR_I[3:0] == 4'b0100 ? 1'b1 : 0); // Tri-state Control 5.286 - assign ADR_8 = (GPIO_ADR_I[3:0] == 4'b1000 ? 1'b1 : 0); // IRQ Mask 5.287 - assign ADR_C = (GPIO_ADR_I[3:0] == 4'b1100 ? 1'b1 : 0); // Edge Capture 5.288 + assign ADR_0 = (GPIO_ADR_I[3:2] == 4'b00 ? 1'b1 : 0); // IO Data 5.289 + assign ADR_4 = (GPIO_ADR_I[3:2] == 4'b01 ? 1'b1 : 0); // Tri-state Control 5.290 + assign ADR_8 = (GPIO_ADR_I[3:2] == 4'b10 ? 1'b1 : 0); // IRQ Mask 5.291 + assign ADR_C = (GPIO_ADR_I[3:2] == 4'b11 ? 1'b1 : 0); // Edge Capture 5.292 + 5.293 + always @(posedge CLK_I or posedge RST_I) 5.294 + if(RST_I) 5.295 + GPIO_ACK_O <= #UDLY 1'b0; 5.296 + else if(GPIO_STB_I && (GPIO_ACK_O == 1'b0)) 5.297 + GPIO_ACK_O <= #UDLY 1'b1; 5.298 + else 5.299 + GPIO_ACK_O <= #UDLY 1'b0; 5.300 + 5.301 + 5.302 + generate 5.303 + if (INPUT_PORTS_ONLY == 1) begin 5.304 + always @(posedge CLK_I or posedge RST_I) 5.305 + if (RST_I) 5.306 + PIO_DATA <= #UDLY 0; 5.307 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && GPIO_ADR_I[3:2] == 2'b00) 5.308 + PIO_DATA <= #UDLY PIO_IN; 5.309 + end 5.310 + endgenerate 5.311 + 5.312 + generate 5.313 + if (OUTPUT_PORTS_ONLY == 1) begin 5.314 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.315 + genvar ipd_idx; 5.316 + for (ipd_idx = 0; (ipd_idx < DATA_WIDTH) && (ipd_idx < 8); ipd_idx = ipd_idx + 1) 5.317 + begin 5.318 + always @(posedge CLK_I or posedge RST_I) 5.319 + if (RST_I) 5.320 + PIO_DATA[ipd_idx] <= #UDLY 0; 5.321 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0000) 5.322 + PIO_DATA[ipd_idx] <= #UDLY GPIO_DAT_I_switch[ipd_idx]; 5.323 + end 5.324 + if (DATA_WIDTH > 8) begin 5.325 + genvar jpd_idx; 5.326 + for (jpd_idx = 8; (jpd_idx < DATA_WIDTH) && (jpd_idx < 16); jpd_idx = jpd_idx + 1) 5.327 + begin 5.328 + always @(posedge CLK_I or posedge RST_I) 5.329 + if (RST_I) 5.330 + PIO_DATA[jpd_idx] <= #UDLY 0; 5.331 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0001) 5.332 + PIO_DATA[jpd_idx] <= #UDLY GPIO_DAT_I_switch[jpd_idx-8]; 5.333 + end 5.334 + end 5.335 + if (DATA_WIDTH > 16) begin 5.336 + genvar kpd_idx; 5.337 + for (kpd_idx = 16; (kpd_idx < DATA_WIDTH) && (kpd_idx < 24); kpd_idx = kpd_idx + 1) 5.338 + begin 5.339 + always @(posedge CLK_I or posedge RST_I) 5.340 + if (RST_I) 5.341 + PIO_DATA[kpd_idx] <= #UDLY 0; 5.342 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0010) 5.343 + PIO_DATA[kpd_idx] <= #UDLY GPIO_DAT_I_switch[kpd_idx-16]; 5.344 + end 5.345 + end 5.346 + if (DATA_WIDTH > 24) begin 5.347 + genvar lpd_idx; 5.348 + for (lpd_idx = 24; (lpd_idx < DATA_WIDTH) && (lpd_idx < 32); lpd_idx = lpd_idx + 1) 5.349 + begin 5.350 + always @(posedge CLK_I or posedge RST_I) 5.351 + if (RST_I) 5.352 + PIO_DATA[lpd_idx] <= #UDLY 0; 5.353 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0011) 5.354 + PIO_DATA[lpd_idx] <= #UDLY GPIO_DAT_I_switch[lpd_idx-24]; 5.355 + end 5.356 + end 5.357 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.358 + 5.359 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.360 + genvar ipd_idx; 5.361 + for (ipd_idx = 0; (ipd_idx < DATA_WIDTH) && (ipd_idx < 8); ipd_idx = ipd_idx + 1) 5.362 + begin 5.363 + always @(posedge CLK_I or posedge RST_I) 5.364 + if (RST_I) 5.365 + PIO_DATA[ipd_idx] <= #UDLY 0; 5.366 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[0]) 5.367 + PIO_DATA[ipd_idx] <= #UDLY GPIO_DAT_I_switch[ipd_idx]; 5.368 + end 5.369 + if (DATA_WIDTH > 8) begin 5.370 + genvar jpd_idx; 5.371 + for (jpd_idx = 8; (jpd_idx < DATA_WIDTH) && (jpd_idx < 16); jpd_idx = jpd_idx + 1) 5.372 + begin 5.373 + always @(posedge CLK_I or posedge RST_I) 5.374 + if (RST_I) 5.375 + PIO_DATA[jpd_idx] <= #UDLY 0; 5.376 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[1]) 5.377 + PIO_DATA[jpd_idx] <= #UDLY GPIO_DAT_I_switch[jpd_idx]; 5.378 + end 5.379 + end 5.380 + if (DATA_WIDTH > 16) begin 5.381 + genvar kpd_idx; 5.382 + for (kpd_idx = 16; (kpd_idx < DATA_WIDTH) && (kpd_idx < 24); kpd_idx = kpd_idx + 1) 5.383 + begin 5.384 + always @(posedge CLK_I or posedge RST_I) 5.385 + if (RST_I) 5.386 + PIO_DATA[kpd_idx] <= #UDLY 0; 5.387 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[2]) 5.388 + PIO_DATA[kpd_idx] <= #UDLY GPIO_DAT_I_switch[kpd_idx]; 5.389 + end 5.390 + end 5.391 + if (DATA_WIDTH > 24) begin 5.392 + genvar lpd_idx; 5.393 + for (lpd_idx = 24; (lpd_idx < DATA_WIDTH) && (lpd_idx < 32); lpd_idx = lpd_idx + 1) 5.394 + begin 5.395 + always @(posedge CLK_I or posedge RST_I) 5.396 + if (RST_I) 5.397 + PIO_DATA[lpd_idx] <= #UDLY 0; 5.398 + else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[3]) 5.399 + PIO_DATA[lpd_idx] <= #UDLY GPIO_DAT_I_switch[lpd_idx]; 5.400 + end 5.401 + end 5.402 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.403 + 5.404 + assign PIO_OUT = PIO_DATA; 5.405 + end 5.406 + endgenerate 5.407 + 5.408 + generate 5.409 + if (BOTH_INPUT_AND_OUTPUT == 1) begin 5.410 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.411 + genvar iopd_idx; 5.412 + for (iopd_idx = 0; (iopd_idx < OUTPUT_WIDTH) && (iopd_idx < 8); iopd_idx = iopd_idx + 1) 5.413 + begin 5.414 + always @(posedge CLK_I or posedge RST_I) 5.415 + if (RST_I) 5.416 + begin 5.417 + PIO_DATAI[iopd_idx] <= #UDLY 0; 5.418 + PIO_DATAO[iopd_idx] <= #UDLY 0; 5.419 + end 5.420 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0000) 5.421 + PIO_DATAI[iopd_idx] <= #UDLY PIO_BOTH_IN[iopd_idx]; 5.422 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0000) 5.423 + PIO_DATAO[iopd_idx] <= #UDLY GPIO_DAT_I_switch[iopd_idx]; 5.424 + end 5.425 + if (OUTPUT_WIDTH > 8) begin 5.426 + genvar jopd_idx; 5.427 + for (jopd_idx = 8; (jopd_idx < OUTPUT_WIDTH) && (jopd_idx < 16); jopd_idx = jopd_idx + 1) 5.428 + begin 5.429 + always @(posedge CLK_I or posedge RST_I) 5.430 + if (RST_I) 5.431 + begin 5.432 + PIO_DATAI[jopd_idx] <= #UDLY 0; 5.433 + PIO_DATAO[jopd_idx] <= #UDLY 0; 5.434 + end 5.435 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0001) 5.436 + PIO_DATAI[jopd_idx] <= #UDLY PIO_BOTH_IN[jopd_idx]; 5.437 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0001) 5.438 + PIO_DATAO[jopd_idx] <= #UDLY GPIO_DAT_I_switch[jopd_idx-8]; 5.439 + end 5.440 + end 5.441 + if (OUTPUT_WIDTH > 16) begin 5.442 + genvar kopd_idx; 5.443 + for (kopd_idx = 16; (kopd_idx < OUTPUT_WIDTH) && (kopd_idx < 24); kopd_idx = kopd_idx + 1) 5.444 + begin 5.445 + always @(posedge CLK_I or posedge RST_I) 5.446 + if (RST_I) 5.447 + begin 5.448 + PIO_DATAI[kopd_idx] <= #UDLY 0; 5.449 + PIO_DATAO[kopd_idx] <= #UDLY 0; 5.450 + end 5.451 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0010) 5.452 + PIO_DATAI[kopd_idx] <= #UDLY PIO_BOTH_IN[kopd_idx]; 5.453 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0010) 5.454 + PIO_DATAO[kopd_idx] <= #UDLY GPIO_DAT_I_switch[kopd_idx-16]; 5.455 + end 5.456 + end 5.457 + if (OUTPUT_WIDTH > 24) begin 5.458 + genvar lopd_idx; 5.459 + for (lopd_idx = 24; (lopd_idx < OUTPUT_WIDTH) && (lopd_idx < 32); lopd_idx = lopd_idx + 1) 5.460 + begin 5.461 + always @(posedge CLK_I or posedge RST_I) 5.462 + if (RST_I) 5.463 + begin 5.464 + PIO_DATAI[lopd_idx] <= #UDLY 0; 5.465 + PIO_DATAO[lopd_idx] <= #UDLY 0; 5.466 + end 5.467 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0011) 5.468 + PIO_DATAI[lopd_idx] <= #UDLY PIO_BOTH_IN[lopd_idx]; 5.469 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0011) 5.470 + PIO_DATAO[lopd_idx] <= #UDLY GPIO_DAT_I_switch[lopd_idx-24]; 5.471 + end 5.472 + end 5.473 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.474 + 5.475 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.476 + genvar iopd_idx; 5.477 + for (iopd_idx = 0; (iopd_idx < OUTPUT_WIDTH) && (iopd_idx < 8); iopd_idx = iopd_idx + 1) 5.478 + begin 5.479 + always @(posedge CLK_I or posedge RST_I) 5.480 + if (RST_I) 5.481 + begin 5.482 + PIO_DATAI[iopd_idx] <= #UDLY 0; 5.483 + PIO_DATAO[iopd_idx] <= #UDLY 0; 5.484 + end 5.485 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[0]) 5.486 + PIO_DATAI[iopd_idx] <= #UDLY PIO_BOTH_IN[iopd_idx]; 5.487 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[0]) 5.488 + PIO_DATAO[iopd_idx] <= #UDLY GPIO_DAT_I_switch[iopd_idx]; 5.489 + end 5.490 + if (OUTPUT_WIDTH > 8) begin 5.491 + genvar jopd_idx; 5.492 + for (jopd_idx = 8; (jopd_idx < OUTPUT_WIDTH) && (jopd_idx < 16); jopd_idx = jopd_idx + 1) 5.493 + begin 5.494 + always @(posedge CLK_I or posedge RST_I) 5.495 + if (RST_I) 5.496 + begin 5.497 + PIO_DATAI[jopd_idx] <= #UDLY 0; 5.498 + PIO_DATAO[jopd_idx] <= #UDLY 0; 5.499 + end 5.500 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[1]) 5.501 + PIO_DATAI[jopd_idx] <= #UDLY PIO_BOTH_IN[jopd_idx]; 5.502 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[1]) 5.503 + PIO_DATAO[jopd_idx] <= #UDLY GPIO_DAT_I_switch[jopd_idx]; 5.504 + end 5.505 + end 5.506 + if (OUTPUT_WIDTH > 16) begin 5.507 + genvar kopd_idx; 5.508 + for (kopd_idx = 16; (kopd_idx < OUTPUT_WIDTH) && (kopd_idx < 24); kopd_idx = kopd_idx + 1) 5.509 + begin 5.510 + always @(posedge CLK_I or posedge RST_I) 5.511 + if (RST_I) 5.512 + begin 5.513 + PIO_DATAI[kopd_idx] <= #UDLY 0; 5.514 + PIO_DATAO[kopd_idx] <= #UDLY 0; 5.515 + end 5.516 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[2]) 5.517 + PIO_DATAI[kopd_idx] <= #UDLY PIO_BOTH_IN[kopd_idx]; 5.518 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[2]) 5.519 + PIO_DATAO[kopd_idx] <= #UDLY GPIO_DAT_I_switch[kopd_idx]; 5.520 + end 5.521 + end 5.522 + if (OUTPUT_WIDTH > 24) begin 5.523 + genvar lopd_idx; 5.524 + for (lopd_idx = 24; (lopd_idx < OUTPUT_WIDTH) && (lopd_idx < 32); lopd_idx = lopd_idx + 1) 5.525 + begin 5.526 + always @(posedge CLK_I or posedge RST_I) 5.527 + if (RST_I) 5.528 + begin 5.529 + PIO_DATAI[lopd_idx] <= #UDLY 0; 5.530 + PIO_DATAO[lopd_idx] <= #UDLY 0; 5.531 + end 5.532 + else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[3]) 5.533 + PIO_DATAI[lopd_idx] <= #UDLY PIO_BOTH_IN[lopd_idx]; 5.534 + else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I_switch[3]) 5.535 + PIO_DATAO[lopd_idx] <= #UDLY GPIO_DAT_I_switch[lopd_idx]; 5.536 + end 5.537 + end 5.538 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.539 + 5.540 + assign PIO_BOTH_OUT = PIO_DATAO[OUTPUT_WIDTH-1:0]; 5.541 + end 5.542 + endgenerate 5.543 + 5.544 + assign PIO_DATA_RE_EN = GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && (GPIO_ADR_I[3:2] == 2'b00); 5.545 + 5.546 + assign PIO_TRI_RE_EN = GPIO_STB_I && GPIO_ACK_O && !GPIO_WE_I && (GPIO_ADR_I[3:2] == 2'b01); 5.547 + 5.548 + assign IRQ_MASK_RE_EN = GPIO_STB_I && GPIO_ACK_O && !GPIO_WE_I && (GPIO_ADR_I[3:2] == 2'b10); 5.549 + 5.550 + assign PIO_DATA_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (GPIO_ADR_I[3:2] == 2'b00); 5.551 + generate 5.552 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.553 + assign PIO_DATA_WR_EN_0 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0000; 5.554 + assign PIO_DATA_WR_EN_1 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0001; 5.555 + assign PIO_DATA_WR_EN_2 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0010; 5.556 + assign PIO_DATA_WR_EN_3 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0011; 5.557 + end 5.558 + endgenerate 5.559 + 5.560 + assign PIO_TRI_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (GPIO_ADR_I[3:2] == 4'b01); 5.561 + generate 5.562 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.563 + assign PIO_TRI_WR_EN_0 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0100; 5.564 + assign PIO_TRI_WR_EN_1 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0101; 5.565 + assign PIO_TRI_WR_EN_2 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0110; 5.566 + assign PIO_TRI_WR_EN_3 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b0111; 5.567 + end 5.568 + endgenerate 5.569 + 5.570 + assign IRQ_MASK_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (GPIO_ADR_I[3:2] == 2'b10); 5.571 + generate 5.572 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.573 + assign IRQ_MASK_WR_EN_0 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1000; 5.574 + assign IRQ_MASK_WR_EN_1 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1001; 5.575 + assign IRQ_MASK_WR_EN_2 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1010; 5.576 + assign IRQ_MASK_WR_EN_3 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1011; 5.577 + end 5.578 + endgenerate 5.579 + 5.580 + assign EDGE_CAP_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (GPIO_ADR_I[3:2] == 2'b11); 5.581 + generate 5.582 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.583 + assign EDGE_CAP_WR_EN_0 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1100; 5.584 + assign EDGE_CAP_WR_EN_1 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1101; 5.585 + assign EDGE_CAP_WR_EN_2 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1110; 5.586 + assign EDGE_CAP_WR_EN_3 = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && GPIO_ADR_I[3:0] == 4'b1111; 5.587 + end 5.588 + endgenerate 5.589 + 5.590 + generate 5.591 + 5.592 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.593 + 5.594 + genvar iti; 5.595 + for (iti = 0; (iti < DATA_WIDTH) && (iti < 8); iti = iti + 1) 5.596 + begin : itio_inst 5.597 + TRI_PIO 5.598 + #(.DATA_WIDTH(1), 5.599 + .IRQ_MODE(IRQ_MODE), 5.600 + .LEVEL(LEVEL), 5.601 + .EDGE(EDGE), 5.602 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.603 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.604 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.605 + TP 5.606 + (.CLK_I(CLK_I), 5.607 + .RST_I(RST_I), 5.608 + .DAT_I(GPIO_DAT_I_switch[iti]), 5.609 + .DAT_O(tpio_out[iti]), 5.610 + .PIO_IO(PIO_IO[iti]), 5.611 + .IRQ_O(IRQ_TRI_TEMP[iti]), 5.612 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN_0), 5.613 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.614 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN_0), 5.615 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.616 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN_0), 5.617 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.618 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN_0)); 5.619 + end 5.620 + if (DATA_WIDTH > 8) begin 5.621 + genvar jti; 5.622 + for (jti = 8; (jti < DATA_WIDTH) && (jti < 16); jti = jti + 1) 5.623 + begin : jtio_inst 5.624 + TRI_PIO 5.625 + #(.DATA_WIDTH(1), 5.626 + .IRQ_MODE(IRQ_MODE), 5.627 + .LEVEL(LEVEL), 5.628 + .EDGE(EDGE), 5.629 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.630 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.631 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.632 + TP 5.633 + (.CLK_I(CLK_I), 5.634 + .RST_I(RST_I), 5.635 + .DAT_I(GPIO_DAT_I_switch[jti-8]), 5.636 + .DAT_O(tpio_out[jti]), 5.637 + .PIO_IO(PIO_IO[jti]), 5.638 + .IRQ_O(IRQ_TRI_TEMP[jti]), 5.639 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN_1), 5.640 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.641 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN_1), 5.642 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.643 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN_1), 5.644 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.645 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN_1)); 5.646 + end 5.647 + end 5.648 + if (DATA_WIDTH > 16) begin 5.649 + genvar kti; 5.650 + for (kti = 16; (kti < DATA_WIDTH) && (kti < 24); kti = kti + 1) 5.651 + begin : ktio_inst 5.652 + TRI_PIO 5.653 + #(.DATA_WIDTH(1), 5.654 + .IRQ_MODE(IRQ_MODE), 5.655 + .LEVEL(LEVEL), 5.656 + .EDGE(EDGE), 5.657 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.658 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.659 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.660 + TP 5.661 + (.CLK_I(CLK_I), 5.662 + .RST_I(RST_I), 5.663 + .DAT_I(GPIO_DAT_I_switch[kti-16]), 5.664 + .DAT_O(tpio_out[kti]), 5.665 + .PIO_IO(PIO_IO[kti]), 5.666 + .IRQ_O(IRQ_TRI_TEMP[kti]), 5.667 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN_2), 5.668 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.669 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN_2), 5.670 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.671 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN_2), 5.672 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.673 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN_2)); 5.674 + end 5.675 + end 5.676 + if (DATA_WIDTH > 24) begin 5.677 + genvar lti; 5.678 + for (lti = 24; (lti < DATA_WIDTH) && (lti < 32); lti = lti + 1) 5.679 + begin : ltio_inst 5.680 + TRI_PIO 5.681 + #(.DATA_WIDTH(1), 5.682 + .IRQ_MODE(IRQ_MODE), 5.683 + .LEVEL(LEVEL), 5.684 + .EDGE(EDGE), 5.685 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.686 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.687 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.688 + TP 5.689 + (.CLK_I(CLK_I), 5.690 + .RST_I(RST_I), 5.691 + .DAT_I(GPIO_DAT_I_switch[lti-24]), 5.692 + .DAT_O(tpio_out[lti]), 5.693 + .PIO_IO(PIO_IO[lti]), 5.694 + .IRQ_O(IRQ_TRI_TEMP[lti]), 5.695 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN_3), 5.696 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.697 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN_3), 5.698 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.699 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN_3), 5.700 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.701 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN_3)); 5.702 + end 5.703 + end 5.704 + 5.705 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.706 + 5.707 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.708 + 5.709 + genvar iti; 5.710 + for (iti = 0; (iti < DATA_WIDTH) && (iti < 8); iti = iti + 1) 5.711 + begin : itio_inst 5.712 + TRI_PIO 5.713 + #(.DATA_WIDTH(1), 5.714 + .IRQ_MODE(IRQ_MODE), 5.715 + .LEVEL(LEVEL), 5.716 + .EDGE(EDGE), 5.717 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.718 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.719 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.720 + TP 5.721 + (.CLK_I(CLK_I), 5.722 + .RST_I(RST_I), 5.723 + .DAT_I(GPIO_DAT_I_switch[iti]), 5.724 + .DAT_O(tpio_out[iti]), 5.725 + .PIO_IO(PIO_IO[iti]), 5.726 + .IRQ_O(IRQ_TRI_TEMP[iti]), 5.727 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN & GPIO_SEL_I_switch[0]), 5.728 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.729 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN & GPIO_SEL_I_switch[0]), 5.730 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.731 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN & GPIO_SEL_I_switch[0]), 5.732 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.733 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN & GPIO_SEL_I_switch[0])); 5.734 + end 5.735 + if (DATA_WIDTH > 8) begin 5.736 + genvar jti; 5.737 + for (jti = 8; (jti < DATA_WIDTH) && (jti < 16); jti = jti + 1) 5.738 + begin : jtio_inst 5.739 + TRI_PIO 5.740 + #(.DATA_WIDTH(1), 5.741 + .IRQ_MODE(IRQ_MODE), 5.742 + .LEVEL(LEVEL), 5.743 + .EDGE(EDGE), 5.744 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.745 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.746 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.747 + TP 5.748 + (.CLK_I(CLK_I), 5.749 + .RST_I(RST_I), 5.750 + .DAT_I(GPIO_DAT_I_switch[jti]), 5.751 + .DAT_O(tpio_out[jti]), 5.752 + .PIO_IO(PIO_IO[jti]), 5.753 + .IRQ_O(IRQ_TRI_TEMP[jti]), 5.754 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN & GPIO_SEL_I_switch[1]), 5.755 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.756 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN & GPIO_SEL_I_switch[1]), 5.757 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.758 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN & GPIO_SEL_I_switch[1]), 5.759 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.760 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN & GPIO_SEL_I_switch[1])); 5.761 + end 5.762 + end 5.763 + if (DATA_WIDTH > 16) begin 5.764 + genvar kti; 5.765 + for (kti = 16; (kti < DATA_WIDTH) && (kti < 24); kti = kti + 1) 5.766 + begin : ktio_inst 5.767 + TRI_PIO 5.768 + #(.DATA_WIDTH(1), 5.769 + .IRQ_MODE(IRQ_MODE), 5.770 + .LEVEL(LEVEL), 5.771 + .EDGE(EDGE), 5.772 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.773 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.774 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.775 + TP 5.776 + (.CLK_I(CLK_I), 5.777 + .RST_I(RST_I), 5.778 + .DAT_I(GPIO_DAT_I_switch[kti]), 5.779 + .DAT_O(tpio_out[kti]), 5.780 + .PIO_IO(PIO_IO[kti]), 5.781 + .IRQ_O(IRQ_TRI_TEMP[kti]), 5.782 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN & GPIO_SEL_I_switch[2]), 5.783 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.784 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN & GPIO_SEL_I_switch[2]), 5.785 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.786 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN & GPIO_SEL_I_switch[2]), 5.787 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.788 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN & GPIO_SEL_I_switch[2])); 5.789 + end 5.790 + end 5.791 + if (DATA_WIDTH > 24) begin 5.792 + genvar lti; 5.793 + for (lti = 24; (lti < DATA_WIDTH) && (lti < 32); lti = lti + 1) 5.794 + begin : ltio_inst 5.795 + TRI_PIO 5.796 + #(.DATA_WIDTH(1), 5.797 + .IRQ_MODE(IRQ_MODE), 5.798 + .LEVEL(LEVEL), 5.799 + .EDGE(EDGE), 5.800 + .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.801 + .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.802 + .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.803 + TP 5.804 + (.CLK_I(CLK_I), 5.805 + .RST_I(RST_I), 5.806 + .DAT_I(GPIO_DAT_I_switch[lti]), 5.807 + .DAT_O(tpio_out[lti]), 5.808 + .PIO_IO(PIO_IO[lti]), 5.809 + .IRQ_O(IRQ_TRI_TEMP[lti]), 5.810 + .PIO_TRI_WR_EN(PIO_TRI_WR_EN & GPIO_SEL_I_switch[3]), 5.811 + .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.812 + .PIO_DATA_WR_EN(PIO_DATA_WR_EN & GPIO_SEL_I_switch[3]), 5.813 + .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.814 + .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN & GPIO_SEL_I_switch[3]), 5.815 + .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.816 + .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN & GPIO_SEL_I_switch[3])); 5.817 + end 5.818 + end 5.819 + 5.820 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.821 + 5.822 + endgenerate 5.823 + 5.824 + 5.825 + wire read_addr_0, read_addr_4, read_addr_8, read_addr_C; 5.826 assign read_addr_0 = (ADR_0 & GPIO_STB_I & ~GPIO_WE_I) ; 5.827 assign read_addr_4 = (ADR_4 & GPIO_STB_I & ~GPIO_WE_I) ; 5.828 assign read_addr_8 = (IRQ_MODE == 1 && (ADR_8 & GPIO_STB_I & ~GPIO_WE_I)); 5.829 - assign read_addr_C = (IRQ_MODE == 1 && (ADR_C & GPIO_STB_I & ~GPIO_WE_I)); 5.830 - 5.831 - always @(posedge CLK_I or posedge RST_I) 5.832 - if(RST_I) 5.833 - GPIO_ACK_O <= #UDLY 1'b0; 5.834 - else if( GPIO_STB_I && !GPIO_ACK_O) 5.835 - GPIO_ACK_O <= #UDLY 1'b1; 5.836 - else 5.837 - GPIO_ACK_O <= #UDLY 1'b0; 5.838 - 5.839 - generate 5.840 - if (INPUT_PORTS_ONLY == 1) begin 5.841 - always @(posedge CLK_I or posedge RST_I) 5.842 - if (RST_I) 5.843 - PIO_DATA <= #UDLY 0; 5.844 - else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I == 4'b1111) 5.845 - PIO_DATA <= #UDLY PIO_IN; 5.846 - end 5.847 - endgenerate 5.848 - 5.849 - generate 5.850 - if (OUTPUT_PORTS_ONLY == 1) begin 5.851 - always @(posedge CLK_I or posedge RST_I) 5.852 - if (RST_I) 5.853 - PIO_DATA <= #UDLY 0; 5.854 - else if (GPIO_STB_I && !GPIO_ACK_O && GPIO_WE_I && ADR_0 == 1'b1 && GPIO_SEL_I == 4'b1111) 5.855 - PIO_DATA <= #UDLY GPIO_DAT_I[DATA_WIDTH-1:0]; 5.856 - 5.857 - assign PIO_OUT = PIO_DATA; 5.858 - end 5.859 - endgenerate 5.860 + assign read_addr_C = (IRQ_MODE == 1 && (ADR_C & GPIO_STB_I & ~GPIO_WE_I)); 5.861 5.862 - generate 5.863 - if (BOTH_INPUT_AND_OUTPUT == 1) begin 5.864 - always @(posedge CLK_I or posedge RST_I) 5.865 - if (RST_I) begin 5.866 - PIO_DATAI <= #UDLY 0; 5.867 - PIO_DATAO <= #UDLY 0; 5.868 - end else if (GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && (ADR_0 == 1'b1) && GPIO_SEL_I == 4'b1111) 5.869 - PIO_DATAI <= #UDLY PIO_BOTH_IN; 5.870 - else if (GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (ADR_0 == 1'b1) && GPIO_SEL_I == 4'b1111) 5.871 - PIO_DATAO <= #UDLY GPIO_DAT_I[OUTPUT_WIDTH-1:0]; 5.872 - 5.873 - assign PIO_BOTH_OUT = PIO_DATAO[OUTPUT_WIDTH-1:0]; 5.874 - end 5.875 - endgenerate 5.876 - 5.877 - assign PIO_DATA_RE_EN = GPIO_STB_I && !GPIO_ACK_O && !GPIO_WE_I && (ADR_0 == 1'b1) && GPIO_SEL_I == 4'b1111; 5.878 - assign PIO_TRI_RE_EN = GPIO_STB_I && GPIO_ACK_O && !GPIO_WE_I && (ADR_4 == 1'b1) && GPIO_SEL_I == 4'b1111; 5.879 - assign IRQ_MASK_RE_EN = GPIO_STB_I && GPIO_ACK_O && !GPIO_WE_I && (ADR_8 == 1'b1) && GPIO_SEL_I == 4'b1111; 5.880 - assign PIO_DATA_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (ADR_0 == 1'b1) && GPIO_SEL_I == 4'b1111; 5.881 - assign PIO_TRI_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (ADR_4 == 1'b1) && GPIO_SEL_I == 4'b1111; 5.882 - assign IRQ_MASK_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (ADR_8 == 1'b1) && GPIO_SEL_I == 4'b1111; 5.883 - assign EDGE_CAP_WR_EN = GPIO_STB_I && GPIO_ACK_O && GPIO_WE_I && (ADR_C == 1'b1) && GPIO_SEL_I == 4'b1111; 5.884 + wire read_byte_0, read_byte_1, read_byte_2, read_byte_3; 5.885 + wire read_byte_4, read_byte_5, read_byte_6, read_byte_7; 5.886 + wire read_byte_8, read_byte_9, read_byte_A, read_byte_B; 5.887 + wire read_byte_C, read_byte_D, read_byte_E, read_byte_F; 5.888 + assign read_byte_0 = ((GPIO_ADR_I[3:0] == 4'b0000) & GPIO_STB_I & ~GPIO_WE_I) ; 5.889 + assign read_byte_1 = ((GPIO_ADR_I[3:0] == 4'b0001) & GPIO_STB_I & ~GPIO_WE_I) ; 5.890 + assign read_byte_2 = ((GPIO_ADR_I[3:0] == 4'b0010) & GPIO_STB_I & ~GPIO_WE_I) ; 5.891 + assign read_byte_3 = ((GPIO_ADR_I[3:0] == 4'b0011) & GPIO_STB_I & ~GPIO_WE_I) ; 5.892 + assign read_byte_4 = ((GPIO_ADR_I[3:0] == 4'b0100) & GPIO_STB_I & ~GPIO_WE_I) ; 5.893 + assign read_byte_5 = ((GPIO_ADR_I[3:0] == 4'b0101) & GPIO_STB_I & ~GPIO_WE_I) ; 5.894 + assign read_byte_6 = ((GPIO_ADR_I[3:0] == 4'b0110) & GPIO_STB_I & ~GPIO_WE_I) ; 5.895 + assign read_byte_7 = ((GPIO_ADR_I[3:0] == 4'b0111) & GPIO_STB_I & ~GPIO_WE_I) ; 5.896 + assign read_byte_8 = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1000) & GPIO_STB_I & ~GPIO_WE_I)); 5.897 + assign read_byte_9 = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1001) & GPIO_STB_I & ~GPIO_WE_I)); 5.898 + assign read_byte_A = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1010) & GPIO_STB_I & ~GPIO_WE_I)); 5.899 + assign read_byte_B = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1011) & GPIO_STB_I & ~GPIO_WE_I)); 5.900 + assign read_byte_C = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1100) & GPIO_STB_I & ~GPIO_WE_I)); 5.901 + assign read_byte_D = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1101) & GPIO_STB_I & ~GPIO_WE_I)); 5.902 + assign read_byte_E = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1110) & GPIO_STB_I & ~GPIO_WE_I)); 5.903 + assign read_byte_F = (IRQ_MODE == 1 && ((GPIO_ADR_I[3:0] == 4'b1111) & GPIO_STB_I & ~GPIO_WE_I)); 5.904 5.905 generate 5.906 - genvar ti; 5.907 - for (ti = 0 ; ti < DATA_WIDTH; ti = ti + 1) 5.908 - begin : tio_inst 5.909 - TRI_PIO #(.DATA_WIDTH(DATA_WIDTH), 5.910 - .IRQ_MODE(IRQ_MODE), 5.911 - .LEVEL(LEVEL), 5.912 - .EDGE(EDGE), 5.913 - .POSE_EDGE_IRQ(POSE_EDGE_IRQ), 5.914 - .NEGE_EDGE_IRQ(NEGE_EDGE_IRQ), 5.915 - .EITHER_EDGE_IRQ(EITHER_EDGE_IRQ)) 5.916 - TP (.CLK_I(CLK_I), 5.917 - .RST_I(RST_I), 5.918 - .DAT_I(GPIO_DAT_I[ti]), 5.919 - .DAT_O(tpio_out[ti]), 5.920 - .PIO_IO(PIO_IO[ti]), 5.921 - .IRQ_O(IRQ_TRI_TEMP[ti]), 5.922 - .PIO_TRI_WR_EN(PIO_TRI_WR_EN), 5.923 - .PIO_TRI_RE_EN(PIO_TRI_RE_EN), 5.924 - .PIO_DATA_WR_EN(PIO_DATA_WR_EN), 5.925 - .PIO_DATA_RE_EN(PIO_DATA_RE_EN), 5.926 - .IRQ_MASK_WR_EN(IRQ_MASK_WR_EN), 5.927 - .IRQ_MASK_RE_EN(IRQ_MASK_RE_EN), 5.928 - .EDGE_CAP_WR_EN(EDGE_CAP_WR_EN)); 5.929 - end 5.930 - endgenerate 5.931 5.932 - generate 5.933 - if (INPUT_PORTS_ONLY == 1) 5.934 - assign GPIO_DAT_O = read_addr_0 ? PIO_DATA : 5.935 - read_addr_8 ? IRQ_MASK : 5.936 - read_addr_C ? EDGE_CAPTURE : 5.937 - 0; 5.938 - else if (BOTH_INPUT_AND_OUTPUT == 1) 5.939 - assign GPIO_DAT_O = read_addr_0 ? PIO_DATAI : 5.940 - read_addr_8 ? IRQ_MASK_BOTH : 5.941 - read_addr_C ? EDGE_CAPTURE_BOTH : 5.942 - 0; 5.943 - else if (TRISTATE_PORTS == 1) 5.944 - assign GPIO_DAT_O = read_addr_0 ? tpio_out : 5.945 - read_addr_4 ? tpio_out : 5.946 - read_addr_8 ? tpio_out : 5.947 - read_addr_C ? IRQ_TRI_TEMP : 5.948 - 0; 5.949 - else 5.950 - assign GPIO_DAT_O = 0; 5.951 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.952 + 5.953 + if (INPUT_PORTS_ONLY == 1) begin 5.954 + if (DATA_WIDTH > 24) 5.955 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATA[ 7: 0] : 5.956 + read_byte_1 ? PIO_DATA[15: 8] : 5.957 + read_byte_2 ? PIO_DATA[23:16] : 5.958 + read_byte_3 ? PIO_DATA[DATA_WIDTH-1:24] : 5.959 + read_byte_8 ? IRQ_MASK[ 7: 0] : 5.960 + read_byte_9 ? IRQ_MASK[15: 8] : 5.961 + read_byte_A ? IRQ_MASK[23:16] : 5.962 + read_byte_B ? IRQ_MASK[DATA_WIDTH-1:24] : 5.963 + read_byte_C ? EDGE_CAPTURE[ 7: 0] : 5.964 + read_byte_D ? EDGE_CAPTURE[15: 8] : 5.965 + read_byte_E ? EDGE_CAPTURE[23:16] : 5.966 + read_byte_F ? EDGE_CAPTURE[DATA_WIDTH-1:24] : 5.967 + 0; 5.968 + else if (DATA_WIDTH > 16) 5.969 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATA[ 7: 0] : 5.970 + read_byte_1 ? PIO_DATA[15: 8] : 5.971 + read_byte_2 ? PIO_DATA[DATA_WIDTH-1:16] : 5.972 + read_byte_3 ? 8'h00 : 5.973 + read_byte_8 ? IRQ_MASK[ 7: 0] : 5.974 + read_byte_9 ? IRQ_MASK[15: 8] : 5.975 + read_byte_A ? IRQ_MASK[DATA_WIDTH-1:16] : 5.976 + read_byte_B ? 8'h00 : 5.977 + read_byte_C ? EDGE_CAPTURE[ 7: 0] : 5.978 + read_byte_D ? EDGE_CAPTURE[15: 8] : 5.979 + read_byte_E ? EDGE_CAPTURE[DATA_WIDTH-1:16] : 5.980 + read_byte_F ? 8'h00 : 5.981 + 0; 5.982 + else if (DATA_WIDTH > 8) 5.983 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATA[ 7: 0] : 5.984 + read_byte_1 ? PIO_DATA[DATA_WIDTH-1: 8] : 5.985 + read_byte_2 ? 8'h00 : 5.986 + read_byte_3 ? 8'h00 : 5.987 + read_byte_8 ? IRQ_MASK[ 7: 0] : 5.988 + read_byte_9 ? IRQ_MASK[DATA_WIDTH-1: 8] : 5.989 + read_byte_A ? 8'h00 : 5.990 + read_byte_B ? 8'h00 : 5.991 + read_byte_C ? EDGE_CAPTURE[ 7: 0] : 5.992 + read_byte_D ? EDGE_CAPTURE[DATA_WIDTH-1: 8] : 5.993 + read_byte_E ? 8'h00 : 5.994 + read_byte_F ? 8'h00 : 5.995 + 0; 5.996 + else 5.997 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATA[DATA_WIDTH-1: 0] : 5.998 + read_byte_1 ? 8'h00 : 5.999 + read_byte_2 ? 8'h00 : 5.1000 + read_byte_3 ? 8'h00 : 5.1001 + read_byte_8 ? IRQ_MASK[DATA_WIDTH-1: 0] : 5.1002 + read_byte_9 ? 8'h00 : 5.1003 + read_byte_A ? 8'h00 : 5.1004 + read_byte_B ? 8'h00 : 5.1005 + read_byte_C ? EDGE_CAPTURE[DATA_WIDTH-1: 0] : 5.1006 + read_byte_D ? 8'h00 : 5.1007 + read_byte_E ? 8'h00 : 5.1008 + read_byte_F ? 8'h00 : 5.1009 + 0; 5.1010 + end 5.1011 + else if (BOTH_INPUT_AND_OUTPUT == 1) begin 5.1012 + if (INPUT_WIDTH > 24) 5.1013 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATAI[ 7: 0] : 5.1014 + read_byte_1 ? PIO_DATAI[15: 8] : 5.1015 + read_byte_2 ? PIO_DATAI[23:16] : 5.1016 + read_byte_3 ? PIO_DATAI[INPUT_WIDTH-1:24] : 5.1017 + read_byte_8 ? IRQ_MASK_BOTH[ 7: 0] : 5.1018 + read_byte_9 ? IRQ_MASK_BOTH[15: 8] : 5.1019 + read_byte_A ? IRQ_MASK_BOTH[23:16] : 5.1020 + read_byte_B ? IRQ_MASK_BOTH[INPUT_WIDTH-1:24] : 5.1021 + read_byte_C ? EDGE_CAPTURE_BOTH[ 7: 0] : 5.1022 + read_byte_D ? EDGE_CAPTURE_BOTH[15: 8] : 5.1023 + read_byte_E ? EDGE_CAPTURE_BOTH[23:16] : 5.1024 + read_byte_F ? EDGE_CAPTURE_BOTH[INPUT_WIDTH-1:24] : 5.1025 + 0; 5.1026 + else if (INPUT_WIDTH > 16) 5.1027 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATAI[ 7: 0] : 5.1028 + read_byte_1 ? PIO_DATAI[15: 8] : 5.1029 + read_byte_2 ? PIO_DATAI[INPUT_WIDTH-1:16] : 5.1030 + read_byte_3 ? 8'h00 : 5.1031 + read_byte_8 ? IRQ_MASK_BOTH[ 7: 0] : 5.1032 + read_byte_9 ? IRQ_MASK_BOTH[15: 8] : 5.1033 + read_byte_A ? IRQ_MASK_BOTH[INPUT_WIDTH-1:16] : 5.1034 + read_byte_B ? 8'h00 : 5.1035 + read_byte_C ? EDGE_CAPTURE_BOTH[ 7: 0] : 5.1036 + read_byte_D ? EDGE_CAPTURE_BOTH[15: 8] : 5.1037 + read_byte_E ? EDGE_CAPTURE_BOTH[INPUT_WIDTH-1:16] : 5.1038 + read_byte_F ? 8'h00 : 5.1039 + 0; 5.1040 + else if (INPUT_WIDTH > 8) 5.1041 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATAI[ 7: 0] : 5.1042 + read_byte_1 ? PIO_DATAI[INPUT_WIDTH-1: 8] : 5.1043 + read_byte_2 ? 8'h00 : 5.1044 + read_byte_3 ? 8'h00 : 5.1045 + read_byte_8 ? IRQ_MASK_BOTH[ 7: 0] : 5.1046 + read_byte_9 ? IRQ_MASK_BOTH[INPUT_WIDTH-1: 8] : 5.1047 + read_byte_A ? 8'h00 : 5.1048 + read_byte_B ? 8'h00 : 5.1049 + read_byte_C ? EDGE_CAPTURE_BOTH[ 7: 0] : 5.1050 + read_byte_D ? EDGE_CAPTURE_BOTH[INPUT_WIDTH-1: 8] : 5.1051 + read_byte_E ? 8'h00 : 5.1052 + read_byte_F ? 8'h00 : 5.1053 + 0; 5.1054 + else 5.1055 + assign GPIO_DAT_O_switch = read_byte_0 ? PIO_DATAI[INPUT_WIDTH-1: 0] : 5.1056 + read_byte_1 ? 8'h00 : 5.1057 + read_byte_2 ? 8'h00 : 5.1058 + read_byte_3 ? 8'h00 : 5.1059 + read_byte_8 ? IRQ_MASK_BOTH[INPUT_WIDTH-1: 0] : 5.1060 + read_byte_9 ? 8'h00 : 5.1061 + read_byte_A ? 8'h00 : 5.1062 + read_byte_B ? 8'h00 : 5.1063 + read_byte_C ? EDGE_CAPTURE_BOTH[INPUT_WIDTH-1: 0] : 5.1064 + read_byte_D ? 8'h00 : 5.1065 + read_byte_E ? 8'h00 : 5.1066 + read_byte_F ? 8'h00 : 5.1067 + 0; 5.1068 + end 5.1069 + else if (TRISTATE_PORTS == 1) begin 5.1070 + if (DATA_WIDTH > 24) 5.1071 + assign GPIO_DAT_O_switch = read_byte_0 ? tpio_out[ 7: 0] : 5.1072 + read_byte_1 ? tpio_out[15: 8] : 5.1073 + read_byte_2 ? tpio_out[23:16] : 5.1074 + read_byte_3 ? tpio_out[DATA_WIDTH-1:24] : 5.1075 + read_byte_4 ? tpio_out[ 7: 0] : 5.1076 + read_byte_5 ? tpio_out[15: 8] : 5.1077 + read_byte_6 ? tpio_out[23:16] : 5.1078 + read_byte_7 ? tpio_out[DATA_WIDTH-1:24] : 5.1079 + read_byte_8 ? tpio_out[ 7: 0] : 5.1080 + read_byte_9 ? tpio_out[15: 8] : 5.1081 + read_byte_A ? tpio_out[23:16] : 5.1082 + read_byte_B ? tpio_out[DATA_WIDTH-1:24] : 5.1083 + read_byte_C ? IRQ_TRI_TEMP[ 7: 0] : 5.1084 + read_byte_D ? IRQ_TRI_TEMP[15: 8] : 5.1085 + read_byte_E ? IRQ_TRI_TEMP[23:16] : 5.1086 + read_byte_F ? IRQ_TRI_TEMP[DATA_WIDTH-1:24] : 5.1087 + 0; 5.1088 + else if (DATA_WIDTH > 16) 5.1089 + assign GPIO_DAT_O_switch = read_byte_0 ? tpio_out[ 7: 0] : 5.1090 + read_byte_1 ? tpio_out[15: 8] : 5.1091 + read_byte_2 ? tpio_out[DATA_WIDTH-1:16] : 5.1092 + read_byte_3 ? 8'h00 : 5.1093 + read_byte_4 ? tpio_out[ 7: 0] : 5.1094 + read_byte_5 ? tpio_out[15: 8] : 5.1095 + read_byte_6 ? tpio_out[DATA_WIDTH-1:16] : 5.1096 + read_byte_7 ? 8'h00 : 5.1097 + read_byte_8 ? tpio_out[ 7: 0] : 5.1098 + read_byte_9 ? tpio_out[15: 8] : 5.1099 + read_byte_A ? tpio_out[DATA_WIDTH-1:16] : 5.1100 + read_byte_B ? 8'h00 : 5.1101 + read_byte_C ? IRQ_TRI_TEMP[ 7: 0] : 5.1102 + read_byte_D ? IRQ_TRI_TEMP[15: 8] : 5.1103 + read_byte_E ? IRQ_TRI_TEMP[DATA_WIDTH-1:16] : 5.1104 + read_byte_F ? 8'h00 : 5.1105 + 0; 5.1106 + else if (DATA_WIDTH > 8) 5.1107 + assign GPIO_DAT_O_switch = read_byte_0 ? tpio_out[ 7: 0] : 5.1108 + read_byte_1 ? tpio_out[DATA_WIDTH-1: 8] : 5.1109 + read_byte_2 ? 8'h00 : 5.1110 + read_byte_3 ? 8'h00 : 5.1111 + read_byte_4 ? tpio_out[ 7: 0] : 5.1112 + read_byte_5 ? tpio_out[DATA_WIDTH-1: 8] : 5.1113 + read_byte_6 ? 8'h00 : 5.1114 + read_byte_7 ? 8'h00 : 5.1115 + read_byte_8 ? tpio_out[ 7: 0] : 5.1116 + read_byte_9 ? tpio_out[DATA_WIDTH-1: 8] : 5.1117 + read_byte_A ? 8'h00 : 5.1118 + read_byte_B ? 8'h00 : 5.1119 + read_byte_C ? IRQ_TRI_TEMP[ 7: 0] : 5.1120 + read_byte_D ? IRQ_TRI_TEMP[DATA_WIDTH-1: 8] : 5.1121 + read_byte_E ? 8'h00 : 5.1122 + read_byte_F ? 8'h00 : 5.1123 + 0; 5.1124 + else 5.1125 + assign GPIO_DAT_O_switch = read_byte_0 ? tpio_out[DATA_WIDTH-1: 0] : 5.1126 + read_byte_1 ? 8'h00 : 5.1127 + read_byte_2 ? 8'h00 : 5.1128 + read_byte_3 ? 8'h00 : 5.1129 + read_byte_4 ? tpio_out[DATA_WIDTH-1: 0] : 5.1130 + read_byte_5 ? 8'h00 : 5.1131 + read_byte_6 ? 8'h00 : 5.1132 + read_byte_7 ? 8'h00 : 5.1133 + read_byte_8 ? tpio_out[DATA_WIDTH-1: 0] : 5.1134 + read_byte_9 ? 8'h00 : 5.1135 + read_byte_A ? 8'h00 : 5.1136 + read_byte_B ? 8'h00 : 5.1137 + read_byte_C ? IRQ_TRI_TEMP[DATA_WIDTH-1: 0] : 5.1138 + read_byte_D ? 8'h00 : 5.1139 + read_byte_E ? 8'h00 : 5.1140 + read_byte_F ? 8'h00 : 5.1141 + 0; 5.1142 + end 5.1143 + else 5.1144 + assign GPIO_DAT_O_switch = 0; 5.1145 + 5.1146 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.1147 + 5.1148 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.1149 + 5.1150 + if (INPUT_PORTS_ONLY == 1) 5.1151 + assign GPIO_DAT_O_switch = read_addr_0 ? PIO_DATA : 5.1152 + read_addr_8 ? IRQ_MASK : 5.1153 + read_addr_C ? EDGE_CAPTURE : 5.1154 + 0; 5.1155 + else if (BOTH_INPUT_AND_OUTPUT == 1) 5.1156 + assign GPIO_DAT_O_switch = read_addr_0 ? PIO_DATAI : 5.1157 + read_addr_8 ? IRQ_MASK_BOTH : 5.1158 + read_addr_C ? EDGE_CAPTURE_BOTH : 5.1159 + 0; 5.1160 + else if (TRISTATE_PORTS == 1) 5.1161 + assign GPIO_DAT_O_switch = read_addr_0 ? tpio_out : 5.1162 + read_addr_4 ? tpio_out : 5.1163 + read_addr_8 ? tpio_out : 5.1164 + read_addr_C ? IRQ_TRI_TEMP : 5.1165 + 0; 5.1166 + else 5.1167 + assign GPIO_DAT_O_switch = 0; 5.1168 + 5.1169 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.1170 + 5.1171 endgenerate 5.1172 5.1173 -//----------------------------------------------------------------------------- 5.1174 -//-------------------------------IRQ Generation-------------------------------- 5.1175 -//----------------------------------------------------------------------------- 5.1176 + 5.1177 + 5.1178 + //----------------------------------------------------------------------------- 5.1179 + //-------------------------------IRQ Generation-------------------------------- 5.1180 + //----------------------------------------------------------------------------- 5.1181 generate 5.1182 + 5.1183 if (IRQ_MODE == 1) begin 5.1184 - always @(posedge CLK_I or posedge RST_I) 5.1185 - if (RST_I) begin 5.1186 - IRQ_MASK <= #UDLY 0; 5.1187 - IRQ_MASK_BOTH <= #UDLY 0; 5.1188 - end else if (IRQ_MASK_WR_EN) begin 5.1189 - IRQ_MASK <= #UDLY GPIO_DAT_I[DATA_WIDTH-1:0]; 5.1190 - IRQ_MASK_BOTH <= #UDLY GPIO_DAT_I[INPUT_WIDTH-1:0]; 5.1191 - end 5.1192 - end 5.1193 + 5.1194 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.1195 + 5.1196 + genvar im_idx; 5.1197 + for (im_idx = 0; (im_idx < DATA_WIDTH) && (im_idx < 8); im_idx = im_idx + 1) 5.1198 + begin 5.1199 + always @(posedge CLK_I or posedge RST_I) 5.1200 + if (RST_I) 5.1201 + IRQ_MASK[im_idx] <= #UDLY 0; 5.1202 + else if (IRQ_MASK_WR_EN_0) 5.1203 + IRQ_MASK[im_idx] <= #UDLY GPIO_DAT_I_switch[im_idx]; 5.1204 + end 5.1205 + if (DATA_WIDTH > 8) begin 5.1206 + genvar jm_idx; 5.1207 + for (jm_idx = 8; (jm_idx < DATA_WIDTH) && (jm_idx < 16); jm_idx = jm_idx + 1) 5.1208 + begin 5.1209 + always @(posedge CLK_I or posedge RST_I) 5.1210 + if (RST_I) 5.1211 + IRQ_MASK[jm_idx] <= #UDLY 0; 5.1212 + else if (IRQ_MASK_WR_EN_1) 5.1213 + IRQ_MASK[jm_idx] <= #UDLY GPIO_DAT_I_switch[jm_idx-8]; 5.1214 + end 5.1215 + end 5.1216 + if (DATA_WIDTH > 16) begin 5.1217 + genvar km_idx; 5.1218 + for (km_idx = 16; (km_idx < DATA_WIDTH) && (km_idx < 24); km_idx = km_idx + 1) 5.1219 + begin 5.1220 + always @(posedge CLK_I or posedge RST_I) 5.1221 + if (RST_I) 5.1222 + IRQ_MASK[km_idx] <= #UDLY 0; 5.1223 + else if (IRQ_MASK_WR_EN_2) 5.1224 + IRQ_MASK[km_idx] <= #UDLY GPIO_DAT_I_switch[km_idx-16]; 5.1225 + end 5.1226 + end 5.1227 + if (DATA_WIDTH > 24) begin 5.1228 + genvar lm_idx; 5.1229 + for (lm_idx = 24; (lm_idx < DATA_WIDTH) && (lm_idx < 32); lm_idx = lm_idx + 1) 5.1230 + begin 5.1231 + always @(posedge CLK_I or posedge RST_I) 5.1232 + if (RST_I) 5.1233 + IRQ_MASK[lm_idx] <= #UDLY 0; 5.1234 + else if (IRQ_MASK_WR_EN_3) 5.1235 + IRQ_MASK[lm_idx] <= #UDLY GPIO_DAT_I_switch[lm_idx-24]; 5.1236 + end 5.1237 + end 5.1238 + 5.1239 + genvar imb_idx; 5.1240 + for (imb_idx = 0; (imb_idx < INPUT_WIDTH) && (imb_idx < 8); imb_idx = imb_idx + 1) 5.1241 + begin 5.1242 + always @(posedge CLK_I or posedge RST_I) 5.1243 + if (RST_I) 5.1244 + IRQ_MASK_BOTH[imb_idx] <= #UDLY 0; 5.1245 + else if (IRQ_MASK_WR_EN_0) 5.1246 + IRQ_MASK_BOTH[imb_idx] <= #UDLY GPIO_DAT_I_switch[imb_idx]; 5.1247 + end 5.1248 + if (INPUT_WIDTH > 8) begin 5.1249 + genvar jmb_idx; 5.1250 + for (jmb_idx = 8; (jmb_idx < INPUT_WIDTH) && (jmb_idx < 16); jmb_idx = jmb_idx + 1) 5.1251 + begin 5.1252 + always @(posedge CLK_I or posedge RST_I) 5.1253 + if (RST_I) 5.1254 + IRQ_MASK_BOTH[jmb_idx] <= #UDLY 0; 5.1255 + else if (IRQ_MASK_WR_EN_1) 5.1256 + IRQ_MASK_BOTH[jmb_idx] <= #UDLY GPIO_DAT_I_switch[jmb_idx-8]; 5.1257 + end 5.1258 + end 5.1259 + if (INPUT_WIDTH > 16) begin 5.1260 + genvar kmb_idx; 5.1261 + for (kmb_idx = 16; (kmb_idx < INPUT_WIDTH) && (kmb_idx < 24); kmb_idx = kmb_idx + 1) 5.1262 + begin 5.1263 + always @(posedge CLK_I or posedge RST_I) 5.1264 + if (RST_I) 5.1265 + IRQ_MASK_BOTH[kmb_idx] <= #UDLY 0; 5.1266 + else if (IRQ_MASK_WR_EN_2) 5.1267 + IRQ_MASK_BOTH[kmb_idx] <= #UDLY GPIO_DAT_I_switch[kmb_idx-16]; 5.1268 + end 5.1269 + end 5.1270 + if (INPUT_WIDTH > 24) begin 5.1271 + genvar lmb_idx; 5.1272 + for (lmb_idx = 24; (lmb_idx < INPUT_WIDTH) && (lmb_idx < 32); lmb_idx = lmb_idx + 1) 5.1273 + begin 5.1274 + always @(posedge CLK_I or posedge RST_I) 5.1275 + if (RST_I) 5.1276 + IRQ_MASK_BOTH[lmb_idx] <= #UDLY 0; 5.1277 + else if (IRQ_MASK_WR_EN_3) 5.1278 + IRQ_MASK_BOTH[lmb_idx] <= #UDLY GPIO_DAT_I_switch[lmb_idx-24]; 5.1279 + end 5.1280 + end 5.1281 + 5.1282 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.1283 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.1284 + 5.1285 + genvar im_idx; 5.1286 + for (im_idx = 0; (im_idx < DATA_WIDTH) && (im_idx < 8); im_idx = im_idx + 1) 5.1287 + begin 5.1288 + always @(posedge CLK_I or posedge RST_I) 5.1289 + if (RST_I) 5.1290 + IRQ_MASK[im_idx] <= #UDLY 0; 5.1291 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[0]) 5.1292 + IRQ_MASK[im_idx] <= #UDLY GPIO_DAT_I_switch[im_idx]; 5.1293 + end 5.1294 + if (DATA_WIDTH > 8) begin 5.1295 + genvar jm_idx; 5.1296 + for (jm_idx = 8; (jm_idx < DATA_WIDTH) && (jm_idx < 16); jm_idx = jm_idx + 1) 5.1297 + begin 5.1298 + always @(posedge CLK_I or posedge RST_I) 5.1299 + if (RST_I) 5.1300 + IRQ_MASK[jm_idx] <= #UDLY 0; 5.1301 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[1]) 5.1302 + IRQ_MASK[jm_idx] <= #UDLY GPIO_DAT_I_switch[jm_idx]; 5.1303 + end 5.1304 + end 5.1305 + if (DATA_WIDTH > 16) begin 5.1306 + genvar km_idx; 5.1307 + for (km_idx = 16; (km_idx < DATA_WIDTH) && (km_idx < 24); km_idx = km_idx + 1) 5.1308 + begin 5.1309 + always @(posedge CLK_I or posedge RST_I) 5.1310 + if (RST_I) 5.1311 + IRQ_MASK[km_idx] <= #UDLY 0; 5.1312 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[2]) 5.1313 + IRQ_MASK[km_idx] <= #UDLY GPIO_DAT_I_switch[km_idx]; 5.1314 + end 5.1315 + end 5.1316 + if (DATA_WIDTH > 24) begin 5.1317 + genvar lm_idx; 5.1318 + for (lm_idx = 24; (lm_idx < DATA_WIDTH) && (lm_idx < 32); lm_idx = lm_idx + 1) 5.1319 + begin 5.1320 + always @(posedge CLK_I or posedge RST_I) 5.1321 + if (RST_I) 5.1322 + IRQ_MASK[lm_idx] <= #UDLY 0; 5.1323 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[3]) 5.1324 + IRQ_MASK[lm_idx] <= #UDLY GPIO_DAT_I_switch[lm_idx]; 5.1325 + end 5.1326 + end 5.1327 + 5.1328 + genvar imb_idx; 5.1329 + for (imb_idx = 0; (imb_idx < INPUT_WIDTH) && (imb_idx < 8); imb_idx = imb_idx + 1) 5.1330 + begin 5.1331 + always @(posedge CLK_I or posedge RST_I) 5.1332 + if (RST_I) 5.1333 + IRQ_MASK_BOTH[imb_idx] <= #UDLY 0; 5.1334 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[0]) 5.1335 + IRQ_MASK_BOTH[imb_idx] <= #UDLY GPIO_DAT_I_switch[imb_idx]; 5.1336 + end 5.1337 + if (INPUT_WIDTH > 8) begin 5.1338 + genvar jmb_idx; 5.1339 + for (jmb_idx = 8; (jmb_idx < INPUT_WIDTH) && (jmb_idx < 16); jmb_idx = jmb_idx + 1) 5.1340 + begin 5.1341 + always @(posedge CLK_I or posedge RST_I) 5.1342 + if (RST_I) 5.1343 + IRQ_MASK_BOTH[jmb_idx] <= #UDLY 0; 5.1344 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[1]) 5.1345 + IRQ_MASK_BOTH[jmb_idx] <= #UDLY GPIO_DAT_I_switch[jmb_idx]; 5.1346 + end 5.1347 + end 5.1348 + if (INPUT_WIDTH > 16) begin 5.1349 + genvar kmb_idx; 5.1350 + for (kmb_idx = 16; (kmb_idx < INPUT_WIDTH) && (kmb_idx < 24); kmb_idx = kmb_idx + 1) 5.1351 + begin 5.1352 + always @(posedge CLK_I or posedge RST_I) 5.1353 + if (RST_I) 5.1354 + IRQ_MASK_BOTH[kmb_idx] <= #UDLY 0; 5.1355 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[2]) 5.1356 + IRQ_MASK_BOTH[kmb_idx] <= #UDLY GPIO_DAT_I_switch[kmb_idx]; 5.1357 + end 5.1358 + end 5.1359 + if (INPUT_WIDTH > 24) begin 5.1360 + genvar lmb_idx; 5.1361 + for (lmb_idx = 24; (lmb_idx < INPUT_WIDTH) && (lmb_idx < 32); lmb_idx = lmb_idx + 1) 5.1362 + begin 5.1363 + always @(posedge CLK_I or posedge RST_I) 5.1364 + if (RST_I) 5.1365 + IRQ_MASK_BOTH[lmb_idx] <= #UDLY 0; 5.1366 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[3]) 5.1367 + IRQ_MASK_BOTH[lmb_idx] <= #UDLY GPIO_DAT_I_switch[lmb_idx]; 5.1368 + end 5.1369 + end 5.1370 + 5.1371 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.1372 + 5.1373 + end // if (IRQ_MODE == 1) 5.1374 + 5.1375 endgenerate 5.1376 - 5.1377 + 5.1378 + 5.1379 + 5.1380 generate 5.1381 //-------------------------------- 5.1382 //--INPUT_PORTS_ONLY MODE IRQ 5.1383 //-------------------------------- 5.1384 - if (IRQ_MODE == 1 && INPUT_PORTS_ONLY == 1 && LEVEL == 1) begin 5.1385 - //level mode IRQ 5.1386 - always @(posedge CLK_I or posedge RST_I) 5.1387 - if (RST_I) 5.1388 - IRQ_TEMP <= #UDLY 0; 5.1389 - else if (IRQ_MASK_WR_EN) 5.1390 - IRQ_TEMP <= #UDLY IRQ_TEMP & GPIO_DAT_I[DATA_WIDTH-1:0]; 5.1391 - else 5.1392 - IRQ_TEMP <= #UDLY PIO_IN & IRQ_MASK;//bit-and 5.1393 + if ((IRQ_MODE == 1) && (INPUT_PORTS_ONLY == 1) && (LEVEL == 1)) begin 5.1394 + // level mode IRQ 5.1395 + 5.1396 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.1397 + 5.1398 + genvar i; 5.1399 + for (i = 0; (i < DATA_WIDTH) && (i < 8); i = i + 1) 5.1400 + begin 5.1401 + always @(posedge CLK_I or posedge RST_I) 5.1402 + if (RST_I) 5.1403 + IRQ_TEMP[i] <= #UDLY 0; 5.1404 + else if (IRQ_MASK_WR_EN_0) 5.1405 + IRQ_TEMP[i] <= #UDLY IRQ_TEMP[i] & GPIO_DAT_I_switch[i]; 5.1406 + else 5.1407 + IRQ_TEMP[i] <= #UDLY PIO_IN[i] & IRQ_MASK[i]; 5.1408 + end 5.1409 + if (DATA_WIDTH > 8) begin 5.1410 + genvar j; 5.1411 + for (j = 8; (j < DATA_WIDTH) && (j < 16); j = j + 1) 5.1412 + begin 5.1413 + always @(posedge CLK_I or posedge RST_I) 5.1414 + if (RST_I) 5.1415 + IRQ_TEMP[j] <= #UDLY 0; 5.1416 + else if (IRQ_MASK_WR_EN_1) 5.1417 + IRQ_TEMP[j] <= #UDLY IRQ_TEMP[j] & GPIO_DAT_I_switch[j-8]; 5.1418 + else 5.1419 + IRQ_TEMP[j] <= #UDLY PIO_IN[j] & IRQ_MASK[j]; 5.1420 + end 5.1421 + end 5.1422 + if (DATA_WIDTH > 16) begin 5.1423 + genvar k; 5.1424 + for (k = 16; (k < DATA_WIDTH) && (k < 24); k = k + 1) 5.1425 + begin 5.1426 + always @(posedge CLK_I or posedge RST_I) 5.1427 + if (RST_I) 5.1428 + IRQ_TEMP[k] <= #UDLY 0; 5.1429 + else if (IRQ_MASK_WR_EN_2) 5.1430 + IRQ_TEMP[k] <= #UDLY IRQ_TEMP[k] & GPIO_DAT_I_switch[k-16]; 5.1431 + else 5.1432 + IRQ_TEMP[k] <= #UDLY PIO_IN[k] & IRQ_MASK[k]; 5.1433 + end 5.1434 + end 5.1435 + if (DATA_WIDTH > 24) begin 5.1436 + genvar l; 5.1437 + for (l = 24; (l < DATA_WIDTH) && (l < 32); l = l + 1) 5.1438 + begin 5.1439 + always @(posedge CLK_I or posedge RST_I) 5.1440 + if (RST_I) 5.1441 + IRQ_TEMP[l] <= #UDLY 0; 5.1442 + else if (IRQ_MASK_WR_EN_3) 5.1443 + IRQ_TEMP[l] <= #UDLY IRQ_TEMP[l] & GPIO_DAT_I_switch[l-24]; 5.1444 + else 5.1445 + IRQ_TEMP[l] <= #UDLY PIO_IN[l] & IRQ_MASK[l]; 5.1446 + end 5.1447 + end 5.1448 + 5.1449 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.1450 + 5.1451 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.1452 + 5.1453 + genvar i; 5.1454 + for (i = 0; (i < DATA_WIDTH) && (i < 8); i = i + 1) 5.1455 + begin 5.1456 + always @(posedge CLK_I or posedge RST_I) 5.1457 + if (RST_I) 5.1458 + IRQ_TEMP[i] <= #UDLY 0; 5.1459 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[0]) 5.1460 + IRQ_TEMP[i] <= #UDLY IRQ_TEMP[i] & GPIO_DAT_I_switch[i]; 5.1461 + else 5.1462 + IRQ_TEMP[i] <= #UDLY PIO_IN[i] & IRQ_MASK[i]; 5.1463 + end 5.1464 + if (DATA_WIDTH > 8) begin 5.1465 + genvar j; 5.1466 + for (j = 8; (j < DATA_WIDTH) && (j < 16); j = j + 1) 5.1467 + begin 5.1468 + always @(posedge CLK_I or posedge RST_I) 5.1469 + if (RST_I) 5.1470 + IRQ_TEMP[j] <= #UDLY 0; 5.1471 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[1]) 5.1472 + IRQ_TEMP[j] <= #UDLY IRQ_TEMP[j] & GPIO_DAT_I_switch[j]; 5.1473 + else 5.1474 + IRQ_TEMP[j] <= #UDLY PIO_IN[j] & IRQ_MASK[j]; 5.1475 + end 5.1476 + end 5.1477 + if (DATA_WIDTH > 16) begin 5.1478 + genvar k; 5.1479 + for (k = 16; (k < DATA_WIDTH) && (k < 24); k = k + 1) 5.1480 + begin 5.1481 + always @(posedge CLK_I or posedge RST_I) 5.1482 + if (RST_I) 5.1483 + IRQ_TEMP[k] <= #UDLY 0; 5.1484 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[2]) 5.1485 + IRQ_TEMP[k] <= #UDLY IRQ_TEMP[k] & GPIO_DAT_I_switch[k]; 5.1486 + else 5.1487 + IRQ_TEMP[k] <= #UDLY PIO_IN[k] & IRQ_MASK[k]; 5.1488 + end 5.1489 + end 5.1490 + if (DATA_WIDTH > 24) begin 5.1491 + genvar l; 5.1492 + for (l = 24; (l < DATA_WIDTH) && (l < 32); l = l + 1) 5.1493 + begin 5.1494 + always @(posedge CLK_I or posedge RST_I) 5.1495 + if (RST_I) 5.1496 + IRQ_TEMP[l] <= #UDLY 0; 5.1497 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[3]) 5.1498 + IRQ_TEMP[l] <= #UDLY IRQ_TEMP[l] & GPIO_DAT_I_switch[l]; 5.1499 + else 5.1500 + IRQ_TEMP[l] <= #UDLY PIO_IN[l] & IRQ_MASK[l]; 5.1501 + end 5.1502 + end 5.1503 + 5.1504 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.1505 + 5.1506 assign IRQ_O = |IRQ_TEMP; 5.1507 - end else if (IRQ_MODE == 1 && INPUT_PORTS_ONLY == 1 && EDGE == 1) begin 5.1508 + 5.1509 + end // if ((IRQ_MODE == 1) && (INPUT_PORTS_ONLY == 1) && (LEVEL == 1)) 5.1510 + 5.1511 + else if ((IRQ_MODE == 1) && (INPUT_PORTS_ONLY == 1) && (EDGE == 1)) begin 5.1512 + // edge mode IRQ 5.1513 + 5.1514 always @(posedge CLK_I or posedge RST_I) 5.1515 if (RST_I) 5.1516 PIO_DATA_DLY <= #UDLY 0; 5.1517 else 5.1518 PIO_DATA_DLY <= PIO_IN; 5.1519 - 5.1520 + 5.1521 // edge-capture register bits are treated as individual bits. 5.1522 - genvar i; 5.1523 - for( i = 0; i < DATA_WIDTH; i = i + 1) 5.1524 - begin 5.1525 - always @(posedge CLK_I or posedge RST_I) 5.1526 - if (RST_I) 5.1527 - EDGE_CAPTURE[i] <= #UDLY 0; 5.1528 - else if (|(PIO_IN[i] & ~PIO_DATA_DLY[i]) && (POSE_EDGE_IRQ == 1)) 5.1529 - EDGE_CAPTURE[i] <= #UDLY PIO_IN[i] & ~PIO_DATA_DLY[i]; 5.1530 - else if (|(~PIO_IN[i] & PIO_DATA_DLY[i]) && (NEGE_EDGE_IRQ == 1)) 5.1531 - EDGE_CAPTURE[i] <= #UDLY ~PIO_IN[i] & PIO_DATA_DLY[i]; 5.1532 - else if (|(PIO_IN[i] & ~PIO_DATA_DLY[i]) && (EITHER_EDGE_IRQ == 1)) 5.1533 - EDGE_CAPTURE[i] <= #UDLY PIO_IN[i] & ~PIO_DATA_DLY[i]; 5.1534 - else if (|(~PIO_IN[i] & PIO_DATA_DLY[i]) && (EITHER_EDGE_IRQ == 1)) 5.1535 - EDGE_CAPTURE[i] <= #UDLY ~PIO_IN[i] & PIO_DATA_DLY[i]; 5.1536 - else if ( (~IRQ_MASK[i]) & GPIO_DAT_I[i] & IRQ_MASK_WR_EN ) 5.1537 - // interrupt mask is being set, so clear edge-capture 5.1538 - EDGE_CAPTURE[i] <= #UDLY 0; 5.1539 - else if (EDGE_CAP_WR_EN) 5.1540 - // user's writing to the edge register, so update edge capture 5.1541 - // register 5.1542 - EDGE_CAPTURE[i] <= #UDLY EDGE_CAPTURE[i] & GPIO_DAT_I[i]; 5.1543 - end 5.1544 - assign IRQ_O = |(EDGE_CAPTURE & IRQ_MASK); 5.1545 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.1546 + 5.1547 + genvar i; 5.1548 + for (i = 0; (i < DATA_WIDTH) && (i < 8); i = i + 1) 5.1549 + begin 5.1550 + always @(posedge CLK_I or posedge RST_I) 5.1551 + if (RST_I) 5.1552 + EDGE_CAPTURE[i] <= #UDLY 0; 5.1553 + else if (|(PIO_IN[i] & ~PIO_DATA_DLY[i]) && (POSE_EDGE_IRQ == 1)) 5.1554 + EDGE_CAPTURE[i] <= #UDLY PIO_IN[i] & ~PIO_DATA_DLY[i]; 5.1555 + else if (|(~PIO_IN[i] & PIO_DATA_DLY[i]) && (NEGE_EDGE_IRQ == 1)) 5.1556 + EDGE_CAPTURE[i] <= #UDLY ~PIO_IN[i] & PIO_DATA_DLY[i]; 5.1557 + else if (|(PIO_IN[i] & ~PIO_DATA_DLY[i]) && (EITHER_EDGE_IRQ == 1)) 5.1558 + EDGE_CAPTURE[i] <= #UDLY PIO_IN[i] & ~PIO_DATA_DLY[i]; 5.1559 + else if (|(~PIO_IN[i] & PIO_DATA_DLY[i]) && (EITHER_EDGE_IRQ == 1)) 5.1560 + EDGE_CAPTURE[i] <= #UDLY ~PIO_IN[i] & PIO_DATA_DLY[i]; 5.1561 + else if ( (~IRQ_MASK[i]) & GPIO_DAT_I_switch[i] & IRQ_MASK_WR_EN_0) 5.1562 + // interrupt mask is being set, so clear edge-capture 5.1563 + EDGE_CAPTURE[i] <= #UDLY 0; 5.1564 + else if (EDGE_CAP_WR_EN_0) 5.1565 + // user's writing to the edge register, so update edge capture 5.1566 + // register 5.1567 + EDGE_CAPTURE[i] <= #UDLY EDGE_CAPTURE[i] & GPIO_DAT_I_switch[i]; 5.1568 + end 5.1569 + 5.1570 + if (DATA_WIDTH > 8) begin 5.1571 + genvar j; 5.1572 + for (j = 8; (j < DATA_WIDTH) && (j < 16); j = j + 1) 5.1573 + begin 5.1574 + always @(posedge CLK_I or posedge RST_I) 5.1575 + if (RST_I) 5.1576 + EDGE_CAPTURE[j] <= #UDLY 0; 5.1577 + else if (|(PIO_IN[j] & ~PIO_DATA_DLY[j]) && (POSE_EDGE_IRQ == 1)) 5.1578 + EDGE_CAPTURE[j] <= #UDLY PIO_IN[j] & ~PIO_DATA_DLY[j]; 5.1579 + else if (|(~PIO_IN[j] & PIO_DATA_DLY[j]) && (NEGE_EDGE_IRQ == 1)) 5.1580 + EDGE_CAPTURE[j] <= #UDLY ~PIO_IN[j] & PIO_DATA_DLY[j]; 5.1581 + else if (|(PIO_IN[j] & ~PIO_DATA_DLY[j]) && (EITHER_EDGE_IRQ == 1)) 5.1582 + EDGE_CAPTURE[j] <= #UDLY PIO_IN[j] & ~PIO_DATA_DLY[j]; 5.1583 + else if (|(~PIO_IN[j] & PIO_DATA_DLY[j]) && (EITHER_EDGE_IRQ == 1)) 5.1584 + EDGE_CAPTURE[j] <= #UDLY ~PIO_IN[j] & PIO_DATA_DLY[j]; 5.1585 + else if ( (~IRQ_MASK[j]) & GPIO_DAT_I_switch[j-8] & IRQ_MASK_WR_EN_1) 5.1586 + // interrupt mask is being set, so clear edge-capture 5.1587 + EDGE_CAPTURE[j] <= #UDLY 0; 5.1588 + else if (EDGE_CAP_WR_EN_1) 5.1589 + // user's writing to the edge register, so update edge capture 5.1590 + // register 5.1591 + EDGE_CAPTURE[j] <= #UDLY EDGE_CAPTURE[j] & GPIO_DAT_I_switch[j-8]; 5.1592 + end 5.1593 + end 5.1594 + 5.1595 + if (DATA_WIDTH > 16) begin 5.1596 + genvar k; 5.1597 + for (k = 16; (k < DATA_WIDTH) && (k < 24); k = k + 1) 5.1598 + begin 5.1599 + always @(posedge CLK_I or posedge RST_I) 5.1600 + if (RST_I) 5.1601 + EDGE_CAPTURE[k] <= #UDLY 0; 5.1602 + else if (|(PIO_IN[k] & ~PIO_DATA_DLY[k]) && (POSE_EDGE_IRQ == 1)) 5.1603 + EDGE_CAPTURE[k] <= #UDLY PIO_IN[k] & ~PIO_DATA_DLY[k]; 5.1604 + else if (|(~PIO_IN[k] & PIO_DATA_DLY[k]) && (NEGE_EDGE_IRQ == 1)) 5.1605 + EDGE_CAPTURE[k] <= #UDLY ~PIO_IN[k] & PIO_DATA_DLY[k]; 5.1606 + else if (|(PIO_IN[k] & ~PIO_DATA_DLY[k]) && (EITHER_EDGE_IRQ == 1)) 5.1607 + EDGE_CAPTURE[k] <= #UDLY PIO_IN[k] & ~PIO_DATA_DLY[k]; 5.1608 + else if (|(~PIO_IN[k] & PIO_DATA_DLY[k]) && (EITHER_EDGE_IRQ == 1)) 5.1609 + EDGE_CAPTURE[k] <= #UDLY ~PIO_IN[k] & PIO_DATA_DLY[k]; 5.1610 + else if ( (~IRQ_MASK[k]) & GPIO_DAT_I_switch[k-16] & IRQ_MASK_WR_EN_2) 5.1611 + // interrupt mask is being set, so clear edge-capture 5.1612 + EDGE_CAPTURE[k] <= #UDLY 0; 5.1613 + else if (EDGE_CAP_WR_EN_2) 5.1614 + // user's writing to the edge register, so update edge capture 5.1615 + // register 5.1616 + EDGE_CAPTURE[k] <= #UDLY EDGE_CAPTURE[k] & GPIO_DAT_I_switch[k-16]; 5.1617 + end 5.1618 + end 5.1619 + 5.1620 + if (DATA_WIDTH > 24) begin 5.1621 + genvar l; 5.1622 + for (l = 24; l < DATA_WIDTH; l = l + 1) 5.1623 + begin 5.1624 + always @(posedge CLK_I or posedge RST_I) 5.1625 + if (RST_I) 5.1626 + EDGE_CAPTURE[l] <= #UDLY 0; 5.1627 + else if (|(PIO_IN[l] & ~PIO_DATA_DLY[l]) && (POSE_EDGE_IRQ == 1)) 5.1628 + EDGE_CAPTURE[l] <= #UDLY PIO_IN[l] & ~PIO_DATA_DLY[l]; 5.1629 + else if (|(~PIO_IN[l] & PIO_DATA_DLY[l]) && (NEGE_EDGE_IRQ == 1)) 5.1630 + EDGE_CAPTURE[l] <= #UDLY ~PIO_IN[l] & PIO_DATA_DLY[l]; 5.1631 + else if (|(PIO_IN[l] & ~PIO_DATA_DLY[l]) && (EITHER_EDGE_IRQ == 1)) 5.1632 + EDGE_CAPTURE[l] <= #UDLY PIO_IN[l] & ~PIO_DATA_DLY[l]; 5.1633 + else if (|(~PIO_IN[l] & PIO_DATA_DLY[l]) && (EITHER_EDGE_IRQ == 1)) 5.1634 + EDGE_CAPTURE[l] <= #UDLY ~PIO_IN[l] & PIO_DATA_DLY[l]; 5.1635 + else if ( (~IRQ_MASK[l]) & GPIO_DAT_I_switch[l-24] & IRQ_MASK_WR_EN_3) 5.1636 + // interrupt mask is being set, so clear edge-capture 5.1637 + EDGE_CAPTURE[l] <= #UDLY 0; 5.1638 + else if (EDGE_CAP_WR_EN_3) 5.1639 + // user's writing to the edge register, so update edge capture 5.1640 + // register 5.1641 + EDGE_CAPTURE[l] <= #UDLY EDGE_CAPTURE[l] & GPIO_DAT_I_switch[l-24]; 5.1642 + end 5.1643 + end 5.1644 + 5.1645 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.1646 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.1647 + 5.1648 + genvar i; 5.1649 + for (i = 0; (i < DATA_WIDTH) && (i < 8); i = i + 1) 5.1650 + begin 5.1651 + always @(posedge CLK_I or posedge RST_I) 5.1652 + if (RST_I) 5.1653 + EDGE_CAPTURE[i] <= #UDLY 0; 5.1654 + else if (|(PIO_IN[i] & ~PIO_DATA_DLY[i]) && (POSE_EDGE_IRQ == 1)) 5.1655 + EDGE_CAPTURE[i] <= #UDLY PIO_IN[i] & ~PIO_DATA_DLY[i]; 5.1656 + else if (|(~PIO_IN[i] & PIO_DATA_DLY[i]) && (NEGE_EDGE_IRQ == 1)) 5.1657 + EDGE_CAPTURE[i] <= #UDLY ~PIO_IN[i] & PIO_DATA_DLY[i]; 5.1658 + else if (|(PIO_IN[i] & ~PIO_DATA_DLY[i]) && (EITHER_EDGE_IRQ == 1)) 5.1659 + EDGE_CAPTURE[i] <= #UDLY PIO_IN[i] & ~PIO_DATA_DLY[i]; 5.1660 + else if (|(~PIO_IN[i] & PIO_DATA_DLY[i]) && (EITHER_EDGE_IRQ == 1)) 5.1661 + EDGE_CAPTURE[i] <= #UDLY ~PIO_IN[i] & PIO_DATA_DLY[i]; 5.1662 + else if ( (~IRQ_MASK[i]) & GPIO_DAT_I_switch[i] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[0]) 5.1663 + // interrupt mask is being set, so clear edge-capture 5.1664 + EDGE_CAPTURE[i] <= #UDLY 0; 5.1665 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[0]) 5.1666 + // user's writing to the edge register, so update edge capture 5.1667 + // register 5.1668 + EDGE_CAPTURE[i] <= #UDLY EDGE_CAPTURE[i] & GPIO_DAT_I_switch[i]; 5.1669 + end 5.1670 + 5.1671 + if (DATA_WIDTH > 8) begin 5.1672 + genvar j; 5.1673 + for (j = 8; (j < DATA_WIDTH) && (j < 16); j = j + 1) 5.1674 + begin 5.1675 + always @(posedge CLK_I or posedge RST_I) 5.1676 + if (RST_I) 5.1677 + EDGE_CAPTURE[j] <= #UDLY 0; 5.1678 + else if (|(PIO_IN[j] & ~PIO_DATA_DLY[j]) && (POSE_EDGE_IRQ == 1)) 5.1679 + EDGE_CAPTURE[j] <= #UDLY PIO_IN[j] & ~PIO_DATA_DLY[j]; 5.1680 + else if (|(~PIO_IN[j] & PIO_DATA_DLY[j]) && (NEGE_EDGE_IRQ == 1)) 5.1681 + EDGE_CAPTURE[j] <= #UDLY ~PIO_IN[j] & PIO_DATA_DLY[j]; 5.1682 + else if (|(PIO_IN[j] & ~PIO_DATA_DLY[j]) && (EITHER_EDGE_IRQ == 1)) 5.1683 + EDGE_CAPTURE[j] <= #UDLY PIO_IN[j] & ~PIO_DATA_DLY[j]; 5.1684 + else if (|(~PIO_IN[j] & PIO_DATA_DLY[j]) && (EITHER_EDGE_IRQ == 1)) 5.1685 + EDGE_CAPTURE[j] <= #UDLY ~PIO_IN[j] & PIO_DATA_DLY[j]; 5.1686 + else if ( (~IRQ_MASK[j]) & GPIO_DAT_I_switch[j-8] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[0]) 5.1687 + // interrupt mask is being set, so clear edge-capture 5.1688 + EDGE_CAPTURE[j] <= #UDLY 0; 5.1689 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[0]) 5.1690 + // user's writing to the edge register, so update edge capture 5.1691 + // register 5.1692 + EDGE_CAPTURE[j] <= #UDLY EDGE_CAPTURE[j] & GPIO_DAT_I_switch[j]; 5.1693 + end 5.1694 + end 5.1695 + 5.1696 + if (DATA_WIDTH > 16) begin 5.1697 + genvar k; 5.1698 + for (k = 16; (k < DATA_WIDTH) && (k < 24); k = k + 1) 5.1699 + begin 5.1700 + always @(posedge CLK_I or posedge RST_I) 5.1701 + if (RST_I) 5.1702 + EDGE_CAPTURE[k] <= #UDLY 0; 5.1703 + else if (|(PIO_IN[k] & ~PIO_DATA_DLY[k]) && (POSE_EDGE_IRQ == 1)) 5.1704 + EDGE_CAPTURE[k] <= #UDLY PIO_IN[k] & ~PIO_DATA_DLY[k]; 5.1705 + else if (|(~PIO_IN[k] & PIO_DATA_DLY[k]) && (NEGE_EDGE_IRQ == 1)) 5.1706 + EDGE_CAPTURE[k] <= #UDLY ~PIO_IN[k] & PIO_DATA_DLY[k]; 5.1707 + else if (|(PIO_IN[k] & ~PIO_DATA_DLY[k]) && (EITHER_EDGE_IRQ == 1)) 5.1708 + EDGE_CAPTURE[k] <= #UDLY PIO_IN[k] & ~PIO_DATA_DLY[k]; 5.1709 + else if (|(~PIO_IN[k] & PIO_DATA_DLY[k]) && (EITHER_EDGE_IRQ == 1)) 5.1710 + EDGE_CAPTURE[k] <= #UDLY ~PIO_IN[k] & PIO_DATA_DLY[k]; 5.1711 + else if ( (~IRQ_MASK[k]) & GPIO_DAT_I_switch[k-16] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[2]) 5.1712 + // interrupt mask is being set, so clear edge-capture 5.1713 + EDGE_CAPTURE[k] <= #UDLY 0; 5.1714 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[2]) 5.1715 + // user's writing to the edge register, so update edge capture 5.1716 + // register 5.1717 + EDGE_CAPTURE[k] <= #UDLY EDGE_CAPTURE[k] & GPIO_DAT_I_switch[k]; 5.1718 + end 5.1719 + end 5.1720 + 5.1721 + if (DATA_WIDTH > 24) begin 5.1722 + genvar l; 5.1723 + for (l = 24; l < DATA_WIDTH; l = l + 1) 5.1724 + begin 5.1725 + always @(posedge CLK_I or posedge RST_I) 5.1726 + if (RST_I) 5.1727 + EDGE_CAPTURE[l] <= #UDLY 0; 5.1728 + else if (|(PIO_IN[l] & ~PIO_DATA_DLY[l]) && (POSE_EDGE_IRQ == 1)) 5.1729 + EDGE_CAPTURE[l] <= #UDLY PIO_IN[l] & ~PIO_DATA_DLY[l]; 5.1730 + else if (|(~PIO_IN[l] & PIO_DATA_DLY[l]) && (NEGE_EDGE_IRQ == 1)) 5.1731 + EDGE_CAPTURE[l] <= #UDLY ~PIO_IN[l] & PIO_DATA_DLY[l]; 5.1732 + else if (|(PIO_IN[l] & ~PIO_DATA_DLY[l]) && (EITHER_EDGE_IRQ == 1)) 5.1733 + EDGE_CAPTURE[l] <= #UDLY PIO_IN[l] & ~PIO_DATA_DLY[l]; 5.1734 + else if (|(~PIO_IN[l] & PIO_DATA_DLY[l]) && (EITHER_EDGE_IRQ == 1)) 5.1735 + EDGE_CAPTURE[l] <= #UDLY ~PIO_IN[l] & PIO_DATA_DLY[l]; 5.1736 + else if ( (~IRQ_MASK[l]) & GPIO_DAT_I_switch[l-24] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[3]) 5.1737 + // interrupt mask is being set, so clear edge-capture 5.1738 + EDGE_CAPTURE[l] <= #UDLY 0; 5.1739 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[3]) 5.1740 + // user's writing to the edge register, so update edge capture 5.1741 + // register 5.1742 + EDGE_CAPTURE[l] <= #UDLY EDGE_CAPTURE[l] & GPIO_DAT_I_switch[l]; 5.1743 + end 5.1744 + end 5.1745 + 5.1746 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.1747 + 5.1748 + assign IRQ_O = |(EDGE_CAPTURE[DATA_WIDTH-1:0] & IRQ_MASK[DATA_WIDTH-1:0]); 5.1749 + 5.1750 + end // if ((IRQ_MODE == 1) && (INPUT_PORTS_ONLY == 1) && (EDGE == 1)) 5.1751 + 5.1752 + //---------------------------------- 5.1753 + //--BOTH_INPUT_AND_OUTPUT MODE IRQ 5.1754 + //---------------------------------- 5.1755 + else if ((IRQ_MODE == 1) && (BOTH_INPUT_AND_OUTPUT == 1) && (LEVEL == 1)) begin 5.1756 5.1757 - //---------------------------------- 5.1758 - //--BOTH_INPUT_AND_OUTPUT MODE IRQ 5.1759 - //---------------------------------- 5.1760 - end else if (IRQ_MODE == 1 && BOTH_INPUT_AND_OUTPUT == 1 && LEVEL == 1) begin 5.1761 - always @(posedge CLK_I or posedge RST_I) 5.1762 - if (RST_I) 5.1763 - IRQ_TEMP_BOTH <= #UDLY 0; 5.1764 - else if (IRQ_MASK_WR_EN) 5.1765 - IRQ_TEMP_BOTH <= #UDLY IRQ_TEMP_BOTH & GPIO_DAT_I[INPUT_WIDTH-1:0]; 5.1766 - else 5.1767 - IRQ_TEMP_BOTH <= #UDLY PIO_BOTH_IN & IRQ_MASK_BOTH; 5.1768 - assign IRQ_O = |IRQ_TEMP_BOTH; 5.1769 - 5.1770 - //edge mode IRQ 5.1771 - end else if (IRQ_MODE == 1 && BOTH_INPUT_AND_OUTPUT == 1 && EDGE == 1) begin 5.1772 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.1773 + 5.1774 + genvar iitb_idx; 5.1775 + for (iitb_idx = 0; (iitb_idx < INPUT_WIDTH) && (iitb_idx < 8); iitb_idx = iitb_idx + 1) 5.1776 + begin 5.1777 + always @(posedge CLK_I or posedge RST_I) 5.1778 + if (RST_I) 5.1779 + IRQ_TEMP_BOTH[iitb_idx] <= #UDLY 0; 5.1780 + else if (IRQ_MASK_WR_EN_0) 5.1781 + IRQ_TEMP_BOTH[iitb_idx] <= #UDLY IRQ_TEMP_BOTH[iitb_idx] & GPIO_DAT_I_switch[iitb_idx]; 5.1782 + else 5.1783 + IRQ_TEMP_BOTH[iitb_idx] <= #UDLY PIO_BOTH_IN[iitb_idx] & IRQ_MASK_BOTH[iitb_idx]; 5.1784 + end 5.1785 + if (INPUT_WIDTH > 8) begin 5.1786 + genvar jitb_idx; 5.1787 + for (jitb_idx = 8; (jitb_idx < INPUT_WIDTH) && (jitb_idx < 16); jitb_idx = jitb_idx + 1) 5.1788 + begin 5.1789 + always @(posedge CLK_I or posedge RST_I) 5.1790 + if (RST_I) 5.1791 + IRQ_TEMP_BOTH[jitb_idx] <= #UDLY 0; 5.1792 + else if (IRQ_MASK_WR_EN_1) 5.1793 + IRQ_TEMP_BOTH[jitb_idx] <= #UDLY IRQ_TEMP_BOTH[jitb_idx] & GPIO_DAT_I_switch[jitb_idx - 8]; 5.1794 + else 5.1795 + IRQ_TEMP_BOTH[jitb_idx] <= #UDLY PIO_BOTH_IN[jitb_idx] & IRQ_MASK_BOTH[jitb_idx]; 5.1796 + end 5.1797 + end 5.1798 + if (INPUT_WIDTH > 16) begin 5.1799 + genvar kitb_idx; 5.1800 + for (kitb_idx = 16; (kitb_idx < INPUT_WIDTH) && (kitb_idx < 24); kitb_idx = kitb_idx + 1) 5.1801 + begin 5.1802 + always @(posedge CLK_I or posedge RST_I) 5.1803 + if (RST_I) 5.1804 + IRQ_TEMP_BOTH[kitb_idx] <= #UDLY 0; 5.1805 + else if (IRQ_MASK_WR_EN_2) 5.1806 + IRQ_TEMP_BOTH[kitb_idx] <= #UDLY IRQ_TEMP_BOTH[kitb_idx] & GPIO_DAT_I_switch[kitb_idx - 16]; 5.1807 + else 5.1808 + IRQ_TEMP_BOTH[kitb_idx] <= #UDLY PIO_BOTH_IN[kitb_idx] & IRQ_MASK_BOTH[kitb_idx]; 5.1809 + end 5.1810 + end 5.1811 + if (INPUT_WIDTH > 24) begin 5.1812 + genvar litb_idx; 5.1813 + for (litb_idx = 24; (litb_idx < INPUT_WIDTH) && (litb_idx < 24); litb_idx = litb_idx + 1) 5.1814 + begin 5.1815 + always @(posedge CLK_I or posedge RST_I) 5.1816 + if (RST_I) 5.1817 + IRQ_TEMP_BOTH[litb_idx] <= #UDLY 0; 5.1818 + else if (IRQ_MASK_WR_EN_3) 5.1819 + IRQ_TEMP_BOTH[litb_idx] <= #UDLY IRQ_TEMP_BOTH[litb_idx] & GPIO_DAT_I_switch[litb_idx - 24]; 5.1820 + else 5.1821 + IRQ_TEMP_BOTH[litb_idx] <= #UDLY PIO_BOTH_IN[litb_idx] & IRQ_MASK_BOTH[litb_idx]; 5.1822 + end 5.1823 + end 5.1824 + 5.1825 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.1826 + 5.1827 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.1828 + 5.1829 + genvar iitb_idx; 5.1830 + for (iitb_idx = 0; (iitb_idx < INPUT_WIDTH) && (iitb_idx < 8); iitb_idx = iitb_idx + 1) 5.1831 + begin 5.1832 + always @(posedge CLK_I or posedge RST_I) 5.1833 + if (RST_I) 5.1834 + IRQ_TEMP_BOTH[iitb_idx] <= #UDLY 0; 5.1835 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[0]) 5.1836 + IRQ_TEMP_BOTH[iitb_idx] <= #UDLY IRQ_TEMP_BOTH[iitb_idx] & GPIO_DAT_I_switch[iitb_idx]; 5.1837 + else 5.1838 + IRQ_TEMP_BOTH[iitb_idx] <= #UDLY PIO_BOTH_IN[iitb_idx] & IRQ_MASK_BOTH[iitb_idx]; 5.1839 + end 5.1840 + if (INPUT_WIDTH > 8) begin 5.1841 + genvar jitb_idx; 5.1842 + for (jitb_idx = 8; (jitb_idx < INPUT_WIDTH) && (jitb_idx < 16); jitb_idx = jitb_idx + 1) 5.1843 + begin 5.1844 + always @(posedge CLK_I or posedge RST_I) 5.1845 + if (RST_I) 5.1846 + IRQ_TEMP_BOTH[jitb_idx] <= #UDLY 0; 5.1847 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[1]) 5.1848 + IRQ_TEMP_BOTH[jitb_idx] <= #UDLY IRQ_TEMP_BOTH[jitb_idx] & GPIO_DAT_I_switch[jitb_idx]; 5.1849 + else 5.1850 + IRQ_TEMP_BOTH[jitb_idx] <= #UDLY PIO_BOTH_IN[jitb_idx] & IRQ_MASK_BOTH[jitb_idx]; 5.1851 + end 5.1852 + end 5.1853 + if (INPUT_WIDTH > 16) begin 5.1854 + genvar kitb_idx; 5.1855 + for (kitb_idx = 16; (kitb_idx < INPUT_WIDTH) && (kitb_idx < 24); kitb_idx = kitb_idx + 1) 5.1856 + begin 5.1857 + always @(posedge CLK_I or posedge RST_I) 5.1858 + if (RST_I) 5.1859 + IRQ_TEMP_BOTH[kitb_idx] <= #UDLY 0; 5.1860 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[2]) 5.1861 + IRQ_TEMP_BOTH[kitb_idx] <= #UDLY IRQ_TEMP_BOTH[kitb_idx] & GPIO_DAT_I_switch[kitb_idx]; 5.1862 + else 5.1863 + IRQ_TEMP_BOTH[kitb_idx] <= #UDLY PIO_BOTH_IN[kitb_idx] & IRQ_MASK_BOTH[kitb_idx]; 5.1864 + end 5.1865 + end 5.1866 + if (INPUT_WIDTH > 24) begin 5.1867 + genvar litb_idx; 5.1868 + for (litb_idx = 24; (litb_idx < INPUT_WIDTH) && (litb_idx < 24); litb_idx = litb_idx + 1) 5.1869 + begin 5.1870 + always @(posedge CLK_I or posedge RST_I) 5.1871 + if (RST_I) 5.1872 + IRQ_TEMP_BOTH[litb_idx] <= #UDLY 0; 5.1873 + else if (IRQ_MASK_WR_EN && GPIO_SEL_I_switch[3]) 5.1874 + IRQ_TEMP_BOTH[litb_idx] <= #UDLY IRQ_TEMP_BOTH[litb_idx] & GPIO_DAT_I_switch[litb_idx]; 5.1875 + else 5.1876 + IRQ_TEMP_BOTH[litb_idx] <= #UDLY PIO_BOTH_IN[litb_idx] & IRQ_MASK_BOTH[litb_idx]; 5.1877 + end 5.1878 + end 5.1879 + 5.1880 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.1881 + 5.1882 + assign IRQ_O = |IRQ_TEMP_BOTH; 5.1883 + 5.1884 + end // if ((IRQ_MODE == 1) && (BOTH_INPUT_AND_OUTPUT == 1) && (LEVEL == 1)) 5.1885 + 5.1886 + // edge mode IRQ 5.1887 + else if ((IRQ_MODE == 1) && (BOTH_INPUT_AND_OUTPUT == 1) && (EDGE == 1)) begin 5.1888 + 5.1889 always @(posedge CLK_I or posedge RST_I) 5.1890 if (RST_I) 5.1891 PIO_DATA_DLY_BOTH <= #UDLY 0; 5.1892 else 5.1893 PIO_DATA_DLY_BOTH <= PIO_BOTH_IN; 5.1894 - 5.1895 + 5.1896 // edge-capture register bits are treated as individual bits. 5.1897 - genvar i_both; 5.1898 - for( i_both = 0; i_both < INPUT_WIDTH; i_both = i_both + 1) 5.1899 - begin 5.1900 - always @(posedge CLK_I or posedge RST_I) 5.1901 - if (RST_I) 5.1902 - EDGE_CAPTURE_BOTH[i_both] <= #UDLY 0; 5.1903 - else if (|(PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]) && POSE_EDGE_IRQ == 1) 5.1904 - EDGE_CAPTURE_BOTH[i_both] <= #UDLY PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]; 5.1905 - else if (|(~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]) && NEGE_EDGE_IRQ == 1) 5.1906 - EDGE_CAPTURE_BOTH[i_both] <= #UDLY ~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]; 5.1907 - else if (|(PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]) && EITHER_EDGE_IRQ == 1) 5.1908 - EDGE_CAPTURE_BOTH[i_both] <= #UDLY PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]; 5.1909 - else if (|(~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]) && EITHER_EDGE_IRQ == 1) 5.1910 - EDGE_CAPTURE_BOTH[i_both] <= #UDLY ~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]; 5.1911 - else if ( (~IRQ_MASK_BOTH[i_both]) & GPIO_DAT_I[i_both] & IRQ_MASK_WR_EN ) 5.1912 - // interrupt mask is being set, so clear edge-capture 5.1913 - EDGE_CAPTURE_BOTH[i_both] <= #UDLY 0; 5.1914 - else if (EDGE_CAP_WR_EN) 5.1915 - // user's writing to the edge register, so update edge capture 5.1916 - // register 5.1917 - EDGE_CAPTURE_BOTH[i_both] <= #UDLY EDGE_CAPTURE_BOTH[i_both] & GPIO_DAT_I[i_both]; 5.1918 - end 5.1919 + if (GPIO_WB_DAT_WIDTH == 8) begin 5.1920 + 5.1921 + genvar i_both; 5.1922 + for (i_both = 0; (i_both < INPUT_WIDTH) && (i_both < 8); i_both = i_both + 1) 5.1923 + begin 5.1924 + always @(posedge CLK_I or posedge RST_I) 5.1925 + if (RST_I) 5.1926 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY 0; 5.1927 + else if (|(PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]) && POSE_EDGE_IRQ == 1) 5.1928 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]; 5.1929 + else if (|(~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]) && NEGE_EDGE_IRQ == 1) 5.1930 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY ~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]; 5.1931 + else if (|(PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]) && EITHER_EDGE_IRQ == 1) 5.1932 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]; 5.1933 + else if (|(~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]) && EITHER_EDGE_IRQ == 1) 5.1934 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY ~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]; 5.1935 + else if ( (~IRQ_MASK_BOTH[i_both]) & GPIO_DAT_I_switch[i_both] & IRQ_MASK_WR_EN_0 ) 5.1936 + // interrupt mask is being set, so clear edge-capture 5.1937 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY 0; 5.1938 + else if (EDGE_CAP_WR_EN_0) 5.1939 + // user's writing to the edge register, so update edge capture 5.1940 + // register 5.1941 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY EDGE_CAPTURE_BOTH[i_both] & GPIO_DAT_I_switch[i_both]; 5.1942 + end 5.1943 + if (INPUT_WIDTH > 8) begin 5.1944 + genvar j_both; 5.1945 + for (j_both = 8; (j_both < INPUT_WIDTH) && (j_both < 16); j_both = j_both + 1) 5.1946 + begin 5.1947 + always @(posedge CLK_I or posedge RST_I) 5.1948 + if (RST_I) 5.1949 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY 0; 5.1950 + else if (|(PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]) && POSE_EDGE_IRQ == 1) 5.1951 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]; 5.1952 + else if (|(~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]) && NEGE_EDGE_IRQ == 1) 5.1953 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY ~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]; 5.1954 + else if (|(PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]) && EITHER_EDGE_IRQ == 1) 5.1955 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]; 5.1956 + else if (|(~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]) && EITHER_EDGE_IRQ == 1) 5.1957 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY ~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]; 5.1958 + else if ( (~IRQ_MASK_BOTH[j_both]) & GPIO_DAT_I_switch[j_both-8] & IRQ_MASK_WR_EN_1 ) 5.1959 + // interrupt mask is being set, so clear edge-capture 5.1960 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY 0; 5.1961 + else if (EDGE_CAP_WR_EN_1) 5.1962 + // user's writing to the edge register, so update edge capture 5.1963 + // register 5.1964 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY EDGE_CAPTURE_BOTH[j_both] & GPIO_DAT_I_switch[j_both-8]; 5.1965 + end 5.1966 + end 5.1967 + if (INPUT_WIDTH > 16) begin 5.1968 + genvar k_both; 5.1969 + for (k_both = 16; (k_both < INPUT_WIDTH) && (k_both < 24); k_both = k_both + 1) 5.1970 + begin 5.1971 + always @(posedge CLK_I or posedge RST_I) 5.1972 + if (RST_I) 5.1973 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY 0; 5.1974 + else if (|(PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]) && POSE_EDGE_IRQ == 1) 5.1975 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]; 5.1976 + else if (|(~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]) && NEGE_EDGE_IRQ == 1) 5.1977 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY ~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]; 5.1978 + else if (|(PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]) && EITHER_EDGE_IRQ == 1) 5.1979 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]; 5.1980 + else if (|(~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]) && EITHER_EDGE_IRQ == 1) 5.1981 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY ~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]; 5.1982 + else if ( (~IRQ_MASK_BOTH[k_both]) & GPIO_DAT_I_switch[k_both-16] & IRQ_MASK_WR_EN_2 ) 5.1983 + // interrupt mask is being set, so clear edge-capture 5.1984 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY 0; 5.1985 + else if (EDGE_CAP_WR_EN_2) 5.1986 + // user's writing to the edge register, so update edge capture 5.1987 + // register 5.1988 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY EDGE_CAPTURE_BOTH[k_both] & GPIO_DAT_I_switch[k_both-16]; 5.1989 + end 5.1990 + end 5.1991 + if (INPUT_WIDTH > 24) begin 5.1992 + genvar l_both; 5.1993 + for (l_both = 24; (l_both < INPUT_WIDTH) && (l_both < 32); l_both = l_both + 1) 5.1994 + begin 5.1995 + always @(posedge CLK_I or posedge RST_I) 5.1996 + if (RST_I) 5.1997 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY 0; 5.1998 + else if (|(PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]) && POSE_EDGE_IRQ == 1) 5.1999 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]; 5.2000 + else if (|(~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]) && NEGE_EDGE_IRQ == 1) 5.2001 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY ~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]; 5.2002 + else if (|(PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]) && EITHER_EDGE_IRQ == 1) 5.2003 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]; 5.2004 + else if (|(~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]) && EITHER_EDGE_IRQ == 1) 5.2005 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY ~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]; 5.2006 + else if ( (~IRQ_MASK_BOTH[l_both]) & GPIO_DAT_I_switch[l_both-24] & IRQ_MASK_WR_EN_3 ) 5.2007 + // interrupt mask is being set, so clear edge-capture 5.2008 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY 0; 5.2009 + else if (EDGE_CAP_WR_EN_3) 5.2010 + // user's writing to the edge register, so update edge capture 5.2011 + // register 5.2012 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY EDGE_CAPTURE_BOTH[l_both] & GPIO_DAT_I_switch[l_both-24]; 5.2013 + end 5.2014 + end 5.2015 + 5.2016 + end // if (GPIO_WB_DAT_WIDTH == 8) 5.2017 + else if (GPIO_WB_DAT_WIDTH == 32) begin 5.2018 + 5.2019 + genvar i_both; 5.2020 + for (i_both = 0; (i_both < INPUT_WIDTH) && (i_both < 8); i_both = i_both + 1) 5.2021 + begin 5.2022 + always @(posedge CLK_I or posedge RST_I) 5.2023 + if (RST_I) 5.2024 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY 0; 5.2025 + else if (|(PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]) && POSE_EDGE_IRQ == 1) 5.2026 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]; 5.2027 + else if (|(~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]) && NEGE_EDGE_IRQ == 1) 5.2028 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY ~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]; 5.2029 + else if (|(PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]) && EITHER_EDGE_IRQ == 1) 5.2030 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY PIO_BOTH_IN[i_both] & ~PIO_DATA_DLY_BOTH[i_both]; 5.2031 + else if (|(~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]) && EITHER_EDGE_IRQ == 1) 5.2032 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY ~PIO_BOTH_IN[i_both] & PIO_DATA_DLY_BOTH[i_both]; 5.2033 + else if ( (~IRQ_MASK_BOTH[i_both]) & GPIO_DAT_I_switch[i_both] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[0]) 5.2034 + // interrupt mask is being set, so clear edge-capture 5.2035 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY 0; 5.2036 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[0]) 5.2037 + // user's writing to the edge register, so update edge capture 5.2038 + // register 5.2039 + EDGE_CAPTURE_BOTH[i_both] <= #UDLY EDGE_CAPTURE_BOTH[i_both] & GPIO_DAT_I_switch[i_both]; 5.2040 + end 5.2041 + if (INPUT_WIDTH > 8) begin 5.2042 + genvar j_both; 5.2043 + for (j_both = 8; (j_both < INPUT_WIDTH) && (j_both < 16); j_both = j_both + 1) 5.2044 + begin 5.2045 + always @(posedge CLK_I or posedge RST_I) 5.2046 + if (RST_I) 5.2047 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY 0; 5.2048 + else if (|(PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]) && POSE_EDGE_IRQ == 1) 5.2049 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]; 5.2050 + else if (|(~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]) && NEGE_EDGE_IRQ == 1) 5.2051 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY ~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]; 5.2052 + else if (|(PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]) && EITHER_EDGE_IRQ == 1) 5.2053 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY PIO_BOTH_IN[j_both] & ~PIO_DATA_DLY_BOTH[j_both]; 5.2054 + else if (|(~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]) && EITHER_EDGE_IRQ == 1) 5.2055 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY ~PIO_BOTH_IN[j_both] & PIO_DATA_DLY_BOTH[j_both]; 5.2056 + else if ( (~IRQ_MASK_BOTH[j_both]) & GPIO_DAT_I_switch[j_both-8] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[1]) 5.2057 + // interrupt mask is being set, so clear edge-capture 5.2058 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY 0; 5.2059 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[1]) 5.2060 + // user's writing to the edge register, so update edge capture 5.2061 + // register 5.2062 + EDGE_CAPTURE_BOTH[j_both] <= #UDLY EDGE_CAPTURE_BOTH[j_both] & GPIO_DAT_I_switch[j_both]; 5.2063 + end 5.2064 + end 5.2065 + if (INPUT_WIDTH > 16) begin 5.2066 + genvar k_both; 5.2067 + for (k_both = 16; (k_both < INPUT_WIDTH) && (k_both < 24); k_both = k_both + 1) 5.2068 + begin 5.2069 + always @(posedge CLK_I or posedge RST_I) 5.2070 + if (RST_I) 5.2071 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY 0; 5.2072 + else if (|(PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]) && POSE_EDGE_IRQ == 1) 5.2073 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]; 5.2074 + else if (|(~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]) && NEGE_EDGE_IRQ == 1) 5.2075 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY ~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]; 5.2076 + else if (|(PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]) && EITHER_EDGE_IRQ == 1) 5.2077 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY PIO_BOTH_IN[k_both] & ~PIO_DATA_DLY_BOTH[k_both]; 5.2078 + else if (|(~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]) && EITHER_EDGE_IRQ == 1) 5.2079 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY ~PIO_BOTH_IN[k_both] & PIO_DATA_DLY_BOTH[k_both]; 5.2080 + else if ( (~IRQ_MASK_BOTH[k_both]) & GPIO_DAT_I_switch[k_both-16] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[2]) 5.2081 + // interrupt mask is being set, so clear edge-capture 5.2082 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY 0; 5.2083 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[2]) 5.2084 + // user's writing to the edge register, so update edge capture 5.2085 + // register 5.2086 + EDGE_CAPTURE_BOTH[k_both] <= #UDLY EDGE_CAPTURE_BOTH[k_both] & GPIO_DAT_I_switch[k_both]; 5.2087 + end 5.2088 + end 5.2089 + if (INPUT_WIDTH > 24) begin 5.2090 + genvar l_both; 5.2091 + for (l_both = 24; (l_both < INPUT_WIDTH) && (l_both < 32); l_both = l_both + 1) 5.2092 + begin 5.2093 + always @(posedge CLK_I or posedge RST_I) 5.2094 + if (RST_I) 5.2095 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY 0; 5.2096 + else if (|(PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]) && POSE_EDGE_IRQ == 1) 5.2097 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]; 5.2098 + else if (|(~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]) && NEGE_EDGE_IRQ == 1) 5.2099 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY ~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]; 5.2100 + else if (|(PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]) && EITHER_EDGE_IRQ == 1) 5.2101 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY PIO_BOTH_IN[l_both] & ~PIO_DATA_DLY_BOTH[l_both]; 5.2102 + else if (|(~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]) && EITHER_EDGE_IRQ == 1) 5.2103 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY ~PIO_BOTH_IN[l_both] & PIO_DATA_DLY_BOTH[l_both]; 5.2104 + else if ( (~IRQ_MASK_BOTH[l_both]) & GPIO_DAT_I_switch[l_both-24] & IRQ_MASK_WR_EN && GPIO_SEL_I_switch[3]) 5.2105 + // interrupt mask is being set, so clear edge-capture 5.2106 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY 0; 5.2107 + else if (EDGE_CAP_WR_EN && GPIO_SEL_I_switch[3]) 5.2108 + // user's writing to the edge register, so update edge capture 5.2109 + // register 5.2110 + EDGE_CAPTURE_BOTH[l_both] <= #UDLY EDGE_CAPTURE_BOTH[l_both] & GPIO_DAT_I_switch[l_both]; 5.2111 + end 5.2112 + end 5.2113 + 5.2114 + end // if (GPIO_WB_DAT_WIDTH == 32) 5.2115 + 5.2116 assign IRQ_O = |(EDGE_CAPTURE_BOTH & IRQ_MASK_BOTH); 5.2117 5.2118 - end else if (IRQ_MODE == 1 && TRISTATE_PORTS == 1) begin 5.2119 + end // if ((IRQ_MODE == 1) && (BOTH_INPUT_AND_OUTPUT == 1) && (EDGE == 1)) 5.2120 + 5.2121 + else if (IRQ_MODE == 1 && TRISTATE_PORTS == 1) begin 5.2122 + 5.2123 assign IRQ_O = |IRQ_TRI_TEMP; 5.2124 - end else 5.2125 + end 5.2126 + 5.2127 + else begin 5.2128 + 5.2129 assign IRQ_O = 1'b0; 5.2130 - endgenerate 5.2131 + end 5.2132 + 5.2133 + endgenerate 5.2134 + 5.2135 5.2136 endmodule 5.2137 `endif // GPIO_V
6.1 diff -r 267b5a25932f -r dfc32cad81ba rtl/verilog/tpio.v 6.2 --- a/rtl/verilog/tpio.v Fri Aug 13 10:41:29 2010 +0100 6.3 +++ b/rtl/verilog/tpio.v Sat Aug 06 01:43:24 2011 +0100 6.4 @@ -1,18 +1,39 @@ 6.5 -// ============================================================================= 6.6 -// COPYRIGHT NOTICE 6.7 -// Copyright 2006 (c) Lattice Semiconductor Corporation 6.8 -// ALL RIGHTS RESERVED 6.9 -// This confidential and proprietary software may be used only as authorised by 6.10 -// a licensing agreement from Lattice Semiconductor Corporation. 6.11 -// The entire notice above must be reproduced on all authorized copies and 6.12 -// copies may only be made to the extent permitted by a licensing agreement from 6.13 -// Lattice Semiconductor Corporation. 6.14 +// ================================================================== 6.15 +// >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< 6.16 +// ------------------------------------------------------------------ 6.17 +// Copyright (c) 2006-2011 by Lattice Semiconductor Corporation 6.18 +// ALL RIGHTS RESERVED 6.19 +// ------------------------------------------------------------------ 6.20 +// 6.21 +// IMPORTANT: THIS FILE IS AUTO-GENERATED BY THE LATTICEMICO SYSTEM. 6.22 +// 6.23 +// Permission: 6.24 +// 6.25 +// Lattice Semiconductor grants permission to use this code 6.26 +// pursuant to the terms of the Lattice Semiconductor Corporation 6.27 +// Open Source License Agreement. 6.28 +// 6.29 +// Disclaimer: 6.30 // 6.31 -// Lattice Semiconductor Corporation TEL : 1-800-Lattice (USA and Canada) 6.32 -// 5555 NE Moore Court 408-826-6000 (other locations) 6.33 -// Hillsboro, OR 97124 web : http://www.latticesemi.com/ 6.34 -// U.S.A email: techsupport@latticesemi.com 6.35 -// ============================================================================/ 6.36 +// Lattice Semiconductor provides no warranty regarding the use or 6.37 +// functionality of this code. It is the user's responsibility to 6.38 +// verify the user’s design for consistency and functionality through 6.39 +// the use of formal verification methods. 6.40 +// 6.41 +// -------------------------------------------------------------------- 6.42 +// 6.43 +// Lattice Semiconductor Corporation 6.44 +// 5555 NE Moore Court 6.45 +// Hillsboro, OR 97214 6.46 +// U.S.A 6.47 +// 6.48 +// TEL: 1-800-Lattice (USA and Canada) 6.49 +// 503-286-8001 (other locations) 6.50 +// 6.51 +// web: http://www.latticesemi.com/ 6.52 +// email: techsupport@latticesemi.com 6.53 +// 6.54 +// -------------------------------------------------------------------- 6.55 // FILE DETAILS 6.56 // FILE DETAILS 6.57 // Project : GPIO for LM32