Vhdl 信号<;信号>;无法合成,同步描述错误

Vhdl 信号<;信号>;无法合成,同步描述错误,vhdl,Vhdl,我正在尝试实现一个组件,该组件接收一个基本时钟的输入,并根据此方案输出一个模式: 我得到了这个错误,我尝试了很多方法来修复它,也遵循了stackoverflow的各种建议,但什么都没有 错误:Xst:827-“E:/Progetti/nuovi/Clock\u生成器/CG\u ex\u 3/Clock\u ex3.vhd”第34行:无法合成信号检查\u 0,同步描述错误。当前软件版本不支持用于描述同步元素(寄存器、内存等)的描述样式 有时,相同的错误指的是形式前时钟 IEEE库; 使用IEEE

我正在尝试实现一个组件,该组件接收一个基本时钟的输入,并根据此方案输出一个模式:

我得到了这个错误,我尝试了很多方法来修复它,也遵循了stackoverflow的各种建议,但什么都没有

错误:Xst:827-“E:/Progetti/nuovi/Clock\u生成器/CG\u ex\u 3/Clock\u ex3.vhd”第34行:无法合成信号检查\u 0,同步描述错误。当前软件版本不支持用于描述同步元素(寄存器、内存等)的描述样式

有时,相同的错误指的是形式前时钟

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体时钟_ex3为
端口(基本时钟:标准逻辑中;
形式时钟:输出标准逻辑);
结束时钟_ex3;
时钟_ex3的架构是
信号形式时钟:标准逻辑:='0';
开始

forma_-clk你的问题回答得很好。这个问题与你的问题之间的区别在于,你的代码中的具体错误是,你在一个进程中有多个
if(上升沿(clk))then
结构;符合条件的合成过程只能包含一个此类边缘检测器


根据您的功能需求,我将使用两个独立的上升沿和下降沿计数器来实现这一点,每个计数器都有自己的进程,然后编写另一个实现状态机的进程,该进程与这些计数器一起工作,以实现所需的状态转换和计数器重置。

您的问题得到了很好的回答。这个问题与你的问题之间的区别在于,你的代码中的具体错误是,你在一个进程中有多个
if(上升沿(clk))then
结构;符合条件的合成过程只能包含一个此类边缘检测器

根据您的功能需求,我将使用两个独立的上升沿和下降沿计数器来实现这一点,每个计数器都有自己的进程,然后编写另一个进程来实现一个状态机,与这些计数器一起工作,以实现所需的状态转换和计数器重置

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity clock_ex3 is
    Port ( base_clk : in  STD_LOGIC;
           forma_clk : out  STD_LOGIC);
end clock_ex3;

architecture Behavioral of clock_ex3 is
    signal pre_forma_clk : std_logic := '0';
begin

forma_clk <= pre_forma_clk;

pattern_generator : process(base_clk)  --line 34

    variable check_0 : natural := 0;
    variable check_1 : natural := 0;
    variable check_2 : natural := 0;
    variable check_3 : natural := 0;

begin
    if (rising_edge(base_clk)) then
        check_0 := check_0 + 1;
        if (check_0 = 15) then
            pre_forma_clk <= not pre_forma_clk;
        end if;
    end if;

    if (falling_edge(base_clk) and check_0 >= 15) then
        check_1 := check_1 + 1;
        if (check_1 = 10) then
            pre_forma_clk <= not pre_forma_clk;
        end if;
    end if;

    if (falling_edge(base_clk) and check_1 >= 10) then
        check_2 := check_2 + 1;
        if (check_2 = 15) then
            pre_forma_clk <= not pre_forma_clk;
        end if;
    end if;

    if (rising_edge(base_clk) and check_2 >= 15) then
        check_3 := check_3 + 1;
        if (check_3 = 10) then
            pre_forma_clk <= not pre_forma_clk;
            check_0 := 0;
            check_1 := 0;
            check_2 := 0;
            check_3 := 0;
        end if;
    end if;

end process;

end Behavioral;