如果VHDL中的敏感度列表无法合成,为什么由于“分析和综合”而出现错误?

时间:2019-08-13 15:08:19

标签: vhdl intel fpga intel-fpga quartus

要在VHDL设计中提供顺序逻辑,我必须使用带有WARNING:googleapiclient.discovery_cache:file_cache is unavailable when using oauth2client >= 4.0.0 or google-auth Traceback (most recent call last): File "/Users/gil/anaconda3/envs/GA2DBenv/lib/python3.7/site-packages/googleapiclient/discovery_cache/__init__.py", line 36, in autodetect from google.appengine.api import memcache ModuleNotFoundError: No module named 'google.appengine' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/gil/anaconda3/envs/GA2DBenv/lib/python3.7/site-packages/googleapiclient/discovery_cache/file_cache.py", line 33, in <module> from oauth2client.contrib.locked_file import LockedFile ModuleNotFoundError: No module named 'oauth2client.contrib.locked_file' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/gil/anaconda3/envs/GA2DBenv/lib/python3.7/site-packages/googleapiclient/discovery_cache/file_cache.py", line 37, in <module> from oauth2client.locked_file import LockedFile ModuleNotFoundError: No module named 'oauth2client.locked_file' 的流程语句。从不同的来源我知道,敏感度列表是不可合成的结构,即是否可以合成以下代码:

sensitivity_list

... process(c) b <= a and c; end process; ... 信号将不会有任何锁存器,这只是一个普通的AND门。但是,当我合成没有敏感度列表的代码时:

c

无论我选择哪个版本的VHDL,都会遇到相同的问题:

  

错误(10442):process_test.vhd(79)处的VHDL流程语句错误:   流程声明必须包含敏感度列表或等待   声明

我的问题是:为什么合成器关心灵敏度列表?以我的理解,它过于关注客户,这不是错误,而是严重的警告,甚至什么也没有,只有在模拟打开时才发出警告。

UPD。这是完整的代码和一些图像。我使用了Quartus Prime Standard 16.1

    ...
    process
    b <= a and c;
    end process;
    ...

RTL合成: enter image description here 造型: enter image description here

2 个答案:

答案 0 :(得分:1)

逻辑合成器的工作是生成行为与您的RTL完全相同的电路。没有敏感度列表的过程,或者无法模拟无限循环的等待过程。因此,按照我的第一句话,逻辑合成器如何生成与您的RTL完全相同的电路?

这永远不会成为问题,因为在合成之前,您应该始终进行模拟。因此,您应该在逻辑合成器看到您的代码之前就已解决此问题。

答案 1 :(得分:1)

我认为您对sensitivity_list有点困惑。 sensitivity_list是触发process激活的信号列表。每次sensitivity_list中的信号之一发生变化时,process都会被激活并评估语句。

在您的示例中:

process(c) begin
    b <= a and c;
end process;

仅当c更改时,该过程才被激活。这意味着b更改时c将采用新值,而a更改时将保留旧值。这不是简单的组合“与”门的行为,合成时需要某种存储元件来存储b的值。

为了推断一个简单的AND门,必须在sensitivity_list中包括所有输入信号。可以通过以下方式手动完成:

process(a, c) begin
    b <= a and c;
end process;

或者在VHDL 2008中自动使用关键字all

process(all) begin
    b <= a and c;
end process;