mirror of
https://github.com/MiSTer-devel/Chess_MiSTer.git
synced 2026-04-19 03:04:02 +00:00
295 lines
9.2 KiB
VHDL
295 lines
9.2 KiB
VHDL
library IEEE;
|
|
use IEEE.std_logic_1164.all;
|
|
use IEEE.numeric_std.all;
|
|
|
|
use work.pChess.all;
|
|
|
|
entity TopModule is
|
|
port
|
|
(
|
|
Clk : in std_logic;
|
|
reset : in std_logic;
|
|
|
|
mirrorBoard : in std_logic;
|
|
aiOn : in std_logic;
|
|
strength : in integer range 0 to 15;
|
|
randomness : in integer range 0 to 3;
|
|
playerBlack : in std_logic;
|
|
overlayOn : in std_logic;
|
|
|
|
input_up : in std_logic;
|
|
input_down : in std_logic;
|
|
input_left : in std_logic;
|
|
input_right : in std_logic;
|
|
input_action : in std_logic;
|
|
input_cancel : in std_logic;
|
|
input_save : in std_logic;
|
|
input_load : in std_logic;
|
|
input_rewind : in std_logic;
|
|
|
|
vga_h_sync : out std_logic;
|
|
vga_v_sync : out std_logic;
|
|
vga_h_blank : out std_logic;
|
|
vga_v_blank : out std_logic;
|
|
vga_R : out std_logic_vector(7 downto 0);
|
|
vga_G : out std_logic_vector(7 downto 0);
|
|
vga_B : out std_logic_vector(7 downto 0);
|
|
Speaker : out std_logic := '0'
|
|
);
|
|
end entity;
|
|
|
|
architecture arch of TopModule is
|
|
|
|
signal vblank : std_logic;
|
|
signal hblank : std_logic;
|
|
signal CounterX : integer range 0 to 1023;
|
|
signal CounterY : integer range 0 to 1023;
|
|
signal Drawer_R : std_logic_vector(7 downto 0);
|
|
signal Drawer_G : std_logic_vector(7 downto 0);
|
|
signal Drawer_B : std_logic_vector(7 downto 0);
|
|
|
|
signal progressbarOn : std_logic;
|
|
signal progressbarColor : std_logic_vector(23 downto 0);
|
|
|
|
signal overlay_0 : unsigned(0 to 79);
|
|
signal overlay_1 : unsigned(0 to 71);
|
|
type toverlayout is array (0 to 17) of std_logic_vector(23 downto 0);
|
|
signal overlay_out : toverlayout;
|
|
signal overlay_combined : std_logic_vector(23 downto 0);
|
|
|
|
signal boardState : tBoardState;
|
|
signal cursor : tPosition;
|
|
signal markedCells : tboardBit;
|
|
signal markedPos : tPosition;
|
|
signal markedPosOn : std_logic;
|
|
signal cheated : std_logic;
|
|
|
|
signal lastOn : std_logic;
|
|
signal lastFrom : tPosition;
|
|
signal lastTo : tPosition;
|
|
|
|
signal progress : integer range 0 to 63;
|
|
|
|
signal checkMate : std_logic;
|
|
signal check : std_logic;
|
|
signal draw : std_logic;
|
|
|
|
begin
|
|
|
|
iControl : entity work.Control
|
|
port map
|
|
(
|
|
Clk => Clk,
|
|
reset => reset,
|
|
|
|
mirrorBoard => mirrorBoard,
|
|
aiOn => aiOn,
|
|
strength => strength,
|
|
randomness => randomness,
|
|
playerBlack => playerBlack,
|
|
|
|
input_up => input_up,
|
|
input_down => input_down,
|
|
input_left => input_left,
|
|
input_right => input_right,
|
|
input_action => input_action,
|
|
input_cancel => input_cancel,
|
|
input_save => input_save,
|
|
input_load => input_load,
|
|
input_rewind => input_rewind,
|
|
|
|
boardState => boardState,
|
|
cursor => cursor,
|
|
markedCells => markedCells,
|
|
markedPos => markedPos,
|
|
markedPosOn => markedPosOn,
|
|
cheated => cheated,
|
|
|
|
lastOn => lastOn,
|
|
lastFrom => lastFrom,
|
|
lastTo => lastTo,
|
|
|
|
progress => progress,
|
|
|
|
checkMate => checkMate,
|
|
check => check,
|
|
draw => draw
|
|
);
|
|
|
|
iVGAOut : entity work.VGAOut
|
|
port map
|
|
(
|
|
Clk => Clk,
|
|
vga_h_sync => vga_h_sync,
|
|
vga_v_sync => vga_v_sync,
|
|
vblank => vblank,
|
|
hblank => hblank,
|
|
CounterX => CounterX,
|
|
CounterY => CounterY
|
|
);
|
|
|
|
vga_h_blank <= hblank;
|
|
vga_v_blank <= vblank;
|
|
|
|
iDrawer : entity work.Drawer
|
|
port map
|
|
(
|
|
Clk => Clk,
|
|
|
|
mirrorBoard => mirrorBoard,
|
|
|
|
board => boardState.board,
|
|
cursor => cursor,
|
|
markedCells => markedCells,
|
|
markedPos => markedPos,
|
|
markedPosOn => markedPosOn,
|
|
cheated => cheated,
|
|
|
|
lastOn => lastOn,
|
|
lastFrom => lastFrom,
|
|
lastTo => lastTo,
|
|
|
|
vblank => vblank,
|
|
CounterX => CounterX,
|
|
CounterY => CounterY,
|
|
|
|
red => Drawer_R,
|
|
green => Drawer_G,
|
|
blue => Drawer_B
|
|
);
|
|
|
|
iProgressbar : entity work.Progressbar
|
|
generic map
|
|
(
|
|
MAX => 64,
|
|
XMULT => 2,
|
|
POSX => 12,
|
|
POSY => 10,
|
|
SIZEY => 20,
|
|
RGB_BACK => x"FFFFFF",
|
|
RGB_FRONT => x"FF0000"
|
|
)
|
|
port map
|
|
(
|
|
Clk => Clk,
|
|
progress => progress,
|
|
CounterX => CounterX,
|
|
CounterY => CounterY,
|
|
outputOn => progressbarOn,
|
|
outputColor => progressbarColor
|
|
);
|
|
|
|
overlay_0 <= x"5748495445205455524e" when boardState.Info.blackTurn = '0' else x"424c41434b205455524e";
|
|
ioverlay0 : entity work.overlay
|
|
generic map
|
|
(
|
|
COLS => 10,
|
|
BACKGROUNDON => '0',
|
|
RGB_BACK => x"000000",
|
|
RGB_FRONT => x"FFFFFF",
|
|
OFFSETX => 16,
|
|
OFFSETY => 48
|
|
)
|
|
port map
|
|
(
|
|
clk => Clk,
|
|
ena => '1',
|
|
i_pixel_out_x => CounterX,
|
|
i_pixel_out_y => CounterY,
|
|
i_pixel_out_data => x"000000",
|
|
o_pixel_out_data => overlay_out(0),
|
|
textstring => overlay_0
|
|
);
|
|
|
|
overlay_1 <= x"434845434b4d415445" when checkMate = '1' else x"434845434b20202020" when check = '1' else x"445241572020202020" when draw = '1' else x"202020202020202020";
|
|
ioverlay1 : entity work.overlay
|
|
generic map
|
|
(
|
|
COLS => 9,
|
|
BACKGROUNDON => '0',
|
|
RGB_BACK => x"000000",
|
|
RGB_FRONT => x"FFFFFF",
|
|
OFFSETX => 16,
|
|
OFFSETY => 64
|
|
)
|
|
port map
|
|
(
|
|
clk => Clk,
|
|
ena => '1',
|
|
i_pixel_out_x => CounterX,
|
|
i_pixel_out_y => CounterY,
|
|
i_pixel_out_data => x"000000",
|
|
o_pixel_out_data => overlay_out(1),
|
|
textstring => overlay_1
|
|
);
|
|
|
|
gboardprints: for i in 0 to 7 generate
|
|
signal inputvalNumbers : unsigned(0 to 7);
|
|
signal inputvalLetters : unsigned(0 to 7);
|
|
begin
|
|
|
|
inputvalNumbers <= x"31" + to_unsigned(7 - i, 8) when mirrorBoard = '0' else x"31" + to_unsigned(i, 8);
|
|
inputvalLetters <= x"41" + to_unsigned(i, 8) when mirrorBoard = '0' else x"41" + to_unsigned(7 - i, 8);
|
|
|
|
ioverlayNumbers : entity work.overlay
|
|
generic map
|
|
(
|
|
COLS => 1,
|
|
BACKGROUNDON => '0',
|
|
RGB_BACK => x"000000",
|
|
RGB_FRONT => x"FFFFFF",
|
|
OFFSETX => 631,
|
|
OFFSETY => 25 + i * 60
|
|
)
|
|
port map
|
|
(
|
|
clk => Clk,
|
|
ena => '1',
|
|
i_pixel_out_x => CounterX,
|
|
i_pixel_out_y => CounterY,
|
|
i_pixel_out_data => x"000000",
|
|
o_pixel_out_data => overlay_out(2 + i),
|
|
textstring => inputvalNumbers
|
|
);
|
|
|
|
ioverlayLetters : entity work.overlay
|
|
generic map
|
|
(
|
|
COLS => 1,
|
|
BACKGROUNDON => '0',
|
|
RGB_BACK => x"000000",
|
|
RGB_FRONT => x"FFFFFF",
|
|
OFFSETX => 151 + i * 60,
|
|
OFFSETY => 468
|
|
)
|
|
port map
|
|
(
|
|
clk => Clk,
|
|
ena => '1',
|
|
i_pixel_out_x => CounterX,
|
|
i_pixel_out_y => CounterY,
|
|
i_pixel_out_data => x"000000",
|
|
o_pixel_out_data => overlay_out(10 + i),
|
|
textstring => inputvalLetters
|
|
);
|
|
end generate;
|
|
|
|
process (overlay_out)
|
|
variable wired_or : std_logic_vector(23 downto 0);
|
|
begin
|
|
wired_or := overlay_out(0) or overlay_out(1);
|
|
if (overlayOn = '1') then
|
|
for i in 2 to (overlay_out'length - 1) loop
|
|
wired_or := wired_or or overlay_out(i);
|
|
end loop;
|
|
end if;
|
|
overlay_combined <= wired_or;
|
|
end process;
|
|
|
|
vga_R <= progressbarColor(23 downto 16) when progressbarOn = '1' else (Drawer_R or overlay_combined(23 downto 16));
|
|
vga_G <= progressbarColor(15 downto 8) when progressbarOn = '1' else (Drawer_G or overlay_combined(15 downto 8));
|
|
vga_B <= progressbarColor(7 downto 0) when progressbarOn = '1' else (Drawer_B or overlay_combined(7 downto 0));
|
|
|
|
|
|
end architecture;
|