2016-05-29 54 views
-1

我試圖在VHDL中實現Booth算法,已經運行「紙張測試」,代碼顯然可以工作,但是當我模擬它時,我不是得到慾望的結果...然後我替換代碼做一個A-Shift來測試,但是當我模擬我的代碼時,我得到這個錯誤:當我試圖模擬我的代碼時,「達到了迭代限制」

錯誤(可壓縮):(vsim-3601)迭代在時間180 ns達到限制5000。

我只是替換這一行:P := STD_LOGIC_VECTOR(unsigned(P) SRA 1);

對於這一點:P := P(16) & P(16 downto 1);

這是代碼大氣壓:

LIBRARY IEEE; 
    USE IEEE.STD_LOGIC_1164.ALL; 
    USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY algor_booth IS 
    PORT(oper1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
     oper2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
     sel : IN STD_LOGIC; 
     result : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) 
      ); 
END ENTITY; 

ARCHITECTURE algor OF algor_booth IS 
BEGIN 
    PROCESS (sel) 
     VARIABLE A, S, P: STD_LOGIC_VECTOR(16 DOWNTO 0); 
     VARIABLE Ma2: STD_LOGIC_VECTOR(7 DOWNTO 0); 
     --VARIABLE flag: STD_LOGIC; 
    BEGIN 

     IF sel = '0' THEN 
      Ma2 := (NOT oper1) + 1; 
      A := oper1 & "00000000" & '0'; 
      S := Ma2 & "00000000" & '0'; 
      P := "00000000" & oper2 & '0'; 
     ELSE 
      --flag := '0'; 
      FOR i IN 1 TO 8 LOOP 
       IF P(1 DOWNTO 0) = "01" THEN 
        P := P + A; 
        --flag := '0'; 
        --P(17) := flag; 
       ELSIF P(1 DOWNTO 0) = "10" THEN 
        P := P + S; 
        --flag := '1'; 
        --P(17) := flag; 
       END IF; 
       --P(17) := flag; 
       P := P(16) & P(16 downto 1); 
       --P(17) := flag; 
      END LOOP; 
      result <= P(16 DOWNTO 1); 

     END IF; 
    END PROCESS; 
END algor; 
+0

查找並消除組合循環。 –

+0

循環有效,當我執行上述更改時,問題就開始了。 –

+1

我將代碼轉換爲使用軟件包numeric_std而不是Synopsys的std_logic_unsigned進行了分析,闡述和模擬了您的代碼。如果迭代限制設置爲5000並且沒有錯誤。請提供[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)(包括您的測試臺)。沒有驗證你的算法。 – user1155120

回答

-1

嘗試了很多之後,就改變了這一行:P := P(16) & P(16 downto 1);

爲這一個:P(16 downto 0) := P(17 downto 1);

而問題解決了!

這裏是固定的代碼:

LIBRARY IEEE; 
    USE IEEE.STD_LOGIC_1164.ALL; 
    USE IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY algor_booth IS 
    PORT(oper1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
     oper2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
     sel : IN STD_LOGIC; 
     result : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) 
      ); 
END ENTITY; 

ARCHITECTURE algor OF algor_booth IS 
BEGIN 
    PROCESS (oper1, oper2) 
     VARIABLE A, S, P: STD_LOGIC_VECTOR(17 DOWNTO 0); 
     VARIABLE Ma2: STD_LOGIC_VECTOR(7 DOWNTO 0); 
     VARIABLE flag: STD_LOGIC; 
    BEGIN 
      Ma2 := (NOT oper1) + 1; 
      A := '0' & oper1 & "00000000" & '0'; 
      S := '0' & Ma2 & "00000000" & '0'; 
      P := '0' & "00000000" & oper2 & '0'; 
      flag := '0'; 

      FOR i IN 1 TO 8 LOOP 
       IF (P(1) = '0' AND P(0) = '1') THEN 
        flag := '0'; 
        P(17) := flag; 
          P := P + A; 
       ELSIF (P(1) = '1' AND P(0) = '0') THEN 
        flag := '1'; 
        P(17) := flag; 
          P := P + S; 
       END IF; 
       P(17) := flag; 
       P(16 downto 0) := P(17 downto 1); 
       P(17) := flag; 
      END LOOP; 
      result <= P(16 DOWNTO 1); 
    END PROCESS; 
END algor; 

感謝您的幫助傢伙!

+2

看看你的代碼的兩個版本,沒有什麼解釋這個問題或修復。查看一下Modelsim用戶手冊,我們發現這是一個零時間循環,意味着您看不見的測試平臺與您的設計模型之間的交互,您已經調整了該模型以消除該問題。如果沒有Minimal,Complete和Verifiable示例演示問題和解決方案,其他問題和答案對其他Stackoverflow讀者無用。 – user1155120

相關問題