Problemas de diseño VHDL warp/Galaxy encoder-registro-7segmentos

Hola el siguiente codigo toma la entrada de un teclado numerico, lo codifica a bcd y a continuacion lo guarda en un registro.
por ultimo se decodifica en 7 segmentos. Tengo un problema al compilarlo con galaxy/warp: resulta que el compilador asigna la señal Q en modo de buried node a las macroceldas del dispositivo (lo estoy programando en una gal22v10). Por lo tanto 4 macroceldas del vector Q mas las 7 de salida del decoder 7 segmentos da un total de 11 y no termina la compilacion ya que aparece el mensaje de error:

signal seg(2) can not be placed on device

Quiero saber si se puede evitar que se asignen las salidas del registro a las macroceldas del dispositivo, si será cosa del compilador y con otro funcione correctamente. En fin agradezco mucho la ayuda que pudieran darme.

Código:
library ieee;
use ieee.std_logic_1164.all;

entity encoder_registro_decoder is
  port (
	clock: in std_logic;
	tecla: in std_logic_vector (0 to 8);
	seg: out std_logic_vector (0 to 6)
  ) ;
end entity ; -- encoder_registro_decoder

architecture arch of encoder_registro_decoder is

	signal C: std_logic_vector (3 downto 0);
	signal Q: std_logic_vector (3 downto 0);

begin
	identifier : process( clock, tecla, C, Q )
	begin
		if (clock'event and clock = '1') then
			Q <= C;			
		end if ;

		if (tecla = "100000000") then
			C <= "0001";
		elsif (tecla = "010000000") then
			C <= "0010";
		elsif (tecla = "001000000") then
			C <= "0011";
		elsif (tecla = "000100000") then
			C <= "0100";
		elsif (tecla = "000010000") then
			C <= "0101";
		elsif (tecla = "000001000") then
			C <= "0110";
		elsif (tecla = "000000100") then
			C <= "0111";
		elsif (tecla = "000000010") then
			C <= "1000";
		else
			C <= "1001";
		end if ;
	case( Q ) is
	
		when "0000" => seg <= "0000001";
		when "0001" => seg <= "1001111";
		when "0010" => seg <= "0010010";
		when "0011" => seg <= "0000110";
		when "0100" => seg <= "1001100";
		when "0101" => seg <= "0100100";
		when "0110" => seg <= "0100000";
		when "0111" => seg <= "0001110";
		when "1000" => seg <= "0000000";
		when others => seg <= "0001100";
	
	end case ;
		
	end process ; -- identifier
end architecture ; -- arch
...
 
Última edición:
Si, por supuesto que es evitable. El tema es que hiciste tu decodificador dentro del proceso condicionado a un evento de clock e inevitablemente eso genera un registro.

Si queres que tu decodificador sea combinatorio tenes que ponerlo en otro proceso que sea puramente combinatorio y no secuencial.

Espero que mi respuesta sea clara para vos, intentalo y decime que paso.
 
Si, por supuesto que es evitable. El tema es que hiciste tu decodificador dentro del proceso condicionado a un evento de clock e inevitablemente eso genera un registro.

Si queres que tu decodificador sea combinatorio tenes que ponerlo en otro proceso que sea puramente combinatorio y no secuencial.

Espero que mi respuesta sea clara para vos, intentalo y decime que paso.

Si te entendi bien deberia hacer lo siguiente:

Código:
library ieee;
use ieee.std_logic_1164.all;

entity encoder_registro_decoder is
  port (
	clock: in std_logic;
	tecla: in std_logic_vector (0 to 8);
	seg: out std_logic_vector (0 to 6)
  ) ;
end entity ; -- encoder_registro_decoder

architecture arch of encoder_registro_decoder is

	signal C: std_logic_vector (3 downto 0);
	signal Q: std_logic_vector (3 downto 0);

begin
	identifier : process( clock, tecla, C)
	begin
		if (clock'event and clock = '1') then
			Q <= C;			
		end if ;

		if (tecla = "100000000") then
			C <= "0001";
		elsif (tecla = "010000000") then
			C <= "0010";
		elsif (tecla = "001000000") then
			C <= "0011";
		elsif (tecla = "000100000") then
			C <= "0100";
		elsif (tecla = "000010000") then
			C <= "0101";
		elsif (tecla = "000001000") then
			C <= "0110";
		elsif (tecla = "000000100") then
			C <= "0111";
		elsif (tecla = "000000010") then
			C <= "1000";
		else
			C <= "1001";
		end if ;
       end process;

decodificador: process(Q)
begin
	case( Q ) is
	
		when "0000" => seg <= "0000001";
		when "0001" => seg <= "1001111";
		when "0010" => seg <= "0010010";
		when "0011" => seg <= "0000110";
		when "0100" => seg <= "1001100";
		when "0101" => seg <= "0100100";
		when "0110" => seg <= "0100000";
		when "0111" => seg <= "0001110";
		when "1000" => seg <= "0000000";
		when others => seg <= "0001100";
	
	end case ;
		
	end process ; -- identifier
end architecture ; -- arch
...

separar el decodificador 7 segmentos en otro proceso independiente, lo compilo y me sigue ocurriendo lo mismo, te muestro la configuracion de pines del reporte:

Código:
Messages:
  Information: Checking for duplicate NODE logic.
  Error: Signal seg(2) can not be placed on device.


                                 C22V10
                 __________________________________________
          clock =| 1|                                  |24|* not used       
       tecla(8) =| 2|                                  |23|= seg(3)         
       tecla(7) =| 3|                                  |22|= (q_1)          
       tecla(6) =| 4|                                  |21|= seg(5)         
       tecla(5) =| 5|                                  |20|= seg(1)         
       tecla(4) =| 6|                                  |19|= seg(6)         
       tecla(3) =| 7|                                  |18|= seg(0)         
       tecla(2) =| 8|                                  |17|= seg(4)         
       tecla(1) =| 9|                                  |16|= (q_0)          
       tecla(0) =|10|                                  |15|= (q_2)          
       not used *|11|                                  |14|= (q_3)          
       not used *|12|                                  |13|* not used       
                 __________________________________________


Summary:
                 Error Count = 1      Warning Count = 0

Errors Detected.
...
 
Esta es mi version, espero que te funcione

Código:
library ieee;
use ieee.std_logic_1164.all;

entity enc_reg_dec is
  port (
	clock: 	in std_logic;
	tecla: 	in std_logic_vector(0 to 8);
	seg: 	out std_logic_vector(0 to 6)
  ) ;
end entity ; -- enc_reg_dec

architecture arch of enc_reg_dec is

	signal C: std_logic_vector (3 downto 0);

begin

	identifier : process(clock, tecla)
	begin
		if (clock'event and clock = '1') then
			C <= "0000";			
			if (tecla(0) = '1') then
				C <= "0001";
			end if;	
			if (tecla(1) = '1') then
				C <= "0010";
			end if;	
			if (tecla(2) = '1') then
				C <= "0011";
			end if;	
			if (tecla(3) = '1') then
				C <= "0100";
			end if;	
			if (tecla(4) = '1') then
				C <= "0101";
			end if;	
			if (tecla(5) = '1') then
				C <= "0110";
			end if;	
			if (tecla(6) = '1') then
				C <= "0111";
			end if;	
			if (tecla(7) = '1') then
				C <= "1000";
			end if;	
			if (tecla(8) = '1') then
				C <= "1001";
			end if;	
		end if;	
    end process;

	decodificador: process(C)
	begin
		case(C) is	
			when "0000" => seg <= "0000001";
			when "0001" => seg <= "1001111";
			when "0010" => seg <= "0010010";
			when "0011" => seg <= "0000110";
			when "0100" => seg <= "1001100";
			when "0101" => seg <= "0100100";
			when "0110" => seg <= "0100000";
			when "0111" => seg <= "0001110";
			when "1000" => seg <= "0000000";
			when others => seg <= "0001100";
		end case ;
	end process ; -- identifier
	
end architecture ; -- arch
 
De nada.

Bueno, habria que analizar por que no entra. La GAL 22V10 no es completamente simetrica, algunas celdas tienen mas entradas que otras. Como fueron asignados los pines? Los elegiste vos?
Si fue asi, podria ser que una eleccion diferente de los pines resolviera el problema.

Otra opcion seria simplificar aun mas la logica y obviar el paso intermedio de utilizar la variable 'C', y asignar las salidas del decodificador directamente en el proceso secuencial.

Si nada de eso sirve yo ya no podre ayudarte porque no uso GAL, ni tengo herramientas para ellas, quiza tu profe te pueda ayudar.
 
Una observacion mas. Proba de reducir el numero de tus entradas a 7. Eso te permitira reducir el tamaño de la variable C a tres bits en lugar de cuatro. Y proba si eso te ayuda.

No es la solucion pero es una manera de ver el circuito funcionando aunque sea en forma parcial.
 
Atrás
Arriba