我正在编写我认为相当标准的VHDL代码,但执行仍然在我身上。
该代码旨在成为Nexsys 3主板上的简单游戏。第一个播放器选择一个开关,LED从它向下滚动,当它们在开关本身上方时显示空白。当滚动到达所选择的开关时,第二个玩家按下按钮。我的游戏部分是让LED滚动。我的代码可以在下面查看:
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);
但到目前为止我没有尝试过任何修复过的东西。
非常感谢任何建议。
谢谢,
Yusif Nurizade
答案 0 :(得分:1)
我想在模拟中你只需要等待;-)
当你使用 100MHz 时钟时,需要~355ms才能发生任何事情(count(25)为高电平)。只要count(25)为高电平,LED将在接下来的335ms内快速移动,并在它们开始时的相同位置结束。 - &GT;因此调整您的计数器。
对于游戏本身重新思考“转移计数(25)='1'”的事情!仅在一个反位置移位更有意义(例如,如果count = X“01000000”......)
btw:对于综合来说,实施像
这样的门控时钟并不是一种好习惯elsif (clk'event and clk='1' and count(25) = '1')) then
你应该使用例如:
elsif (clk'event and clk='1') then
if count(25) = '1' then
...