Domanda

Sono relativamente nuovo su VHDL. Sto tentando di scrivere codice per eseguire la moltiplicazione senza segno utilizzando una combinazione di additivi completi. Durante la compilazione passa alla mappatura delle porte. Ho risolto gli errori nella prima mappa, ma tutti gli altri mi danno problemi.

Ottengo lo stesso errore per ciascuno: " I valori effettivi delle espressioni nell'aspetto della mappa delle porte devono essere statici "

Ecco il mio codice. Qualsiasi aiuto è apprezzato. Inoltre, se hai suggerimenti generali basati sull'esame del mio codice, sarei grato.

Grazie, Buzkie

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;
È stato utile?

Soluzione

Sono arrugginito, ma potresti dover avere espliciti e porte per le a(_) and b(_) voci. Ho sentito parlare di wire-OR, ma non di wire-AND (almeno in logica positiva).

Almeno, prova a sostituire ognuno di questi con solo la parte a(_) e vedi se gli errori scompaiono. Non sarà il circuito giusto, ma confermerà se ho ragione su cosa sta causando il problema della compilazione.

Altri suggerimenti

Se ricordo bene le cose, non è possibile mappare un'espressione logica (ad es. a (0) eb (0)) su una porta (ma penso che le costanti siano OK). Se questo è corretto, devi creare segnali espliciti per tutti gli ingressi e le uscite.

Inoltre: 1) Non penso che l'architettura più fulladder sia comportamentale, quindi la chiamerei qualcos'altro. Ho usato (correttamente o no) il nome rtl per queste architetture.

2) Dovrebbe essere possibile creare un'istanza degli additivi completi senza dichiarare il componente. Usa una sintassi come

Fand00: entity fulladder port map(...)

Trovo anche solito specificare sempre i nomi delle porte formali (cout = > c1 (0), con qualche riserva per la direzione della freccia, ecc.)

3) Suppongo che tu sappia che qualsiasi sintetizzatore recentemente nuovo sarà in grado di sintetizzare una moltiplicazione e che lo stai facendo solo per imparare come funziona, altrimenti te l'ho detto :)

Alcuni sintetizzatori hanno problemi con le mappe delle porte che non sono espressioni statiche.

Potrebbe essere necessario sostituire l'espressione nella mappa delle porte con un segnale, ovunque si verifichi il sintetizzatore. Ad esempio:

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

Con:

signal t: std_logic;

...

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

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

<=>

Se possibile, passare a un altro software sintetizzatore. Non torturarti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top