VHDL 代碼第 177 行未註釋時出現警告,註釋後警告消失。警告提示綜合工具推測出了**鎖存器**,可能導致時序錯誤。信號定義:
SIGNAL DCM_spd_in : std_logic_vector (7 DOWNTO 0);
PORT (spi_rddata : out std_logic_vector(7 DOWNTO 0));
VHDL 中,**process 或併發賦值若未對所有輸入組合指定輸出**,綜合器為保持輸出值會推測**鎖存器**(Level-sensitive),而非期望的**觸發器**(Edge-triggered)。常見原因:
if 缺少 else 分支case 缺少 when othersrising_edge(clk) 而是用電平判斷該行代碼導致某條信號在組合邏輯中**未被完全賦值**(如只在條件成立時賦值,否則保持原值),綜合器推測鎖存器。註釋後,邏輯路徑變化,可能該信號被其他邏輯完全覆蓋,或直接被優化掉,警告自然消失。**但這不代表問題解決**,僅是掩蓋了症狀。
-- 錯誤:缺少 else
if (cond = '1') then
sig_out <= '1';
end if;
-- 正確:補全 else
if (cond = '1') then
sig_out <= '1';
else
sig_out <= '0'; -- 或保持預設值
end if;
-- 錯誤:電平敏感,易推測鎖存器
process (clk)
begin
if (clk = '1') then -- 錯!
q <= d;
end if;
end process;
-- 正確:上升沿觸發
process (clk)
begin
if rising_edge(clk) then
q <= d;
end if;
end process;
when otherscase sel is
when "00" => out <= a;
when "01" => out <= b;
when others => out <= '0'; -- 必須有
end case;
警告指出**推測出鎖存器**,根因是組合邏輯未完全指定輸出或時序邏輯寫法不當。**註釋代碼只是掩蓋症狀**,必須從邏輯完整性入手修復。優先檢查 if/else、case、時序邏輯邊沿觸發寫法。