

<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> vga <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>      <font color="#0000ff">---25.175 Mhz clk</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>in</b></font>   <font color="#2e8b57"><b>unsigned</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>unsigned</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>
            write       <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>
            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>
            hsync       <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font>   <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            vsync       <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font>   <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            red         <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font>   <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            green       <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font>   <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            blue        <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font>   <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
            int_n       <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font>   <font color="#2e8b57"><b>std_logic</b></font>
           <font color="#6a5acd">);</font>

<font color="#804040"><b>end</b></font> vga<font color="#6a5acd">;</font>


<font color="#804040"><b>architecture</b></font> rtl <font color="#804040"><b>of</b></font> vga <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> DATA_TRS<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> colour<font color="#6a5acd">,</font>row<font color="#6a5acd">,</font>column<font color="#6a5acd">,</font>reg_addr <font color="#2e8b57"><b>:</b></font> <font color="#2e8b57"><b>unsigned</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> ale_i<font color="#6a5acd">,</font>psen_i<font color="#6a5acd">,</font>wr_i<font color="#6a5acd">,</font>rd_i<font color="#6a5acd">,</font>done_screen_i<font color="#6a5acd">,</font>write_i <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>unsigned</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> colour_reg <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>unsigned</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> row_reg    <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>unsigned</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> col_reg    <font color="#2e8b57"><b>:</b></font><font color="#2e8b57"><b>unsigned</b></font><font color="#2e8b57"><b>:=</b></font><font color="#ff00ff">X&quot;02&quot;</font><font color="#6a5acd">;</font>
<font color="#804040"><b>component</b></font>  vgacon
<font color="#804040"><b>port</b></font><font color="#6a5acd">(</font> clock   <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>
     resetn   <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>
     row      <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">5</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
      col     <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">5</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font> <font color="#6a5acd">);</font>
     colour   <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">2</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">);</font>
     do_write <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>
     hsync    <font color="#2e8b57"><b>:</b></font><font color="#804040"><b>out</b></font> <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
     vsync    <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font> <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
     data_r      <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font> <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
    data_g       <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font> <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
    data_b       <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font> <font color="#2e8b57"><b>std_logic</b></font><font color="#6a5acd">;</font>
    done_screen  <font color="#2e8b57"><b>:</b></font> <font color="#804040"><b>out</b></font> <font color="#2e8b57"><b>std_logic</b></font> <font color="#6a5acd">);</font>
<font color="#804040"><b>end</b></font> <font color="#804040"><b>component</b></font><font color="#6a5acd">;</font>


<font color="#804040"><b>begin</b></font>

vgacon1<font color="#2e8b57"><b>:</b></font>vgacon <font color="#804040"><b>port</b></font> <font color="#804040"><b>map</b></font><font color="#6a5acd">(</font> clock<font color="#2e8b57"><b>=&gt;</b></font>clk<font color="#6a5acd">,</font>
                resetn<font color="#2e8b57"><b>=&gt;</b></font>reset<font color="#6a5acd">,</font>
                row<font color="#2e8b57"><b>=&gt;</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font>row<font color="#6a5acd">(</font><font color="#ff00ff">5</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">)),</font>
                col<font color="#2e8b57"><b>=&gt;</b></font> <font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font>column<font color="#6a5acd">(</font><font color="#ff00ff">5</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font> <font color="#6a5acd">)),</font>
                colour<font color="#2e8b57"><b>=&gt;</b></font><font color="#2e8b57"><b>std_logic_vector</b></font><font color="#6a5acd">(</font>colour<font color="#6a5acd">(</font><font color="#ff00ff">2</font> <font color="#804040"><b>downto</b></font> <font color="#ff00ff">0</font><font color="#6a5acd">)),</font>
                do_write<font color="#2e8b57"><b>=&gt;</b></font>write_i<font color="#6a5acd">,</font>
                hsync<font color="#2e8b57"><b>=&gt;</b></font>hsync<font color="#6a5acd">,</font>
                vsync<font color="#2e8b57"><b>=&gt;</b></font>vsync<font color="#6a5acd">,</font>
                data_r<font color="#2e8b57"><b>=&gt;</b></font>red<font color="#6a5acd">,</font>
                data_g<font color="#2e8b57"><b>=&gt;</b></font>green<font color="#6a5acd">,</font>
                data_b<font color="#2e8b57"><b>=&gt;</b></font>blue<font color="#6a5acd">,</font>
                done_screen<font color="#2e8b57"><b>=&gt;</b></font>done_screen_i<font color="#6a5acd">);</font>

int_n<font color="#2e8b57"><b>&lt;=</b></font> <font color="#2e8b57"><b>not</b></font><font color="#6a5acd">(</font>done_screen_i<font color="#6a5acd">);</font>     <font color="#0000ff">---make this open drain to allow wired_or</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>
                write_i<font color="#2e8b57"><b>&lt;=</b></font>write<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">'0'</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>prs_state<font color="#6a5acd">,</font>addr_high<font color="#6a5acd">,</font>addr_data<font color="#6a5acd">)</font>

<font color="#804040"><b>begin</b></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="#2e8b57"><b>and</b></font> <font color="#6a5acd">(</font>addr_data<font color="#2e8b57"><b>=</b></font>colour_reg <font color="#2e8b57"><b>or</b></font> addr_data<font color="#2e8b57"><b>=</b></font>col_reg <font color="#2e8b57"><b>or</b></font> addr_data<font color="#2e8b57"><b>=</b></font>row_reg<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>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> colour_reg<font color="#2e8b57"><b>=&gt;</b></font>colour<font color="#2e8b57"><b>&lt;=</b></font>addr_data<font color="#6a5acd">;</font>
                        <font color="#804040"><b>when</b></font> col_reg<font color="#2e8b57"><b>=&gt;</b></font>column<font color="#2e8b57"><b>&lt;=</b></font>addr_data<font color="#6a5acd">;</font>
                        <font color="#804040"><b>when</b></font> row_reg<font color="#2e8b57"><b>=&gt;</b></font>row<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>end</b></font> <font color="#804040"><b>if</b></font><font color="#6a5acd">;</font>
                next_state<font color="#2e8b57"><b>&lt;=</b></font>data_trs<font color="#6a5acd">;</font>

        <font color="#804040"><b>when</b></font> DATA_TRS <font color="#2e8b57"><b>=&gt;</b></font>

        <font color="#804040"><b>if</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>





