----------------------------------------------------------- -- extended.vhd -- -- extended card counting strategy -- for EE 552 project, Blackjack card counting -- -- by Denise Garvey -- Group: Matthew Remington, 364 463 -- Rishi Kapoor, 355 655 -- Denise Garvey, 362 058 -- -- Feb. 23, 1999 -- -- uses basic.vhd, and adds: -- - the capabilities of the player receiving more than -- one card -- - a clock input -- ----------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity extended is port(dealer : in std_logic_vector(3 downto 0); first_card : in std_logic_vector(3 downto 0); second_card : in std_logic_vector(3 downto 0); sum : in std_logic_vector(4 downto 0); extra_card_bit : in std_logic; dealt : in std_logic; clock : in std_logic; play_code : out std_logic_vector (1 downto 0); code_valid : out std_logic); end extended; architecture behavioral of extended is -- card codes -- constant ace : std_logic_vector(3 downto 0) := "0001"; constant two : std_logic_vector(3 downto 0) := "0010"; constant three : std_logic_vector(3 downto 0) := "0011"; constant four : std_logic_vector(3 downto 0) := "0100"; constant five : std_logic_vector(3 downto 0) := "0101"; constant six : std_logic_vector(3 downto 0) := "0110"; constant seven : std_logic_vector(3 downto 0) := "0111"; constant eight : std_logic_vector(3 downto 0) := "1000"; constant nine : std_logic_vector(3 downto 0) := "1001"; constant ten : std_logic_vector(3 downto 0) := "1010"; constant jack : std_logic_vector(3 downto 0) := "1011"; constant queen : std_logic_vector(3 downto 0) := "1100"; constant king : std_logic_vector(3 downto 0) := "1101"; -- play codes -- constant stay : std_logic_vector(1 downto 0) := "00"; constant hit : std_logic_vector(1 downto 0) := "01"; constant double_down : std_logic_vector(1 downto 0) := "10"; constant split : std_logic_vector(1 downto 0) := "11"; -- signal play_valid : std_logic; begin --valid: process(clock) --begin --if (clock = '0') then -- code_valid <= '0'; --else if (dealt = '1') then -- code_valid <= '1'; -- end if; --end if; --end process; set: process(clock) begin if rising_edge(clock) then if (dealt = '0') then play_code <= stay; code_valid <= '0'; else code_valid <= '1'; if (extra_card_bit = '1') then if (sum < 17) then play_code <= hit; else play_code <= stay; end if; else case first_card is when ace => case second_card is when ace => play_code <= split; when two => if ((dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when three => if ((dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when four => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when five => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when six => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when seven => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; elsif ((dealer = two) OR (dealer = seven) OR (dealer = eight)) then play_code <= stay; else play_code <= hit; end if; when eight => play_code <= stay; when nine => play_code <= stay; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when two => case second_card is when ace => if ((dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when two => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six) OR (dealer = seven)) then play_code <= split; else play_code <= hit; end if; when three => play_code <= hit; when four => play_code <= hit; when five => play_code <= hit; when six => play_code <= hit; when seven => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when eight => if ((dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= hit; else play_code <= double_down; end if; when nine => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when ten => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when jack => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when queen => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when king => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when others => play_code <= stay; end case; when three => case second_card is when ace => if ((dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when two => play_code <= hit; when three => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six) OR (dealer = seven)) then play_code <= split; else play_code <= hit; end if; when four => play_code <= hit; when five => play_code <= hit; when six => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when seven => if ((dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= hit; else play_code <= double_down; end if; when eight => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when nine => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when ten => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when jack => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when queen => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when king => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when others => play_code <= stay; end case; when four => case second_card is when ace => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when two => play_code <= hit; when three => play_code <= hit; when four => if ((dealer = five) OR (dealer = six)) then play_code <= split; else play_code <= hit; end if; when five => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when six => if ((dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= hit; else play_code <= double_down; end if; when seven => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when eight => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when nine => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when ten => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when jack => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when queen => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when king => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when others => play_code <= stay; end case; when five => case second_card is when ace => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when two => play_code <= hit; when three => play_code <= hit; when four => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when five => if ((dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= hit; else play_code <= double_down; end if; when six => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when seven => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when eight => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when nine => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when ten => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when jack => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when queen => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when king => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when others => play_code <= stay; end case; when six => case second_card is when ace => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when two => play_code <= hit; when three => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when four => if ((dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= hit; else play_code <= double_down; end if; when five => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= split; else play_code <= hit; end if; when seven => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when eight => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when nine => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when ten => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when jack => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when queen => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when king => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when others => play_code <= stay; end case; when seven => case second_card is when ace => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; elsif ((dealer = two) OR (dealer = seven) OR (dealer = eight)) then play_code <= stay; else play_code <= hit; end if; when two => if ((dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= double_down; else play_code <= hit; end if; when three => if ((dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= hit; else play_code <= double_down; end if; when four => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when five => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when seven => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six) OR (dealer = seven)) then play_code <= split; else play_code <= hit; end if; when eight => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when nine => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when eight => case second_card is when ace => play_code <= stay; when two => if ((dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= hit; else play_code <= double_down; end if; when three => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when four => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when five => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when seven => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when eight => play_code <= split; when nine => play_code <= stay; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when nine => case second_card is when ace => play_code <= stay; when two => if (dealer = ace) then play_code <= hit; else play_code <= double_down; end if; when three => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when four => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when five => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when seven => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when eight => play_code <= stay; when nine => if ((dealer = seven) OR (dealer = ten) OR (dealer = jack) OR (dealer = queen) OR (dealer = king) OR (dealer = ace)) then play_code <= stay; else play_code <= split; end if; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when ten => case second_card is when ace => play_code <= stay; when two => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when three => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when four => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when five => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when seven => play_code <= stay; when eight => play_code <= stay; when nine => play_code <= stay; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when jack => case second_card is when ace => play_code <= stay; when two => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when three => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when four => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when five => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when seven => play_code <= stay; when eight => play_code <= stay; when nine => play_code <= stay; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when queen => case second_card is when ace => play_code <= stay; when two => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when three => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when four => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when five => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when seven => play_code <= stay; when eight => play_code <= stay; when nine => play_code <= stay; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when king => case second_card is when ace => play_code <= stay; when two => if ((dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when three => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when four => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when five => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when six => if ((dealer = two) OR (dealer = three) OR (dealer = four) OR (dealer = five) OR (dealer = six)) then play_code <= stay; else play_code <= hit; end if; when seven => play_code <= stay; when eight => play_code <= stay; when nine => play_code <= stay; when ten => play_code <= stay; when jack => play_code <= stay; when queen => play_code <= stay; when king => play_code <= stay; when others => play_code <= stay; end case; when others => play_code <= stay; end case; end if; -- extra card if end if; -- dealt flag if end if; -- clock if end process; end behavioral;