【问题标题】:VHDL - SynthesisVHDL - 综合
【发布时间】:2016-01-23 16:26:00
【问题描述】:

我有一个关于 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

【问题讨论】:

  • 您对A 的巨大表达与A &lt;= A_MSB(3) &amp; A_MSB &amp; A_LSB; 有何不同?
  • 好吧,它在 A_MSB(3) 和 A_MSB (2 D---) 之间添加了一点。它还使用多路复用器来检查 A_MSB (3) 是“1”还是“0”来识别如果输入为 neg 或 pos。则相应地更改溢出/进位的附加位。
  • 是的,但除非我遗漏了什么,否则添加的位与 A_MSB(3) 相同……与我的完全一样。那么,我错过了什么? (元值除外)。
  • 大声笑 :) 确实是……谢谢。你也可以添加任何关于合成的 cmet 吗?
  • 无,只是过于复杂的表达式会使优化器感到困惑,这可能发生在这里。比较简化前后的资源使用情况。 (我会在模拟中仔细检查你的减法在所有情况下都能正常工作。我觉得 B 和 B_Neg 应该更对称。)

标签: vhdl


【解决方案1】:

如果我理解正确,您需要一个用于 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;

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您的设计中有一个多路复用器,正如 Brian 指出的那样,A 的逻辑被简化为没有多路复用器的 A &lt;= A_MSB(3) &amp; A_MSG &amp; A_LSB

    您对B_neg 的逻辑是错误的,因为它只会在B 为正时给您-B。如果你使用B_neg &lt;= std_logic_vector(signed(not(B))+1);你会有不同的合成结果。

    应该有 3 个加法器,一个用于B_neg,一个用于A+B,一个用于A+B_neg。但是,我怀疑由于您使用常量 '0' 定义 B_neg 的方式,合成器比您更聪明,并将 B_neg 加法器分成 2 个较小的加法器。

    您不必将B_neg 定义为“非 B + 1”,即二进制补码一元减法定义。为了可读性,最好使用B_neg &lt;= std_logic_vector(-signed(B));SUM &lt;= std_logic_vector(signed(A)+signed(B)) when SEL = '0' else std_logic_vector(signed(A)-signed(B));

    【讨论】:

      【解决方案3】:

      进行更改后,我有以下架构:

      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 和两个加法器的原因吗?更像这样的东西:

      这只是综合选择吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多