由于VHDL中的同步描述不良,无法合成信号

时间:2014-12-15 10:33:50

标签: mapping vhdl synthesize

我的VHDL中的Synthesise有问题。这是代码的一部分,它给了我错误:

CASE stare_curenta IS
        WHEN verde =>
            stare_urm <= albastru;

                rosuS1368stg <= '1';
                galbenS1368stg <= '0';
                verdeS1368stg <= '0';

                rosuS1368 <= '0';
                galbenS1368 <= '0';
                if ( clock'event and clock = '0') then
                    galbenS1368 <= '1';
                end if;
                verdeS1368 <= '1';

                rosup1v1i4v2i3v1i2v2i6v1i5v2i8v1i7v2 <= '0';
                verdep1v1i4v2i3v1i2v2i6v1i5v2i8v1i7v2 <= '1';

                rosuS2457stg <= '1';
                galbenS2457stg <= '0';
                if (clock'event and clock = '0') then
                    galbenS2457stg <= '1';
                end if;
                verdeS2457stg <= '0';

                rosuS2457 <= '1';
                galbenS2457 <= '0';
                verdeS2457 <= '0';

                rosup2v1i1v2i4v1i3v2i5v1i8v2i7v1i6v2 <= '1';
                verdep2v1i1v2i4v1i3v2i5v1i8v2i7v1i6v2 <= '0';

我在下面有另一个时钟和时钟事件过程,如下所示:

PROCESS(clock,stare_urm)
        BEGIN
            if (clock'event and clock = '1')then
                stare_curenta <= stare_urm;
            end if;
    END PROCESS;

&#39;检查语法&#39;和&#39;模拟&#39;进展顺利,只有Synthesise它给我错误:信号galbenS1368无法合成,错误的同步描述。当前软件版本不支持您用于描述同步元素(寄存器,内存等)的描述样式。

谢谢!

1 个答案:

答案 0 :(得分:0)

问题是:

if (clock'event and clock = '0') then

里面你的状态解码。这不是语法问题,模拟器将尽职尽责地执行您所写的内容(尽管您可能无法得到您想要的结果),但正如错误消息所述,它不是受支持的合成风格(在更大的组合过程中嵌入一个时钟代码段,即一个用于创建寄存器的过程的一部分。)

无论哪种方式,我都不确定你真正想做什么。当灵敏度列表中的信号发生变化时,将评估过程。你编写它的方式,你有效地说&#34;当评估这个过程时,如果在那个时刻正在下降的时刻,注册信号&#34;,即使你可能想要的是分配一个值,然后在下一个下降时钟边沿上注册。

假设最后一个语句是这样,它基本上告诉你如何编码它。它有两个部分。 (1)分配一个值:

when verde =>
  ...
  galbenS2457stg <= '1';

(2)在下一个时钟下降沿注册:

process (clock)
begin
  if clock'event and clock = '0' then
    galbenS2457stg_reg <= galbenS2457stg;
  end if;
end process;

综合中的同步设计本质上是寄存器 - &gt;一堆组合逻辑 - &gt;注册 - &gt;组合逻辑 - &gt;等编码就好了,你的寄存器与代码中的组合逻辑分开,是开始考虑硬件的好方法。

编辑以澄清

根据你在评论中的回答,似乎我对我推荐的内容不够清楚。

您有一些处理状态机的过程。我假设其中大部分都是非时钟的。您试图在其中插入小的时钟部分,这就是该工具所抱怨的内容。我建议您尝试以下列方式进行编码(不是完整的代码,只是为了说明这一点):

comb1 : process (...) -- fill in sensitivity list as needed
begin
  -- state machine decode
  ...
    when verde =>
      ...
      galbenS2457stg <= '1';
  ...
end process comb1;

clocked1 : process (clock)
begin
  if clock'event and clock = '0' then
    galbenS2457stg_reg <= galbenS2457stg;
  end if;
end process clocked1;

如果需要,请更改名称 - 由于您只发布了部分代码,因此galbenS2457stg根本不是输出。无论如何命名它们,在状态解码过程中分配的信号应该是内部信号,并且将在架构声明区域中声明,而不是作为输出端口,而时钟信号将是输出端口,并且将被声明为这样