elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado:


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica (Moderador: skapunky)
| | |-+  Proyecto VHDL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Proyecto VHDL  (Leído 1,141 veces)
manbu

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Proyecto VHDL
« en: 28 Julio 2017, 20:46 »

Muy buenas,

Estoy estudiando ingenieria electronica industrial y estoy llevando a cabo mi TFG, pero me encuentro atascado en un pequeño programa de VHDL por si me podéis echar una mano programando una FPGA de xilinx.

Mi proyecto se basa en controlar unos servomotores que se mueven mediante de señales PFM. Estas señales varían su ciclo de trabajo con el tiempo en bajo en vez de con el alto como las haría el PWM. He conseguido generar con éxito la señal de control PFM para mover estos servos, pero no solo tengo que enviar señales sino que también las recibo y ahí es donde me encuentro algo atascado.

Me gustaría calcular el tiempo que estaría en bajo la señal PFM que me llega por un pin de la FPGA, el PFM se basa en valores lógicos (altos de 3,3V y bajo de 0V), por lo que me gustaría poder calcular de alguna forma el tiempo que está en bajo justo cuando pega un flanco de bajada la señal PFM.

La señal PFM tiene unos valores limites de tiempo en bajo que son 1000us de mínimo y 2000us de máximo, según estos valores los servos se tienen que mover a una posición u otra. Si me llega pfm de 1000us de tiempo en bajo el servo se tiene que mover a 0 grados y si es de 2000us a 180 (si es de 1500us a 90). Mi objetivo es una vez calcular este tiempo en bajo generar su correspondiente posición de grado en byte y enviar dicho valor mediante una uart a una terminal para comprobar su valor.

Lo que he hecho es generar una máquina de estados en la que dependiendo del valor del PFM haga una cosa u otra. Si está en bajo incremente un contador y lo almacene en una variable y cuando suba recoja este valor haga una conversión (dicha conversión es equivalente a multiplicar dicho valor por 0'0036 pero como no se muy bien como trabajar en decimales, he decidido multiplicar por 2 y dividir por 512 que es potencia de dos y me da aproximadamente 0'0039) y después de esta conversión coja el valor entero y lo convierta en byte y lo envíe. He comprobado el programa con una terminal pero no me da valores fiables, por lo que no se en que estaría fallando.

Espero que podáis echarme una mano, saludos.

----------------------------------------------------------------------------------------

l
Código
  1. ibrary IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.NUMERIC_STD.ALL;
  4.  
  5. entity servo_0_pfm_grados is
  6.    Port ( clk : in  STD_LOGIC;
  7.           reset : in  STD_LOGIC;
  8.           i_PFM_0_grados : in  STD_LOGIC;
  9.           o_DV_0 : out STD_LOGIC;
  10.           o_byte_0_grados : out  STD_LOGIC_VECTOR (7 downto 0));
  11. end servo_0_pfm_grados;
  12.  
  13. architecture Behavioral of servo_0_pfm_grados is
  14.  
  15. type estado is (alto, bajo);
  16. signal estado_actual : estado := bajo;
  17. constant num_1 : integer := 2;
  18. constant num_2 : integer := 512;
  19.  
  20. begin
  21.  
  22. máquinas_de_estados : process (clk, reset, estado_actual)
  23.  
  24. variable contador : integer range 0 to 100000 := 0;
  25. variable almacenador : integer range 0 to 100000 := 0;
  26. variable conversion : integer range 0 to 1;
  27. variable grado : integer range 0 to 180 := 0;
  28. variable grado_fin : integer range 0 to 180 := 0;
  29.  
  30. begin
  31.  
  32. if reset='0' then
  33.  
  34. contador := 0;
  35. almacenador := 0;
  36. o_byte_0_grados<= (others => '0');
  37. o_DV_0<='0';
  38. estado_actual <= bajo;
  39.  
  40. elsif clk'event and clk='1' then
  41.  
  42. case estado_actual is
  43.  
  44. when bajo =>
  45.  
  46. contador := contador + 1;
  47. almacenador := contador;
  48. o_DV_0 <= '0';
  49.  
  50. if i_PFM_0_grados='1' then
  51.  
  52. estado_actual <= alto;
  53.  
  54. end if;
  55.  
  56. when alto =>
  57.  
  58. contador := 0;
  59. o_DV_0 <= '1';
  60. conversion := almacenador/num_2;
  61. grado := conversion*num_1;
  62. o_byte_0_grados <= std_logic_vector(to_unsigned(grado, 8));
  63.  
  64. if i_PFM_0_grados='0' then
  65.  
  66. estado_actual <= bajo;
  67.  
  68. end if;
  69. end case;
  70. end if;
  71. end process máquinas_de_estados;
  72. end Behavioral;

Los códigos deben ir en etiquetas GeSHi


« Última modificación: 28 Julio 2017, 20:49 por engel lex » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
VHDL
Electrónica
ukol 5 6,490 Último mensaje 12 Enero 2017, 13:16
por pablo321
VGA en VHDL
Foro Libre
joan.ayala 0 474 Último mensaje 23 Mayo 2014, 22:52
por joan.ayala
Divisor en VHDL
Electrónica
Casilda 0 1,167 Último mensaje 5 Junio 2014, 23:41
por Casilda
Multiplicador en VHDL
Electrónica
SGTheDreamer 1 1,109 Último mensaje 29 Marzo 2015, 21:24
por kondrag_X1
VHDL
Electrónica
carlospulido3 1 1,262 Último mensaje 14 Marzo 2017, 19:43
por Randomize
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines