library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity card_generator is
port( in_clock : in std_logic;
in_random : in std_logic;
out_card : out std_logic_vector(3 downto 0));
end card_generator;
architecture card_generator_arch of card_generator is
begin
process
variable var_startup : natural range 0 to 1;
variable var_sequence : std_logic_vector(3 downto 0);
variable var_lfsr : std_logic_vector(7 downto 0);
variable var_lfsr_next_bit : std_logic;
variable var_temp : std_logic_vector(7 downto 0);
variable var_deck : std_logic_vector(7 downto 0);
variable var_count : natural range 0 to 104;
begin
wait until (in_clock'event) and (in_clock = '1');
if (var_startup = 0) then
var_startup := 1;
var_sequence := "0000";
var_deck := "00000001";
var_count := 0;
end if;
if (in_random = '0') then
var_sequence := var_sequence + 1;
if (var_sequence = 14) then
var_sequence := "0001";
end if;
out_card <= var_sequence;
else
if (var_count = 0) then
var_lfsr := var_deck;
if (var_deck = "11111111") then
var_deck := "00000001";
else
var_deck := var_deck + 1;
end if;
end if;
for i in 1 to 8 loop
if ((i=1) or (var_temp(7 downto 4) > 12)) then
var_lfsr_next_bit := var_lfsr(0) XOR var_lfsr(4) XOR
var_lfsr(5) XOR var_lfsr(7);
var_lfsr(7 downto 1) := var_lfsr(6 downto 0);
var_lfsr(0) := var_lfsr_next_bit;
var_temp := var_lfsr - 1;
end if;
end loop;
out_card <= var_temp(7 downto 4) + 1;
var_count := var_count + 1;
if (var_count = 104) then
var_count := 0;
end if;
end if;
end process;
end card_generator_arch;