<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>243</b><br />
<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>246</b><br />
<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>243</b><br />
<br />
<b>Notice</b>:  Trying to access array offset on value of type bool in <b>/mnt/cpcwiki-httpdocs/includes/libs/IPSet.php</b> on line <b>246</b><br />
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://oldwiki.cpcwiki.eu/index.php?action=history&amp;feed=atom&amp;title=VHDL_implementation_of_the_8255_PIO</id>
		<title>VHDL implementation of the 8255 PIO - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://oldwiki.cpcwiki.eu/index.php?action=history&amp;feed=atom&amp;title=VHDL_implementation_of_the_8255_PIO"/>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;action=history"/>
		<updated>2026-08-29T08:12:09Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=65813&amp;oldid=prev</id>
		<title>MacDeath at 22:15, 19 December 2010</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=65813&amp;oldid=prev"/>
				<updated>2010-12-19T22:15:50Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 22:15, 19 December 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This code can be used to implement an 8255 PIO in a CPLD or a FPGA.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This code can be used to implement an &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[[&lt;/ins&gt;8255&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;]] &lt;/ins&gt;PIO in a CPLD or a FPGA.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wikidb:diff:version:1.11a:oldid:65812:newid:65813 --&gt;
&lt;/table&gt;</summary>
		<author><name>MacDeath</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=65812&amp;oldid=prev</id>
		<title>MacDeath at 22:14, 19 December 2010</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=65812&amp;oldid=prev"/>
				<updated>2010-12-19T22:14:18Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 22:14, 19 December 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L690&quot; &gt;Line 690:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 690:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Hardware&lt;/del&gt;]][[Category:CPC Internal Components]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Emulator&lt;/ins&gt;]][[Category:CPC Internal Components&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;]][[Category:Electronic Component]][[Category:DIY]][[Category:Programming&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wikidb:diff:version:1.11a:oldid:40312:newid:65812 --&gt;
&lt;/table&gt;</summary>
		<author><name>MacDeath</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=40312&amp;oldid=prev</id>
		<title>MacDeath at 21:36, 27 January 2010</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=40312&amp;oldid=prev"/>
				<updated>2010-01-27T21:36:23Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 21:36, 27 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L690&quot; &gt;Line 690:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 690:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Hardware]][[Category:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Built in Hardware&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Hardware]][[Category:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;CPC Internal Components&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wikidb:diff:version:1.11a:oldid:40024:newid:40312 --&gt;
&lt;/table&gt;</summary>
		<author><name>MacDeath</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=40024&amp;oldid=prev</id>
		<title>MacDeath at 14:07, 27 January 2010</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=40024&amp;oldid=prev"/>
				<updated>2010-01-27T14:07:34Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 14:07, 27 January 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L690&quot; &gt;Line 690:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 690:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Hardware]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Hardware]][[Category:Built in &lt;/ins&gt;Hardware]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wikidb:diff:version:1.11a:oldid:31922:newid:40024 --&gt;
&lt;/table&gt;</summary>
		<author><name>MacDeath</name></author>	</entry>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=31922&amp;oldid=prev</id>
		<title>Octoate: Created page with 'This code can be used to implement an 8255 PIO in a CPLD or a FPGA.  &lt;pre&gt; -- -- A simulation model of I82C55 PIA -- Copyright (c) MikeJ - Feb 2007 -- -- All rights reserved -- -…'</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=VHDL_implementation_of_the_8255_PIO&amp;diff=31922&amp;oldid=prev"/>
				<updated>2009-09-23T16:44:20Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;#039;This code can be used to implement an 8255 PIO in a CPLD or a FPGA.  &amp;lt;pre&amp;gt; -- -- A simulation model of I82C55 PIA -- Copyright (c) MikeJ - Feb 2007 -- -- All rights reserved -- -…&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This code can be used to implement an 8255 PIO in a CPLD or a FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
-- A simulation model of I82C55 PIA&lt;br /&gt;
-- Copyright (c) MikeJ - Feb 2007&lt;br /&gt;
--&lt;br /&gt;
-- All rights reserved&lt;br /&gt;
--&lt;br /&gt;
-- Redistribution and use in source and synthezised forms, with or without&lt;br /&gt;
-- modification, are permitted provided that the following conditions are met:&lt;br /&gt;
--&lt;br /&gt;
-- Redistributions of source code must retain the above copyright notice,&lt;br /&gt;
-- this list of conditions and the following disclaimer.&lt;br /&gt;
--&lt;br /&gt;
-- Redistributions in synthesized form must reproduce the above copyright&lt;br /&gt;
-- notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
-- documentation and/or other materials provided with the distribution.&lt;br /&gt;
--&lt;br /&gt;
-- Neither the name of the author nor the names of other contributors may&lt;br /&gt;
-- be used to endorse or promote products derived from this software without&lt;br /&gt;
-- specific prior written permission.&lt;br /&gt;
--&lt;br /&gt;
-- THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot;&lt;br /&gt;
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE&lt;br /&gt;
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
-- POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
--&lt;br /&gt;
-- You are responsible for any legal issues arising from your use of this code.&lt;br /&gt;
--&lt;br /&gt;
-- The latest version of this file can be found at: www.fpgaarcade.com&lt;br /&gt;
--&lt;br /&gt;
-- Email support@fpgaarcade.com&lt;br /&gt;
--&lt;br /&gt;
-- Revision list&lt;br /&gt;
--&lt;br /&gt;
-- version 001 initial release&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
library ieee ;&lt;br /&gt;
  use ieee.std_logic_1164.all ;&lt;br /&gt;
  use ieee.std_logic_unsigned.all;&lt;br /&gt;
  use ieee.numeric_std.all;&lt;br /&gt;
&lt;br /&gt;
entity I82C55 is&lt;br /&gt;
  port (&lt;br /&gt;
&lt;br /&gt;
    I_ADDR            : in    std_logic_vector(1 downto 0); -- A1-A0&lt;br /&gt;
    I_DATA            : in    std_logic_vector(7 downto 0); -- D7-D0&lt;br /&gt;
    O_DATA            : out   std_logic_vector(7 downto 0);&lt;br /&gt;
    O_DATA_OE_L       : out   std_logic;&lt;br /&gt;
&lt;br /&gt;
    I_CS_L            : in    std_logic;&lt;br /&gt;
    I_RD_L            : in    std_logic;&lt;br /&gt;
    I_WR_L            : in    std_logic;&lt;br /&gt;
&lt;br /&gt;
    I_PA              : in    std_logic_vector(7 downto 0);&lt;br /&gt;
    O_PA              : out   std_logic_vector(7 downto 0);&lt;br /&gt;
    O_PA_OE_L         : out   std_logic_vector(7 downto 0);&lt;br /&gt;
&lt;br /&gt;
    I_PB              : in    std_logic_vector(7 downto 0);&lt;br /&gt;
    O_PB              : out   std_logic_vector(7 downto 0);&lt;br /&gt;
    O_PB_OE_L         : out   std_logic_vector(7 downto 0);&lt;br /&gt;
&lt;br /&gt;
    I_PC              : in    std_logic_vector(7 downto 0);&lt;br /&gt;
    O_PC              : out   std_logic_vector(7 downto 0);&lt;br /&gt;
    O_PC_OE_L         : out   std_logic_vector(7 downto 0);&lt;br /&gt;
&lt;br /&gt;
    RESET             : in    std_logic;&lt;br /&gt;
    ENA               : in    std_logic; -- (CPU) clk enable&lt;br /&gt;
    CLK               : in    std_logic&lt;br /&gt;
    );&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
architecture RTL of I82C55 is&lt;br /&gt;
&lt;br /&gt;
  -- registers&lt;br /&gt;
  signal bit_mask          : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal r_porta           : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal r_portb           : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal r_portc           : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal r_control         : std_logic_vector(7 downto 0);&lt;br /&gt;
  --&lt;br /&gt;
  signal porta_we          : std_logic;&lt;br /&gt;
  signal portb_we          : std_logic;&lt;br /&gt;
  signal porta_re          : std_logic;&lt;br /&gt;
  signal portb_re          : std_logic;&lt;br /&gt;
  --&lt;br /&gt;
  signal porta_we_t1       : std_logic;&lt;br /&gt;
  signal portb_we_t1       : std_logic;&lt;br /&gt;
  signal porta_re_t1       : std_logic;&lt;br /&gt;
  signal portb_re_t1       : std_logic;&lt;br /&gt;
  --&lt;br /&gt;
  signal porta_we_rising   : boolean;&lt;br /&gt;
  signal portb_we_rising   : boolean;&lt;br /&gt;
  signal porta_re_rising   : boolean;&lt;br /&gt;
  signal portb_re_rising   : boolean;&lt;br /&gt;
  --&lt;br /&gt;
  signal groupa_mode       : std_logic_vector(1 downto 0); -- port a/c upper&lt;br /&gt;
  signal groupb_mode       : std_logic;                    -- port b/c lower&lt;br /&gt;
  --&lt;br /&gt;
  signal porta_read        : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal portb_read        : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal portc_read        : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal control_read      : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal mode_clear        : std_logic;&lt;br /&gt;
  --&lt;br /&gt;
  signal a_inte1           : std_logic;&lt;br /&gt;
  signal a_inte2           : std_logic;&lt;br /&gt;
  signal b_inte            : std_logic;&lt;br /&gt;
  --&lt;br /&gt;
  signal a_intr            : std_logic;&lt;br /&gt;
  signal a_obf_l           : std_logic;&lt;br /&gt;
  signal a_ibf             : std_logic;&lt;br /&gt;
  signal a_ack_l           : std_logic;&lt;br /&gt;
  signal a_stb_l           : std_logic;&lt;br /&gt;
  signal a_ack_l_t1        : std_logic;&lt;br /&gt;
  signal a_stb_l_t1        : std_logic;&lt;br /&gt;
  --&lt;br /&gt;
  signal b_intr            : std_logic;&lt;br /&gt;
  signal b_obf_l           : std_logic;&lt;br /&gt;
  signal b_ibf             : std_logic;&lt;br /&gt;
  signal b_ack_l           : std_logic;&lt;br /&gt;
  signal b_stb_l           : std_logic;&lt;br /&gt;
  signal b_ack_l_t1        : std_logic;&lt;br /&gt;
  signal b_stb_l_t1        : std_logic;&lt;br /&gt;
  --&lt;br /&gt;
  signal a_ack_l_rising    : boolean;&lt;br /&gt;
  signal a_stb_l_rising    : boolean;&lt;br /&gt;
  signal b_ack_l_rising    : boolean;&lt;br /&gt;
  signal b_stb_l_rising    : boolean;&lt;br /&gt;
  --&lt;br /&gt;
  signal porta_ipreg       : std_logic_vector(7 downto 0);&lt;br /&gt;
  signal portb_ipreg       : std_logic_vector(7 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
  --&lt;br /&gt;
  -- mode 0   - basic input/output&lt;br /&gt;
  -- mode 1   - strobed input/output&lt;br /&gt;
  -- mode 2/3 - bi-directional bus&lt;br /&gt;
  --&lt;br /&gt;
  -- control word (write)&lt;br /&gt;
  --&lt;br /&gt;
  -- D7    mode set flag        1 = active&lt;br /&gt;
  -- D6..5 GROUPA mode selection (mode 0,1,2)&lt;br /&gt;
  -- D4    GROUPA porta         1 = input, 0 = output&lt;br /&gt;
  -- D3    GROUPA portc upper   1 = input, 0 = output&lt;br /&gt;
  -- D2    GROUPB mode selection (mode 0 ,1)&lt;br /&gt;
  -- D1    GROUPB portb         1 = input, 0 = output&lt;br /&gt;
  -- D0    GROUPB portc lower   1 = input, 0 = output&lt;br /&gt;
  --&lt;br /&gt;
  -- D7    bit set/reset        0 = active&lt;br /&gt;
  -- D6..4 x&lt;br /&gt;
  -- D3..1 bit select&lt;br /&gt;
  -- d0    1 = set, 0 - reset&lt;br /&gt;
  --&lt;br /&gt;
  -- all output registers including status are reset when mode is changed&lt;br /&gt;
    --1. Port A:&lt;br /&gt;
    --All Modes: Output data is cleared, input data is not cleared.&lt;br /&gt;
&lt;br /&gt;
    --2. Port B:&lt;br /&gt;
    --Mode 0: Output data is cleared, input data is not cleared.&lt;br /&gt;
    --Mode 1 and 2: Both output and input data are cleared.&lt;br /&gt;
&lt;br /&gt;
    --3. Port C:&lt;br /&gt;
    --Mode 0:Output data is cleared, input data is not cleared.&lt;br /&gt;
    --Mode 1 and 2: IBF and INTR are cleared and OBF# is set.&lt;br /&gt;
    --Outputs in Port C which are not used for handshaking or interrupt signals are cleared.&lt;br /&gt;
    --Inputs such as STB#, ACK#, or &amp;quot;spare&amp;quot; inputs are not affected. The interrupts for Ports A and B are disabled.&lt;br /&gt;
&lt;br /&gt;
  p_bit_mask : process(I_DATA)&lt;br /&gt;
  begin&lt;br /&gt;
    bit_mask &amp;lt;= x&amp;quot;01&amp;quot;;&lt;br /&gt;
    case I_DATA(3 downto 1) is&lt;br /&gt;
      when &amp;quot;000&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;01&amp;quot;;&lt;br /&gt;
      when &amp;quot;001&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;02&amp;quot;;&lt;br /&gt;
      when &amp;quot;010&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;04&amp;quot;;&lt;br /&gt;
      when &amp;quot;011&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;08&amp;quot;;&lt;br /&gt;
      when &amp;quot;100&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;10&amp;quot;;&lt;br /&gt;
      when &amp;quot;101&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;20&amp;quot;;&lt;br /&gt;
      when &amp;quot;110&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;40&amp;quot;;&lt;br /&gt;
      when &amp;quot;111&amp;quot; =&amp;gt; bit_mask &amp;lt;= x&amp;quot;80&amp;quot;;&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
    end case;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_write_reg_reset : process(RESET, CLK)&lt;br /&gt;
    variable r_portc_masked : std_logic_vector(7 downto 0);&lt;br /&gt;
    variable r_portc_setclr : std_logic_vector(7 downto 0);&lt;br /&gt;
  begin&lt;br /&gt;
    if (RESET = '1') then&lt;br /&gt;
      r_porta &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      r_portb &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      r_portc &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      r_control &amp;lt;= x&amp;quot;9B&amp;quot;; -- 10011011&lt;br /&gt;
      mode_clear &amp;lt;= '1';&lt;br /&gt;
    elsif rising_edge(CLK) then&lt;br /&gt;
&lt;br /&gt;
      r_portc_masked := (not bit_mask) and r_portc;&lt;br /&gt;
      for i in 0 to 7 loop&lt;br /&gt;
        r_portc_setclr(i) := bit_mask(i) and I_DATA(0);&lt;br /&gt;
      end loop;&lt;br /&gt;
&lt;br /&gt;
      if (ENA = '1') then&lt;br /&gt;
        mode_clear &amp;lt;= '0';&lt;br /&gt;
        if (I_CS_L = '0') and (I_WR_L = '0') then&lt;br /&gt;
          case I_ADDR is&lt;br /&gt;
            when &amp;quot;00&amp;quot; =&amp;gt; r_porta   &amp;lt;= I_DATA;&lt;br /&gt;
            when &amp;quot;01&amp;quot; =&amp;gt; r_portb   &amp;lt;= I_DATA;&lt;br /&gt;
            when &amp;quot;10&amp;quot; =&amp;gt; r_portc   &amp;lt;= I_DATA;&lt;br /&gt;
&lt;br /&gt;
            when &amp;quot;11&amp;quot; =&amp;gt; if (I_DATA(7) = '0') then -- set/clr&lt;br /&gt;
                           r_portc &amp;lt;= r_portc_masked or r_portc_setclr;&lt;br /&gt;
                         else&lt;br /&gt;
                           --mode_clear &amp;lt;= '1';&lt;br /&gt;
                           --r_porta    &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
                           --r_portb    &amp;lt;= x&amp;quot;00&amp;quot;; -- clear port b input reg&lt;br /&gt;
                           --r_portc    &amp;lt;= x&amp;quot;00&amp;quot;; -- clear control sigs&lt;br /&gt;
                           r_control  &amp;lt;= I_DATA; -- load new mode&lt;br /&gt;
                         end if;&lt;br /&gt;
            when others =&amp;gt; null;&lt;br /&gt;
          end case;&lt;br /&gt;
        end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_decode_control : process(r_control)&lt;br /&gt;
  begin&lt;br /&gt;
    groupa_mode &amp;lt;= r_control(6 downto 5);&lt;br /&gt;
    groupb_mode &amp;lt;= r_control(2);&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_oe : process(I_CS_L, I_RD_L)&lt;br /&gt;
  begin&lt;br /&gt;
    O_DATA_OE_L &amp;lt;= '1';&lt;br /&gt;
    if (I_CS_L = '0') and (I_RD_L = '0') then&lt;br /&gt;
      O_DATA_OE_L &amp;lt;= '0';&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_read : process(I_ADDR, porta_read, portb_read, portc_read, control_read)&lt;br /&gt;
  begin&lt;br /&gt;
    O_DATA &amp;lt;= x&amp;quot;00&amp;quot;; -- default&lt;br /&gt;
    --if (I_CS_L = '0') and (I_RD_L = '0') then -- not required&lt;br /&gt;
      case I_ADDR is&lt;br /&gt;
        when &amp;quot;00&amp;quot; =&amp;gt; O_DATA &amp;lt;= porta_read;&lt;br /&gt;
        when &amp;quot;01&amp;quot; =&amp;gt; O_DATA &amp;lt;= portb_read;&lt;br /&gt;
        when &amp;quot;10&amp;quot; =&amp;gt; O_DATA &amp;lt;= portc_read;&lt;br /&gt;
        when &amp;quot;11&amp;quot; =&amp;gt; O_DATA &amp;lt;= control_read;&lt;br /&gt;
        when others =&amp;gt; null;&lt;br /&gt;
      end case;&lt;br /&gt;
    --end if;&lt;br /&gt;
  end process;&lt;br /&gt;
  control_read(7) &amp;lt;= '1'; -- always 1&lt;br /&gt;
  control_read(6 downto 0) &amp;lt;= r_control(6 downto 0);&lt;br /&gt;
&lt;br /&gt;
  p_rw_control : process(I_CS_L, I_RD_L, I_WR_L, I_ADDR)&lt;br /&gt;
  begin&lt;br /&gt;
    porta_we &amp;lt;= '0';&lt;br /&gt;
    portb_we &amp;lt;= '0';&lt;br /&gt;
    porta_re &amp;lt;= '0';&lt;br /&gt;
    portb_re &amp;lt;= '0';&lt;br /&gt;
&lt;br /&gt;
    if (I_CS_L = '0') and (I_ADDR = &amp;quot;00&amp;quot;) then&lt;br /&gt;
      porta_we &amp;lt;= not I_WR_L;&lt;br /&gt;
      porta_re &amp;lt;= not I_RD_L;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (I_CS_L = '0') and (I_ADDR = &amp;quot;01&amp;quot;) then&lt;br /&gt;
      portb_we &amp;lt;= not I_WR_L;&lt;br /&gt;
      portb_re &amp;lt;= not I_RD_L;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_rw_control_reg : process&lt;br /&gt;
  begin&lt;br /&gt;
    wait until rising_edge(CLK);&lt;br /&gt;
    if (ENA = '1') then&lt;br /&gt;
      porta_we_t1 &amp;lt;= porta_we;&lt;br /&gt;
      portb_we_t1 &amp;lt;= portb_we;&lt;br /&gt;
      porta_re_t1 &amp;lt;= porta_re;&lt;br /&gt;
      portb_re_t1 &amp;lt;= portb_re;&lt;br /&gt;
&lt;br /&gt;
      a_stb_l_t1 &amp;lt;= a_stb_l;&lt;br /&gt;
      a_ack_l_t1 &amp;lt;= a_ack_l;&lt;br /&gt;
      b_stb_l_t1 &amp;lt;= b_stb_l;&lt;br /&gt;
      b_ack_l_t1 &amp;lt;= b_ack_l;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  porta_we_rising &amp;lt;= (porta_we = '0') and (porta_we_t1 = '1'); -- falling as inverted&lt;br /&gt;
  portb_we_rising &amp;lt;= (portb_we = '0') and (portb_we_t1 = '1'); --  &amp;quot;&lt;br /&gt;
  porta_re_rising &amp;lt;= (porta_re = '0') and (porta_re_t1 = '1'); -- falling as inverted&lt;br /&gt;
  portb_re_rising &amp;lt;= (portb_re = '0') and (portb_re_t1 = '1'); --  &amp;quot;&lt;br /&gt;
  --&lt;br /&gt;
  a_stb_l_rising  &amp;lt;= (a_stb_l = '1') and (a_stb_l_t1 = '0');&lt;br /&gt;
  a_ack_l_rising  &amp;lt;= (a_ack_l = '1') and (a_ack_l_t1 = '0');&lt;br /&gt;
  b_stb_l_rising  &amp;lt;= (b_stb_l = '1') and (b_stb_l_t1 = '0');&lt;br /&gt;
  b_ack_l_rising  &amp;lt;= (b_ack_l = '1') and (b_ack_l_t1 = '0');&lt;br /&gt;
  --&lt;br /&gt;
  -- GROUP A&lt;br /&gt;
  -- in mode 1&lt;br /&gt;
  --&lt;br /&gt;
  -- d4=1 (porta = input)&lt;br /&gt;
  --   pc7,6 io (d3=1 input, d3=0 output)&lt;br /&gt;
  --   pc5 output a_ibf&lt;br /&gt;
  --   pc4 input  a_stb_l&lt;br /&gt;
  --   pc3 output a_intr&lt;br /&gt;
  --&lt;br /&gt;
  -- d4=0 (porta = output)&lt;br /&gt;
  --   pc7 output a_obf_l&lt;br /&gt;
  --   pc6 input  a_ack_l&lt;br /&gt;
  --   pc5,4 io (d3=1 input, d3=0 output)&lt;br /&gt;
  --   pc3 output a_intr&lt;br /&gt;
  --&lt;br /&gt;
  -- GROUP B&lt;br /&gt;
  -- in mode 1&lt;br /&gt;
  -- d1=1 (portb = input)&lt;br /&gt;
  --   pc2 input  b_stb_l&lt;br /&gt;
  --   pc1 output b_ibf&lt;br /&gt;
  --   pc0 output b_intr&lt;br /&gt;
  --&lt;br /&gt;
  -- d1=0 (portb = output)&lt;br /&gt;
  --   pc2 input  b_ack_l&lt;br /&gt;
  --   pc1 output b_obf_l&lt;br /&gt;
  --   pc0 output b_intr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  -- WHEN AN INPUT&lt;br /&gt;
  --&lt;br /&gt;
  -- stb_l a low on this input latches input data&lt;br /&gt;
  -- ibf   a high on this output indicates data latched. set by stb_l and reset by rising edge of RD_L&lt;br /&gt;
  -- intr  a high on this output indicates interrupt. set by stb_l high, ibf high and inte high. reset by falling edge of RD_L&lt;br /&gt;
  -- inte A controlled by bit/set PC4&lt;br /&gt;
  -- inte B controlled by bit/set PC2&lt;br /&gt;
&lt;br /&gt;
  -- WHEN AN OUTPUT&lt;br /&gt;
  --&lt;br /&gt;
  -- obf_l output will go low when cpu has written data&lt;br /&gt;
  -- ack_l input - a low on this clears obf_l&lt;br /&gt;
  -- intr  output set when ack_l is high, obf_l is high and inte is one. reset by falling edge of WR_L&lt;br /&gt;
  -- inte A controlled by bit/set PC6&lt;br /&gt;
  -- inte B controlled by bit/set PC2&lt;br /&gt;
&lt;br /&gt;
  -- GROUP A&lt;br /&gt;
  -- in mode 2&lt;br /&gt;
  --&lt;br /&gt;
  -- porta = IO&lt;br /&gt;
  --&lt;br /&gt;
  --  control bits 2..0 still control groupb/c lower 2..0&lt;br /&gt;
  --&lt;br /&gt;
  --&lt;br /&gt;
  --  PC7 output a_obf&lt;br /&gt;
  --  PC6 input  a_ack_l&lt;br /&gt;
  --  PC5 output a_ibf&lt;br /&gt;
  --  PC4 input  a_stb_l&lt;br /&gt;
  --  PC3 is still interrupt out&lt;br /&gt;
  p_control_flags : process(RESET, CLK)&lt;br /&gt;
    variable we   : boolean;&lt;br /&gt;
    variable set1 : boolean;&lt;br /&gt;
    variable set2 : boolean;&lt;br /&gt;
  begin&lt;br /&gt;
    if (RESET = '1') then&lt;br /&gt;
      a_obf_l &amp;lt;= '1';&lt;br /&gt;
      a_inte1 &amp;lt;= '0';&lt;br /&gt;
      a_ibf   &amp;lt;= '0';&lt;br /&gt;
      a_inte2 &amp;lt;= '0';&lt;br /&gt;
      a_intr  &amp;lt;= '0';&lt;br /&gt;
      --&lt;br /&gt;
      b_inte  &amp;lt;= '0';&lt;br /&gt;
      b_obf_l &amp;lt;= '1';&lt;br /&gt;
      b_ibf   &amp;lt;= '0';&lt;br /&gt;
      b_intr  &amp;lt;= '0';&lt;br /&gt;
    elsif rising_edge(CLK) then&lt;br /&gt;
      we := (I_CS_L = '0') and (I_WR_L = '0') and (I_ADDR = &amp;quot;11&amp;quot;) and (I_DATA(7) = '0');&lt;br /&gt;
&lt;br /&gt;
      if (ENA = '1') then&lt;br /&gt;
        if (mode_clear = '1') then&lt;br /&gt;
          a_obf_l &amp;lt;= '1';&lt;br /&gt;
          a_inte1 &amp;lt;= '0';&lt;br /&gt;
          a_ibf   &amp;lt;= '0';&lt;br /&gt;
          a_inte2 &amp;lt;= '0';&lt;br /&gt;
          a_intr  &amp;lt;= '0';&lt;br /&gt;
          --&lt;br /&gt;
          b_inte  &amp;lt;= '0';&lt;br /&gt;
          b_obf_l &amp;lt;= '1';&lt;br /&gt;
          b_ibf   &amp;lt;= '0';&lt;br /&gt;
          b_intr  &amp;lt;= '0';&lt;br /&gt;
        else&lt;br /&gt;
          if (bit_mask(7) = '1') and we then&lt;br /&gt;
            a_obf_l &amp;lt;= I_DATA(0);&lt;br /&gt;
          else&lt;br /&gt;
            if porta_we_rising then&lt;br /&gt;
              a_obf_l &amp;lt;= '0';&lt;br /&gt;
            elsif (a_ack_l = '0') then&lt;br /&gt;
              a_obf_l &amp;lt;= '1';&lt;br /&gt;
            end if;&lt;br /&gt;
          end if;&lt;br /&gt;
          --&lt;br /&gt;
          if (bit_mask(6) = '1') and we then a_inte1 &amp;lt;= I_DATA(0); end if; -- bus set when mode1 &amp;amp; input?&lt;br /&gt;
          --&lt;br /&gt;
          if (bit_mask(5) = '1') and we then&lt;br /&gt;
            a_ibf   &amp;lt;= I_DATA(0);&lt;br /&gt;
          else&lt;br /&gt;
            if porta_re_rising then&lt;br /&gt;
              a_ibf &amp;lt;= '0';&lt;br /&gt;
            elsif (a_stb_l = '0') then&lt;br /&gt;
              a_ibf &amp;lt;= '1';&lt;br /&gt;
            end if;&lt;br /&gt;
          end if;&lt;br /&gt;
          --&lt;br /&gt;
          if (bit_mask(4) = '1') and we then a_inte2 &amp;lt;= I_DATA(0); end if; -- bus set when mode1 &amp;amp; output?&lt;br /&gt;
          --&lt;br /&gt;
          set1 := a_ack_l_rising and (a_obf_l = '1') and (a_inte1 = '1');&lt;br /&gt;
          set2 := a_stb_l_rising and (a_ibf   = '1') and (a_inte2 = '1');&lt;br /&gt;
          --&lt;br /&gt;
          if (bit_mask(3) = '1') and we then&lt;br /&gt;
            a_intr  &amp;lt;= I_DATA(0);&lt;br /&gt;
          else&lt;br /&gt;
            if (groupa_mode(1) = '1') then&lt;br /&gt;
              if (porta_we = '1') or (porta_re = '1') then&lt;br /&gt;
                 a_intr &amp;lt;= '0';&lt;br /&gt;
               elsif set1 or set2 then&lt;br /&gt;
                 a_intr &amp;lt;= '1';&lt;br /&gt;
               end if;&lt;br /&gt;
            else&lt;br /&gt;
              if    (r_control(4) = '0') then -- output&lt;br /&gt;
                if (porta_we = '1') then -- falling ?&lt;br /&gt;
                  a_intr &amp;lt;= '0';&lt;br /&gt;
                elsif set1 then&lt;br /&gt;
                  a_intr &amp;lt;= '1';&lt;br /&gt;
                end if;&lt;br /&gt;
              elsif (r_control(4) = '1') then -- input&lt;br /&gt;
                if (porta_re = '1') then -- falling ?&lt;br /&gt;
                  a_intr &amp;lt;= '0';&lt;br /&gt;
                elsif set2 then&lt;br /&gt;
                  a_intr &amp;lt;= '1';&lt;br /&gt;
                end if;&lt;br /&gt;
              end if;&lt;br /&gt;
            end if;&lt;br /&gt;
          end if;&lt;br /&gt;
          --&lt;br /&gt;
          if (bit_mask(2) = '1') and we then b_inte  &amp;lt;= I_DATA(0); end if; -- bus set?&lt;br /&gt;
&lt;br /&gt;
          if (bit_mask(1) = '1') and we then&lt;br /&gt;
            b_obf_l &amp;lt;= I_DATA(0);&lt;br /&gt;
          else&lt;br /&gt;
            if (r_control(1) = '0') then -- output&lt;br /&gt;
              if portb_we_rising then&lt;br /&gt;
                b_obf_l &amp;lt;= '0';&lt;br /&gt;
              elsif (b_ack_l = '0') then&lt;br /&gt;
                b_obf_l &amp;lt;= '1';&lt;br /&gt;
              end if;&lt;br /&gt;
            else&lt;br /&gt;
              if portb_re_rising then&lt;br /&gt;
                b_ibf &amp;lt;= '0';&lt;br /&gt;
              elsif (b_stb_l = '0') then&lt;br /&gt;
                b_ibf &amp;lt;= '1';&lt;br /&gt;
              end if;&lt;br /&gt;
            end if;&lt;br /&gt;
          end if;&lt;br /&gt;
&lt;br /&gt;
          if (bit_mask(0) = '1') and we then&lt;br /&gt;
            b_intr  &amp;lt;= I_DATA(0);&lt;br /&gt;
          else&lt;br /&gt;
            if (r_control(1) = '0') then -- output&lt;br /&gt;
              if (portb_we = '1') then -- falling ?&lt;br /&gt;
                b_intr &amp;lt;= '0';&lt;br /&gt;
              elsif b_ack_l_rising and (b_obf_l = '1') and (b_inte = '1') then&lt;br /&gt;
                b_intr &amp;lt;= '1';&lt;br /&gt;
              end if;&lt;br /&gt;
            else&lt;br /&gt;
              if (portb_re = '1') then -- falling ?&lt;br /&gt;
                b_intr &amp;lt;= '0';&lt;br /&gt;
              elsif b_stb_l_rising and (b_ibf = '1') and (b_inte = '1') then&lt;br /&gt;
                b_intr &amp;lt;= '1';&lt;br /&gt;
              end if;&lt;br /&gt;
            end if;&lt;br /&gt;
          end if;&lt;br /&gt;
&lt;br /&gt;
        end if;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_porta : process(r_porta, r_control, groupa_mode, r_porta, I_PA, porta_ipreg, a_ack_l)&lt;br /&gt;
  begin&lt;br /&gt;
    -- D4    GROUPA porta         1 = input, 0 = output&lt;br /&gt;
    O_PA       &amp;lt;= x&amp;quot;FF&amp;quot;; -- if not driven, float high&lt;br /&gt;
    O_PA_OE_L  &amp;lt;= x&amp;quot;FF&amp;quot;;&lt;br /&gt;
    porta_read &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if    (groupa_mode = &amp;quot;00&amp;quot;) then -- simple io&lt;br /&gt;
      if (r_control(4) = '0') then -- output&lt;br /&gt;
        O_PA       &amp;lt;= r_porta;&lt;br /&gt;
        O_PA_OE_L  &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      end if;&lt;br /&gt;
      porta_read &amp;lt;= I_PA;&lt;br /&gt;
    elsif (groupa_mode = &amp;quot;01&amp;quot;) then -- strobed&lt;br /&gt;
      if (r_control(4) = '0') then -- output&lt;br /&gt;
        O_PA       &amp;lt;= r_porta;&lt;br /&gt;
        O_PA_OE_L  &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      end if;&lt;br /&gt;
      porta_read &amp;lt;= porta_ipreg;&lt;br /&gt;
    else -- if (groupa_mode(1) = '1') then -- bi dir&lt;br /&gt;
      if (a_ack_l = '0') then -- output enable&lt;br /&gt;
        O_PA       &amp;lt;= r_porta;&lt;br /&gt;
        O_PA_OE_L  &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      end if;&lt;br /&gt;
      porta_read &amp;lt;= porta_ipreg; -- latched data&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_portb : process(r_portb, r_control, groupb_mode, r_portb, I_PB, portb_ipreg)&lt;br /&gt;
  begin&lt;br /&gt;
    O_PB       &amp;lt;= x&amp;quot;FF&amp;quot;; -- if not driven, float high&lt;br /&gt;
    O_PB_OE_L  &amp;lt;= x&amp;quot;FF&amp;quot;;&lt;br /&gt;
    portb_read &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if (groupb_mode = '0') then -- simple io&lt;br /&gt;
      if (r_control(1) = '0') then -- output&lt;br /&gt;
        O_PB       &amp;lt;= r_portb;&lt;br /&gt;
        O_PB_OE_L  &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      end if;&lt;br /&gt;
      portb_read &amp;lt;= I_PB;&lt;br /&gt;
    else -- strobed mode&lt;br /&gt;
      if (r_control(1) = '0') then -- output&lt;br /&gt;
        O_PB       &amp;lt;= r_portb;&lt;br /&gt;
        O_PB_OE_L  &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
      end if;&lt;br /&gt;
      portb_read &amp;lt;= portb_ipreg;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_portc_out : process(r_portc, r_control, groupa_mode, groupb_mode,&lt;br /&gt;
                        a_obf_l, a_ibf, a_intr,b_obf_l, b_ibf, b_intr)&lt;br /&gt;
  begin&lt;br /&gt;
    O_PC       &amp;lt;= x&amp;quot;FF&amp;quot;; -- if not driven, float high&lt;br /&gt;
    O_PC_OE_L  &amp;lt;= x&amp;quot;FF&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    -- bits 7..4&lt;br /&gt;
    if    (groupa_mode = &amp;quot;00&amp;quot;) then -- simple io&lt;br /&gt;
      if (r_control(3) = '0') then -- output&lt;br /&gt;
        O_PC     (7 downto 4)  &amp;lt;= r_portc(7 downto 4);&lt;br /&gt;
        O_PC_OE_L(7 downto 4)  &amp;lt;= x&amp;quot;0&amp;quot;;&lt;br /&gt;
      end if;&lt;br /&gt;
    elsif (groupa_mode = &amp;quot;01&amp;quot;) then -- mode1&lt;br /&gt;
&lt;br /&gt;
      if (r_control(4) = '0') then -- port a output&lt;br /&gt;
        O_PC     (7) &amp;lt;= a_obf_l;&lt;br /&gt;
        O_PC_OE_L(7) &amp;lt;= '0';&lt;br /&gt;
        -- 6 is ack_l input&lt;br /&gt;
        if (r_control(3) = '0') then -- port c output&lt;br /&gt;
          O_PC     (5 downto 4) &amp;lt;= r_portc(5 downto 4);&lt;br /&gt;
          O_PC_OE_L(5 downto 4) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
        end if;&lt;br /&gt;
      else -- port a input&lt;br /&gt;
        if (r_control(3) = '0') then -- port c output&lt;br /&gt;
          O_PC     (7 downto 6) &amp;lt;= r_portc(7 downto 6);&lt;br /&gt;
          O_PC_OE_L(7 downto 6) &amp;lt;= &amp;quot;00&amp;quot;;&lt;br /&gt;
        end if;&lt;br /&gt;
        O_PC     (5) &amp;lt;= a_ibf;&lt;br /&gt;
        O_PC_OE_L(5) &amp;lt;= '0';&lt;br /&gt;
        -- 4 is stb_l input&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    else -- if (groupa_mode(1) = '1') then -- mode2&lt;br /&gt;
      O_PC     (7) &amp;lt;= a_obf_l;&lt;br /&gt;
      O_PC_OE_L(7) &amp;lt;= '0';&lt;br /&gt;
      -- 6 is ack_l input&lt;br /&gt;
      O_PC     (5) &amp;lt;= a_ibf;&lt;br /&gt;
      O_PC_OE_L(5) &amp;lt;= '0';&lt;br /&gt;
      -- 4 is stb_l input&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    -- bit 3 (controlled by group a)&lt;br /&gt;
    if    (groupa_mode = &amp;quot;00&amp;quot;) then -- group a steals this bit&lt;br /&gt;
      --if (groupb_mode = '0') then -- we will let bit 3 be driven, data sheet is a bit confused about this&lt;br /&gt;
        if (r_control(0) = '0') then -- ouput (note, groupb control bit)&lt;br /&gt;
          O_PC     (3) &amp;lt;= r_portc(3);&lt;br /&gt;
          O_PC_OE_L(3) &amp;lt;= '0';&lt;br /&gt;
        end if;&lt;br /&gt;
      --&lt;br /&gt;
    else -- stolen&lt;br /&gt;
      O_PC     (3) &amp;lt;= a_intr;&lt;br /&gt;
      O_PC_OE_L(3) &amp;lt;= '0';&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    -- bits 2..0&lt;br /&gt;
    if    (groupb_mode = '0') then -- simple io&lt;br /&gt;
      if (r_control(0) = '0') then -- output&lt;br /&gt;
        O_PC     (2 downto 0)  &amp;lt;= r_portc(2 downto 0);&lt;br /&gt;
        O_PC_OE_L(2 downto 0)  &amp;lt;= &amp;quot;000&amp;quot;;&lt;br /&gt;
      end if;&lt;br /&gt;
    else&lt;br /&gt;
      -- mode 1&lt;br /&gt;
      -- 2 is input&lt;br /&gt;
      if (r_control(1) = '0') then -- output&lt;br /&gt;
        O_PC     (1) &amp;lt;= b_obf_l;&lt;br /&gt;
        O_PC_OE_L(1) &amp;lt;= '0';&lt;br /&gt;
      else -- input&lt;br /&gt;
        O_PC     (1) &amp;lt;= b_ibf;&lt;br /&gt;
        O_PC_OE_L(1) &amp;lt;= '0';&lt;br /&gt;
      end if;&lt;br /&gt;
      O_PC     (0) &amp;lt;= b_intr;&lt;br /&gt;
      O_PC_OE_L(0) &amp;lt;= '0';&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_portc_in : process(r_portc, I_PC, r_control, groupa_mode, groupb_mode, a_ibf, b_obf_l,&lt;br /&gt;
                       a_obf_l, a_inte1, a_inte2, a_intr, b_inte, b_ibf, b_intr)&lt;br /&gt;
  begin&lt;br /&gt;
    portc_read &amp;lt;= x&amp;quot;00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    a_stb_l &amp;lt;= '1';&lt;br /&gt;
    a_ack_l &amp;lt;= '1';&lt;br /&gt;
    b_stb_l &amp;lt;= '1';&lt;br /&gt;
    b_ack_l &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
    if    (groupa_mode = &amp;quot;01&amp;quot;) then -- mode1 or 2&lt;br /&gt;
      if (r_control(4) = '0') then -- port a output&lt;br /&gt;
        a_ack_l &amp;lt;= I_PC(6);&lt;br /&gt;
      else -- port a input&lt;br /&gt;
        a_stb_l &amp;lt;= I_PC(4);&lt;br /&gt;
      end if;&lt;br /&gt;
    elsif (groupa_mode(1) = '1') then -- mode 2&lt;br /&gt;
      a_ack_l &amp;lt;= I_PC(6);&lt;br /&gt;
      a_stb_l &amp;lt;= I_PC(4);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if (groupb_mode = '1') then&lt;br /&gt;
      if (r_control(1) = '0') then -- output&lt;br /&gt;
        b_ack_l &amp;lt;= I_PC(2);&lt;br /&gt;
      else -- input&lt;br /&gt;
        b_stb_l &amp;lt;= I_PC(2);&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if    (groupa_mode = &amp;quot;00&amp;quot;) then -- simple io&lt;br /&gt;
      portc_read(7 downto 3) &amp;lt;= I_PC(7 downto 3);&lt;br /&gt;
    elsif (groupa_mode = &amp;quot;01&amp;quot;) then&lt;br /&gt;
      if (r_control(4) = '0') then -- port a output&lt;br /&gt;
        portc_read(7 downto 3) &amp;lt;= a_obf_l &amp;amp; a_inte1 &amp;amp; I_PC(5 downto 4) &amp;amp; a_intr;&lt;br /&gt;
      else -- input&lt;br /&gt;
        portc_read(7 downto 3) &amp;lt;= I_PC(7 downto 6) &amp;amp; a_ibf &amp;amp; a_inte2 &amp;amp; a_intr;&lt;br /&gt;
      end if;&lt;br /&gt;
    else -- mode 2&lt;br /&gt;
      portc_read(7 downto 3) &amp;lt;= a_obf_l &amp;amp; a_inte1 &amp;amp; a_ibf &amp;amp; a_inte2 &amp;amp; a_intr;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    if    (groupb_mode = '0') then -- simple io&lt;br /&gt;
      portc_read(2 downto 0) &amp;lt;= I_PC(2 downto 0);&lt;br /&gt;
    else&lt;br /&gt;
      if (r_control(1) = '0') then -- output&lt;br /&gt;
        portc_read(2 downto 0) &amp;lt;= b_inte &amp;amp; b_obf_l &amp;amp; b_intr;&lt;br /&gt;
      else -- input&lt;br /&gt;
        portc_read(2 downto 0) &amp;lt;= b_inte &amp;amp; b_ibf   &amp;amp; b_intr;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  p_ipreg : process&lt;br /&gt;
  begin&lt;br /&gt;
    wait until rising_edge(CLK);&lt;br /&gt;
    --   pc4 input  a_stb_l&lt;br /&gt;
    --   pc2 input  b_stb_l&lt;br /&gt;
&lt;br /&gt;
    if (ENA = '1') then&lt;br /&gt;
      if (a_stb_l = '0') then&lt;br /&gt;
        porta_ipreg &amp;lt;= I_PA;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
      if (mode_clear = '1') then&lt;br /&gt;
        portb_ipreg &amp;lt;= (others =&amp;gt; '0');&lt;br /&gt;
      elsif (b_stb_l = '0') then&lt;br /&gt;
        portb_ipreg &amp;lt;= I_PB;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
end architecture RTL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Hardware]]&lt;/div&gt;</summary>
		<author><name>Octoate</name></author>	</entry>

	</feed>