Mapping 由于VHDL中的同步描述不正确,无法合成信号
我对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';
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变量后,才出现此错误。