mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2024-12-23 08:27:44 +00:00
186 lines
4.9 KiB
VHDL
186 lines
4.9 KiB
VHDL
--
|
|
-- Copyright (C) 2012 Jared Boone, ShareBrained Technology, Inc.
|
|
--
|
|
-- This file is part of PortaPack.
|
|
--
|
|
-- This program is free software; you can redistribute it and/or modify
|
|
-- it under the terms of the GNU General Public License as published by
|
|
-- the Free Software Foundation; either version 2, or (at your option)
|
|
-- any later version.
|
|
--
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
-- GNU General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU General Public License
|
|
-- along with this program; see the file COPYING. If not, write to
|
|
-- the Free Software Foundation, Inc., 51 Franklin Street,
|
|
-- Boston, MA 02110-1301, USA.
|
|
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
|
|
entity top_tb is
|
|
|
|
end top_tb;
|
|
|
|
architecture behavior of top_tb is
|
|
|
|
component top
|
|
port (
|
|
MCU_D : inout std_logic_vector(7 downto 0);
|
|
MCU_DIR : in std_logic;
|
|
MCU_MODE : in std_logic;
|
|
MCU_STROBE : in std_logic;
|
|
MCU_ADDR : in std_logic;
|
|
|
|
TP_U : out std_logic;
|
|
TP_D : out std_logic;
|
|
TP_L : out std_logic;
|
|
TP_R : out std_logic;
|
|
|
|
SW_SEL : in std_logic;
|
|
SW_ROT_A : in std_logic;
|
|
SW_ROT_B : in std_logic;
|
|
SW_U : in std_logic;
|
|
SW_D : in std_logic;
|
|
SW_L : in std_logic;
|
|
SW_R : in std_logic;
|
|
|
|
LCD_RESETX : out std_logic;
|
|
LCD_RS : out std_logic;
|
|
LCD_WRX : out std_logic;
|
|
LCD_RDX : out std_logic;
|
|
LCD_DB : inout std_logic_vector(17 downto 0);
|
|
LCD_TE : in std_logic
|
|
);
|
|
end component;
|
|
|
|
signal mcu_d : std_logic_vector(7 downto 0);
|
|
signal mcu_strobe : std_logic;
|
|
signal mcu_dir : std_logic;
|
|
signal mcu_mode : std_logic;
|
|
signal mcu_addr : std_logic;
|
|
|
|
signal tp_u : std_logic;
|
|
signal tp_d : std_logic;
|
|
signal tp_l : std_logic;
|
|
signal tp_r : std_logic;
|
|
|
|
signal sw_sel : std_logic;
|
|
signal sw_rot_a : std_logic;
|
|
signal sw_rot_b : std_logic;
|
|
signal sw_u : std_logic;
|
|
signal sw_d : std_logic;
|
|
signal sw_l : std_logic;
|
|
signal sw_r : std_logic;
|
|
|
|
signal lcd_resetx : std_logic;
|
|
signal lcd_rs : std_logic;
|
|
signal lcd_wrx : std_logic;
|
|
signal lcd_rdx : std_logic;
|
|
signal lcd_db : std_logic_vector(17 downto 0);
|
|
signal lcd_te : std_logic := '0';
|
|
begin
|
|
|
|
uut : top
|
|
port map (
|
|
MCU_D => mcu_d,
|
|
MCU_STROBE => mcu_strobe,
|
|
MCU_DIR => mcu_dir,
|
|
MCU_MODE => mcu_mode,
|
|
MCU_ADDR => mcu_addr,
|
|
TP_U => tp_u,
|
|
TP_D => tp_d,
|
|
TP_L => tp_l,
|
|
TP_R => tp_r,
|
|
SW_SEL => sw_sel,
|
|
SW_ROT_A => sw_rot_a,
|
|
SW_ROT_B => sw_rot_b,
|
|
SW_U => sw_u,
|
|
SW_D => sw_d,
|
|
SW_L => sw_l,
|
|
SW_R => sw_r,
|
|
LCD_RESETX => lcd_resetx,
|
|
LCD_RS => lcd_rs,
|
|
LCD_WRX => lcd_wrx,
|
|
LCD_RDX => lcd_rdx,
|
|
LCD_DB => lcd_db,
|
|
LCD_TE => lcd_te
|
|
);
|
|
|
|
stimulus: process is
|
|
begin
|
|
sw_sel <= '0';
|
|
sw_rot_a <= '0';
|
|
sw_rot_b <= '0';
|
|
sw_u <= '0';
|
|
sw_d <= '0';
|
|
sw_l <= '0';
|
|
sw_r <= '0';
|
|
|
|
mcu_d <= (others => 'Z');
|
|
mcu_mode <= '1';
|
|
mcu_dir <= '1';
|
|
mcu_addr <= '1';
|
|
mcu_strobe <= '1';
|
|
|
|
wait for 50.0 ns;
|
|
|
|
-- Write to resistive touch panel
|
|
mcu_mode <= '0'; -- Target: I/O
|
|
mcu_dir <= '0'; -- Direction: MCU -> CPLD
|
|
mcu_addr <= '0'; -- LCD reset signal
|
|
wait for 19.6 ns; -- 4 cycles: Wait for CPLD D to reach Hi-Z
|
|
mcu_d <= "11000101";
|
|
wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE.
|
|
mcu_strobe <= '0';
|
|
wait for 9.8 ns; -- 2 cycles
|
|
mcu_strobe <= '1';
|
|
wait for 49.0 ns;
|
|
|
|
-- Write to LCD (command, then 16-bit data)
|
|
mcu_mode <= '1'; -- Target: LCD
|
|
mcu_dir <= '0'; -- Direction: MCU -> CPLD
|
|
mcu_addr <= '0'; -- Address: RS = 0 (command)
|
|
wait for 19.6 ns; -- 4 cycles: Wait for CPLD D to reach Hi-Z
|
|
|
|
mcu_d <= "10100101";
|
|
wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE.
|
|
mcu_strobe <= '0';
|
|
wait for 9.8 ns; -- 2 cycles
|
|
mcu_d <= "00001111";
|
|
wait for 24.5 ns; -- 5 cycles: Prop from D to LCD_DB[7:0], WRX# minimum low time.
|
|
mcu_strobe <= '1';
|
|
wait for 9.8 ns; -- 2 cycles: Part of prop from STROBE to LCD_WRX, delay to keep RS after WRX deassert.
|
|
mcu_addr <= '1'; -- Address: RS = 1 (data)
|
|
wait for 9.8 ns; -- 2 cycles: Part of prop from STROBE to LCD_WRX.
|
|
|
|
mcu_d <= "01011010";
|
|
wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE.
|
|
mcu_strobe <= '0';
|
|
wait for 9.8 ns; -- 2 cycles
|
|
mcu_d <= "11110000";
|
|
wait for 24.5 ns; -- 5 cycles: Prop from D to LCD_DB[7:0], WRX# minimum low time.
|
|
mcu_strobe <= '1';
|
|
wait for 19.6 ns; -- 4 cycles: Prop from STROBE to LCD_WRX.
|
|
|
|
mcu_d <= "01010101";
|
|
wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE.
|
|
mcu_strobe <= '0';
|
|
wait for 9.8 ns; -- 2 cycles
|
|
mcu_d <= "10101010";
|
|
wait for 24.5 ns; -- 5 cycles: Prop from D to LCD_DB[7:0], WRX# minimum low time.
|
|
mcu_strobe <= '1';
|
|
wait for 19.6 ns; -- 4 cycles: Prop from STROBE to LCD_WRX.
|
|
|
|
-- Read from switches
|
|
mcu_d <= (others => 'Z');
|
|
mcu_mode <= '0'; -- Target: I/O
|
|
mcu_dir <= '1'; -- Direction: MCU <- CPLD
|
|
wait for 49.0 ns;
|
|
|
|
end process;
|
|
end architecture behavior;
|