【问题标题】:VHDL - Xilinx ISE crashing during synthesisVHDL - Xilinx ISE 在综合期间崩溃
【发布时间】:2014-08-10 08:41:34
【问题描述】:

我是 VHDL 新手,当我的代码中有某些内容(在 Xilinx ISE 中开发)时,综合工具会崩溃。

以下是导致程序崩溃的要点。

signal enteredDigit1 : std_logic_vector(3 downto 0);

begin

u3: entity work.module port map (x,y, enteredDigit1)

process(asyncClock, enteredDigit1) begin
    ssegDigit <= enteredDigit1
end process

如果我在该进程之外执行 ssegDigit

任何想法为什么它会崩溃?我没有从程序控制台得到任何指示。

编辑:它似乎正在崩溃,因为我正在为 ssegDigit 分配一个新值。如果我在它编译的过程中将 enterDigit1 赋予一个变量

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    如果没有看到错误消息和/或ssegDigit 的声明,可能无法提供明确的答案。

    这样分析:

    library ieee;
    use ieee.std_logic_1164.all;
    
    entity module is
        port ( 
            signal x:               in   std_logic_vector (3 downto 0);
            signal y:               in   std_logic_vector (3 downto 0);
            signal enteredDigit1:   out  std_logic_vector (3 downto 0)
        );
    end entity;
    
    architecture foo of module is
    begin
    
    end architecture;    
    
    library ieee;
    use ieee.std_logic_1164.all;
    
    entity ssegDigit_tb is
    end entity;
    
    architecture foo of ssegDigit_tb is
    
        signal asyncClock:     std_logic;
        signal x:              std_logic_vector(3 downto 0);
        signal y:              std_logic_vector(3 downto 0);
    
        signal ssegDigit:      std_logic_vector(3 downto 0);
    
        signal enteredDigit1 : std_logic_vector(3 downto 0);
    
    
    begin
    
    u3: entity work.module port map (x,y, enteredDigit1);
    
        process(asyncClock, enteredDigit1) 
        begin
            ssegDigit <= enteredDigit1;
        end process;
    end architecture;
    

    注意ssegDigit 的索引范围与enteredDigit1 相同,我更正了enteredDigit1 的声明:

    signal enteredDigit1 : std_logic_vector(3 down 0);
    

    VHDL 保留字downto 不完整的地方应该是:

        signal enteredDigit1 : std_logic_vector(3 downto 0);
    

    在不知道导致 ISE 工具崩溃的确切方法的情况下,有一种外部可能性是它的解析器不够健壮。

    一般来说,模拟器的分析器会比综合工具中的分析器更强大。编写合成器时预期有效的 VHDL 设计规范,这也指出了在合成之前验证您的设计的实用性。

    如果ssegDigit 的声明对于enteredDigit1 中的每个元素都没有一个匹配的元素,或者在为enteredDigit1 的声明中修复保留字downto 都不是您的问题,那么根据定义,您没有提供足够的信息。还要注意过程中赋值语句后面和end process之后的分号。

    让我们知道,并在需要时详细说明问题。

    注意到您在示例中更正了 downto,但没有更正缺少的分号。

    在您发表评论后:

    ... sseg 数字按照您的预期声明,并且端口映射到相同的范围。我在想可能是合成器发生故障的情况,因为输入的信号在几个地方被修改了Digit1。知道为什么它会在流程之外起作用吗?同步问题?

    ssegDigit 似乎被声明为信号并连接到端口。这表明在 cmets 中玩 20 个问题是徒劳的,每次都会显示更多信息(我们最终会收到一条消息,建议将对话移动到 wiki 聊天中,如果没有其他问题的话)。

    也许您可以显示端口声明,包括模式、相关元素的信号声明以及信号的任何赋值语句,尤其是enteredDigit1

    展示导致您得出综合工具“崩溃”结论的迹象也可能对您有用。

    请参阅How do I ask a good question?,帮助其他人重现问题,“包含足够的代码以允许其他人重现问题。有关此方面的帮助,请阅读如何创建最小、完整、有效的示例”(How to create a Minimal, Complete, and Verifiable example)。

    【讨论】:

    • 它实际上是错误的,只是一个错字。 sseg 数字按照您的预期声明,并且端口映射到相同的范围。我在想可能是合成器发生故障的情况,因为输入的信号在几个地方被修改了Digit1。知道为什么它会在流程之外起作用吗?同步问题?
    • 如果您要消除敏感度列表,请添加一个等待语句作为wait on asyncClock, enteredDigit1; 形式的进程的最后一条语句,您的进程语句将与用于并发语句的等效进程语句相同除了asyncClock,它没有出现在赋值语句的右侧。如果不使用,请将其删除。我想一个合成器(它在等效进程上运行)不应该因为额外的敏感度列表元素而崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多