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;
|