
<font color="#ffa500">---Simple 16 bit counter started and stopped </font>
<font color="#ffa500">---by the low frequency input divided by two.</font>
<font color="#ffa500">--- with little state machine to implement a 8052 interface in 8 bit mode</font>
<font color="#ffa500">---reading from the base address when the interrupt is low returns the</font>
<font color="#ffa500">--- low byte of the counter,reading the base address+1 returns the high byte</font>
<font color="#ffa500">--- of the counter and resets the interrupt.  </font>
<font color="#ffa500">--- ignore the interrupt at reset,just do a dummy read to clear it</font>
<font color="#ffa500">--- if you want the modelsim simulation waveforms as a postscript file mail me.</font>

 <font color="#ffff00">library</font> ieee<font color="#ff00ff">;</font>
<font color="#ffff00">use</font> ieee<font color="#ff00ff">.</font>std_logic_1164<font color="#ff00ff">.</font><font color="#ffff00">all</font><font color="#ff00ff">;</font>
<font color="#ffff00">ENTITY</font> bidir <font color="#ffff00">IS</font>
    <font color="#ffff00">PORT</font><font color="#ff00ff">(</font>
        bidir   <font color="#c0c0c0">:</font> <font color="#ffff00">INOUT</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
        oe      <font color="#c0c0c0">:</font> <font color="#ffff00">IN</font> <font color="#c0c0c0">STD_LOGIC</font><font color="#ff00ff">;</font>
        inp     <font color="#c0c0c0">:</font> <font color="#ffff00">IN</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
        outp    <font color="#c0c0c0">:</font> <font color="#ffff00">OUT</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">));</font>
<font color="#ffff00">END</font> bidir<font color="#ff00ff">;</font>
<font color="#ffff00">ARCHITECTURE</font> rtl <font color="#ffff00">OF</font> bidir <font color="#ffff00">IS</font>
<font color="#ffff00">SIGNAL</font>  a  <font color="#c0c0c0">:</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>

<font color="#ffff00">SIGNAL</font>  b  <font color="#c0c0c0">:</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
<font color="#ffff00">BEGIN</font>

        a <font color="#c0c0c0">&lt;=</font> inp<font color="#ff00ff">;</font>
        outp <font color="#c0c0c0">&lt;=</font> b<font color="#ff00ff">;</font>


     <font color="#ffff00">PROCESS</font> <font color="#ff00ff">(</font>oe<font color="#ff00ff">,</font> bidir<font color="#ff00ff">)</font>
        <font color="#ffff00">BEGIN</font>
        <font color="#ffff00">IF</font><font color="#ff00ff">(</font> oe <font color="#c0c0c0">=</font> <font color="#ffffff">'0'</font><font color="#ff00ff">)</font> <font color="#ffff00">THEN</font>
            bidir <font color="#c0c0c0">&lt;=</font> <font color="#ff00ff">(</font><font color="#ffff00">others</font><font color="#c0c0c0">=&gt;</font><font color="#ffffff">'Z'</font><font color="#ff00ff">);</font>
            b <font color="#c0c0c0">&lt;=</font> bidir<font color="#ff00ff">;</font>
        <font color="#ffff00">ELSE</font>
            bidir <font color="#c0c0c0">&lt;=</font> a<font color="#ff00ff">;</font>
            b <font color="#c0c0c0">&lt;=</font> bidir<font color="#ff00ff">;</font>
        <font color="#ffff00">END</font> <font color="#ffff00">IF</font><font color="#ff00ff">;</font>
    <font color="#ffff00">END</font> <font color="#ffff00">PROCESS</font><font color="#ff00ff">;</font>
 <font color="#ffff00">end</font> rtl<font color="#ff00ff">;</font>

<font color="#ffff00">library</font> IEEE<font color="#ff00ff">;</font>
<font color="#ffff00">use</font> IEEE<font color="#ff00ff">.</font>std_logic_1164<font color="#ff00ff">.</font><font color="#ffff00">all</font><font color="#ff00ff">;</font>
<font color="#ffff00">use</font> IEEE<font color="#ff00ff">.</font>std_logic_unsigned<font color="#ff00ff">.</font><font color="#ffff00">all</font><font color="#ff00ff">;</font>





<font color="#ffff00">entity</font> C_interface <font color="#ffff00">is</font>
    <font color="#ffff00">port</font><font color="#ff00ff">(</font>

^I    p_clk^I<font color="#c0c0c0">:</font> <font color="#ffff00">in</font>^I<font color="#c0c0c0">std_logic</font><font color="#ff00ff">;</font>^I<font color="#ffa500">-- processor clk</font>
^I    reset^I<font color="#c0c0c0">:</font> <font color="#ffff00">in</font>^I<font color="#c0c0c0">std_logic</font><font color="#ff00ff">;</font>^I<font color="#ffa500">-- processor reset</font>
^I    lps^I^I<font color="#c0c0c0">:</font> <font color="#ffff00">in</font>^I<font color="#c0c0c0">std_logic</font><font color="#ff00ff">;</font>^I<font color="#ffa500">-- Long period signal to measure^I^I--- assuming 8 bit addressing mode,it makes things easier</font>
            addr_data   <font color="#c0c0c0">:</font> <font color="#ffff00">inout</font>   <font color="#c0c0c0">std_logic_vector</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">downto</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
            ale_n       <font color="#c0c0c0">:</font> <font color="#ffff00">in</font>    <font color="#c0c0c0">std_logic</font><font color="#ff00ff">;</font>
            psen_n      <font color="#c0c0c0">:</font> <font color="#ffff00">in</font>    <font color="#c0c0c0">std_logic</font><font color="#ff00ff">;</font>
            rd_n        <font color="#c0c0c0">:</font> <font color="#ffff00">in</font>    <font color="#c0c0c0">std_logic</font><font color="#ff00ff">;</font>
            wr_n        <font color="#c0c0c0">:</font> <font color="#ffff00">in</font>    <font color="#c0c0c0">std_logic</font><font color="#ff00ff">;</font>
^I    int_n^I<font color="#c0c0c0">:</font> <font color="#ffff00">out</font>^I<font color="#c0c0c0">std_logic</font>
                   <font color="#ff00ff">);</font>


<font color="#ffff00">end</font> C_interface<font color="#ff00ff">;</font>

<font color="#ffa500">-- assuning that the test counter is 16 bits depending on the p_clk and stuff</font>

<font color="#ffff00">architecture</font> BEHAVIOUR <font color="#ffff00">of</font> C_interface <font color="#ffff00">is</font>

<font color="#ffff00">constant</font> RESET_ACTIVE <font color="#c0c0c0">:</font><font color="#c0c0c0">std_logic</font><font color="#c0c0c0">:=</font><font color="#ffffff">'1'</font><font color="#ff00ff">;</font>
<font color="#ffff00">constant</font> BASE_ADDR    <font color="#c0c0c0">:</font><font color="#c0c0c0">std_logic_vector</font><font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">downto</font> <font color="#ffffff">0</font><font color="#ff00ff">)</font><font color="#c0c0c0">:=</font><font color="#ffffff">x&quot;00&quot;</font><font color="#ff00ff">;</font> <font color="#ffa500">-- set this to whatever</font>
<font color="#ffff00">constant</font> Base_addrplus1 <font color="#c0c0c0">:</font> <font color="#c0c0c0">std_logic_vector</font><font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">downto</font> <font color="#ffffff">0</font><font color="#ff00ff">)</font><font color="#c0c0c0">:=</font><font color="#ffffff">x&quot;01&quot;</font><font color="#ff00ff">;</font>
<font color="#ffff00">type</font> UC_STATE_TYPE <font color="#ffff00">is</font> <font color="#ff00ff">(</font>IDLE<font color="#ff00ff">,</font> ADDR_DECODE<font color="#ff00ff">,</font> DATA_TRS<font color="#ff00ff">,</font> END_CYCLE<font color="#ff00ff">);</font>
<font color="#ffff00">signal</font> uc_data_out  <font color="#c0c0c0">:</font> <font color="#c0c0c0">std_logic_vector</font><font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">downto</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
<font color="#ffff00">signal</font> timer<font color="#c0c0c0">:</font><font color="#c0c0c0">std_logic_vector</font><font color="#ff00ff">(</font><font color="#ffffff">15</font> <font color="#ffff00">downto</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
<font color="#ffff00">signal</font> prs_state<font color="#ff00ff">,</font> next_state <font color="#c0c0c0">:</font> UC_STATE_TYPE<font color="#ff00ff">;</font>
<font color="#ffff00">signal</font> data_oreg_0<font color="#ff00ff">,</font>data_oreg_1<font color="#ff00ff">,</font>addr     <font color="#c0c0c0">:</font> <font color="#c0c0c0">std_logic_vector</font><font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">downto</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
<font color="#ffff00">signal</font> lpsdiv<font color="#ff00ff">,</font>uc_data_oe<font color="#c0c0c0">:</font><font color="#c0c0c0">std_Logic</font><font color="#ff00ff">;</font>
  <font color="#ffff00">component</font> bidir
        <font color="#ffff00">PORT</font><font color="#ff00ff">(</font>
        bidir   <font color="#c0c0c0">:</font> <font color="#ffff00">INOUT</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
        oe      <font color="#c0c0c0">:</font> <font color="#ffff00">IN</font> <font color="#c0c0c0">STD_LOGIC</font><font color="#ff00ff">;</font>
        inp     <font color="#c0c0c0">:</font> <font color="#ffff00">IN</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
        outp    <font color="#c0c0c0">:</font> <font color="#ffff00">OUT</font> <font color="#c0c0c0">STD_LOGIC_VECTOR</font> <font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">DOWNTO</font> <font color="#ffffff">0</font><font color="#ff00ff">));</font>
<font color="#ffff00">end</font> <font color="#ffff00">component</font><font color="#ff00ff">;</font>

<font color="#ffff00">begin</font>
divlps<font color="#c0c0c0">:</font><font color="#ffff00">process</font><font color="#ff00ff">(</font>lps<font color="#ff00ff">,</font>reset<font color="#ff00ff">)</font>
<font color="#ffff00">begin</font>
^I<font color="#ffff00">if</font> reset<font color="#c0c0c0">=</font>RESET_ACTIVE <font color="#ffff00">then</font>
^I^Ilpsdiv<font color="#c0c0c0">&lt;=</font><font color="#ffffff">'0'</font><font color="#ff00ff">;</font>
^I<font color="#ffff00">elsif</font> rising_edge<font color="#ff00ff">(</font>lps<font color="#ff00ff">)</font> <font color="#ffff00">then</font>
^I^Ilpsdiv<font color="#c0c0c0">&lt;=not</font><font color="#ff00ff">(</font>lpsdiv<font color="#ff00ff">);</font>
^I<font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>


<font color="#ffff00">end</font> <font color="#ffff00">process</font><font color="#ff00ff">;</font>

bdir<font color="#c0c0c0">:</font>bidir
^I<font color="#ffff00">port</font> <font color="#ffff00">map</font><font color="#ff00ff">(</font>bidir <font color="#c0c0c0">=&gt;</font>  addr_data<font color="#ff00ff">,</font>
^I^Ioe     <font color="#c0c0c0">=&gt;</font>  uc_data_oe<font color="#ff00ff">,</font>^I
^I^Iinp   <font color="#c0c0c0">=&gt;</font>  uc_data_out<font color="#ff00ff">,</font>
^I^Ioutp   <font color="#c0c0c0">=&gt;</font>  addr<font color="#ff00ff">);</font>^I


timr<font color="#c0c0c0">:</font><font color="#ffff00">process</font><font color="#ff00ff">(</font>p_clk<font color="#ff00ff">,</font>lpsdiv<font color="#ff00ff">)</font>
<font color="#ffff00">begin</font>
^I
^I<font color="#ffff00">if</font> rising_edge<font color="#ff00ff">(</font>p_clk<font color="#ff00ff">)</font> <font color="#ffff00">then</font>
^I^I<font color="#ffff00">if</font> lpsdiv<font color="#c0c0c0">=</font><font color="#ffffff">'0'</font> <font color="#ffff00">then</font>
^I^I^I
^I^I^Itimer  <font color="#c0c0c0">&lt;=</font><font color="#ff00ff">(</font><font color="#ffff00">others</font><font color="#c0c0c0">=&gt;</font><font color="#ffffff">'0'</font><font color="#ff00ff">);</font>
^I
^I^I<font color="#ffff00">else</font>
^I^I^Idata_oreg_0<font color="#c0c0c0">&lt;=</font>timer<font color="#ff00ff">(</font><font color="#ffffff">7</font> <font color="#ffff00">downto</font> <font color="#ffffff">0</font><font color="#ff00ff">);</font>
^I^I^Idata_oreg_1<font color="#c0c0c0">&lt;=</font>timer<font color="#ff00ff">(</font><font color="#ffffff">15</font> <font color="#ffff00">downto</font> <font color="#ffffff">8</font><font color="#ff00ff">);</font>^I
^I^I^Itimer<font color="#c0c0c0">&lt;=</font>timer<font color="#c0c0c0">+</font><font color="#ffffff">'1'</font><font color="#ff00ff">;</font>
^I^I<font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>
^I<font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>
^I
<font color="#ffff00">end</font> <font color="#ffff00">process</font><font color="#ff00ff">;</font>^I


gen_int<font color="#c0c0c0">:</font><font color="#ffff00">process</font><font color="#ff00ff">(</font>lpsdiv<font color="#ff00ff">,</font>prs_state<font color="#ff00ff">)</font>

<font color="#ffff00">begin</font>
^I^I<font color="#ffff00">if</font> falling_edge<font color="#ff00ff">(</font>lpsdiv<font color="#ff00ff">)</font> <font color="#ffff00">then</font>
^I^I^Iint_n<font color="#c0c0c0">&lt;=</font><font color="#ffffff">'0'</font><font color="#ff00ff">;</font>
^I^I<font color="#ffff00">elsif</font> prs_state <font color="#c0c0c0">=</font> end_cycle <font color="#ffff00">then</font>
^I^I^Iint_n<font color="#c0c0c0">&lt;=</font><font color="#ffffff">'1'</font><font color="#ff00ff">;</font>
^I^I<font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>
<font color="#ffff00">end</font> <font color="#ffff00">process</font><font color="#ff00ff">;</font>^I^I^I


UC_SM_REGS<font color="#c0c0c0">:</font> <font color="#ffff00">process</font> <font color="#ff00ff">(</font>p_clk<font color="#ff00ff">,</font> reset<font color="#ff00ff">)</font>
<font color="#ffff00">begin</font>
        <font color="#ffff00">if</font> reset <font color="#c0c0c0">=</font> RESET_ACTIVE <font color="#ffff00">then</font>
            prs_state <font color="#c0c0c0">&lt;=</font> IDLE<font color="#ff00ff">;</font>

        <font color="#ffff00">elsif</font> rising_edge<font color="#ff00ff">(</font>p_clk<font color="#ff00ff">)</font> <font color="#ffff00">then</font>
            prs_state <font color="#c0c0c0">&lt;=</font> next_state<font color="#ff00ff">;</font>

        <font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>

<font color="#ffff00">end</font> <font color="#ffff00">process</font><font color="#ff00ff">;</font>


uc_if<font color="#c0c0c0">:</font> <font color="#ffff00">process</font> <font color="#ff00ff">(</font>prs_state<font color="#ff00ff">,</font>psen_n<font color="#ff00ff">,</font>addr<font color="#ff00ff">,</font>data_oreg_0<font color="#ff00ff">,</font>data_oreg_1<font color="#ff00ff">,</font> ale_n<font color="#ff00ff">,</font> rd_n<font color="#ff00ff">,</font> wr_n<font color="#ff00ff">)</font>

<font color="#ffff00">begin</font>

next_state <font color="#c0c0c0">&lt;=</font> prs_state<font color="#ff00ff">;</font>
 uc_data_oe<font color="#c0c0c0">&lt;=</font><font color="#ffffff">'0'</font><font color="#ff00ff">;</font>
 uc_data_out<font color="#c0c0c0">&lt;=</font><font color="#ff00ff">(</font><font color="#ffff00">others</font><font color="#c0c0c0">=&gt;</font><font color="#ffffff">'0'</font><font color="#ff00ff">);</font>
    <font color="#ffff00">case</font> prs_state <font color="#ffff00">is</font>
            <font color="#ffff00">when</font> IDLE <font color="#c0c0c0">=&gt;</font>

^I^I^I^I^I
            <font color="#ffff00">if</font> ale_n<font color="#c0c0c0">=</font><font color="#ffffff">'0'</font> <font color="#c0c0c0">and</font> psen_n <font color="#c0c0c0">=</font> <font color="#ffffff">'1'</font> <font color="#ffff00">then</font>
               next_state <font color="#c0c0c0">&lt;=</font> ADDR_DECODE<font color="#ff00ff">;</font>
            <font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>



        <font color="#ffff00">when</font> ADDR_DECODE <font color="#c0c0c0">=&gt;</font>
^I
^I    <font color="#ffff00">if</font> rd_n <font color="#c0c0c0">=</font> <font color="#ffffff">'0'</font> <font color="#c0c0c0">or</font> wr_n <font color="#c0c0c0">=</font> <font color="#ffffff">'0'</font> <font color="#ffff00">then</font>
                        next_state <font color="#c0c0c0">&lt;=</font> DATA_TRS<font color="#ff00ff">;</font>
            <font color="#ffff00">else</font>

                  next_state <font color="#c0c0c0">&lt;=</font> IDLE<font color="#ff00ff">;</font>
            <font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>



        <font color="#ffff00">when</font> DATA_TRS <font color="#c0c0c0">=&gt;</font>

^I^I<font color="#ffff00">if</font> rd_n <font color="#c0c0c0">=</font> <font color="#ffffff">'0'</font> <font color="#ffff00">then</font>
^I^Iuc_data_oe<font color="#c0c0c0">&lt;=</font><font color="#ffffff">'1'</font><font color="#ff00ff">;</font>
^I^I
^I^I<font color="#ffff00">case</font> addr <font color="#ffff00">is</font>
^I^I^I <font color="#ffff00">when</font> base_addr <font color="#c0c0c0">=&gt;</font> uc_data_out <font color="#c0c0c0">&lt;=</font> data_oreg_0<font color="#ff00ff">;</font>
                         <font color="#ffff00">when</font> base_addrplus1 <font color="#c0c0c0">=&gt;</font> uc_data_out <font color="#c0c0c0">&lt;=</font> data_oreg_1<font color="#ff00ff">;</font>
^I^I^I <font color="#ffff00">when</font> <font color="#ffff00">others</font> <font color="#c0c0c0">=&gt;</font> <font color="#ffff00">NULL</font><font color="#ff00ff">;</font>^I
^I^I <font color="#ffff00">end</font> <font color="#ffff00">case</font><font color="#ff00ff">;</font>
^I
                <font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>


                <font color="#ffff00">if</font> rd_n <font color="#c0c0c0">=</font> <font color="#ffffff">'1'</font> <font color="#c0c0c0">and</font> wr_n <font color="#c0c0c0">=</font> <font color="#ffffff">'1'</font> <font color="#ffff00">then</font>
                    next_state <font color="#c0c0c0">&lt;=</font> END_CYCLE<font color="#ff00ff">;</font>
                <font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>



        <font color="#ffff00">when</font> END_CYCLE <font color="#c0c0c0">=&gt;</font>

^I
             <font color="#ffff00">if</font> ale_n <font color="#c0c0c0">=</font> <font color="#ffffff">'1'</font> <font color="#ffff00">then</font>
              next_state <font color="#c0c0c0">&lt;=</font> IDLE<font color="#ff00ff">;</font>
            <font color="#ffff00">end</font> <font color="#ffff00">if</font><font color="#ff00ff">;</font>
^I^I^I

             <font color="#ffff00">end</font> <font color="#ffff00">case</font><font color="#ff00ff">;</font>

<font color="#ffff00">end</font> <font color="#ffff00">process</font><font color="#ff00ff">;</font>

^I
    <font color="#ffff00">end</font> BEHAVIOUR<font color="#ff00ff">;</font>
























