这是一个前瞻加法器吗?以及如何对其进行基准测试?
Is this a look ahead adder? And how to benchmark it?
我试图同时制作纹波进位和前瞻 N 位加法器,当我制作 N 位全加器时,我决定将它重新用于前瞻,但就是感觉不到适合我。
全加器:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FullAdder is
Port (
FA_A : in STD_LOGIC;
FA_B : in STD_LOGIC;
FA_Cin : in STD_LOGIC;
FA_S : out STD_LOGIC;
FA_Cout : out STD_LOGIC
);
end FullAdder;
architecture Behavior of FullAdder is
begin
FA_S <= FA_A XOR FA_B XOR FA_Cin ;
FA_Cout <= (FA_A AND FA_B) OR (FA_Cin AND FA_A) OR (FA_Cin AND FA_B);
end Behavior;
N 位块:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FullAdderNBits is
Generic( N : integer := 8 );
Port (
A : in STD_LOGIC_VECTOR(0 to N-1);
B : in STD_LOGIC_VECTOR(0 to N-1);
Cin : in STD_LOGIC;
S : out STD_LOGIC_VECTOR(0 to N-1);
Cout : out STD_LOGIC
);
end FullAdderNBits;
architecture Behavior of FullAdderNBits is
signal temp_B : STD_LOGIC_VECTOR(0 to N-1);
signal carries : STD_LOGIC_VECTOR(0 to N);
component FullAdder Port(
FA_A : in STD_LOGIC;
FA_B : in STD_LOGIC;
FA_Cin : in STD_LOGIC;
FA_S : out STD_LOGIC;
FA_Cout : out STD_LOGIC
);
end component;
begin
temp_B <= not B when Cin = '1' else B;
carries(N) <= Cin;
ForGenerate: for i in (N-1) downto 0 generate
UX: FullAdder port map(
A(i),
temp_B(i),
carries(i+1),
S(i),
carries(i)
);
end generate ForGenerate;
Cout <= carries(0);
end Behavior;
展望未来:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity LookAheadAdder is
Port (
LAA_A : in STD_LOGIC;
LAA_B : in STD_LOGIC;
LAA_Cin : in STD_LOGIC;
LAA_S : out STD_LOGIC;
LAA_Cout : out STD_LOGIC
);
end LookAheadAdder;
architecture Behavior of LookAheadAdder is
signal P : STD_LOGIC;
signal G : STD_LOGIC;
begin
P <= LAA_A xor LAA_B;
G <= LAA_A and LAA_B;
LAA_S <= P xor LAA_Cin;
LAA_Cout <= G or (P and LAA_Cin);
end Behavior;
相同的 N 位块,只是更改了组件:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity LookAheadNBitsAdder is
Generic( N : integer := 8 );
Port (
A : in STD_LOGIC_VECTOR(0 to N-1);
B : in STD_LOGIC_VECTOR(0 to N-1);
Cin : in STD_LOGIC;
S : out STD_LOGIC_VECTOR(0 to N-1);
Cout : out STD_LOGIC
);
end LookAheadNBitsAdder;
architecture Behavior of LookAheadNBitsAdder is
signal temp_B : STD_LOGIC_VECTOR(0 to N-1);
signal carries : STD_LOGIC_VECTOR(0 to N);
component LookAheadAdder Port(
LAA_A : in STD_LOGIC;
LAA_B : in STD_LOGIC;
LAA_Cin : in STD_LOGIC;
LAA_S : out STD_LOGIC;
LAA_Cout : out STD_LOGIC
);
end component;
begin
temp_B <= not B when Cin = '1' else B;
carries(N) <= Cin;
ForGenerate: for i in (N-1) downto 0 generate
UX: LookAheadAdder port map(
A(i),
temp_B(i),
carries(i+1),
S(i),
carries(i)
);
end generate ForGenerate;
Cout <= carries(0);
end Behavior;
我怎样才能更快地进行测试?我没有 FPGA,我可以用 ModelSim 做吗?我试过模拟,但看起来传播没有任何延迟,波只是从一个状态跳到另一个状态。
这两个都是写成组合逻辑的。这意味着输入将立即传播到输出。查看哪个是 "faster" 的唯一方法是引入一个时钟并开始计算时钟周期。您可以看到哪个会使用更少的芯片资源,但如果它们都是用组合逻辑(不是顺序的)编写的,那么在模拟中输出将是即时的。
我试图同时制作纹波进位和前瞻 N 位加法器,当我制作 N 位全加器时,我决定将它重新用于前瞻,但就是感觉不到适合我。
全加器:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FullAdder is
Port (
FA_A : in STD_LOGIC;
FA_B : in STD_LOGIC;
FA_Cin : in STD_LOGIC;
FA_S : out STD_LOGIC;
FA_Cout : out STD_LOGIC
);
end FullAdder;
architecture Behavior of FullAdder is
begin
FA_S <= FA_A XOR FA_B XOR FA_Cin ;
FA_Cout <= (FA_A AND FA_B) OR (FA_Cin AND FA_A) OR (FA_Cin AND FA_B);
end Behavior;
N 位块:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FullAdderNBits is
Generic( N : integer := 8 );
Port (
A : in STD_LOGIC_VECTOR(0 to N-1);
B : in STD_LOGIC_VECTOR(0 to N-1);
Cin : in STD_LOGIC;
S : out STD_LOGIC_VECTOR(0 to N-1);
Cout : out STD_LOGIC
);
end FullAdderNBits;
architecture Behavior of FullAdderNBits is
signal temp_B : STD_LOGIC_VECTOR(0 to N-1);
signal carries : STD_LOGIC_VECTOR(0 to N);
component FullAdder Port(
FA_A : in STD_LOGIC;
FA_B : in STD_LOGIC;
FA_Cin : in STD_LOGIC;
FA_S : out STD_LOGIC;
FA_Cout : out STD_LOGIC
);
end component;
begin
temp_B <= not B when Cin = '1' else B;
carries(N) <= Cin;
ForGenerate: for i in (N-1) downto 0 generate
UX: FullAdder port map(
A(i),
temp_B(i),
carries(i+1),
S(i),
carries(i)
);
end generate ForGenerate;
Cout <= carries(0);
end Behavior;
展望未来:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity LookAheadAdder is
Port (
LAA_A : in STD_LOGIC;
LAA_B : in STD_LOGIC;
LAA_Cin : in STD_LOGIC;
LAA_S : out STD_LOGIC;
LAA_Cout : out STD_LOGIC
);
end LookAheadAdder;
architecture Behavior of LookAheadAdder is
signal P : STD_LOGIC;
signal G : STD_LOGIC;
begin
P <= LAA_A xor LAA_B;
G <= LAA_A and LAA_B;
LAA_S <= P xor LAA_Cin;
LAA_Cout <= G or (P and LAA_Cin);
end Behavior;
相同的 N 位块,只是更改了组件:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity LookAheadNBitsAdder is
Generic( N : integer := 8 );
Port (
A : in STD_LOGIC_VECTOR(0 to N-1);
B : in STD_LOGIC_VECTOR(0 to N-1);
Cin : in STD_LOGIC;
S : out STD_LOGIC_VECTOR(0 to N-1);
Cout : out STD_LOGIC
);
end LookAheadNBitsAdder;
architecture Behavior of LookAheadNBitsAdder is
signal temp_B : STD_LOGIC_VECTOR(0 to N-1);
signal carries : STD_LOGIC_VECTOR(0 to N);
component LookAheadAdder Port(
LAA_A : in STD_LOGIC;
LAA_B : in STD_LOGIC;
LAA_Cin : in STD_LOGIC;
LAA_S : out STD_LOGIC;
LAA_Cout : out STD_LOGIC
);
end component;
begin
temp_B <= not B when Cin = '1' else B;
carries(N) <= Cin;
ForGenerate: for i in (N-1) downto 0 generate
UX: LookAheadAdder port map(
A(i),
temp_B(i),
carries(i+1),
S(i),
carries(i)
);
end generate ForGenerate;
Cout <= carries(0);
end Behavior;
我怎样才能更快地进行测试?我没有 FPGA,我可以用 ModelSim 做吗?我试过模拟,但看起来传播没有任何延迟,波只是从一个状态跳到另一个状态。
这两个都是写成组合逻辑的。这意味着输入将立即传播到输出。查看哪个是 "faster" 的唯一方法是引入一个时钟并开始计算时钟周期。您可以看到哪个会使用更少的芯片资源,但如果它们都是用组合逻辑(不是顺序的)编写的,那么在模拟中输出将是即时的。