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 最长静态前缀的信息。
这里是级联全加器的通用代码。
问题是全加器的结果出现一个事件延迟(我的意思是当我更改输入 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 最长静态前缀的信息。