Случайное включение и выключение светодиода в VHDL

Я хочу реализовать игру со случайными числами на BASYS2. В этой игре будет выбрано пять светодиодов, один из которых будет включаться случайным образом на секунду или две (это время можно изменить, чтобы увеличить или уменьшить уровень сложности игры). Затем пользователь должен отреагировать на это событие светодиода, нажав кнопку переключателя за ним в течение времени, когда он включен. Если он или она сможет сделать это успешно, будет начислено очко, которое будет показано на семисегментном дисплее. Если он или она терпит неудачу, баллы не начисляются. Таких событий будет 9, после чего игру можно будет переиграть.

Now following is my code (only for the random LED turning on). However, I am unable to fix it. Please somebody help. The FPGA I am using is BASYS2 SPARTAN 3E-100.

Заранее спасибо всем.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
use IEEE.STD_LOGIC_arith.ALL;

entity random_number is
generic ( width : integer :=  4 ); 
port (
clk : in std_logic;
reset : in std_logic;
random_num : out std_logic_vector (width-1 downto 0)   --output vector            
);
end random_number;

architecture Behavioral of random_number is
signal q: std_logic_vector(23 downto 0);
signal divided_clock: std_logic;
begin
process(clk, reset)
begin
if (reset = '1')then 
q <= X"000000";
elsif(rising_edge(clk)) then
q <= q + 1;
end if;
end process;
divided_clock <= q(22);


process (divided_clock)
variable rand_temp : std_logic_vector(width-1 downto 0):=("1000");
variable temp : std_logic := '0';
begin
if(rising_edge(divided_clock)) then
temp := rand_temp(width-1) xor rand_temp(width-2);
rand_temp(width-1 downto 1) := rand_temp(width-2 downto 0);
rand_temp(0) := temp;
end if;
random_num <= rand_temp;
end process;
end Behavioral;

person user3518317    schedule 10.04.2014    source источник


Ответы (1)


Я думаю, что второй процесс должен работать даже с основным clk, а разделенные часы должны быть активными.

signal divided_enable: std_logic;
process(clk, reset)
begin
if (reset = '1')then 
  q <= X"000000";
elsif(rising_edge(clk)) then
  q <= q + 1;
end if;
if (q(22) = '1') then
  --short pulse wenn q bit 22 is high
  divided_enable <= '1';
  q <= (others => '0');
end if;
end process;


process (clk)
variable rand_temp : std_logic_vector(width-1 downto 0):=("1000");
variable temp : std_logic := '0';
begin
if(rising_edge(clk)) then
  if(divided_enable = '1') then
    temp := rand_temp(width-1) xor rand_temp(width-2);
    rand_temp(width-1 downto 1) := rand_temp(width-2 downto 0);
    rand_temp(0) := temp;
   end if;
 end if;
random_num <= rand_temp;
end process;

Я не знаю, решит ли это все ваши проблемы. Пожалуйста, опишите ошибки компилятора или ошибки в поведении.

person P. Schreiber    schedule 10.04.2014
comment
это очень любезно с вашей стороны. Модифицированный вами код работал без ошибок. Я буду продолжать задавать некоторые вопросы снова и снова, потому что у меня есть проект, который я должен представить в конце текущего семестра. Тогда увидимся. - person user3518317; 10.04.2014
comment
@ user3518317, если решение работает для вас, может быть, вы могли бы пометить ответ как принятый? Это стандартная практика здесь и хороший способ выразить свою благодарность :) - person rick; 11.04.2014