VHDL转换与连接

时间:2013-03-30 05:22:06

标签: scroll concatenation vhdl bit-shift

我正在编写我认为相当标准的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

1 个答案:

答案 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
      ...