after slot5
[dide_16.git] / bsp4 / Designflow / src / vga_arc.vhd
diff --git a/bsp4/Designflow/src/vga_arc.vhd b/bsp4/Designflow/src/vga_arc.vhd
new file mode 100644 (file)
index 0000000..3d2d158
--- /dev/null
@@ -0,0 +1,223 @@
+ -------------------------------------------------------------------------------\r
+-- Title      : vga architecture\r
+-- Project    : LU Digital Design\r
+-------------------------------------------------------------------------------\r
+-- File       : vga.vhd\r
+-- Author     : Thomas Handl\r
+-- Company    : TU Wien\r
+-- Created    : 2004-04-07\r
+-- Last update: 2006-02-24\r
+-------------------------------------------------------------------------------\r
+-- Description: arch of top level module, the sub-modules are connected here\r
+-------------------------------------------------------------------------------\r
+-- Copyright (c) 2004 TU Wien\r
+-------------------------------------------------------------------------------\r
+-- Revisions  :\r
+-- Date        Version  Author  Description\r
+-- 2004-04-07  1.0      handl   Created\r
+-- 2006-02-24  2.0      ST      revised\r
+-------------------------------------------------------------------------------\r
+\r
+-------------------------------------------------------------------------------\r
+-- LIBRARIES\r
+-------------------------------------------------------------------------------\r
+\r
+library IEEE;\r
+use IEEE.std_logic_1164.all;\r
+use IEEE.std_logic_unsigned.all;\r
+use IEEE.std_logic_arith.all;\r
+\r
+use work.vga_pak.all;      -- include package\r
+\r
+-------------------------------------------------------------------------------\r
+-- ARCHITECTURE\r
+-------------------------------------------------------------------------------\r
+\r
+architecture behav of vga is\r
+\r
+  attribute syn_preserve          : boolean;\r
+  attribute syn_preserve of behav : architecture is true;\r
+\r
+\r
+-------------------------------------------------------------------------------\r
+-- component declarations for the modules\r
+-------------------------------------------------------------------------------\r
+\r
+  component vga_driver\r
+    port (\r
+      clk                  : in  std_logic;\r
+      reset                : in  std_logic;\r
+      column_counter       : out std_logic_vector(COL_CNT_WIDTH-1 downto 0);\r
+      line_counter         : out std_logic_vector(LINE_CNT_WIDTH-1 downto 0);\r
+      h_enable             : out std_logic;\r
+      v_enable             : out std_logic;\r
+      hsync                : out std_logic; \r
+      vsync                : out std_logic;\r
+      d_hsync_state          : out hsync_state_type;\r
+      d_vsync_state          : out vsync_state_type;\r
+      d_hsync_counter        : out std_logic_vector(HSYN_CNT_WIDTH-1 downto 0);\r
+      d_vsync_counter        : out std_logic_vector(VSYN_CNT_WIDTH-1 downto 0);\r
+      d_set_hsync_counter    : out std_logic;\r
+      d_set_vsync_counter    : out std_logic;\r
+      d_set_column_counter   : out std_logic;\r
+      d_set_line_counter     : out std_logic);\r
+  end component;\r
+\r
+\r
+  component vga_control\r
+    port (\r
+      clk            : in  std_logic;\r
+      reset          : in  std_logic;\r
+      column_counter : in  std_logic_vector(COL_CNT_WIDTH-1 downto 0);\r
+      line_counter   : in  std_logic_vector(LINE_CNT_WIDTH-1 downto 0);\r
+      h_enable       : in  std_logic;\r
+      v_enable       : in  std_logic;\r
+      toggle_counter : out std_logic_vector(TOG_CNT_WIDTH-1 downto 0);\r
+      toggle         : out std_logic;\r
+      r, g, b        : out std_logic\r
+      );\r
+  end component;\r
+\r
+\r
+  component board_driver\r
+    port (\r
+       reset : in  std_logic;\r
+      seven_seg  : out std_logic_vector(2*SEG_WIDTH-1 downto 0));\r
+  end component;\r
+\r
+\r
+-- declare signals needed for internal wiring of these components later\r
+  signal column_counter_sig   : std_logic_vector(COL_CNT_WIDTH-1 downto 0);\r
+  signal line_counter_sig     : std_logic_vector(LINE_CNT_WIDTH-1 downto 0);\r
+  signal h_enable_sig         : std_logic;\r
+  signal v_enable_sig         : std_logic;\r
+  signal r_sig, g_sig, b_sig  : std_logic;\r
+  signal hsync_sig, vsync_sig : std_logic;\r
+  \r
+-- declare signals needed for prolongation of reset\r
+  signal   dly_counter       : std_logic_vector(1 downto 0);\r
+  signal   dly_counter_next  : std_logic_vector(1 downto 0);\r
+  constant MAX_DLY           : std_logic_vector(1 downto 0) := "11";\r
+  signal   reset_dly         : std_logic;      --\r
+  signal   safe_reset        : std_logic;     \r
+\r
+\r
+-------------------------------------------------------------------------------\r
+-- prolong duration of reset to prevent glitches  at power-up\r
+-------------------------------------------------------------------------------\r
+\r
+begin\r
+\r
+  DELAY_RESET_syn : process(clk_pin)            -- synchronous capture\r
+  begin\r
+    if clk_pin'event and clk_pin = '1' then     -- upon rising clock\r
+      dly_counter <= dly_counter_next;          -- ... capture new counter value\r
+    end if;\r
+  end process;\r
+\r
+  DELAY_RESET_next : process(dly_counter, reset_pin)    -- next state logic\r
+  begin\r
+    if reset_pin = RES_ACT then              -- upon reset\r
+      dly_counter_next <= (others => '0');   -- ...clear dly counter\r
+    elsif dly_counter < MAX_DLY then         -- if no oflo\r
+      dly_counter_next <= dly_counter + '1'; -- ...increment dly counter\r
+    else \r
+      dly_counter_next <= dly_counter;       -- freeze dly counter when oflo\r
+    end if;\r
+  end process;\r
+  \r
+  DELAY_RESET_out: process(dly_counter)\r
+  begin\r
+    if dly_counter < MAX_DLY then      -- until dly counter reaches maximum\r
+      reset_dly   <= RES_ACT;          -- ...activate delayed reset signal\r
+    else                               -- upon counter oflo \r
+      reset_dly <= not(RES_ACT);       -- ...finally deactivate delayed reset\r
+    end if;\r
+  end process;\r
+\r
+\r
+\r
+  COMBINE_RESET: process(reset_pin, reset_dly)         -- generate "safe" reset signal\r
+  begin\r
+    if reset_pin = RES_ACT or reset_dly = RES_ACT then -- ...by combining delayed reset with non-delayed reset input \r
+      safe_reset <= RES_ACT;\r
+    else\r
+      safe_reset <= not(RES_ACT);\r
+    end if;\r
+  end process;\r
+\r
+\r
+-------------------------------------------------------------------------------\r
+-- instantiate the components and connect to internal and external signals\r
+-------------------------------------------------------------------------------\r
+\r
+\r
+board_driver_unit : board_driver\r
+    port map (\r
+      reset       => safe_reset,\r
+      seven_seg   => seven_seg_pin);\r
+\r
+\r
+vga_driver_unit : vga_driver\r
+    port map (\r
+      clk                => clk_pin,\r
+      reset              => safe_reset,\r
+      column_counter     => column_counter_sig,\r
+      line_counter       => line_counter_sig,\r
+      h_enable           => h_enable_sig,\r
+      v_enable           => v_enable_sig,\r
+      hsync              => hsync_sig,\r
+      vsync              => vsync_sig,\r
+      d_hsync_state        => d_hsync_state,\r
+      d_vsync_state        => d_vsync_state,\r
+      d_hsync_counter      => d_hsync_counter,\r
+      d_vsync_counter      => d_vsync_counter,\r
+      d_set_hsync_counter  => d_set_hsync_counter,\r
+      d_set_vsync_counter  => d_set_vsync_counter,\r
+      d_set_column_counter => d_set_column_counter,\r
+      d_set_line_counter   => d_set_line_counter);\r
+\r
+-- make the wiring for hsync and vsync pins \r
+-- (pin is output only => internal _sig version required to allow readback of signal)\r
+  vsync_pin <= vsync_sig;\r
+  hsync_pin <= hsync_sig;\r
+\r
+\r
+  vga_control_unit : vga_control\r
+    port map (\r
+      clk            => clk_pin,\r
+      reset          => safe_reset,\r
+      column_counter => column_counter_sig,\r
+      line_counter   => line_counter_sig,\r
+      h_enable       => h_enable_sig,\r
+      v_enable       => v_enable_sig,\r
+      toggle_counter => d_toggle_counter,\r
+      toggle         => d_toggle,\r
+      r              => r_sig,\r
+      g              => g_sig,\r
+      b              => b_sig);\r
+\r
+-- make the wiring for RGB pins: drive all pins for same color from one source ("8 color mode")\r
+  r0_pin <= r_sig; r1_pin <= r_sig; r2_pin <= r_sig;\r
+  g0_pin <= g_sig; g1_pin <= g_sig; g2_pin <= g_sig;\r
+  b0_pin <= b_sig; b1_pin <= b_sig;\r
+\r
+\r
+-- make extra pin connections for debug signals\r
+  d_hsync          <= hsync_sig;       -- make duplicate of signal for debug connector\r
+  d_vsync          <= vsync_sig;       -- make duplicate of signal for debug connector\r
+  d_column_counter <= column_counter_sig;\r
+  d_line_counter   <= line_counter_sig;\r
+  d_h_enable       <= h_enable_sig;\r
+  d_v_enable       <= v_enable_sig;\r
+  d_r              <= r_sig;\r
+  d_g              <= g_sig;\r
+  d_b              <= b_sig;\r
+  d_state_clk      <= clk_pin;        -- make duplicate of signal for debug connector\r
+\r
+  \r
+end behav;\r
+\r
+-------------------------------------------------------------------------------\r
+-- END ARCHITECTURE\r
+-------------------------------------------------------------------------------\r