我試圖在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;
查找並消除組合循環。 –
循環有效,當我執行上述更改時,問題就開始了。 –
我將代碼轉換爲使用軟件包numeric_std而不是Synopsys的std_logic_unsigned進行了分析,闡述和模擬了您的代碼。如果迭代限制設置爲5000並且沒有錯誤。請提供[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)(包括您的測試臺)。沒有驗證你的算法。 – user1155120