賽靈思正在推斷我寫的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設計中使用鎖存器,因爲它們可能導致 時序問題。
您的n語句優先級編碼器/多路複用器nstate_s不完整。您覆蓋條件值「011」,「100」,「101」,「110」和「111」,並具有一個空語句的else語句。這意味着對於條件值「000」,「001」和「010」,您不會在nstate_s定義鎖存器上驅動不同的值。更改else的情況來驅動cstate_s的當前值。 else null在cstate_s寄存器中是多餘的,它保存在trig的上升沿設置的值。您應該可以在不使用空語句的情況下完成設計生涯。 – user1155120
合成中使用的唯一值是二進制表示值('0','1','L'和'H'映射爲'0'和'1',而'Z'用於推斷高阻抗狀態。其他(或其他選擇的情況)應該覆蓋合成的二進制值以及所有未指定的值以進行模擬。這兩種用法不兼容。參見IEEE Std 1076-2008 16.8.2標準邏輯類型的解釋。合成中忽略指定金屬值(U','X','W'和' - ')的語句。 – user1155120