VHDL 错误"Process clocking is too complex."



大家好,我最近开始用 VHDL 编码(这里的代码是 T 触发器),我遇到了一个错误,说"进程时钟太复杂了",这是下面附加的第一个代码,令人惊讶的是我也是解决方案。但我不知道它是如何工作的,没有错误的代码是第二代码。我在谷歌上搜索了半个小时的错误,但找不到令人满意的原因。请帮忙。

第一个代码:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY t_ff IS
PORT(t,clk,rst:IN STD_LOGIC;
q,q_bar:OUT STD_LOGIC);
END t_ff;
ARCHITECTURE t_ff OF t_ff IS
SIGNAL temp: STD_LOGIC;
BEGIN
PROCESS(clk,rst)
BEGIN
IF(clk='1' AND clk'event)THEN
IF(t='1')THEN temp<= NOT temp;
END IF;
ELSIF(rst='1')THEN temp<='0';
END IF;
q<= temp;
q_bar<= NOT temp;
END PROCESS;
END t_ff;

第二个代码:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY t_ff IS
PORT(t,clk,rst:IN STD_LOGIC;
q,q_bar:OUT STD_LOGIC);
END t_ff;
ARCHITECTURE t_ff OF t_ff IS
SIGNAL temp: STD_LOGIC;
BEGIN
PROCESS(clk,rst)
BEGIN
IF(rst='1')THEN temp<='0';
ELSIF(clk='1' AND clk'event)THEN
IF(t='1')THEN temp<= NOT temp;
END IF;
END IF;
q<= temp;
q_bar<= NOT temp;
END PROCESS;
END t_ff;

原因很简单。但首先我们需要更改您的代码:

这两个版本都没有描述T触发器的行为;两者都描述了至少2个(如果不是3个)触发器的行为。这是因为

时钟过程中的每个信号分配都会推断出触发器

每个过程中有 3 个信号分配 -tempqq_bar- 因此您将获得 3 个触发器(尽管 1 个是多余的,因此可能会被合成器优化)。因此,首先,如果要保证只有一个触发器,则需要重写每个过程,以便其中只包含一个信号分配。

重写第一个过程是没有意义的,因为其他原因它是错误的 - 见后面。第二个过程应该重写成这样:

PROCESS(clk,rst)
BEGIN
IF (rst='1') THEN temp<='0';
ELSIF (clk='1' AND clk'event) THEN
IF (t='1') THEN temp <= NOT temp;
END IF;
END IF;
END PROCESS;
q <= temp;
q_bar <= NOT temp;

换句话说,您需要将作业移动到流程之外qq_bar。第二个版本的新版本描述了具有异步复位的 T 型触发器的行为:

如果复位

被断言,则复位触发器;否则,如果 T 输入在时钟的上升沿置位,然后反转 人字拖

如果我重写你的第一个版本,它会描述一些不存在的电子元件的行为,所以它将无法合成。这种行为没有这样的触发器:

如果 T 输入在时钟的上升沿置位,然后反转 人字拖;否则,如果断言重置,则重置触发器

您可以描述一个具有同步复位的 T 型触发器:

在时钟的上升沿:如果复位被置位,则复位 触发器,否则,如果 T 输入在上升时置位 时钟的边缘,然后反转触发器

喜欢这个

PROCESS(clk)
BEGIN
IF (clk='1' AND clk'event) THEN
IF (rst='1') THEN temp<='0';
ELSIF (t='1') THEN temp <= NOT temp;
END IF;
END IF;
END PROCESS;
q <= temp;
q_bar <= NOT temp;

最后,您使用的是相当老式的编码风格。我建议使用rising_edge功能。你的括号也是多余的。经验丰富的 VHDL 代码会像这样编写您的第二个版本:

PROCESS(clk,rst)
BEGIN
IF rst='1' THEN temp<='0';
ELSIF rising_edge(clk) THEN
IF t='1' THEN temp<= NOT temp;
END IF;
END IF;
END PROCESS;    
q <= temp;
q_bar <= NOT temp;

相关内容

最新更新