Advertisement
Guest User

Untitled

a guest
Sep 13th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 4.70 KB | None | 0 0
  1. library IEEE;
  2.  
  3. use IEEE.std_logic_1164.all;
  4. use IEEE.numeric_std.all;
  5.  
  6. -- internal rendering is done via block ram so 320x240x4 mode supported only
  7.  
  8. -- modes supported
  9. -- mode: 0 - 640x480@60Hz max number of pixels
  10.  
  11. entity VGA is
  12.     generic (
  13.         g_Mode : natural := 0
  14.     );
  15.     port
  16.     (
  17.         CLOCK         : in std_logic;
  18.        
  19.         VGA_HSYNC     : out std_logic;
  20.         VGA_VSYNC     : out std_logic;
  21.        
  22.         VGA_R        : out std_logic_vector (0 to 7);
  23.         VGA_G        : out std_logic_vector (0 to 7);
  24.         VGA_B        : out std_logic_vector (0 to 7);
  25.    
  26.         VGA_CLOCK     : out std_logic;
  27.         NOT_RENDERING : out std_logic;
  28.        
  29.         WRITE_X       : in  integer range 0 to 320 := 0;
  30.         WRITE_Y       : in  integer range 0 to 240 := 0;
  31.         WRITE_SIGNAL  : in  std_logic := '0';
  32.         WRITE_COLOR   : in  std_logic_vector (1 downto 0) := "00";
  33.         WROTE             : out std_logic
  34.     );
  35. end VGA;
  36.  
  37. architecture RTL of VGA is
  38.  
  39.     subtype t_Color is std_logic_vector (1 downto 0);
  40.     type t_RenderBuffer is array(0 to (320*240)-1) of t_Color;
  41.    
  42.     -- PLL 108 MHz clock
  43.     component ecomputer is
  44.       port (
  45.             vga_pll_outclk0_clk : out std_logic;        -- clk
  46.             vga_pll_refclk_clk  : in  std_logic := 'X'; -- clk
  47.             vga_pll_reset_reset : in  std_logic := 'X'  -- reset
  48.       );
  49.     end component ecomputer;
  50.  
  51.     signal w_VgaClock    : std_logic;
  52.     signal w_Reset       : std_logic := '0';
  53.    
  54.     signal r_Buffer      : t_RenderBuffer := (others => "00");
  55.    
  56.     signal w_R              : std_logic_vector (0 to 7);
  57.     signal w_G              : std_logic_vector (0 to 7);
  58.     signal w_B              : std_logic_vector (0 to 7);
  59.    
  60.     signal w_VColumns   : integer range 0 to 4096;
  61.     signal w_VRows          : integer range 0 to 4096;
  62.     signal w_Rendering   : std_logic;
  63.    
  64.     signal r_Hpos        : integer range 0 to 4096 := 0;
  65.     signal r_Vpos        : integer range 0 to 4096 := 0;
  66.     signal w_Divider     : integer range 1 to 128  := 1;
  67.    
  68.     -- fifo management
  69.    
  70.     signal w_FifoWriteF  : std_logic;
  71.     signal w_FifoWriteB  : std_logic;
  72.     signal w_FifoReadAv  : std_logic;
  73.     signal w_FifoWriteD  : std_logic_vector (19 downto 0);
  74.     signal w_FifoReadRq  : std_logic;
  75.     signal w_FifoReadEm  : std_logic;
  76.     signal w_FifoReadQ   : std_logic_vector (19 downto 0);
  77.    
  78. begin
  79.  
  80.     ce : component ecomputer
  81.         port map (
  82.             vga_pll_outclk0_clk => w_VgaClock,
  83.             vga_pll_refclk_clk  => CLOCK,  
  84.             vga_pll_reset_reset => w_Reset
  85.         );
  86.  
  87.     e_Fifo : entity work.VGAFifo
  88.         port map (wrfull => w_FifoWriteF, wrclk => CLOCK, wrreq => WRITE_SIGNAL, data => w_FifoWriteD,
  89.               rdclk => w_VgaClock, rdempty => w_FifoReadEm, rdreq => w_FifoReadRq, q => w_FifoReadQ);
  90.  
  91.     modeselect_gen : if g_Mode = 0 generate
  92.         w_Divider <= 2;
  93.     end generate modeselect_gen;    
  94.  
  95.     e_Sync : entity work.VGASync
  96.         port map (
  97.             CLOCK => w_VgaClock,
  98.             HSYNC => VGA_HSYNC, VSYNC => VGA_VSYNC,
  99.             R => w_R, G => w_G, B => w_B,
  100.             VCOLUMNS => w_VColumns, VROWS => w_VRows, RENDERING_PIXELS => w_Rendering
  101.         );
  102.        
  103.     VGA_CLOCK <= w_VgaClock;
  104.    
  105.     w_DrawToBuffer : process (CLOCK) is begin
  106.    
  107.         if rising_edge(CLOCK) then
  108.        
  109.             if WRITE_SIGNAL = '1' then
  110.                 if w_FifoWriteF = '1' then
  111.                     w_FifoWriteD <= WRITE_COLOR & (std_logic_vector(to_unsigned((320*WRITE_X) + WRITE_Y, 17))) & "0";
  112.                 end if;
  113.             end if;
  114.        
  115.         end if;
  116.    
  117.     end process w_DrawToBuffer;
  118.    
  119.     w_DrawResult : process (w_FifoWriteF, WRITE_SIGNAL) is begin
  120.         WROTE <= w_FifoWriteF and WRITE_SIGNAL;
  121.     end process w_DrawResult;
  122.    
  123.     w_DrawBuffer : process (w_VgaClock) is begin
  124.    
  125.         if rising_edge(w_VgaClock) then
  126.        
  127.             if w_FifoReadEm = '0' then
  128.                 w_FifoReadRq <= '1';
  129.                 r_Buffer(to_integer(unsigned(w_FifoReadQ(17 downto 1))))(to_integer(unsigned(w_FifoReadQ(19 downto 17))));
  130.             end if;
  131.            
  132.             if w_Rendering = '1' then
  133.                 if r_Hpos < w_VColumns-1 then
  134.                     r_Hpos <= r_Hpos + 1;
  135.                 else
  136.                     r_Hpos <= 0;
  137.                     if r_Vpos < w_VRows-1 then
  138.                         r_Vpos <= r_Vpos + 1;
  139.                     else
  140.                         r_Vpos <= 0;
  141.                     end if;
  142.                 end if;
  143.                
  144.                 case r_Buffer((((r_Vpos - (r_Vpos mod w_Divider)) / w_Divider) * (w_VColumns / w_Divider)) + ((r_Hpos - (r_Hpos mod w_Divider)) / w_Divider)) is
  145.                     when "00" =>
  146.                         -- black
  147.                         VGA_R <= "00000000";
  148.                         VGA_G <= "00000000";
  149.                         VGA_B <= "00000000";
  150.                     when "01" =>
  151.                         -- matrix green
  152.                         VGA_R <= "01110001";
  153.                         VGA_G <= "11111111";
  154.                         VGA_B <= "01001110";
  155.                     when "10" =>
  156.                         -- complementary to matrix green
  157.                         VGA_R <= "11111111";
  158.                         VGA_G <= "01001110";
  159.                         VGA_B <= "01110001";
  160.                     when "11" =>
  161.                         -- white
  162.                         VGA_R <= "11111111";
  163.                         VGA_G <= "11111111";
  164.                         VGA_B <= "11111111";
  165.                     when others => null;
  166.                 end case;
  167.             else
  168.                 VGA_R <= w_R;
  169.                 VGA_G <= w_G;
  170.                 VGA_B <= w_B;
  171.             end if;
  172.            
  173.         end if;
  174.        
  175.     end process w_DrawBuffer;
  176.    
  177.     NOT_RENDERING <= w_Rendering;
  178.  
  179. end architecture RTL;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement