【发布时间】:2017-07-29 18:02:13
【问题描述】:
我是一名软件工程师 (JAVA/C++) 而不是电气工程师,因此您可以想象 VHDL 让我非常困惑,因为我不知道合成器在幕后试图做什么。它告诉我它无法综合我认为非常简单的架构。 (事实上它是为我拥有的几个实体做的,所以我怀疑我误解了一些基本概念并在多个地方重复了架构错误。)
为什么不能合成... (错误 - 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 线转换为高电平时,应将 ack 输出驱动为高电平;在下降沿,它应更改为低电平驱动。 (在每种情况下,我还希望更改一大堆其他内容,因此我需要进程而不是并发语句,ack 更改它只是为了向顶级实体发出请求已完成的信号。)
什么是“不保值”?当它说“NOT(clock-edge)”时,它在说什么“时钟”?
我很想知道如何解决这个问题(不改变结构),并解释我试图让合成器做什么以及为什么合成器无法完成目标。
【问题讨论】:
-
我可能已经找到了一些原因...阅读后我认为灵敏度过程中“X
-
您的综合工具将具有时序逻辑的 HDL 指南,显示从 IEEE Std 1076.6-2004(已撤销)派生的可接受形式。这里的问题是您尝试将 data_request 的两个边缘用作双数据速率时钟,而如果支持 DDR,则仅适用于 iO 单元并且需要特殊调用(并使用两个触发器)。通常每个进程只支持一个时钟边沿。想想硬件描述语言。
标签: events process vhdl clock synthesis