Проблема сопоставления портов VHDL

Я относительно новичок в 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;

person Buzkie    schedule 10.03.2009    source источник


Ответы (3)


Я ржавый, но вам могут понадобиться явные и гейты для записей a(_) and b(_). Я слышал о проводных ИЛИ, но не о проводных И (по крайней мере, в положительной логике).

По крайней мере, попробуйте заменить каждый из них только частью a(_) и посмотрите, исчезнут ли ошибки. Это не будет правильной схемой, но она подтвердит, прав ли я в отношении того, что вызывает проблему компиляции.

person MarkusQ    schedule 10.03.2009
comment
Это сработало. Мне просто нужно и входы, прежде чем пытаться передать их через сумматоры - person Buzkie; 11.03.2009

Если я все правильно помню, вы не можете сопоставить логическое выражение (например, a (0) и b (0)) с портом (но я думаю, что константы в порядке). Если это правильно, вы должны создать явные сигналы для всех входов и выходов.

Кроме того: 1) Я не думаю, что архитектура fulladder является поведенческой, поэтому я бы назвал ее как-то иначе. Я использовал (правильно или нет) имя rtl для этих архитектур.

2) Должна быть возможность создавать полные сумматоры без объявления компонента. Используйте синтаксис, например

Fand00: entity fulladder port map(...)

Я также считаю обычным всегда указывать формальные имена портов (cout => c1(0), с некоторой оговоркой для направления стрелки и т. д.)

3) Я полагаю, вы знаете, что любой недавно появившийся синтезатор сможет синтезировать умножение, и что вы делаете это только для того, чтобы узнать, как это работает, а то я вам просто сказал :)

person erikkallen    schedule 10.03.2009
comment
Спасибо за советы. Это домашнее задание, которое мы должны выполнить таким образом, чтобы смоделировать критический путь, иначе я бы с удовольствием использовал встроенное умножение. - person Buzkie; 11.03.2009

Некоторые синтезаторы имеют проблемы с картами портов, которые не являются статическими выражениями.

Возможно, вам придется заменить выражение в карте порта сигналом, где бы синтезатор ни ругался. Например:

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

С:

signal t: std_logic;

...

t <= a(0) and b(0);

...

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

Если возможно, перейдите на другое программное обеспечение синтезатора. Не мучайте себя.

person filmil    schedule 05.05.2009