problema de mapeamento da porta VHDL
Pergunta
Eu sou relativamente novo para VHDL. Eu estou tentando escrever código para fazer sem sinal de multiplicação, utilizando uma combinação de somadores completos. Ao compilar passa-se para o mapeamento da porta. Eu já resolveu os erros no primeiro mapa, mas todos os outros me dão problemas.
Eu recebo o mesmo erro para cada um: "reais expressão no aspecto mapa porta deve ser estático"
Aqui está o meu código. Qualquer ajuda é apreciada. Além disso, se você tiver dicas gerais com base em olhar para o meu código que eu ficaria grato.
Obrigado, 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;
Solução
Eu estou enferrujado, mas você pode precisar de ter explícito e portões para as entradas a(_) and b(_)
. Já ouvi falar de fio-RUP, mas não fio-ANDs (em lógica positiva, pelo menos).
No mínimo, tente substituir cada uma delas com apenas a parte a(_)
, e ver se os erros de ir embora. Não vai ser o circuito direito, mas ele vai confirmar se estou certo sobre o que está causando o problema de compilação.
Outras dicas
Se eu lembrar de coisas corretamente, você não pode mapear uma expressão lógica (por exemplo, um (0) e b (0)) a uma porta (mas acho constantes são OK). Se isso é correto, você tem que criar sinais explícitos para todas as entradas e saídas.
Além disso: 1) Eu não acho que a arquitetura fulladder é comportamental, então eu iria nomeá-lo outra coisa. Eu tenho usado (corretamente ou não) o nome RTL para estas arquiteturas.
2) Deve ser possível instanciar os somadores completos sem declarar o componente. Use uma sintaxe como
Fand00: entity fulladder port map(...)
Também acho que o habitual para sempre especificar os nomes das portas formais (cout => c1 (0), com alguma reserva para a direção da seta, etc.)
3) Acho que você sabe que qualquer recentemente novo sintetizador será capaz de synthisize uma multiplicação e que você está apenas fazendo isso para aprender como ele funciona, caso contrário eu apenas lhe disse:)
Alguns sintetizadores têm problemas com mapas de portas que não são expressões estáticas.
Você pode ter que substituir a expressão no mapa da porta com um sinal, onde o sintetizador reclama. Por exemplo:
Fand00: fulladder port map('0',(a(0) and b(0)),'0',pro(0),c1(0));
Com:
signal t: std_logic;
...
t <= a(0) and b(0);
...
Fand00: fulladder port map('0',t,'0',pro(0),c1(0));
Se possível, mude para um software sintetizador diferente. Não se torture.