VHDL错误,语法还不错

时间:2013-12-05 22:29:33

标签: error-handling vhdl electronics

我用VHDL编写了这个程序,alle语法很好,我试图仔细检查所有的端口映射,但是我得到som警告导致程序无法工作,甚至很难生成位文件。这里有谁可以帮忙吗?我变得疯了!

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;


    entity topMain is
    port(   clk   : in std_logic; 
          alarm : in std_logic_vector (1 downto 0);
        d_open : in std_logic_vector (1 downto 0);      
        d_closed  : in std_logic_vector(1 downto 0);        
        d_out : out std_logic_vector (1 downto 0));         
    end topMain;

    architecture Behavioral of topMain is

    type state_type is (S0,S1,S3);


    signal NS, Current_State : state_type;
    begin

    process (clk, alarm)
    begin

    if alarm ="11" then 
        Current_State <= S3;  -- 

    elsif rising_edge (clk) then 
        Current_State <= NS;   -- state change
    end if;
    end process;

    --------------------------------


    process(Current_State,d_open, d_closed, clk)
    begin
        case Current_State is

    ----
    when S3 =>      d_out <= "11";
            if (d_open = "10") then
                        NS <= S3;

                    elsif (d_closed = "01") then
                    NS <= S3;
                    elsif (d_closed = "00") then 
                    NS <= S3;

            end if;

----

      when S0 =>         d_out <= "10"; -- open door
                     if ( d_open = "10" ) then
                      NS <= S0;

                             elsif (d_closed= "01") then
                             NS <= S1;
                             elsif (d_closed = "10") then
                             NS <= S0;

                else   
                    NS <= S0;
                end if;


    when S1 =>        d_out <= "01";  -- open door
                if ( d_closed = "01" ) then
                    NS <= S1;
                    elsif (d_open <= "10") then
                    NS <= S0;
                    elsif (d_open <= "01") then
                    NS <= S1;
                else   
                    NS <= S1;
                end if;

        end case;

   end process;
    end Behavioral; 

如果有人可以看一下,这就是完整的项目。 它是一个简单的程序,包含有限状态机和3个变化,模拟防盗报警。 当闹钟关闭时,你可以打开门并关闭它,但如果它打开,你什么都不能做。这是我想做的事情,尽管我是新手。如有任何不便,请原谅我。

http://www.abmy.dk/BAlarm.zip

我现在收到的警告:

警告:Xst:819 - “C:/Xilinx/OP/BAlarm/topMain.vhd”第36行:过程灵敏度列表中缺少一个或多个信号。为了能够合成FPGA / CPLD硬件,XST将假设灵敏度列表中存在所有必需的信号。请注意,合成的结果可能与初始设计规格不同。丢失的信号是:     警告:Xst:737 - 找到信号的3位锁存器。锁存器可以从不完整的case或if语句生成。我们不建议在FPGA / CPLD设计中使用锁存器,因为它们可能会导致时序问题。 警告:Xst:647 - 从不使用输入。如果该端口属于顶级块或者属于子块并保留该子块的层次结构,则该端口将被保留并保持未连接状态。 警告:PhysDesignRules:372 - 门控时钟。时钟网顶/ NS_not0001来源    通过组合引脚。这不是好的设计实践。使用CE引脚    控制将数据加载到触发器中。 警告:路由:455 - CLK Net:top / NS_not0001可能有过度偏斜,因为

1 个答案:

答案 0 :(得分:2)

在组合过程的所有分支中未分配NS信号 process(Current_State, d_open, d_closed, clk),它将推断锁存;另请参阅https://stackoverflow.com/a/20394822/2352082https://stackoverflow.com/a/20411227/2352082

代码:

when S3 => d_out <= "11";
           if (d_open = "10") then
             ns <= S3;
           elsif (d_closed = "01") then
             ns <= S3;
           elsif (d_closed = "00") then
             ns <= S3;
           end if;

没有else,因此如果之前没有条件 为TRUE,然后未分配NS,这导致由...推断的锁存器 合成

您可以通过添加else并正确分配NS值来解决此问题,例如:

           ...
           else
             ns <= S0;  -- TBD[S0 is only example; use correct value]
           end if;

我没有在过程敏感度列表中看到任何信号丢失,但是clk是 由于此过程实现了组合设计,因此包括在最后一个中并且不是必需的。