VHDL综合

VHDL综合,vhdl,Vhdl,我有一个关于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 st

我有一个关于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;
IEEE库;
使用IEEE.std_logic_1164.ALL;
使用IEEE.numeric_std.ALL;
实体Q3a是
端口(A_MSB,B_MSB,A_LSB,B_LSB:在标准逻辑向量(3到0)中):=“0000”;
SEL:在标准逻辑中:='0';
执行:执行标准逻辑:='0';
输出:输出标准逻辑向量(7到0):=“00000000”);
最终实体Q3a;
Q3a的架构是
信号A,B,和,B_负:标准逻辑向量(8到0);
开始

A在您的设计中有一个mux,正如Brian所说,
A
的逻辑简化为
A在您的设计中有一个mux,正如Brian所说,
A
的逻辑简化为
A在进行更改后,我有以下架构:

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;
Q3a的架构行为是 信号A,B,和,B_负:标准逻辑向量(8到0); 开始
A进行更改后,我有以下体系结构:

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;
Q3a的架构行为是 信号A,B,和,B_负:标准逻辑向量(8到0); 开始
A如果我理解正确,您需要一个加法器用于A+b和A+b_neg,以及一个在b或b_neg之间选择的mux。 你没有明确地写出来,你需要这样写

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;
Q3a的架构行为是 信号a,b,和,b_负:标准逻辑向量(8到0); 信号b_addr:std_逻辑_向量(8到0); 开始
a如果我理解正确,您需要一个加法器用于a+b和a+b_neg,以及一个在b或b_neg之间选择的mux。 你没有明确地写出来,你需要这样写

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;
Q3a的架构行为是 信号a,b,和,b_负:标准逻辑向量(8到0); 信号b_addr:std_逻辑_向量(8到0); 开始
a
a
的巨型表达式与
a井有何不同?它在_MSB(3)和_MSB(2D---)之间添加了一个位。它还使用mux检查_MSB(3)是否是“1”或“0”,以标识输入是neg还是pos。然后相应地更改溢出/进位的附加位。是的,但除非我遗漏了某些内容,否则添加的位与我的中的相同。那么,我遗漏了什么?(除元值外)。lol:)确实是。。。。非常感谢。你也能对合成添加一些评论吗?除了一个过于复杂的表达式可能会使乐观主义者困惑之外,没有其他评论,这可能发生在这里。比较简化前后的资源使用情况。(我会在模拟中再次检查减法是否在所有情况下都正确。我觉得B和B_Neg应该更加对称。)a的
a
的巨大表达式与
a有何不同呢?它在a_MSB(3)和a_MSB(2d)之间加了一点。它还使用mux检查a_MSB(3)是否正确是“1”或“0”,以标识输入是neg还是pos。然后相应地更改溢出/进位的附加位。是的,但除非我遗漏了某些内容,否则添加的位与我的中的相同。那么,我遗漏了什么?(除元值外)。lol:)确实是。。。。非常感谢。你也能对合成添加一些评论吗?除了一个过于复杂的表达式可能会使乐观主义者困惑之外,没有其他评论,这可能发生在这里。比较简化前后的资源使用情况。(我会在模拟中再次检查你的减法在所有情况下都正确。我觉得B和B_Neg应该更对称。)