summaryrefslogtreecommitdiffstats
path: root/lab4/VGA_lab_tb.vhd
blob: 1e2b19a5c387e566345c32101137832b12039a97 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
--------------------------------------------------------------------------------
-- VGA lab testbench
-- Anders Nilsson
-- 26-feb-2020
-- Version 1.0


-- library declaration
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;            -- basic IEEE library
use IEEE.NUMERIC_STD.ALL;               -- IEEE library for the unsigned type
                                        -- and various arithmetic operations
entity VGA_lab_tb is
end entity;

architecture func of VGA_lab_tb is

  component VGA_lab
    port ( clk	          : in std_logic;                         -- system clock
           rst            : in std_logic;                         -- reset
           Hsync	  : out std_logic;                        -- horizontal sync
           Vsync	  : out std_logic;                        -- vertical sync
           vgaRed	  : out	std_logic_vector(2 downto 0);     -- VGA red
           vgaGreen       : out std_logic_vector(2 downto 0);     -- VGA green
           vgaBlue	  : out std_logic_vector(2 downto 1);    -- VGA blue
           PS2KeyboardCLK	        : in std_logic;                         -- PS2 clock
	   PS2KeyboardData        : in std_logic);                        -- PS2 data
  end component;

  signal clk : std_logic;
  signal rst : std_logic;
  signal PS2KeyboardCLK : std_logic;
  signal PS2KeyboardData : std_logic;
  
  constant FPGA_clk_period : time := 10 ns;
  constant PS2_clk_period : time := 60 us;
  constant PS2_time : time := 1 ms;
  
  begin

    uut: VGA_lab port map(
      clk => clk,
      rst => rst,
      PS2KeyboardCLK => PS2KeyboardCLK,
      PS2KeyboardData => PS2KeyboardData
      );

	PS2_stimuli : process
			type pattern_array is array(natural range <>) of unsigned(7 downto 0);
		constant patterns : pattern_array :=
			("00011100",		-- x"1C" = Make scancode 'A'
			 "11110000",		-- x"F0" = Break ...
			 "00011100",		-- x"1C" = ... scancode 'A'
			 "00110010",		-- x"32" = Make scancode 'B'
			 "11110000",		-- x"F0" = Break ...
			 "00110010",		-- x"32" = ... scancode 'B'
			 "00110101",		-- x"35" = Make scancode 'Y'
			 "11110000",		-- x"F0" = Break ...
			 "00110101"			-- x"35" = ... scancode 'Y'
			);
			 
		begin
			PS2KeyboardData <= '1';											-- initial value
			PS2KeyboardCLK <= '1';
			wait for PS2_time;
			for i in patterns'range loop
				PS2KeyboardData <= '0';										-- start bit
				wait for PS2_clk_period/2;
				PS2KeyboardCLK <= '0';
				for j in 0 to 7 loop
					wait for PS2_clk_period/2;
					PS2KeyboardData <= patterns(i)(j);			-- data bit(s)
					PS2KeyboardCLK <= '1';
					wait for PS2_clk_period/2;
					PS2KeyboardCLK <= '0';									-- data valid on negative flank
				end loop;
				wait for PS2_clk_period/2;
				PS2KeyboardData <= '0';										-- parity bit (bogus value, always '0')
				PS2KeyboardCLK <= '1';
				wait for PS2_clk_period/2;
				PS2KeyboardCLK <= '0';
				wait for PS2_clk_period/2;
				PS2KeyboardData <= '1';										-- stop bit
				PS2KeyboardCLK <= '1';
				wait for PS2_clk_period/2;
				PS2KeyboardCLK <= '0';
				wait for PS2_clk_period/2;
				PS2KeyboardCLK <= '1';
				if (((i mod 3) = 0) or (((i+1) mod 3) = 0)) then
					wait for PS2_time;											-- wait between Make and Break
				else
					wait for PS2_clk_period/2;
				end if;
			end loop;
			wait; -- for ever
	end process;
			
			
		clk_process : process
    begin
      clk <= '0';
       wait for FPGA_clk_period/2;
      clk <= '1';
      wait for FPGA_clk_period/2;
    end process;

    rst <= '1', '0' after 25 ns;


end architecture;