xilinx VHDL错误827:信号<;名称>;无法合成

xilinx VHDL错误827:信号<;名称>;无法合成,vhdl,xilinx,hdl,Vhdl,Xilinx,Hdl,我是VHDL编程的初学者,我正在尝试使用ISE project navigator 13.1合成以下VHDL代码(软件谴责按钮) entity PBdebouncer is Port ( PB : in STD_LOGIC; CLK : in STD_LOGIC; reset : in STD_LOGIC; PBdebounced : out STD_LOGIC); end PBdebouncer; architecture Behaviora

我是VHDL编程的初学者,我正在尝试使用ISE project navigator 13.1合成以下VHDL代码(软件谴责按钮)

entity PBdebouncer is
Port ( PB : in  STD_LOGIC;
       CLK : in  STD_LOGIC;
       reset : in  STD_LOGIC;
       PBdebounced : out  STD_LOGIC);
end PBdebouncer;

architecture Behavioral of PBdebouncer is

begin

    p1: process(CLK , PB , reset)
        variable enable,count : integer range 0 to 100000 := 0;
    begin
        if(reset = '1') then
            count := 0;
            enable :=0;
        elsif(CLK' event and CLK = '1' ) then
            if (enable = 1) then
                count := count + 1;
            end if;

            if(count = 99999 ) then 
                if(PB = '0') then
                    PBdebounced <= '0';
                else
                    PBdebounced <= '0';
                end if;

                count := 0;
                enable := 0;
            end if;

            count := count;

        else
            enable := 1;
        end if;

    end process;
end Behavioral;
实体PBdebouncer是
端口(PB:STD_逻辑中;
CLK:标准逻辑中;
复位:在标准逻辑中;
PBdebounced:输出标准逻辑);
末端去抖器;
PBdebouncer的架构是
开始
p1:过程(时钟、PB、复位)
变量启用,计数:整数范围0到100000:=0;
开始
如果(重置='1'),则
计数:=0;
启用:=0;
elsif(CLK'事件和CLK='1'),然后
如果(启用=1),则
计数:=计数+1;
如果结束;
如果(计数=99999),则
如果(PB='0'),则

PBdebounced请在Clk'和事件之间没有空格的情况下尝试

其他几个问题:
当您仅使用其中两个值时,“enable”的范围为何为0到100000?为什么不使用布尔逻辑或标准逻辑?
“pbdebounced”是否应该设置为除“0”以外的任何值?
为什么要用括号括住布尔表达式?
为什么PB在敏感度列表中?
它在模拟中是否按预期工作

这些可能现在就可以了

编辑:错误的格式隐藏了问题:

begin
   if reset = '1' then
      count := 0;
      enable :=0;
   elsif rising_edge(clk) then
      if enable = 1 then 
         count := count + 1; 
      end if;
      if count = 99999 then 
         -- do stuff
      end if;
      count:= count;
-- else   
-- enable := 1;
-- THE TWO LINES ABOVE are the problem
-- They are outside both the CLK and RESET clauses.
   end if;
end process;

在Clk'和事件之间没有空格的情况下尝试

其他几个问题:
当您仅使用其中两个值时,“enable”的范围为何为0到100000?为什么不使用布尔逻辑或标准逻辑?
“pbdebounced”是否应该设置为除“0”以外的任何值?
为什么要用括号括住布尔表达式?
为什么PB在敏感度列表中?
它在模拟中是否按预期工作

这些可能现在就可以了

编辑:错误的格式隐藏了问题:

begin
   if reset = '1' then
      count := 0;
      enable :=0;
   elsif rising_edge(clk) then
      if enable = 1 then 
         count := count + 1; 
      end if;
      if count = 99999 then 
         -- do stuff
      end if;
      count:= count;
-- else   
-- enable := 1;
-- THE TWO LINES ABOVE are the problem
-- They are outside both the CLK and RESET clauses.
   end if;
end process;

问题的原因似乎已由Brians的回答确定,但我只想为这些情况添加一个提示:

在Xilinx ISE中,您可以查看许多语言模板(选择编辑->语言模板),这有助于您实现各种类型的触发器(同步/异步复位、上升/下降沿触发等)和其他结构


这些可能非常有用-尤其是在获取这样的错误消息时,这通常是由于语法正确的VHDL代码导致的,这些代码描述了无法在所选设备中合成的硬件。

问题的原因似乎已由Brians answer确定-但我仅为这些情况添加一个提示:

在Xilinx ISE中,您可以查看许多语言模板(选择编辑->语言模板),这有助于您实现各种类型的触发器(同步/异步复位、上升/下降沿触发等)和其他结构


这些信息非常有用,尤其是当收到这样的错误信息时,这通常是由于语法正确的VHDL代码导致的,这些代码描述了无法在所选设备中合成的硬件。

只是一个小建议:作为初学者避免变量。
它们看起来像是在软件程序中工作,但它们有时会映射到硬件中令人讨厌的东西。

只是一个小建议:作为初学者,避免变量。
它们似乎像在软件程序中一样工作,但它们有时会映射到硬件中令人讨厌的东西。

关于类型,我尝试了所有方法,但仍然是相同的错误关于我在前面的代码中有一个错误,应该是:'if(PB='0')然后,PBDEBOUND谈到了括号:我尝试了没有括号的代码,但仍然存在同样的问题:在模拟中捕捉这些小错误。然后,当它工作时,你将有一个更容易的合成时间。关于类型,我尝试了每件事,但仍然是相同的错误关于,我在前面的代码中有一个错误,应该是:'if(PB='0')然后,PBDEBOUND谈到了括号:我尝试了没有括号的代码,但仍然存在同样的问题:在模拟中捕捉这些小错误。然后,当它工作时,你将有一个更容易的合成时间。