aboutsummaryrefslogtreecommitdiff
path: root/eindopdracht-progh2-vivado/eindopdracht-progh2-vivado.srcs/sources_1/top.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'eindopdracht-progh2-vivado/eindopdracht-progh2-vivado.srcs/sources_1/top.vhd')
-rw-r--r--eindopdracht-progh2-vivado/eindopdracht-progh2-vivado.srcs/sources_1/top.vhd156
1 files changed, 156 insertions, 0 deletions
diff --git a/eindopdracht-progh2-vivado/eindopdracht-progh2-vivado.srcs/sources_1/top.vhd b/eindopdracht-progh2-vivado/eindopdracht-progh2-vivado.srcs/sources_1/top.vhd
new file mode 100644
index 0000000..31ff7ab
--- /dev/null
+++ b/eindopdracht-progh2-vivado/eindopdracht-progh2-vivado.srcs/sources_1/top.vhd
@@ -0,0 +1,156 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+
+entity top is port (
+ SYSCLK, SYSRESET : in std_logic; -- system clock (100 MHz) and reset
+ R, G, B : out std_logic_vector(3 downto 0); -- VGA color signals
+ HSYNC, VSYNC : out std_logic; -- VGA sync signals
+ PS2_CLK : in std_logic; -- async ps/2 clock input
+ PS2_DAT : in std_logic; -- async ps/2 data input
+ GLOBAL_MUTE : in std_logic; -- global mute switch
+ PWM_OUT : out std_logic; -- audio PWM output
+ UART_TXD : out std_logic; -- USB UART TX
+ UART_RXD : in std_logic); -- USB UART RX
+end top;
+
+architecture Behavioral of top is
+ component vga port (
+ clk25, reset : in std_logic;
+ x, y : out std_logic_vector(9 downto 0);
+ rgb : in std_logic_vector(11 downto 0);
+ red, green, blue : out std_logic_vector(3 downto 0);
+ hsync, vsync : out std_logic);
+ end component;
+ component ps2sync port(
+ CLK: in std_logic; -- system clock
+ RESET: in std_logic; -- async reset
+ PS2_CLK: in std_logic; -- async ps/2 clock input
+ PS2_DAT: in std_logic; -- async ps/2 data input
+ DAT: out std_logic_vector(7 downto 0); -- scancode data
+ NEW_DAT: out std_logic); -- if scancode was just completed (1 for once clock cycle)
+ end component;
+ component bcd2disp port (
+ CLK: in std_logic; -- system clock
+ N0, N1, N2, N3: in std_logic_vector(3 downto 0); -- shift inputs
+ DD: out std_logic_vector(7 downto 0); -- display data
+ DS: out std_logic_vector(3 downto 0)); -- display select
+ end component;
+ component design_1_wrapper port (
+ gpio_out_tri_o : out std_logic_vector (7 downto 0);
+ ps2_sync_in_tri_i : in std_logic_vector (8 downto 0);
+ ps2_int : in std_logic;
+ reset : in std_logic;
+ sys_clock : in std_logic;
+ usb_uart_rxd : in std_logic;
+ usb_uart_txd : out std_logic);
+ end component;
+ component pixeldata is port(
+ CLK: in std_logic; -- system clock
+ RESET: in std_logic; -- async reset
+ NOTE_IDX: in std_logic_vector(3 downto 0);
+ NOTE_WRONG: in std_logic;
+ X, Y: in std_logic_vector(9 downto 0); -- pixel x/y
+ RGB: out std_logic_vector(11 downto 0)); -- RGB output color
+ end component;
+ component note_synth is port(
+ CLK: in std_logic; -- system clock
+ RESET: in std_logic; -- async reset
+ NOTE_IDX: in std_logic_vector(3 downto 0); -- note index
+ NOTE_WRONG: in std_logic; -- note wrong
+ NOTE_PLAY: in std_logic; -- output audio
+ PWM_OUT: out std_logic); -- audio signal level
+ end component;
+
+ signal clk25: std_logic_vector(1 downto 0); -- clock divider (100_000_000/4)
+
+ signal SYNC_DAT: std_logic_vector(7 downto 0); -- ps2sync <-> scancodefilter
+ signal SYNC_DAT_NEW: std_logic; -- ps2sync <-> scancodefilter
+ signal BCD_NEW: std_logic_vector(3 downto 0); -- scancodefilter <-> dispshift
+ signal BCD_SHIFT: std_logic; -- scancodefilter <-> dispshift
+
+ signal PIXEL_X, PIXEL_Y : std_logic_vector(9 downto 0); -- current pixel coordinates
+ signal PIXEL_COLOR : std_logic_vector(11 downto 0); -- pixel color ("RRRRGGGGBBBB")
+ signal PIXCLK : std_logic; -- VGA pixel clock
+ signal PWM_OUT_TEMP : std_logic; -- audio output buffer (for muting)
+
+ -- game state signals
+ signal MICROBLAZE_GPIO_IN : std_logic_vector(8 downto 0);
+ signal MICROBLAZE_GPIO_OUT : std_logic_vector(7 downto 0);
+ alias NOTE_IDX is MICROBLAZE_GPIO_OUT(3 downto 0); -- note (f3 - f4)
+ alias NOTE_PLAY is MICROBLAZE_GPIO_OUT(4); -- play note on output
+ alias NOTE_WRONG is MICROBLAZE_GPIO_OUT(5); -- note is wrong (change color + error sound)
+
+ -- index freq note
+ -- 0x0 329.6 E4 (on lowest bar)
+ -- 0x1 349.2 F4
+ -- 0x2 391.9 G4
+ -- 0x3 440.0 A4
+ -- 0x4 493.8 B4
+ -- 0x5 523.2 C5
+ -- 0x6 587.3 D5
+ -- 0x7 659.2 E5
+ -- 0x8 698.4 F5 (on highest bar)
+begin
+ -- clock divider
+ process(SYSCLK, SYSRESET)
+ begin
+ if SYSRESET = '1' then
+ clk25 <= (others => '0');
+ elsif rising_edge(SYSCLK) then
+ clk25 <= (clk25 + 1);
+ end if;
+ end process;
+ PIXCLK <= clk25(1);
+
+ note: note_synth port map (
+ CLK => SYSCLK,
+ RESET => SYSRESET,
+ NOTE_IDX => NOTE_IDX,
+ NOTE_WRONG => NOTE_WRONG,
+ NOTE_PLAY => NOTE_PLAY,
+ PWM_OUT => PWM_OUT_TEMP);
+
+ PWM_OUT <= PWM_OUT_TEMP and GLOBAL_MUTE;
+
+ -- convert async ps2 signals into synchronous lines
+ ps2: component ps2sync port map (
+ CLK => SYSCLK,
+ RESET => SYSRESET,
+ PS2_CLK => PS2_CLK,
+ PS2_DAT => PS2_DAT,
+ DAT => SYNC_DAT,
+ NEW_DAT => SYNC_DAT_NEW);
+
+ MICROBLAZE_GPIO_IN <= SYNC_DAT_NEW & SYNC_DAT;
+ microblaze: component design_1_wrapper port map (
+ gpio_out_tri_o => MICROBLAZE_GPIO_OUT,
+ ps2_sync_in_tri_i => MICROBLAZE_GPIO_IN,
+ ps2_int => SYNC_DAT_NEW,
+ reset => SYSRESET,
+ sys_clock => SYSCLK,
+ usb_uart_rxd => UART_RXD,
+ usb_uart_txd => UART_TXD);
+
+ image: component pixeldata port map (
+ CLK => SYSCLK,
+ RESET => SYSRESET,
+ X => PIXEL_X,
+ Y => PIXEL_Y,
+ NOTE_IDX => NOTE_IDX,
+ NOTE_WRONG => NOTE_WRONG,
+ RGB => PIXEL_COLOR);
+
+ display : component vga port map(
+ reset => SYSRESET,
+ clk25 => PIXCLK,
+ rgb => PIXEL_COLOR,
+ x => PIXEL_X,
+ y => PIXEL_Y,
+ hsync => HSYNC,
+ vsync => VSYNC,
+ red => R,
+ green => G,
+ blue => B);
+end Behavioral;