Asynchronous VHDL:无法合成信号

Asynchronous VHDL:无法合成信号,asynchronous,vhdl,Asynchronous,Vhdl,我对VHDL非常陌生,正在尝试为学校的一个项目编写代码。我想要的是一个一维的乒乓球游戏,使用LED灯作为球。请注意,我对VHDL没有结构化的理解,我通过查找VHDL中的状态机设计编写了以下代码,并试图提出自己的代码。我有一个异步复位和两个异步输入,对应于每个球员的按钮按下返回球。它们是异步的,因为我希望球员能够在时钟周期内即使按下按钮很短的时间也能回球 在Xilinx 10.1中,模拟按我想要的方式运行,但当我尝试合成时,以下代码会出现以下错误: ERROR:Xst:827 - "C:/User

我对VHDL非常陌生,正在尝试为学校的一个项目编写代码。我想要的是一个一维的乒乓球游戏,使用LED灯作为球。请注意,我对VHDL没有结构化的理解,我通过查找VHDL中的状态机设计编写了以下代码,并试图提出自己的代码。我有一个异步复位和两个异步输入,对应于每个球员的按钮按下返回球。它们是异步的,因为我希望球员能够在时钟周期内即使按下按钮很短的时间也能回球

在Xilinx 10.1中,模拟按我想要的方式运行,但当我尝试合成时,以下代码会出现以下错误:

ERROR:Xst:827 - "C:/Users/Emre/LED_pong/pong.vhd" line 49: Signal present_state cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.
当我删除包含PAD1和PAD2的elsif语句时,它会进行合成,但会失去其功能

entity pong is
Port ( CLK : in  STD_LOGIC;
       RST : in  STD_LOGIC;
       PAD1 : in  STD_LOGIC;
       PAD2 : in  STD_LOGIC;
       LEDS : out  STD_LOGIC_VECTOR (7 downto 0));
end pong;

architecture Behavioral of pong is

type state is ( P1_SERVE, A1, A2, A3, A4, A5, A6, A7,
                     B0, B1, B2, B3, B4, B5, B6, P2_SERVE,
                     WAIT_FOR_P1, WAIT_FOR_P2, P1_HIT_EARLY, P2_HIT_EARLY,
               P1_SCORED, P2_SCORED );
signal present_state: state;
signal temp : STD_LOGIC_VECTOR (7 downto 0) := "00000000";

begin

process (CLK, RST, PAD1, PAD2) begin

    if (RST = '1') then
        temp <= "10000000";
        present_state <= P1_SERVE;

    elsif (rising_edge(CLK)) then
        case present_state is

            when P1_SERVE =>
                temp <= "10000000";
            when P2_SERVE =>
                temp <= "00000001";

            when P1_SCORED =>
                temp <= "00000000";
           present_state <= P2_SERVE;
            when P2_SCORED =>
           temp <= "00000000";
           present_state <= P1_SERVE;

            when A1 =>
                temp <= "01000000";
                present_state <= A2;
            when A2 =>
                temp <= "00100000";
                present_state <= A3;
            when A3 =>
                temp <= "00010000";
                present_state <= A4;
            when A4 =>
                temp <= "00001000";
                present_state <= A5;
            when A5 =>
                temp <= "00000100";
                present_state <= A6;
            when A6 =>
                temp <= "00000010";
           present_state <= A7;
            when A7 =>
                temp <= "00000001";
           present_state <= WAIT_FOR_P2;
        when WAIT_FOR_P2 =>
           temp <= "00000000";
           present_state <= P2_SERVE;

            when B6 =>
                temp <= "00000010";
                present_state <= B5;
            when B5 =>
                temp <= "00000100";
                present_state <= B4;
            when B4 =>
                temp <= "00001000";
                present_state <= B3;
            when B3 =>
                temp <= "00010000";
                present_state <= B2;
            when B2 =>
                temp <= "00100000";
                present_state <= B1;
            when B1 =>
                temp <= "01000000";
           present_state <=  B0;
            when B0 =>
                temp <= "10000000";
           present_state <= WAIT_FOR_P1;
        when WAIT_FOR_P1 =>
           temp <= "00000000";
           present_state <= P1_SERVE;

            when P1_HIT_EARLY =>
                temp <= "10000000";
                present_state <= P2_SCORED;
            when P2_HIT_EARLY =>
                temp <= "00000001";
                present_state <= P1_SCORED;

        when others =>
           null;
        end case;

  elsif (PAD1 = '1') then
     case present_state is 
        when P1_SERVE =>
           present_state <= A1;
        when B0 =>
           present_state <= P1_HIT_EARLY;
        when WAIT_FOR_P1 =>
           present_state <= A1;
        when others =>
           null;    
     end case;

    elsif (PAD2 = '1') then
        case present_state is
            when P2_SERVE =>
                present_state <= B6;
            when A7 =>
                present_state <= P2_HIT_EARLY;
            when WAIT_FOR_P2 =>
                present_state <= B6;
        when others =>
           null;
        end case;

    end if;
end process;

   LEDS <= temp;

end Behavioral;
实体pong是
端口(时钟:在标准逻辑中;
RST:标准逻辑中;
PAD1:标准逻辑中;
PAD2:标准逻辑中;
LED:输出标准逻辑向量(7到0);
结束乒乓球;
pong的体系结构是
类型状态为(P1、A1、A2、A3、A4、A5、A6、A7、,
B0、B1、B2、B3、B4、B5、B6、P2,
等待P1,等待P2,P1提前命中,P2提前命中,
P1_得分,P2_得分);
信号存在状态:状态;
信号温度:标准逻辑向量(7到0):=“00000000”;
开始
过程(时钟、RST、PAD1、PAD2)开始
如果(RST='1'),则

temp除了case语句中的异步重置和时钟加载之外,您还尝试使用PAD1和PAD2作为当前_状态的闩锁启用

您希望的行为的首选实现并不反映硬件。例如,在后面的两个case语句中,当您使用PAD1和PAD2作为有效的组合时钟时,您正在查看当前的_状态

您可能希望捕获PAD1和PAD2作为每个时钟清除的事件,就像捕获中断的边缘一样。根据您的时钟频率,您可能需要对其进行脉冲过滤,问题是您是否可以从按钮上同时获得接通和断开反弹。还需要考虑时钟边沿的设置时间,这意味着您可能需要在特定窗口中对设置时间进行采样。该模型是一个触发器,使用PAD1和PAD2作为时钟,后跟一个锁存器


使用事件捕获,您可以在rising_edge(CLK)评估中将所有案例语句合并为一个。其效果是根据PAD1或PAD2(已存储)事件,在某些状态情况下给出两种可能的输出状态。

除了case语句中的异步重置和时钟加载外,您还尝试使用PAD1和PAD2作为当前状态的闩锁启用

您希望的行为的首选实现并不反映硬件。例如,在后面的两个case语句中,当您使用PAD1和PAD2作为有效的组合时钟时,您正在查看当前的_状态

您可能希望捕获PAD1和PAD2作为每个时钟清除的事件,就像捕获中断的边缘一样。根据您的时钟频率,您可能需要对其进行脉冲过滤,问题是您是否可以从按钮上同时获得接通和断开反弹。还需要考虑时钟边沿的设置时间,这意味着您可能需要在特定窗口中对设置时间进行采样。该模型是一个触发器,使用PAD1和PAD2作为时钟,后跟一个锁存器


使用事件捕获,您可以在rising_edge(CLK)评估中将所有案例语句合并为一个。其效果是根据PAD1或PAD2(已存储)事件,在某些状态情况下给出两种可能的输出状态。

除了case语句中的异步重置和时钟加载外,您还尝试使用PAD1和PAD2作为当前状态的闩锁启用

您希望的行为的首选实现并不反映硬件。例如,在后面的两个case语句中,当您使用PAD1和PAD2作为有效的组合时钟时,您正在查看当前的_状态

您可能希望捕获PAD1和PAD2作为每个时钟清除的事件,就像捕获中断的边缘一样。根据您的时钟频率,您可能需要对其进行脉冲过滤,问题是您是否可以从按钮上同时获得接通和断开反弹。还需要考虑时钟边沿的设置时间,这意味着您可能需要在特定窗口中对设置时间进行采样。该模型是一个触发器,使用PAD1和PAD2作为时钟,后跟一个锁存器


使用事件捕获,您可以在rising_edge(CLK)评估中将所有案例语句合并为一个。其效果是根据PAD1或PAD2(已存储)事件,在某些状态情况下给出两种可能的输出状态。

除了case语句中的异步重置和时钟加载外,您还尝试使用PAD1和PAD2作为当前状态的闩锁启用

您希望的行为的首选实现并不反映硬件。例如,在后面的两个case语句中,当您使用PAD1和PAD2作为有效的组合时钟时,您正在查看当前的_状态

您可能希望捕获PAD1和PAD2作为每个时钟清除的事件,就像捕获中断的边缘一样。根据您的时钟频率,您可能需要对其进行脉冲过滤,问题是您是否可以从按钮上同时获得接通和断开反弹。还需要考虑时钟边沿的设置时间,这意味着您可能需要在特定窗口中对设置时间进行采样。该模型是一个触发器,使用PAD1和PAD2作为时钟,后跟一个锁存器

使用事件捕获,您可以将所有case语句合并到一个u中