我想用以下代码描述一个二进制到bcd转换器:
`图书馆 IEEE; 使用 IEEE.STD_LOGIC_1164.ALL; 使用 IEEE.NUMERIC_STD.ALL;
实体主要是 港口 ( BIN :在 STD_LOGIC_VECTOR 中(7 降到 0); BCDu : out STD_LOGIC_VECTOR(3 降到 0); BCDd : 输出 STD_LOGIC_VECTOR(3 降到 0); BCDc :输出 STD_LOGIC_VECTOR(3 降至 0) ); 最终实体 MAIN;
MAIN 的架构行为是 开始 进程(BIN) 变量 aux :natural := to_integer(unsigned(BIN)); 变量 uni : 自然 := 0; 变量 dec : 自然 := 0; 变量 cent : 自然 := 0;
begin
if(aux < 256) then
while(aux > 99) loop
aux := aux - 100;
cent := cent + 1;
end loop;
while(aux > 9) loop
aux := aux - 10;
dec := dec + 1;
end loop;
end if;
uni := aux;
BCDu <= std_logic_vector(to_unsigned(uni, 4));
BCDd <= std_logic_vector(to_unsigned(dec, 4));
BCDc <= std_logic_vector(to_unsigned(cent, 4));
end process;
最终架构行为; ` 但出现如下错误: “循环已经迭代了 64 次。使用“set -loop_iteration_limit XX”迭代更多。”
我不知道为什么会出现这个错误,我有两次,总共有7次迭代
VHDL 是一种硬件描述语言,而不是一种过程语言。在模拟中,循环的步骤是逐一执行的,而在硬件上,循环是展开的,使得整个事情是并行计算的。在您的情况下,循环可能必须有专用于 x 从 0 到 255 的所有可能值的门,因为综合引擎不够智能,无法意识到循环最多只能运行 7 次。这可能可以通过在另一个变量中预先计算循环迭代来解决。类似的解决方案是使用除法和模来完全消除循环。
但是,最好的解决方案是使用 7 个链式单步 BCD 转换模块,无需经过任何流程即可最大程度地减少所用门的数量。在每个模块中,如果 4 位输入至少为 5,则将 3 添加到输出,并且其输出移位一位,以便在下一阶段之前引入原始输入的一个新位。因此,第一个模块对 3 位进行操作以产生 4 位,并且仅当前一个模块至少有 3 位之后才使用该模块。 5 和 3 是其中的特殊数字,因为在下一次移位之后,5 变成 10,3 变成使 10 等于 16 所需的额外 6,即 4 位数字(十六进制)的基数。加 3 将额外的 10 带到下一个数字,因为二进制 16 在下一个数字中变成 1。