
<font color="#804040"><b>library</b></font> ieee<font color="#6a5acd">;</font>
<font color="#804040"><b>use</b></font> ieee<font color="#6a5acd">.</font>std_logic_1164<font color="#6a5acd">.</font><font color="#804040"><b>all</b></font><font color="#6a5acd">;</font>
<font color="#804040"><b>use</b></font> ieee<font color="#6a5acd">.</font>numeric_std<font color="#6a5acd">.</font><font color="#804040"><b>all</b></font><font color="#6a5acd">;</font>


<font color="#804040"><b>entity</b></font> mult <font color="#804040"><b>is</b></font>

 <font color="#804040"><b>port</b></font><font color="#6a5acd">(</font>

            clk         <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>in</b></font>    <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            reset       <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>in</b></font>    <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            addr_data   <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>inout</b></font> <font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font><font color="#ff00ff">7</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
            addr_high   <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>in</b></font>   <font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font><font color="#ff00ff">7</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
            ale         <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>in</b></font>    <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            psen_n      <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>in</b></font>    <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            rd_n        <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>in</b></font>    <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            wr_n        <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>in</b></font>    <font color="#2e8b57"><b>std_logic</b></font>

           <font color="#6a5acd">);</font>

<font color="#804040"><b>end</b></font> mult<font color="#6a5acd">;</font>

<font color="#804040"><b>architecture</b></font> rtl <font color="#804040"><b>of</b></font> mult <font color="#804040"><b>is</b></font>


<font color="#804040"><b>type</b></font> UC_STATE_TYPE <font color="#804040"><b>is</b></font> <font color="#6a5acd">(</font>IDLE<font color="#6a5acd">,</font> ADDR_DECODE<font color="#6a5acd">,</font>ADDR_MATCH<font color="#6a5acd">,</font>END_CYCLE<font color="#6a5acd">);</font>
<font color="#804040"><b>signal</b></font> prs_state<font color="#6a5acd">,</font> next_state <font color="#2e8b57"><b>:</b></font> UC_STATE_TYPE<font color="#6a5acd">;</font>
<font color="#804040"><b>signal</b></font> mult_low<font color="#6a5acd">,</font>mult_high<font color="#6a5acd">,</font>addr_data_int<font color="#6a5acd">,</font>reg_addr <font color="#2e8b57"><b>:</b></font> <font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font><font color="#ff00ff">7</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
<font color="#804040"><b>signal</b></font> result <font color="#2e8b57"><b>:</b></font> <font color="#2e8b57"><b>signed</b></font><font color="#6a5acd">(</font><font color="#ff00ff">19</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
<font color="#804040"><b>signal</b></font> multiplier <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>signed</b></font><font color="#6a5acd">(</font><font color="#ff00ff">9</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
<font color="#804040"><b>signal</b></font> ale_i<font color="#6a5acd">,</font>psen_i<font color="#6a5acd">,</font>wr_i<font color="#6a5acd">,</font>rd_i<font color="#6a5acd">,</font>uc_data_oe <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>


<font color="#804040"><b>constant</b></font> upper_addr <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#2e8b57"><b>:=</b></font><font color="#ff00ff">X&quot;FF&quot;</font><font color="#6a5acd">;</font>   <font color="#0000ff">---register addresses</font>
<font color="#804040"><b>constant</b></font> mult_low_addr   <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#2e8b57"><b>:=</b></font><font color="#ff00ff">X&quot;00&quot;</font><font color="#6a5acd">;</font>
<font color="#804040"><b>constant</b></font> mult_high_addr  <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#2e8b57"><b>:=</b></font><font color="#ff00ff">X&quot;01&quot;</font><font color="#6a5acd">;</font>
<font color="#804040"><b>constant</b></font> result_1_addr   <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#2e8b57"><b>:=</b></font><font color="#ff00ff">X&quot;02&quot;</font><font color="#6a5acd">;</font>
<font color="#804040"><b>constant</b></font> result_2_addr   <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#2e8b57"><b>:=</b></font><font color="#ff00ff">X&quot;03&quot;</font><font color="#6a5acd">;</font>
<font color="#804040"><b>constant</b></font> result_3_addr   <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#2e8b57"><b>:=</b></font><font color="#ff00ff">X&quot;04&quot;</font><font color="#6a5acd">;</font>

<font color="#804040"><b>alias</b></font> result_byte_1 <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>signed</b></font><font color="#6a5acd">(</font><font color="#ff00ff">7</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">)</font> <font color="#804040"><b>is</b></font> result<font color="#6a5acd">(</font><font color="#ff00ff">7</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
<font color="#804040"><b>alias</b></font> result_byte_2 <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>signed</b></font><font color="#6a5acd">(</font><font color="#ff00ff">7</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">)</font> <font color="#804040"><b>is</b></font> result<font color="#6a5acd">(</font><font color="#ff00ff">15</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">8</font><font color="#6a5acd">);</font>
<font color="#804040"><b>alias</b></font> result_byte_3 <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>signed</b></font><font color="#6a5acd">(</font><font color="#ff00ff">3</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">)</font> <font color="#804040"><b>is</b></font> result<font color="#6a5acd">(</font><font color="#ff00ff">19</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">16</font><font color="#6a5acd">);</font>


<font color="#804040"><b>begin</b></font>


multiplier <font color="#2e8b57"><b>&lt;=</b></font><font color="#2e8b57"><b>signed</b></font><font color="#6a5acd">(</font>mult_high<font color="#6a5acd">(</font><font color="#ff00ff">1</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">)</font> <font color="#2e8b57"><b>&amp;</b></font> mult_low<font color="#6a5acd">);</font>
result<font color="#2e8b57"><b>&lt;=</b></font> multiplier<font color="#2e8b57"><b>*</b></font>multiplier<font color="#6a5acd">;</font>
addr_data<font color="#2e8b57"><b>&lt;=</b></font>addr_data_int <font color="#804040"><b>when</b></font> <font color="#6a5acd">(</font>uc_data_oe<font color="#2e8b57"><b>=</b></font><font color="#ff00ff">'1'</font><font color="#6a5acd">)</font> <font color="#804040"><b>else</b></font> <font color="#6a5acd">(</font><font color="#804040"><b>others</b></font><font color="#2e8b57"><b>=&gt;</b></font><font color="#ff00ff">'Z'</font><font color="#6a5acd">);</font>


sync<font color="#2e8b57"><b>:</b></font><font color="#804040"><b>process</b></font><font color="#6a5acd">(</font>clk<font color="#6a5acd">)</font>
<font color="#804040"><b>begin</b></font>
        <font color="#804040"><b>if</b></font> rising_edge<font color="#6a5acd">(</font>clk<font color="#6a5acd">)</font> <font color="#804040"><b>then</b></font>
                ale_i<font color="#2e8b57"><b>&lt;=</b></font>ale<font color="#6a5acd">;</font>
                psen_i<font color="#2e8b57"><b>&lt;=</b></font>psen_n<font color="#6a5acd">;</font>
                rd_i<font color="#2e8b57"><b>&lt;=</b></font>rd_n<font color="#6a5acd">;</font>
                wr_i<font color="#2e8b57"><b>&lt;=</b></font>wr_n<font color="#6a5acd">;</font>

        <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>
<font color="#804040"><b>end</b></font> <font color="#804040"><b>process</b></font><font color="#6a5acd">;</font>



UC_REGS<font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>process</b></font> <font color="#6a5acd">(</font>clk<font color="#6a5acd">)</font>
<font color="#804040"><b>begin</b></font>

        <font color="#804040"><b>if</b></font> rising_edge<font color="#6a5acd">(</font>clk<font color="#6a5acd">)</font> <font color="#804040"><b>then</b></font>
                <font color="#804040"><b>if</b></font> reset <font color="#2e8b57"><b>=</b></font> <font color="#ff00ff">'1'</font> <font color="#804040"><b>then</b></font>
                    prs_state <font color="#2e8b57"><b>&lt;=</b></font> IDLE<font color="#6a5acd">;</font>
                <font color="#804040"><b>else</b></font>
                    prs_state <font color="#2e8b57"><b>&lt;=</b></font> next_state<font color="#6a5acd">;</font>
                <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>

        <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>

<font color="#804040"><b>end</b></font> <font color="#804040"><b>process</b></font><font color="#6a5acd">;</font>


Uc_decode<font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>process</b></font> <font color="#6a5acd">(</font>ale_i<font color="#6a5acd">,</font>wr_i<font color="#6a5acd">,</font>rd_i<font color="#6a5acd">)</font>

<font color="#804040"><b>begin</b></font>
uc_data_oe<font color="#2e8b57"><b>&lt;=</b></font><font color="#ff00ff">'0'</font><font color="#6a5acd">;</font>
        <font color="#804040"><b>case</b></font> prs_state <font color="#804040"><b>is</b></font>
        <font color="#804040"><b>when</b></font> IDLE <font color="#2e8b57"><b>=&gt;</b></font>

                <font color="#804040"><b>if</b></font> ale_i<font color="#2e8b57"><b>=</b></font><font color="#ff00ff">'1'</font> <font color="#2e8b57"><b>and</b></font> psen_i <font color="#2e8b57"><b>=</b></font> <font color="#ff00ff">'1'</font> <font color="#804040"><b>then</b></font>
                next_state <font color="#2e8b57"><b>&lt;=</b></font> ADDR_DECODE<font color="#6a5acd">;</font>
                <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>

        <font color="#804040"><b>when</b></font> ADDR_DECODE <font color="#2e8b57"><b>=&gt;</b></font>
                <font color="#804040"><b>if</b></font> ale_i<font color="#2e8b57"><b>=</b></font><font color="#ff00ff">'0'</font> <font color="#804040"><b>then</b></font>
                        <font color="#804040"><b>if</b></font> <font color="#6a5acd">(</font>addr_high<font color="#2e8b57"><b>=</b></font>upper_addr<font color="#6a5acd">)</font> <font color="#804040"><b>then</b></font>
                                <font color="#804040"><b>if</b></font> <font color="#6a5acd">(</font>addr_data<font color="#2e8b57"><b>=</b></font>mult_low_addr <font color="#2e8b57"><b>or</b></font> addr_data<font color="#2e8b57"><b>=</b></font>mult_high_addr <font color="#2e8b57"><b>or</b></font> addr_data<font color="#2e8b57"><b>=</b></font>result_1_addr <font color="#2e8b57"><b>or</b></font> addr_data<font color="#2e8b57"><b>=</b></font>result_2_addr <font color="#2e8b57"><b>or</b></font> addr_data<font color="#2e8b57"><b>=</b></font>result_3_addr<font color="#6a5acd">)</font> <font color="#804040"><b>then</b></font>
                                                reg_addr<font color="#2e8b57"><b>&lt;=</b></font>addr_data<font color="#6a5acd">;</font>
                                                next_state<font color="#2e8b57"><b>&lt;=</b></font>addr_match<font color="#6a5acd">;</font>
                                <font color="#804040"><b>else</b></font> next_state <font color="#2e8b57"><b>&lt;=</b></font>idle<font color="#6a5acd">;</font>
                                <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>
                        <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>
                <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>

        <font color="#804040"><b>when</b></font> ADDR_MATCH <font color="#2e8b57"><b>=&gt;</b></font>

                <font color="#804040"><b>if</b></font> wr_i<font color="#2e8b57"><b>=</b></font><font color="#ff00ff">'0'</font> <font color="#804040"><b>then</b></font>
                        <font color="#804040"><b>case</b></font> reg_addr <font color="#804040"><b>is</b></font>
                        <font color="#804040"><b>when</b></font> mult_low_addr<font color="#2e8b57"><b>=&gt;</b></font>mult_low<font color="#2e8b57"><b>&lt;=</b></font>addr_data<font color="#6a5acd">;</font>
                        <font color="#804040"><b>when</b></font> mult_high_addr<font color="#2e8b57"><b>=&gt;</b></font>mult_high<font color="#2e8b57"><b>&lt;=</b></font>addr_data<font color="#6a5acd">;</font>
                        <font color="#804040"><b>when</b></font> <font color="#804040"><b>others</b></font> <font color="#2e8b57"><b>=&gt;</b></font><font color="#804040"><b>null</b></font><font color="#6a5acd">;</font>
                        <font color="#804040"><b>end</b></font> <font color="#804040"><b>case</b></font><font color="#6a5acd">;</font>


                <font color="#804040"><b>elsif</b></font> rd_i<font color="#2e8b57"><b>=</b></font><font color="#ff00ff">'0'</font> <font color="#804040"><b>then</b></font>
                        uc_data_oe<font color="#2e8b57"><b>&lt;=</b></font><font color="#ff00ff">'1'</font><font color="#6a5acd">;</font>

                                <font color="#804040"><b>case</b></font> reg_addr <font color="#804040"><b>is</b></font>
                                <font color="#804040"><b>when</b></font> result_1_addr<font color="#2e8b57"><b>=&gt;</b></font>addr_data_int<font color="#2e8b57"><b>&lt;=</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font>result_byte_1<font color="#6a5acd">);</font>
                                <font color="#804040"><b>when</b></font> result_2_addr<font color="#2e8b57"><b>=&gt;</b></font>addr_data_int<font color="#2e8b57"><b>&lt;=</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font>result_byte_2<font color="#6a5acd">);</font>
                                <font color="#804040"><b>when</b></font> result_3_addr<font color="#2e8b57"><b>=&gt;</b></font>addr_data_int<font color="#2e8b57"><b>&lt;=</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font><font color="#ff00ff">&quot;0000&quot;</font> <font color="#2e8b57"><b>&amp;</b></font> result_byte_3<font color="#6a5acd">);</font>
                                <font color="#804040"><b>when</b></font> <font color="#804040"><b>others</b></font> <font color="#2e8b57"><b>=&gt;</b></font><font color="#804040"><b>null</b></font><font color="#6a5acd">;</font>
                                <font color="#804040"><b>end</b></font> <font color="#804040"><b>case</b></font><font color="#6a5acd">;</font>
                <font color="#804040"><b>elsif</b></font> rd_i <font color="#2e8b57"><b>=</b></font> <font color="#ff00ff">'1'</font> <font color="#2e8b57"><b>and</b></font> wr_i <font color="#2e8b57"><b>=</b></font> <font color="#ff00ff">'1'</font> <font color="#804040"><b>then</b></font>
                                next_state <font color="#2e8b57"><b>&lt;=</b></font> END_CYCLE<font color="#6a5acd">;</font>

                <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>

        <font color="#804040"><b>when</b></font> END_CYCLE <font color="#2e8b57"><b>=&gt;</b></font>

        <font color="#804040"><b>if</b></font> ale_i <font color="#2e8b57"><b>=</b></font> <font color="#ff00ff">'0'</font> <font color="#804040"><b>then</b></font>
        next_state <font color="#2e8b57"><b>&lt;=</b></font> IDLE<font color="#6a5acd">;</font>
        <font color="#804040"><b>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>


        <font color="#804040"><b>end</b></font> <font color="#804040"><b>case</b></font><font color="#6a5acd">;</font>

<font color="#804040"><b>end</b></font> <font color="#804040"><b>process</b></font><font color="#6a5acd">;</font>

    <font color="#804040"><b>end</b></font> rtl<font color="#6a5acd">;</font>














































