2017-03-31 65 views
1

賽靈思正在推斷我寫的VHDL代碼的鎖存器。我查了可能的原因,發現這通常是由於不完整的if或case語句。我已經經歷了,並確保包括其他人和別人發言時,但我仍然收到警告。我相信這也影響到我正在研究的另一個項目,所以我想了解爲什麼會出現這種情況。賽靈思VHDL閂鎖警告故障排除

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity state_machine is 
    port(trig, en: in std_logic; cstate,nstate: out std_logic_vector(0 to 2)); 
end state_machine; 

architecture Behavioral of state_machine is 
signal cstate_s,nstate_s: std_logic_vector(0 to 2); 

begin 
cstate <= cstate_s; 
nstate <= nstate_s; 

process(en, cstate_s) 
begin 
    if en = '1' then 
     nstate_s <= "111"; 
     if cstate_s = "111" then 
      nstate_s <= "011"; 
     elsif cstate_s = "011" then 
      nstate_s <= "100"; 
     elsif cstate_s = "100" then 
      nstate_s <= "101"; 
     elsif cstate_s = "101" then 
      nstate_s <= "110"; 
     elsif cstate_s = "110" then 
      nstate_s <= "111"; 
     else 
      null; 
     end if; 
    else 
     null; 
    end if; 
end process; 

process(trig, nstate_s) 
begin 
    if rising_edge(trig) then 
     cstate_s <= nstate_s; 
    else 
     null; 
    end if; 
end process; 

end Behavioral; 

警告:XST:737 - 找到3位鎖存器信號。鎖存器可以從不完整的情況或者如果報表中生成 。我們不推薦在FPGA/CPLD設計中使用鎖存器,因爲它們可能導致 時序問題。

+1

您的n語句優先級編碼器/多路複用器nstate_s不完整。您覆蓋條件值「011」,「100」,「101」,「110」和「111」,並具有一個空語句的else語句。這意味着對於條件值「000」,「001」和「010」,您不會在nstate_s定義鎖存器上驅動不同的值。更改else的情況來驅動cstate_s的當前值。 else null在cstate_s寄存器中是多餘的,它保存在trig的上升沿設置的值。您應該可以在不使用空語句的情況下完成設計生涯。 – user1155120

+1

合成中使用的唯一值是二進制表示值('0','1','L'和'H'映射爲'0'和'1',而'Z'用於推斷高阻抗狀態。其他(或其他選擇的情況)應該覆蓋合成的二進制值以及所有未指定的值以進行模擬。這兩種用法不兼容。參見IEEE Std 1076-2008 16.8.2標準邏輯類型的解釋。合成中忽略指定金屬值(U','X','W'和' - ')的語句。 – user1155120

回答

3

對於存在時合成的組合過程要被合成的無閂鎖,必須有beginend process;其中過程的所有輸出未分配之間沒有路徑。這被稱爲完成分配。該過程的輸出是在其內任何地方分配的任何signal

你有這樣的路徑。當執行任何包含null語句的路徑時,您的第一個進程(nstate_s)的輸出未分配給。因此,你將得到合成鎖存器。只有null聲明沒有意義。如果您真的不在乎在這些路徑中爲您的輸出分配了什麼值,請將輸出分配給'-',這意味着不在意VHDL中的

順便說一句(假設trig是一個時鐘),你的第二個過程是不組合(這是順序),所以你不必完全服從分配;你的else分支是不必要的。