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

Mapping 由于VHDL中的同步描述不正确,无法合成信号,mapping,vhdl,synthesize,Mapping,Vhdl,Synthesize,我对VHDL中的合成器有问题。这是代码中给出错误的部分: CASE stare_curenta IS WHEN verde => stare_urm <= albastru; rosuS1368stg <= '1'; galbenS1368stg <= '0'; verdeS1368stg <= '0';

我对VHDL中的合成器有问题。这是代码中给出错误的部分:

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;
“检查语法”和“模拟”进行得很顺利,只是它给了我一个错误:信号galbenS1368无法合成,同步描述不好。当前软件版本不支持用于描述同步元素寄存器、内存等的描述样式

谢谢大家!

问题是:

if (clock'event and clock = '0') then
在你的州内。这不是一个语法问题,模拟器会尽职尽责地执行您编写的内容,尽管您可能无法获得预期的结果,但正如错误消息所述,它不是一种受支持的合成样式,它在更大的组合进程中嵌入一段时钟代码,即一个进程的一部分,用于创建寄存器

不管怎样,我不确定这是你真正想做的。当灵敏度列表中的信号发生变化时,对过程进行评估。按照你的编码方式,你实际上是在说,当这个过程被评估时,如果在时钟下降的那一刻,注册信号,即使你可能打算分配一个值,然后在下一个下降的时钟边缘注册

假设最后一条语句是这样,它基本上告诉您如何编写代码。它有两个部分。1指定一个值:

when verde =>
  ...
  galbenS2457stg <= '1';
2在下一个下降时钟边缘上登记:

process (clock)
begin
  if clock'event and clock = '0' then
    galbenS2457stg_reg <= galbenS2457stg;
  end if;
end process;
合成中的同步设计本质上是寄存器->一组组合逻辑->寄存器->组合逻辑->等等。这样编码,用代码将寄存器与组合逻辑分开,是开始更多地考虑硬件的好方法

编辑以澄清

根据你在评论中的回答,我似乎对我的建议不够清楚

您有一些处理状态机的进程。我想大部分都没锁。您试图在其中插入小的、有时钟的部分,而这正是该工具所抱怨的。我建议您尝试以以下方式编码,而不是完整的代码,只是为了说明这一点:

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根本不是一个输出。无论您如何命名,在您的状态解码过程中分配的信号都应该是内部信号,并将在体系结构声明区域中声明,而不是作为输出端口,而时钟信号将是输出端口,并将声明为输出端口。

我去掉了if clock'event和clock='0',并放入您给我的代码,processclock与if时钟的代码位于同一位置的那个。。。是现在我遇到了一些语法错误,可能是我没有正确声明_reg变量。我将它们定义为:signal galbenS2457stg_reg:std_logic。谢谢。不要把它放在原来的地方。添加一个完全不同的过程。进程中不能有进程,它在不同的进程中。我面临的问题是:我有galbenS2457stg:out STD_逻辑;在这个声明之后,我将galbenS2457stg_reg:out STD_LOGIC;。但是当我检查语法时,它给了我一个错误:无法读取模式输出的对象galbenS2457stg。只有在声明了_reg变量后,才出现此错误。