Vhdl rising_edge语句不可综合

时间:2014-06-18 13:23:59

标签: vhdl frequency

我正在编写一个小程序,用于我的Zybo FPGA,它应该是一个具有10个不同步骤的可变分频器。

然而,在最后一行,当我尝试将时钟输出到LED进行测试时,它给出了我的错误:第137行:语句不可合成,因为它在NOT(时钟边缘)条件下不保持其值< / p>

这是我的代码

entity StappenMotor is
Port (  Reset, CLK : in STD_LOGIC;
            X1, X2 : in  STD_LOGIC;
            Z1 : out STD_LOGIC);
end StappenMotor;

architecture Behavioral of StappenMotor is
signal speed : integer := 0;
signal puls : STD_LOGIC;
begin

speed_proc: process(X1, X2) is
begin
if (rising_edge(X1) and speed < 10) then
    speed <= speed + 1;
elsif (rising_edge(X2) and speed > 0) then
    speed <= speed - 1;
end if;
end process speed_proc;

freq_proc: process(CLK) is
variable int : integer := 0;
begin
    if rising_edge(CLK) then
        int := int + 1;
    end if;

    case speed is
        when 0 =>
            if int = 250000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 1 =>
            if int = 200000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 2 =>
            if int = 175000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 3 =>
            if int = 150000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 4 =>
            if int = 125000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 5 =>
            if int = 100000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 6 =>
            if int = 75000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 7 => 
            if int = 62500000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 8 =>
            if int = 50000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 9 =>
            if int = 35000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when 10 =>
            if int = 25000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        when others =>
            if int = 10000000 then
                puls <= '1';
                int := 0;
            else puls <= '0';
            end if;
        end case;
    end process freq_proc;

test: process(puls) is
begin
    if rising_edge(puls) then
        Z1 <= '1';
    else Z1 <= '0';
    end if;
end process test;
end Behavioral;

该行发生错误:

if rising_edge(puls) then

任何人都有线索?

亲切的问候。

2 个答案:

答案 0 :(得分:3)

问题在于整个test过程,而不仅仅是您提到的单行。

test: process(puls) is
begin
    if rising_edge(puls) then
        Z1 <= '1';
    else Z1 <= '0';
    end if;
end process test;

如果你考虑一下你在这里所描述的内容,那么只要时钟有上升沿,你就要求Z1驱动为高puls每当{{1}}发生变化但不是上升沿(包括Z-> 1,1-> 0,Z-> 0转变)。

这在FPGA中通常是不可能的,因此不可合成,因此工具抱怨。

答案 1 :(得分:3)

您的所有流程都存在一些问题,但编译器可能不会像test中那样大声抱怨它们。

speed_proc中,您正在使rising_edge()符合资格并进行额外比较。我建议改为嵌套if语句(将比较if放在rising_edge() if中。您还尝试使用2个独立的时钟为同一寄存器提供时钟。你可能需要找到一种不同的方法来做到这一点。

freq_proc中,只有你的变量增量位于rising_edge()支票内 - 我没有理由不将其余内容放入其中。它更标准,通常应该减少意外问题。

test中,正如@Chiggs所提到的,你想要完成的是无效的。如果您想在每个时钟周期切换Z1,您可以执行以下操作:

if rising_edge(puls) then
  Z1 <= not Z1;
end if;

(对于模拟,您需要初始化Z1以查看有效输出。)