2013-03-30 2 views
0

Я пишу то, что, как я думал, будет довольно стандартным кодом VHDL, но исполнение продолжает возвращаться ко мне.VHDL Shift with Concatenation

Код предназначен для простой игры на плате Nexsys 3. Первый игрок выбирает переключатель, и светодиоды прокручиваются вниз, показывая пробел, когда они находятся над самим переключателем. Второй игрок нажимает кнопку, когда свиток переходит к выбранному переключателю. Моя часть игры - прокрутить светодиоды. Мой код можно посмотреть ниже:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
use IEEE.NUMERIC_STD.ALL; 

entity Two_Player_3_24_2013 is 
port( clk:  in std_logic; 
     rst:  in std_logic; 
     switches: in std_logic_vector(7 downto 0); 
     led_indic: out std_logic_vector(7 downto 0)   
); 

end Two_Player_3_24_2013; 

architecture Behavioral of Two_Player_3_24_2013 is 

signal count: std_logic_vector(31 downto 0):= "00000000000000000000000000000000";  
signal only_one: std_logic := '0'; 
signal shifter: std_logic_vector(7 downto 0) := "00000000"; 

begin 

only_one <= '1' when switches = "10000000" else 
      '1' when switches = "01000000" else 
      '1' when switches = "00100000" else 
      '1' when switches = "00010000" else 
      '1' when switches = "00001000" else 
      '1' when switches = "00000100" else 
      '1' when switches = "00000010" else 
      '1' when switches = "00000001" else 
      '0'; 

counting: process(clk, rst, only_one) 
    begin 
    if (rst = '1') then 
    count <= "00000000000000000000000000000000"; 
    elsif (clk'event and clk='1' and only_one = '1') then 
    count <= count + '1'; 
    end if; 
end process counting; 


shifting: process(clk, rst, count, shifter) 
    begin 
    if (rst = '1') then 
    shifter <= "00000000"; 
    elsif (clk'event and clk='1' and count = "00000000000000010000000000000000") then 
    shifter <= switches; 
    elsif (clk'event and clk='1' and count(25) = '1') then 
    shifter <= shifter(0) & shifter(7 downto 1); 
    end if; 
end process shifting; 

led_indic <= shifter; 

end Behavioral; 

Теперь я проверил детали по отдельности, и они работают. Сигнал only_one действителен только при включении одного переключателя. Счетчик начинается в нужное время, и первый выключатель запускается в нужное время. По какой-то причине я все еще не могу понять, однако он отказывается прокручивать. Я попытался запустить это как на доске, так и в симуляции, но я не могу понять, почему прокрутка не работает. Исходная настройка выполняется только в определенное время, а конкатенация должна выполняться с регулярными интервалами времени. Я знаю, проблема связана с

shifter <= shifter(0) & shifter(7 downto 1); 

, но до сих пор ничего не пробовал исправил его.

Любые советы приветствуются.

Спасибо,
Юсиф Нуризаде

ответ

1

Я думаю, в симуляции вы просто должны ждать ;-)

при использовании 100MHz часов, она занимает ~ 335ms, пока ничего не происходит (COUNT (25) в приоритете). как только и счетчик (25) высок, светодиоды будут очень быстро сдвигаться для следующих 335 мс, заканчивающихся в том же положении, в котором они начинались. -> поэтому настроить счетчики.

для самой игры передумать «сдвиг в то время как счет (25) =« 1 »» вещь! это имеет смысл переходить только на один противопоставление (например, если счетчик = X «01000000» ...)

кстати: для синтеза это не является хорошей практикой для реализации стробированных часов, как

elsif (clk'event and clk='1' and count(25) = '1')) then 

вы должны а использовать, например:

elsif (clk'event and clk='1') then 
    if count(25) = '1' then 
     ... 
+0

балды, Спасибо так много, что установил его немедленно! Юсиф Нуризаде –