TODOPIC

Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: rivale en 29 de Mayo de 2012, 17:30:10

Título: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale 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:

(http://img542.imageshack.us/img542/1751/pantall.png)
 (http://imageshack.us/photo/my-images/542/pantall.png/)
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: Suky 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!

Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale 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
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: Suky 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!
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale en 29 de Mayo de 2012, 19:51:32
Gracias suky, le voy a dar una leida
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale 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
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: Suky 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  :?
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale 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:
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale 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.
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: bigluis 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.
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: bigluis 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:


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


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.
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale 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  :-/ :-/
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: bigluis en 02 de Junio de 2012, 00:54:14
 :-/ :-/

Que bueno escuchar tus avances

 ((:-)) ((:-))
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: Suky 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!
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale 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 :-/
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale en 03 de Junio de 2012, 03:27:20
Hola de nuevo, espero me puedan resolver una duda, estoy trabajando con la tarjeta del MAXII EPM2210F324 C3N. estaba funcionando bien, y depronto se apago la tarjeta y ya no corre el programa.

tambien tengo otros 2 pics conectados a la tarjeta y a estos no les paso nada, cuando conecto la tarjeta a la computadora, esta la detecta pero no puedo programarle nada. alguna idea de que haya pasado?? :?
Título: Re: Puedo poner un While dentro de un case? Quartus II
Publicado por: rivale en 18 de Junio de 2012, 22:26:27
les pongo un videito de las pruebas del robot.