【发布时间】:2015-09-08 09:30:52
【问题描述】:
我正在尝试开发一个 8 位二进制到 BCD VHDL 模块,但赛灵思套件正在优化我的 Bin_in 信号以始终接地。我发现了其他几个提到类似问题的线程(在不同的编码上下文中),但提供的答案似乎涉及未声明输出的完整真值表的算法。我还找到了一个 8 位到 BCD 转换器的例子,它的算法与我的相似。如果我正确开发了我的代码,则该过程应该在Bin_in 输入更改时运行,所以我不明白为什么这些工具会优化它。非常感谢任何信息或帮助。
这是来自综合的警告:
WARNING:Xst:647 - Input <Bin_in<7:1>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.numeric_std.ALL;
entity B8_to_4BCD is
port (Bin_in : in std_logic_vector (7 downto 0);
BCD0, BCD1, BCD2 : out std_logic_vector (3 downto 0)
);
end entity B8_to_4BCD;
architecture Behavioral of B8_to_4BCD is
begin
--Sequential code follows, runs if Bin_in changes
process (Bin_in)
--Holders for Bin_in and output BCD
variable input : std_logic_vector (7 downto 0);
variable output : std_logic_vector (11 downto 0);
begin
input := Bin_in; --Assign Bin_in to input
output := (others => '0'); --Set output to all zeroes
for I in 1 to 8 loop
--Check ones for greater than or equal to 5
if output(3 downto 0) >= "0101" then
output(3 downto 0) := output(3 downto 0) + "0011";
--Check tens for greater than or equal to 5
elsif output(7 downto 4) >= "0101" then
output(7 downto 4) := output(7 downto 4) + "0011";
--Check hundreds for greater than or equal to 5
elsif output(11 downto 8) >= "0101" then
output(11 downto 8) := output(11 downto 8) + "0011";
else
end if;
output := output(11 downto 1) & input(7); --Shift output left one and move input(7) into LSB
input := input(6 downto 0) & '0'; --Shift input left one and pad with zero
end loop;
BCD0 <= output(3 downto 0);
BCD1 <= output(7 downto 4);
BCD2 <= output(11 downto 8);
end process;
end Behavioral;
【问题讨论】:
-
在仿真中能正常工作吗?
-
它没有。它输出所有三个 BCD 输出的值,但它们不正确(BCD2 和 BCD1 始终为零,BCD0 为零或一)。
-
你不能使用
elsif,因为每个BCD数字都是相互独立的,但是你在描述一个优先级树。 -
除了 Paebbels 注释指出每个 BCD 数字的评估应该是独立的,输出不正确的移位应该是
output := output(10 downto 0) & input(7); --shift output left one and move input(7) into lsb。完成这两件事后,您的模型可以正确模拟并且应该可以正确合成。 -
感谢大家的cmets,非常有帮助的反馈。