關於VHDL中Loop State error...loop must terminate within 10,000 iterations錯誤解決方法

robot_editor發表於2024-05-11

關於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迴圈就會發生錯誤。所以平時應該養成程式碼二的程式設計習慣。

相關文章