Autor Tema: Puedo poner un While dentro de un case? Quartus II  (Leído 10337 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Puedo poner un While dentro de un case? Quartus II
« en: 29 de Mayo de 2012, 17:30:10 »
Hola a todos, estoy intentando hacer un programita para una VHDL en quartusII y tengo el siguiente codigo:


Código: [Seleccionar]
case Sen is
when A_der => 
begin
              process(Sen4)
  begin
     while Sen4 = '0' loop
    d_mB <= B"10";
    enB <= '1';
    enA <= '0';
end loop;
end process;

--


esto es parte del codigo, pero basicamente lo que quiero es que cuando se cumpla la condicion del case dentro quedarme en un while y estar actualizando la variable Sen4.

pero tengo algun error en la sintaxis, ya que el compilador me marca el siguiente error:


"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #1 en: 29 de Mayo de 2012, 17:38:32 »
Acuérdate que no es secuencial! Como es eso de:

Citar
pero basicamente lo que quiero es que cuando se cumpla la condicion del case dentro quedarme en un while y estar actualizando la variable Sen4

Tendrías que mas o menos dar la idea general para ver como pensarlo de forma concurrente.


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #2 en: 29 de Mayo de 2012, 17:52:09 »
Gracias suky.
te explico, estoy haciendo un robot para resolver laberinto
y primero leo los sensores y luego verifico en que condicion entran, esto con el case

ahi esta el codigo. (no se como ponerlo de colores)

Código: [Seleccionar]
-- Declaracion de librerias
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Declaracion de la entidad ---
entity sensors is

Port (
clk  : in std_logic;
--Sen : in std_logic_vector(5 downto 0);--Variable para guardar la lectura de los sensores
Sen0 : in std_logic;--Variable para guardar la lectura del sensor
Sen1 : in std_logic;--Variable para guardar la lectura del sensor
Sen2 : in std_logic;--Variable para guardar la lectura del sensor
Sen3 : in std_logic;--Variable para guardar la lectura del sensor
Sen4 : in std_logic;--Variable para guardar la lectura del sensor
Sen5 : in std_logic;--Variable para guardar la lectura del sensor
--              S2
--S0                          S1         
--
--
--S4                          S3
--              S5
enA : out std_logic;--enable del motor derecho
enB : out std_logic;--enable del motor izquierdo
D_mA: out std_logic_vector(1 downto 0);--direccion del motor A;10-->adelante,01-->atras
D_mB: out std_logic_vector(1 downto 0);--direccion del motor A;10-->adelante,01-->atras
Dir : out std_logic_vector(8 downto 0)--Vector para enviar el tipo de giro que se debe de realizar, Donde:
--Dir0 --> Alineacion a la derecha
--Dir1 --> Alineacion a la izquierda
--Dir2 --> Giro derecha
--Dir3 --> Giro izquieda
--Dir4 --> Derecho
--Dir5 --> Derecho | giro derecha
--Dir6 --> Derecho | giro izquierda
--Dir7 --> Derecho | giro izquierda | giro derecha
--Dir8 --> fin de camino

);
end sensors;
-- Declaracion de la arquitectura ---
architecture behavior of sensors is
constant A_der: std_logic_vector(5 downto 0):=B"001011";--Alineacion a la derecha
constant A_izq: std_logic_vector(5 downto 0):=B"010011";--Alineacion a la izquierda
constant G_der: std_logic_vector(5 downto 0):=B"010101";--Giro derecha
constant G_izq: std_logic_vector(5 downto 0):=B"001110";--Giro izquieda
constant Der  : std_logic_vector(5 downto 0):=B"011011";--derecho
constant Der_d: std_logic_vector(5 downto 0):=B"010001";--derecho | derecha
constant Der_i: std_logic_vector(5 downto 0):=B"001010";--derecho | izquieda
constant Der_i_d: std_logic_vector(5 downto 0):=B"000000";--derecho | izquieda | derecho
constant Sin_c: std_logic_vector(5 downto 0):=B"011111";--sin camino
constant end_d: std_logic_vector(5 downto 0):=B"110001";--termino del giro a la derecha
constant end_i: std_logic_vector(5 downto 0):=B"101010";--termino del giro a la izquierda
constant end_g: std_logic_vector(5 downto 0):=B"100000";--termino del giro cuando no hay pared a los costados
signal   Sen: std_logic_vector(5 downto 0):=B"000000";--variable para guardar todos los snesores leidos
variable flag: integer:=0

begin
process(Sen0,Sen1,Sen2,Sen3,Sen4,Sen5,clk)--leo los sensores

begin
Sen <= Sen5 & Sen4 & Sen3 & Sen2 & Sen1 & Sen0;
if rising_edge(clk)then
case Sen is
when A_der =>
                                                                           --aqui quiero que se este leyendo un sensor para saber cuando debe terminar de girar
Dir <= B"000000001";

when A_izq => 
--
Dir <= B"000000010";
when G_der => 

Dir <= B"000000100";
when G_izq => 
Dir <= B"000001000";
when Der => 
Dir <= B"000010000";
when Der_d => 
Dir <= B"000100000";
when Der_i => 
Dir <= B"001000000";
when Der_i_d => 
Dir <= B"010000000";
when Sin_c => 
Dir <= B"100000000";
when end_d => 
Dir <= B"000000101";
when end_i => 
Dir <= B"000001001";
when end_g => 
Dir <= B"000001011";
when others =>
Dir <= B"000000000";

end case;
end if;
end process;
end behavior;



por ejemplo en la primera condicion el robot debe girar a la derecha y quiero que el VHDL active los motores para el giro mientras un sensor sea 0.

o alguna idea de como hacer esto

De antemano GRacias
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #3 en: 29 de Mayo de 2012, 19:19:10 »
Podrías implementar una maquina de estados? Dependiendo del valor de los sensores vas eligiendo cada estado y dependiendo del estado que se encuentre fijas las salidas.

El siguiente articulo puede ayudarte: http://es.scribd.com/doc/22290052/5-Maquinas-de-estado-con-VHDL

Yo utilizo ese método por ejemplo para el control de un motor paso a paso.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #4 en: 29 de Mayo de 2012, 19:51:32 »
Gracias suky, le voy a dar una leida
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #5 en: 29 de Mayo de 2012, 20:49:31 »
Ya leo lo que me recomendaste suky, antes de continuar con esa opcion me gustaria saber si es posible.

leo las entradas y tomo una desicion en base a esta, pero quiero que el robot se quede girando hasta que una entrada cambie, esto sin hacer caso de las demas entradas.

es decir, dentro de un "process" donde checo varias entradas, puedo poner otro process que solo este verificando una entrada?

no se si me explique bien
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #6 en: 29 de Mayo de 2012, 22:03:41 »
Acuérdate que ingresa al proceso cuando cambia una de las señales de la lista sensitiva, ejecuta las instrucciones de forma secuencial y luego se suspende hasta un nuevo cambio. Otro detalle a tener en cuenta es que las señales que se modifican dentro del proceso toman efecto cuando se suspende y es válida la última asignación dentro de las sentencias secuenciales. En base a eso, como lo implementarias  :?
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #7 en: 29 de Mayo de 2012, 22:22:42 »
Haaaa, ahora lo tengo mas claro :oops:

bueno, continuare de otra forma.

en cuanto lo tenga lo posteo y si tengo mas dudas tambien volveré  :mrgreen:
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #8 en: 31 de Mayo de 2012, 23:37:16 »
Bueno, aca reportando avances:
ya pude resolver ese problema, simplemente acttivando "banderas" me quedo en la  condicion que quiero hasta que los sensores cambien a la posicion que yo quiero.

Gracias suky, no tenia claro como funcionaba el process, tambien intente usar la funcion wait y resulta que no funciona dentro de un process :5]. asi que tuve que hacer retardos con contadores :mrgreen:

aun no termino el codigo pero ya se mueve el robot  :D.
"Nada es imposible, no si puedes imaginarlo"

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #9 en: 01 de Junio de 2012, 13:52:35 »
Es como mencionó suky anteriormente, en programación de hardware no puedes hacer ciclos infinitos, ya que esto significaría crear hardware infinito. La función wait tampoco va a funcionar ya que esta sólo es útil para simulación. Si deseas hacer un retardo debes crear un contador, y cuando este alcance cierto valor entonces continuar con la máquina de estados.

Los paradigmas de programación de Hardware cambian mucho con los paradigmas de programación de software.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #10 en: 01 de Junio de 2012, 14:35:14 »
Según lo poco que entendí deseas hacer algo similar a un robot sigue líneas o esquiva obstaculos.

Al tener 2 sensores uno para la izquierda y otro para la derecha debes tener 3 posibilidades:

  • Ambos sensores apagados, SenIzq y SenDer cero, debe continuar recto
  • SenIzq encendido y SenDer apagado, debe hacer un giro a la izquierda
  • SenIzq apagado y SenDer encendido, Debe hacer un giro a la derecha
  • Ambos sensores encendidos, Debe hacer un giro de 360 grados

Así mismo tienes 2 motores, y en dependencia del sentido de estos realizarás el giro.

  • Ambos motores encendidos, MotDer y MotIzq, avanzas
  • MotIzq encendido y MotDer apagado, giras a la derecha
  • MotIzq apagado y MotDer enecendido, giras a la Izquierda
  • Abos motores apagados, detienes el avance

En este caso lo mejor es realizar una máquina de estado con referencia a los valores de los motores, ya que son estos quienes guardan los valores anteriores y son quienes tendrán el valor próximo.

Por ejemplo

Código: [Seleccionar]
Case Motores
   when MotDer=1 and MotIzq=1  --El motor está avanzando
      if SenIzq = 0 and SenDer = 0  --Si ambos sensores apagados entonces avanzar
         MotDer = 1
         MotIzq = 1
      if SenIzq = 1 and SenDer = 0  --Si SenIzq = 0 y senDer =1 girar a la derecha
         MotDer = 1
         MotIzq = 0
      if SenIzq = 0 and SenDer = 1  --Si SenIzq = 0 y senDer =1 girar a la derecha
         MotDer = 0
         MotIzq = 1
      if SenIzq = 1 and SenDer = 1  --Si SenIzq = 1 y senDer =1 girar a la derecha
         MotDer = 0
         MotIzq = 1
   when MotDer=1 and MotIzq=0  --El motor está girando a la izquierda
      if SenIzq = 0 and SenDer = 0  --Si ambos sensores apagados entonces avanzar
         MotDer = 1
         MotIzq = 1
      if SenIzq = 1 and SenDer = 0  --Si SenIzq = 0 y senDer =1 girar a la derecha
         MotDer = 1
         MotIzq = 0
      if SenIzq = 0 and SenDer = 1  --Si SenIzq = 0 y senDer =1 girar a la derecha
         MotDer = 0
         MotIzq = 1
      if SenIzq = 1 and SenDer = 1  --Si SenIzq = 1 y senDer =1 girar a la derecha
         MotDer = 0
         MotIzq = 1
   when MotDer=0 and MotIzq=1  --El motor está girando a la derecha
      if SenIzq = 0 and SenDer = 0  --Si ambos sensores apagados entonces avanzar
         MotDer = 1
         MotIzq = 1
      if SenIzq = 1 and SenDer = 0  --Si SenIzq = 0 y senDer =1 girar a la derecha
         MotDer = 1
         MotIzq = 0
      if SenIzq = 0 and SenDer = 1  --Si SenIzq = 0 y senDer =1 girar a la derecha
         MotDer = 0
         MotIzq = 1
      if SenIzq = 1 and SenDer = 1  --Si SenIzq = 1 y senDer =1 girar a la derecha
         MotDer = 0
         MotIzq = 1

El código no está completo, deberás modificarlo hasta que quede como tu quieres. Por otro lado, creo que sería mejor trabajar con 3 sensores.

Si lo que quieres hacer es un robot que encuentre la salida de un laberinto, debes agregarle memoria. Es decir este debe recordar la última decisión que tomó al llegar a una intersección. De lo contrario, habrán ocasiones en las que el robot quede dentro del mismo lugar.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #11 en: 01 de Junio de 2012, 22:39:10 »
Gracias big luis, en efecto use unos contadores para que hiciera los retardos.

es para un robot de laberinto, pero es con paredes, hubiera preferido usar pic, pero una condicion era usar altera.

ya logre que se alinee y que de vuelta a la derecha  :-/ :-/
"Nada es imposible, no si puedes imaginarlo"

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #12 en: 02 de Junio de 2012, 00:54:14 »
 :-/ :-/

Que bueno escuchar tus avances

 ((:-)) ((:-))
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #13 en: 02 de Junio de 2012, 08:22:15 »
Genial! Y que bueno que sea un requisito usar Altera  :mrgreen: Así se aprende cosas nuevas  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Puedo poner un While dentro de un case? Quartus II
« Respuesta #14 en: 02 de Junio de 2012, 10:39:35 »
Genial! Y que bueno que sea un requisito usar Altera  :mrgreen: Así se aprende cosas nuevas  ;-)


Si, al menos eso fue lo bueno, hace 3 dias no tenia ni idea de como programar en quartus, y ahora el robot ya tiene vida, el robot no es un gran reto, pero con la altera me fue dificil ya que intento usar cosas que con micros si se puede y con esta cosa no. pero voy avanzando :-/
"Nada es imposible, no si puedes imaginarlo"