我正在编写一个小程序,用于我的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
任何人都有线索?
亲切的问候。
答案 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
以查看有效输出。)