VHDL - 综合
VHDL - Synthesis
我有一个关于 VHDL 综合的问题,希望你们中的一些人能帮助我。我有以下加法器模型:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY Q3a IS
PORT (A_MSB,B_MSB,A_LSB,B_LSB : IN std_logic_vector(3 DOWNTO 0):="0000";
SEL : IN std_logic:='0';
CARRY : OUT std_logic:='0';
OUTPUT : OUT std_logic_vector(7 DOWNTO 0):="00000000");
END ENTITY Q3a;
ARCHITECTURE behavioral OF Q3a IS
SIGNAL A,B,SUM,B_NEG : std_logic_vector(8 DOWNTO 0);
BEGIN
A <= (A_MSB(3) & '0' & A_MSB(2 DOWNTO 0) & A_LSB) WHEN A_MSB(3) = '0' ELSE
(A_MSB(3) & '1' & A_MSB(2 DOWNTO 0) & A_LSB);
B <= (B_MSB(3) & '0' & B_MSB(2 DOWNTO 0) & B_LSB) WHEN B_MSB(3) = '0' ELSE
(B_MSB(3) & '1' & B_MSB(2 DOWNTO 0) & B_LSB);
B_NEG <= std_logic_vector(signed(not(B_MSB(3) & '0' & B_MSB(2 DOWNTO 0) & B_LSB))+1);
SUM <= std_logic_vector(signed(A)+ signed(B)) WHEN SEL = '0' ELSE
std_logic_vector(signed(A)+ signed(B_NEG));
CARRY <= SUM(7);
OUTPUT <= SUM(8) & SUM(6 DOWNTO 0);
END ARCHITECTURE behavioral;
该模型运行良好,但存在一些小问题。当我看它时,虽然我看到 3 个多路复用器,一个用于 A,一个用于 B,一个用于加法器的输入选择。当我在 Quartus II 上使用 RTL 查看器打开模型时。我明白了:
在我看来,这看起来像是 4 个加法器和一个多路复用器。任何人都可以与我分享一些关于这方面的信息吗?
干杯
D
您的设计中只有一个多路复用器,正如 Brian 指出的那样,A
的逻辑已简化为 A <= A_MSB(3) & A_MSG & A_LSB
,它没有多路复用器。
您对 B_neg
的逻辑是错误的,因为它只会在 B
为正时给您 -B
。如果你使用 B_neg <= std_logic_vector(signed(not(B))+1);
你会得到不同的合成结果。
应该有 3 个加法器,一个用于 B_neg
,一个用于 A+B
,一个用于 A+B_neg
。但是,我怀疑由于您使用常量 '0'
定义 B_neg
的方式,合成器比您更聪明并将 B_neg
加法器分成 2 个较小的加法器。
您不必将 B_neg
定义为 "not B + 1",即二进制补码一元负定义。为了便于阅读,最好使用 B_neg <= std_logic_vector(-signed(B));
或 SUM <= std_logic_vector(signed(A)+signed(B)) when SEL = '0' else std_logic_vector(signed(A)-signed(B));
进行更改后,我的架构如下:
ARCHITECTURE behavioral OF Q3a IS
SIGNAL A,B,SUM,B_NEG : std_logic_vector(8 DOWNTO 0);
BEGIN
A <= (A_MSB(3) & A_MSB & A_LSB);
B <= (B_MSB(3) & B_MSB & B_LSB);
B_NEG <= std_logic_vector(-signed(B));
SUM <= std_logic_vector(signed(A)+ signed(B)) WHEN SEL = '0' ELSE
std_logic_vector(signed(A)+ signed(B_NEG));
CARRY <= SUM(7);
OUTPUT <= SUM(8) & SUM(6 DOWNTO 0);
END ARCHITECTURE behavioral;
RTL综合图已更改为:
就像乔纳森建议的那样。我知道它需要 1 个加法器用于 B_NEG,但是,但是他们有单独的加法器用于 A+B 和 A+B_NEG 后跟一个 Mux,而不是有一个 Mux 和两个加法器的原因吗?更像是这样的:
这只是综合选择吗?
如果我没理解错的话,您需要一个用于 a+b 和 a+b_neg 的加法器,以及一个在 b 或 b_neg 之间进行选择的多路复用器。
你没有明确写,你需要这样写
architecture behavioral of Q3a is
signal a,b,sum,b_neg : std_logic_vector(8 downto 0);
signal b_addr : std_logic_vector(8 downto 0);
begin
a <= (a_msb(3) & a_msb & a_lsb);
b <= (b_msb(3) & b_msb & b_lsb);
b_neg <= std_logic_vector(-signed(b));
b_addr <= b when sel = '0' else b_neg;
sum <= std_logic_vector(signed(a)+ signed(b_addr));
carry <= sum(7);
output <= sum(8) & sum(6 downto 0);
end architecture behavioral;
希望对你有帮助。
我有一个关于 VHDL 综合的问题,希望你们中的一些人能帮助我。我有以下加法器模型:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY Q3a IS
PORT (A_MSB,B_MSB,A_LSB,B_LSB : IN std_logic_vector(3 DOWNTO 0):="0000";
SEL : IN std_logic:='0';
CARRY : OUT std_logic:='0';
OUTPUT : OUT std_logic_vector(7 DOWNTO 0):="00000000");
END ENTITY Q3a;
ARCHITECTURE behavioral OF Q3a IS
SIGNAL A,B,SUM,B_NEG : std_logic_vector(8 DOWNTO 0);
BEGIN
A <= (A_MSB(3) & '0' & A_MSB(2 DOWNTO 0) & A_LSB) WHEN A_MSB(3) = '0' ELSE
(A_MSB(3) & '1' & A_MSB(2 DOWNTO 0) & A_LSB);
B <= (B_MSB(3) & '0' & B_MSB(2 DOWNTO 0) & B_LSB) WHEN B_MSB(3) = '0' ELSE
(B_MSB(3) & '1' & B_MSB(2 DOWNTO 0) & B_LSB);
B_NEG <= std_logic_vector(signed(not(B_MSB(3) & '0' & B_MSB(2 DOWNTO 0) & B_LSB))+1);
SUM <= std_logic_vector(signed(A)+ signed(B)) WHEN SEL = '0' ELSE
std_logic_vector(signed(A)+ signed(B_NEG));
CARRY <= SUM(7);
OUTPUT <= SUM(8) & SUM(6 DOWNTO 0);
END ARCHITECTURE behavioral;
该模型运行良好,但存在一些小问题。当我看它时,虽然我看到 3 个多路复用器,一个用于 A,一个用于 B,一个用于加法器的输入选择。当我在 Quartus II 上使用 RTL 查看器打开模型时。我明白了:
在我看来,这看起来像是 4 个加法器和一个多路复用器。任何人都可以与我分享一些关于这方面的信息吗? 干杯 D
您的设计中只有一个多路复用器,正如 Brian 指出的那样,A
的逻辑已简化为 A <= A_MSB(3) & A_MSG & A_LSB
,它没有多路复用器。
您对 B_neg
的逻辑是错误的,因为它只会在 B
为正时给您 -B
。如果你使用 B_neg <= std_logic_vector(signed(not(B))+1);
你会得到不同的合成结果。
应该有 3 个加法器,一个用于 B_neg
,一个用于 A+B
,一个用于 A+B_neg
。但是,我怀疑由于您使用常量 '0'
定义 B_neg
的方式,合成器比您更聪明并将 B_neg
加法器分成 2 个较小的加法器。
您不必将 B_neg
定义为 "not B + 1",即二进制补码一元负定义。为了便于阅读,最好使用 B_neg <= std_logic_vector(-signed(B));
或 SUM <= std_logic_vector(signed(A)+signed(B)) when SEL = '0' else std_logic_vector(signed(A)-signed(B));
进行更改后,我的架构如下:
ARCHITECTURE behavioral OF Q3a IS
SIGNAL A,B,SUM,B_NEG : std_logic_vector(8 DOWNTO 0);
BEGIN
A <= (A_MSB(3) & A_MSB & A_LSB);
B <= (B_MSB(3) & B_MSB & B_LSB);
B_NEG <= std_logic_vector(-signed(B));
SUM <= std_logic_vector(signed(A)+ signed(B)) WHEN SEL = '0' ELSE
std_logic_vector(signed(A)+ signed(B_NEG));
CARRY <= SUM(7);
OUTPUT <= SUM(8) & SUM(6 DOWNTO 0);
END ARCHITECTURE behavioral;
RTL综合图已更改为:
就像乔纳森建议的那样。我知道它需要 1 个加法器用于 B_NEG,但是,但是他们有单独的加法器用于 A+B 和 A+B_NEG 后跟一个 Mux,而不是有一个 Mux 和两个加法器的原因吗?更像是这样的:
这只是综合选择吗?
如果我没理解错的话,您需要一个用于 a+b 和 a+b_neg 的加法器,以及一个在 b 或 b_neg 之间进行选择的多路复用器。 你没有明确写,你需要这样写
architecture behavioral of Q3a is
signal a,b,sum,b_neg : std_logic_vector(8 downto 0);
signal b_addr : std_logic_vector(8 downto 0);
begin
a <= (a_msb(3) & a_msb & a_lsb);
b <= (b_msb(3) & b_msb & b_lsb);
b_neg <= std_logic_vector(-signed(b));
b_addr <= b when sel = '0' else b_neg;
sum <= std_logic_vector(signed(a)+ signed(b_addr));
carry <= sum(7);
output <= sum(8) & sum(6 downto 0);
end architecture behavioral;
希望对你有帮助。