【问题标题】:VHDL port mapping problemVHDL端口映射问题
【发布时间】:2010-10-12 13:22:40
【问题描述】:

我对 VHDL 比较陌生。我正在尝试编写代码来使用全加器的组合进行无符号乘法。编译时将其传递给端口映射。我已经解决了第一张地图中的错误,但其他所有地图都给我带来了问题。

我得到相同的错误:“端口映射方面的表达式实际值必须是静态的”

这是我的代码。任何帮助表示赞赏。此外,如果您有基于查看我的代码的一般提示,我将不胜感激。

谢谢, 布兹基

library  ieee;
use  ieee.std_logic_1164.all;


entity fulladder is

     port (a, b, c: in std_logic;
           sout, cout: out std_logic);

     end fulladder;

architecture behav of fulladder is
begin

sout <= (a xor b) xor c ;
cout <= (a and b) or (c and (a xor b));

     end behav;

library ieee;
use ieee.std_logic_1164.all;

entity unsignedmult is 
port (a,b: in     std_logic_vector (3 downto 0);
       pro: out std_logic_vector (7 downto 0)); 

end unsignedmult;     


architecture synth of unsignedmult is

    --Declarations
    signal c1,c2,c3,c4,c5: std_logic_vector (3 downto 0);
    signal s1,s2,s3,s4: std_logic_vector (2 downto 0);
    component fulladder
        port (a,b,c:in std_logic;
           sout,cout:out std_logic);
    end component;

begin  

    --Row 0                    ----Sin-----A&B-------Cin--Sout---Cout
    Fand00: fulladder port map('0',(a(0) and b(0)),'0',pro(0),c1(0));   
    Fand01: fulladder port map('0',(a(1) and b(0)),'0',s1(0),c1(1));
    Fand02: fulladder port map('0',(a(2) and b(0)),'0',s1(1),c1(2));
    Fand03: fulladder port map('0',(a(3) and b(0)),'0',s1(2),c1(3));

    --Row 1
    Fand10: fulladder port map(s1(0),(a(0) and b(1)),c1(0),pro(1),c2(0));
    Fand11: fulladder port map(s1(1),(a(1) and b(1)),c1(1),s2(0),c2(1));
    Fand12: fulladder port map(s1(2),(a(2) and b(1)),c1(2),s2(1),c2(2));
    Fand13: fulladder port map('0',(a(3) and b(1)),c1(3),s2(2),c2(3));

    --Row 2
    Fand20: fulladder
         ----Sin------A&B------Cin-Sout-Cout
       port map(s2(0),(a(0) and b(2)),c2(0),pro(2),c3(0));
    Fand21: fulladder
         ----Sin--A&B------Cin-Sout-Cout
       port map(s2(1),(a(1) and b(2)),c2(1),s3(0),c3(1));
    Fand22: fulladder
         ----Sin--A&B------Cin-Sout-Cout
       port map(s2(2),(a(2) and b(2)),c2(2),s3(1),c3(2));
    Fand23: fulladder
         ----Sin--A&B------Cin-Sout-Cout
       port map('0',(a(3) and b(2)),c2(3),s3(2),c3(3));

    --Row 3
    Fand30: fulladder
         ----Sin------A&B------Cin-Sout-Cout
       port map(s3(0),(a(0) and b(3)),c3(0),pro(3),c4(0));
    Fand31: fulladder
         ----Sin--A&B------Cin-Sout-Cout
       port map(s3(1),(a(1) and b(3)),c3(1),s4(0),c4(1));
    Fand32: fulladder
         ----Sin--A&B------Cin-Sout-Cout
       port map(s3(2),(a(2) and b(3)),c3(2),s4(1),c4(2));
    Fand33: fulladder
         ----Sin--A&B------Cin-Sout-Cout
       port map('0',(a(3) and b(3)),c3(3),s4(2),c4(3));

    --Row 4
    F40: fulladder
       port map(s4(0),c4(0),'0',pro(4),c5(0));
    F41: fulladder
       port map(s4(1),c4(1),c5(0),pro(5),c5(1));
    F42: fulladder
       port map(s4(2),c4(2),c5(1),pro(6),c5(2));
    F43: fulladder
       port map('0',c4(3),c5(2),pro(7),c5(3));

end synth;

【问题讨论】:

    标签: port vhdl circuit


    【解决方案1】:

    我生疏了,但您可能需要为 a(_) and b(_) 条目设置明确的和门。我听说过线或,但不是线与(至少在正逻辑中)。

    至少,尝试用a(_) 部分替换其中的每一个,看看错误是否消失。它不会是正确的电路,但它会确认我是否正确了解导致编译问题的原因。

    【讨论】:

    • 那行得通。在尝试通过加法器传递它们之前,我只需要输入输入
    【解决方案2】:

    如果我没记错的话,您不能将逻辑表达式(例如 a(0) 和 b(0))映射到端口(但我认为常量是可以的)。如果这是正确的,您必须为所有输入和输出创建显式信号。

    还有: 1) 我不认为 fulladder 架构是行为的,所以我将它命名为别的。我已经(正确与否)为这些架构使用了名称 rtl。

    2) 应该可以在不声明组件的情况下实例化完整的加法器。使用类似

    的语法
    Fand00: entity fulladder port map(...)
    

    我还发现通常总是指定正式的端口名称(cout => c1(0),保留箭头方向等)

    3) 我想你知道任何最近的新合成器都能够合成乘法,而你这样做只是为了了解它是如何工作的,否则我只是告诉你:)

    【讨论】:

    • 感谢您的提示。这是我们必须以这种方式完成的家庭作业,以模拟关键路径,否则我很乐意使用内置乘法。
    【解决方案3】:

    某些合成器在使用非静态表达式的端口映射时存在问题。

    您可能不得不用信号替换端口映射中的表达式,无论合成器抱怨什么。例如:

    Fand00: fulladder port map('0',(a(0) and b(0)),'0',pro(0),c1(0));

    与:

    signal t: std_logic;

    ...

    t &lt;= a(0) and b(0);

    ...

    Fand00: fulladder port map('0',t,'0',pro(0),c1(0));

    如果可能,请更改为其他合成器软件。不要折磨自己。

    【讨论】:

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