Vhdl 通用全加器代码

Vhdl generic fulladder code

这里是级联全加器的通用代码。

问题是全加器的结果出现一个事件延迟(我的意思是当我更改输入 1 和输入 2 时,先前输入的结果出现)。我知道如果我在没有进程的情况下编写代码,则不会发生这种延迟,但我需要编写一个通用的全加器,并且没有办法在没有进程和 for 循环的情况下编写通用代码。

所以我想问是否有人可以帮助我修复代码,以便输出可以立即显示结果!!!

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

entity adders is
    generic(
        numberOfInputs : Integer := 4
    ); port(
        enable  : in std_logic;
        cin     : in std_logic;
        inputs1 : in std_logic_vector(numberOfInputs-1 downto 0);
        inputs2 : in std_logic_vector(numberOfInputs-1 downto 0);
        outputs : out std_logic_vector(numberOfInputs downto 0)
    );
end entity adders;

architecture Generic_Adder of adders is
    signal Couts:std_logic_vector(numberOfInputs downto 0);
    signal temp1:std_logic_vector(numberOfInputs-1 downto 0);
    signal temp2:std_logic_vector(numberOfInputs-1 downto 0);
    signal temp3:std_logic_vector(numberOfInputs-1 downto 0);

begin

    temp2<=inputs1;
    temp3<=inputs2;  
    couts(0)<= cin;

    Sum:process(temp2,temp3,cin,enable,Couts) is
    begin
        for count in 0 to numberOfInputs-1 loop
            temp1(count) <= (temp2(count) xor temp3(count));
            outputs(count) <= Couts(count) xor temp1(count);
            Couts(count+1) <= (temp2(count) and temp3(count)) or(couts(count) and temp1(count));--cout(count) is the previuos cout becuase the first cout is cin
        end loop;
    end process;

    outputs(numberOfInputs) <= Couts(numberOfInputs);
end Generic_Adder;

您可以使用生成语句在流程语句之外编写迭代代码。它可能看起来像这样:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

entity adders is
    generic(
        numberOfInputs : Integer := 4
    ); port(
        enable  : in std_logic;
        cin     : in std_logic;
        inputs1 : in std_logic_vector(numberOfInputs-1 downto 0);
        inputs2 : in std_logic_vector(numberOfInputs-1 downto 0);
        outputs : out std_logic_vector(numberOfInputs downto 0)
    );
end entity adders;

architecture Generic_Adder of adders is
    signal carry  : std_logic_vector(numberOfInputs     downto 0);
    signal result : std_logic_vector(numberOfInputs - 1 downto 0);
begin

    carry(0) <= cin;

    for I in 0 to numberOfInputs-1 generate
    begin
        result(I) <= inputs1(I) xor inputs2(I) xor carry(I);
        carry(I+1) <= 
            (inputs1(I) and inputs2(I)) or 
            (inputs1(I) and carry(I))   or
            (inputs2(I) and carry(I));
    end generate;

    outputs <= carry(numberOfInputs) & result;

end Generic_Adder;

进程中使用了temp1信号,但敏感列表中没有。

因此,temp1 中的更改不会触发流程的重新评估,并且 temp1 的新值不会反映在其他驱动信号中,直到另一个信号触发重新评估,因此您很可能体验 "delay".

通过将 temp1 添加到敏感列表来解决此问题,或者按照 Bill Lynch 的建议重写,或者如果您使用的是 VHDL-2008 和兼容的编译器,则敏感列表可以是 process (all) ...

此外,"longest static prefix"的VHDL问题是由于进程内循环驱动outputs和进程外outputs(numberOfInputs)造成的。结果是 outputs(numberOfInputs) 有一个来自进程的驱动程序 'U' 和一个进程外的 Couts(numberOfInputs) 驱动程序。基于 std_logic 解析函数的结果值是 ´'U'´ 的值。

解决此问题的一种方法是在保留进程时将 outputs(numberOfInputs) 移动到进程内部,例如:

        ...
    end loop;
    outputs(numberOfInputs) <= Couts(numberOfInputs);
end process;

这个答案 有更多关于 VHDL 最长静态前缀的信息。