[miguel@casita PracticaMux]$ ghdl -a mux4_1tb.vhd mux4_1tb.s: Mensajes del ensamblador: mux4_1tb.s:55: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:57: Error: sufijo de instrucción inválido para `pop' mux4_1tb.s:555: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:602: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:663: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:724: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:785: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:846: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:887: Error: sufijo de instrucción inválido para `push' mux4_1tb.s:929: Error: sufijo de instrucción inválido para `push' ghdl: compilation errorEl problema según lei en los foros de ghdl, se debe a que ghdl es un programa para 32 bits y el equipo que tengo tiene gcc de 64 bits, y buscando una solución encontre el wiki de UMHDL que está SourceForge y que es un IDE para trabajar de forma inicial con VHDL; en su wiki se indica lo siguiente de forma textual
"Possible problems in Linux 64-bits
1. Problem: in Linux 64-bits the following errors are got when compiling:
/home/myworkspace/e~and_gate.s: Assembler messages:
/home/myworkspace/e~and_gate.s:40: Error: invalid instruction suffix for 'push'
/home/myworkspace/e~and_gate.s:42: Error: invalid instruction suffix for 'pop'
Solution: the problem is that GHDL is a 32-bit program. The solution is to append some extra options when invoking to GHDL.
$ ghdl -a -Wa,--32 ...
$ ghdl -e -Wa,--32 -Wl,-m32 ...
However, UMHDL already checks the Operating System when executing and take it into account, so that errors should not happen.
"
A partir de esta indicación, no es necesario instalar entonces el IDE para compilar y simular un codigo de VHDL, es por ellos que de acuerdo a la wikibooks de vhdl (https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_VHDL/Ap%C3%A9ndices/Instalaci%C3%B3n_y_uso_de_GHDL)
Se puede simular de la forma
[miguel@casita PracticaMux]$ ghdl -a -Wa,--32 mux4_1.vhd [miguel@casita PracticaMux]$ ghdl -a -Wa,--32 mux4_1tb.vhd [miguel@casita PracticaMux]$ ghdl -e -Wa,--32 -Wl,-m32 mux4_1tb [miguel@casita PracticaMux]$ ghdl -r mux4_1tb --vcd=mux4_1.vcd [miguel@casita PracticaMux]$ gtkwave mux4_1.vcdLos códigos son los siguientes
-- mux4.vhd -- Multiplexor 4 a 1 -- Direcciona una de cuatro señales de entrada (d0 a d3) hacia la salida -- dependiendo del estado de los bits de selecci´on ENTITY mux4_1 is port( d0,d1,d2,d3 : in bit; --s : in bit_vector (1 downto 0); s0,s1 : in bit; y : out bit); END mux4_1; architecture mux4to1 of mux4_1 is begin -- Asignaci´on de señales concurrentes y<= ((not(s1)) and (not(s0)) and d0) or ((not(s1)) and s0 and d1) or (s1 and (not s0) and d2) or (s1 and s0 and d3); end mux4to1;
--mux4_1tb.vhd -- Multiplexor 4 a 1 -- Direcciona una de cuatro señales de entrada (d0 a d3) hacia la salida -- dependiendo del estado de los bits de selecci´on ENTITY mux4_1tb is END mux4_1tb; ARCHITECTURE muxtb OF mux4_1tb is COMPONENT mux4_1 PORT( d0,d1,d2,d3 : in bit; --s : in bit_vector (1 downto 0); s0,s1 : in bit; y : out bit); END COMPONENT; SIGNAL d0,d1,d2,d3: bit; SIGNAL s0,s1: bit; SIGNAL y: bit; BEGIN u0: mux4_1 PORT MAP (d0,d1,d2,d3,s0,s1,y); d0 <= '1' after 0 ns, '0' after 5 ns, '1' after 10 ns, '0' after 15 ns; d1 <= '1' after 0 ns, '0' after 10 ns, '1' after 20 ns, '0' after 30 ns; d2 <= '1' after 0 ns, '0' after 20 ns, '1' after 40 ns, '0' after 60 ns; d3 <= '1' after 0 ns, '0' after 40 ns, '1' after 80 ns, '0' after 90 ns; s0 <= '0' after 0 ns, '0' after 1 ns; s1 <= '0' after 0 ns, '1' after 2 ns; END muxtb;La salida es la siguiente