關於VHDL中Loop State error...loop must terminate within 10,000 iterations錯誤解決方法
首先比較下面兩段程式碼:(使用while迴圈描述偶校驗位產生電路)
程式碼一:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity parity_check is
port(
datain: in std_logic_vector(7 downto 0);
y: out std_logic
);
end parity_check;
architecture rtl of parity_check is
begin
process(datain)
variable tmp: std_logic:='0'; ;不同點
variable i: integer:= 0; ;不同點
begin
while i<8 loop
tmp:=tmp xor datain(i);
i:= i + 1;
end loop
y <= tmp;
end datain;
end rtl;
程式碼二:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity parity_check is
port(
datain: in std_logic_vector(7 downto 0);
y: out std_logic
);
end parity_check;
architecture rtl of parity_check is
begin
process(datain)
variable tmp: std_logic; ;不同點
variable i: integer; ;不同點
begin
tmp:='0'; ;不同點
i:=0; ;不同點
while i<8 loop
tmp:=tmp xor datain(i);
i:= i + 1;
end loop
y <= tmp;
end datain;
end rtl;
程式碼二在編碼過程中沒有報錯,而程式碼一卻在編譯過程中報錯,出現題目所述錯誤。同樣是賦值,原因到底在哪裡呢?
在程序中,說明語句只執行一次,即變數的宣告部分只執行一次,由於程式碼二中程序的主體部分開頭每次都對變數i
進行賦值操作,相當於每次都會對其進行清零操作,顯然迴圈過程不會發生錯誤;而程式碼一中,當程序被觸發的次數不止一次時,loop迴圈就會發生錯誤。所以平時應該養成程式碼二的程式設計習慣。