首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

FPGA VHDL 警告:推測出鎖存器而非觸發器

     編輯:程式設計綜合問答

現象

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 others
  • 時序邏輯中未用 rising_edge(clk) 而是用電平判斷

為何註釋該行警告消失?

該行代碼導致某條信號在組合邏輯中**未被完全賦值**(如只在條件成立時賦值,否則保持原值),綜合器推測鎖存器。註釋後,邏輯路徑變化,可能該信號被其他邏輯完全覆蓋,或直接被優化掉,警告自然消失。**但這不代表問題解決**,僅是掩蓋了症狀。

正確修復方法

1. 確保組合邏輯全覆蓋

-- 錯誤:缺少 else
if (cond = '1') then
    sig_out <= '1';
end if;

-- 正確:補全 else
if (cond = '1') then
    sig_out <= '1';
else
    sig_out <= '0'; -- 或保持預設值
end if;

2. 時序邏輯必須用邊沿觸發

-- 錯誤:電平敏感,易推測鎖存器
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;

3. Case 語句加 when others

case sel is
    when "00" => out <= a;
    when "01" => out <= b;
    when others => out <= '0'; -- 必須有
end case;

建議流程

  1. **定位警告行**:綜合報告給出具體行號與信號名。
  2. **檢查該信號賦值邏輯**:是否存在分支不全、電平敏感判斷。
  3. **補全缺失分支或改為邊沿觸發**。
  4. **重新綜合**,確認警告消失且時序分析通過。

總結

警告指出**推測出鎖存器**,根因是組合邏輯未完全指定輸出或時序邏輯寫法不當。**註釋代碼只是掩蓋症狀**,必須從邏輯完整性入手修復。優先檢查 if/else、case、時序邏輯邊沿觸發寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved