我是一名软件工程师(JAVA/C++),而不是电气工程师,所以你可以想象VHDL对我来说是彻底的困惑,因为我不知道什么是合成器正试图在幕后做。它告诉我,它无法综合我认为是一个非常简单的架构。 (实际上它是为我的几个实体做的,所以我怀疑我误解了一些基本概念,并在多个地方重复了架构错误。)这是为什么不能合成? (在NOT(时钟边沿)不保留它的值)
为什么不能合成... (ERROR - controller.vhd( 63):语句不是合成的,因为它不 NOT(时钟边缘)的条件下保持其价值VHDL-1242 完成:错误代码2)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY controller IS
PORT (
ack: out STD_LOGIC := '0';
data_request: in STD_LOGIC
);
END controller;
ARCHITECTURE logic OF controller IS
BEGIN
PROCESS (data_request)
BEGIN
if (rising_edge(data_request)) then
-- other logic will be added here
ack <= '1';
elsif (falling_edge(data_request)) then
-- other logic will be added here too
ack<='0';
end if;
END PROCESS;
END logic;
(是的,我完全知道,该过程的“逻辑”可以由 ack < = data_request替代;但是我的vhdl源实际上比t更复杂他的 ,但我已经将其归结为引发错误的最简单的子集。请不要建议用不同的结构/并发语句替换进程。)
基本上,当data_request行转换为高电平时,ack输出应该被驱动为高电平;在下降的时候应该改变为低点。 (并且在每种情况下,我都希望其他一些东西也会发生变化,因此我需要该过程而不是并发语句,但更改它只是为了向顶层实体发出请求已完成的信号。)
什么是“不持有其价值”?什么“时钟”是指什么时候它说“不(时钟边缘)”?
我很想解释如何解决这个问题(不改变结构)以及我想要问合成器做什么以及为什么合成器无法完成目标的解释。
我可能已经找出了一些原因,为什么...读取后,我认为在灵敏度过程中的“X <= Y”分配中的X输出由合成器实现,其中触发器附加到灵敏度事件上作为时钟我试图用两个触发器不支持的不同时钟源来驱动触发器。它是否正确?那么,如何根据两个不同的事件来改变输出,比如两种不同的方式? – user3059763
您的综合工具将具有用于顺序逻辑的HDL指南,其中显示了从IEEE Std 1076.6-2004(撤回)派生的可接受形式。这里的问题是你试图使用data_request的两个边作为双数据速率时钟,而DDR如果支持,只能用于iO单元并需要特殊调用(并使用两个触发器)。通常每个进程只能支持一个时钟边沿。认为硬件描述语言。 – user1155120