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