【发布时间】:2023-03-22 15:08:01
【问题描述】:
我正在尝试在 VHDL 中实现 Booth 算法,已经运行了“纸质测试”并且代码显然可以工作,但是当我模拟它时,我没有得到想要的结果......然后我替换了代码做一个 A-Shift 来测试,但是当我模拟我的代码时,我得到了这个错误:
错误(可抑制):(vsim-3601) 在 180 ns 时达到迭代限制 5000。
我只是替换这一行: P := STD_LOGIC_VECTOR(unsigned(P) SRA 1);
为此: P := P(16) & P(16 downto 1);
这是atm的代码:
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 并且没有错误。请提供Minimal, Complete, and Verifiable example(包括您的测试台)。未验证您的算法。
-
这个模块内部没有可以运行5000次迭代的循环,所以这个错误是由于与这个模块之外的代码交互而产生的。请按照 user1155120 的建议制作一个最小、完整和可验证的示例。
标签: algorithm iteration vhdl limit