【问题标题】:VHDL error, even though I generate a bit fileVHDL错误,即使我生成了一个位文件
【发布时间】:2013-12-05 22:29:32
【问题描述】:

我用 VHDL 编写了这个程序,所有语法都很好,我尝试仔细检查所有端口映射,但我收到一些警告,导致程序无法工作,即使它可以生成位文件。 . 有人可以帮忙吗??

    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

我现在收到的警告:

WARNING: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 引脚 控制数据加载到触发器中。 WARNING:Route:455 - CLK Net:top/NS_not0001 可能有过度倾斜,因为

【问题讨论】:

  • 您收到的警告到底是什么?当你说它“不起作用”时,你到底是什么意思?您是否尝试过运行模拟?如果您希望我们帮助您,您必须帮助我们。
  • 我已经添加了到目前为止我在问题中得到的所有警告..

标签: error-handling vhdl


【解决方案1】:

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,这会导致由 合成。

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

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

我没有看到进程敏感度列表中缺少任何信号,但clk 是 包含在最后一个中,但不是必需的,因为此过程实现了组合设计。

【讨论】:

  • Hej Morten, Kan se du også er fra DK, helt sikkert :) .. Hvor præcis tilføjer jeg 当其他人 til koden?
  • @abmy:是的,我也来自丹麦,但为了其他人,让我们保留英文转换;-) 我已经更正了我之前的答案,因为它不正确。导致闩锁的不是缺少when others =&gt;,而是when S3 =&gt;if 中缺少else。请参阅上面的更新答案。
  • 我回家后试试看。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-12-22
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
相关资源
最近更新 更多