Autor Tema: creación de un contador de personas que guarde 4 registros en vhdl  (Leído 8856 veces)

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

Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
buenas, soy estudiante de ingeniería de telecomunicaciones y estoy viendo una materia llamada electrónica digital, pero los temas que maneja el profesor son orientados a descripción de hardware y hasta ahora eh manejado algunos temas pero hay otros que son muy complejos, por tal motivo pido el favor si alguien maneja este tema con el fin de darme una orientacion de como comenzar el proyecto en el cual tengo muy poco tiempo.

el proyecto consiste en hacer en vhd un circuito para ser utilizado en una carrera de atletismo, el circuito debe tener un disparo que inicia la carrera y un sensor en la meta que guarde el tiempo de cada maratonista en horas, minutos y segundos y guardarlos en una memoria, se deben guardar solo 4 registros y el reloj debe ser de un 1 Hz.

 :)hasta ahora se que las señales deben ser 3 que son horas min y seg y que se puede comenzar utilizando 3 contadores con un comparador un contador para las horas de 0 a 59 un contador para los minutos de 0 a 59 y un contador para los segundos de 0 a 59 :)

a la espera de una pronta respuesta

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #1 en: 17 de Mayo de 2016, 20:12:20 »
Lo unico que recuerdo de VHDL es que podes hacer bloques y repetirlos. Lo mas simple seria directamente tomar el reloj dividirlo hasta tener 1Hz.

El disparo habilitaria algun latch ( un Set-Reset ), este daria paso con una AND a la señal de reloj y finalmente llegar a un contador. Por ahora el contador es un simple contador de varios bits ( queda en binario )

Luego el sensor de llegada activaria el Reset del latch de entrada (inhabilitando el paso del clock) y tal ves necesites alguna AND mas para no dar paso al disparo de nuevo ( en caso que alguien mantenga presionado el boton ). Y ahi tendrias tu contador pero para un solo corredor.

De ahi en adelante pienso que son retoques. Por ejemplo el sensor que alimente a una serie shift-register de 4 bits, con una salida que vaya desactivando uno de los 4 contadores por cada pulso.

Suponete que tengas inicialmente ( 0 pulsos en el sensor de llegada ), esten las 4 salidas 0b1111, y eso te habilita las 4 AND que dan paso del reloj a los 4 contadores. Cuando pasa el primer corredor la salida sea: 0b0111, luego que pase el otro pase a 0b0011 y asi hasta llegar a que quede todo en 0000 ihabilitandose los 4 contadores.  Simple de hacer con 4 FF-D que se les de un SET inicial, y que el primer FF-D tenga un 0 de entrada, el sensor solo alimentaria los clock de todos esos FF-D ( por flanco obvio ). La señal de disparo seria la encargada de poner a 1 a todos los FF-D, Como tambien por igual podrias poner que resetee el contador que posee toda la cuenta.

Luego para pasarlo a horas, minutos, segundos, cambia los contadores binarios por bloques que cuando cuenten 60 y cambie el estado de la salida, asi la entrada del otro contador lo detecta y suma 1. Serian 3 contadores por cada corredor

Serian todos bloques :P, que en la parte de los contadores se repetirian para cada uno.

Y es lo unico que se me ocurre y lo que puedo aportar.
« Última modificación: 17 de Mayo de 2016, 20:20:58 por KILLERJC »

Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #2 en: 18 de Mayo de 2016, 10:05:01 »
gracias por el aporte,  :-/ alguien podría aportar como seria el codigo en vhdl basado en este diagrama de bloques




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #3 en: 18 de Mayo de 2016, 14:55:29 »
Citar
alguien podría aportar como seria el codigo en vhdl basado en este diagrama de bloques

Realmente ahi ya estarias pidiendo todo, y que te lo hagan. No cuesta nada creo buscar por internet:

- Counter VHDL code

Ahi tenes tu contador, obviamente lo vas a tener que estudiar y cambiar segun lo que necesites.

- Set Reset Flip Flop VHDL

Genial, ahi tenes tu Flip flop RS, las AND no necesitarias codificarlas, sino podrias hacerlo, como ? Busquemos en Google de NUEVO!

- AND VHDL Code

Falto el Shift Register

- shift register vhdl code 4 bit

Listo tenes todos tus componentes solo buscando en google.... y solo te queda estudiar como es el lenguaje VHDL en caso que no lo sepas y modificar el tema del contador. ( Ya que lo demas es unir bloques ).


Si ya luego de que intentaste todo lo posible y no te funciona, podes preguntar y presentas el codigo modificado ( y el original ) para que veamos que puede estar fallando en tu logica. Obviamente no todo, solo lo que no te funciona.

Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #4 en: 19 de Mayo de 2016, 10:01:51 »
 :) buenas, el dia de ayer investigando pude realizar con un poco de ayuda la parte de los contadores, pero no he podido ingresar la parte correspondiente a los segundos, si es bien el cronómetro debe marcar horas, minutos y segundos, hasta ahora solo marca horas y minutos
 atento a sus comentarios

library IEEE;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_1164.ALL;
 
entity contador_reloj is
    PORT (
        clk  : IN  STD_LOGIC; --Reloj de 1Hz.
        reset: IN  STD_LOGIC; --Señal de reset.
        H1   : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); --Segundo digito de la hora.
        H0   : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --Primer digito de la hora.
        M1   : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); --Segundo digito de los minutos.
        M0   : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)  --Primer digito de los minutos.
    );
end contador_reloj;
 
architecture Behavioral of contador_reloj is
    signal mm1: UNSIGNED(2 downto 0) := "000" ;
    signal mm0: UNSIGNED(3 downto 0) := "0000";
    signal hh1: UNSIGNED(2 downto 0) := "000" ;
    signal hh0: UNSIGNED(3 downto 0) := "0000";
begin
    reloj: process (clk, reset) begin
        if reset = '1' then
            hh1 <= "000" ;
            hh0 <= "0000";
            mm1 <= "000" ;
            mm0 <= "0000";
        elsif rising_edge(clk) then
            mm0 <= mm0 + 1;
            if mm0 = 9 then
                mm1 <= mm1 + 1;
                mm0 <= "0000";
            end if;
            -- Al pasar 59 minutos, contar una hora.
            if mm1 = 5 AND mm0 = 9 then
                hh0 <= hh0 + 1;
                mm1 <= "000";
            end if;
            if hh0 = 9 then
                hh1 <= hh1 + 1;
                hh0 <= "0000";
            end if;
            -- Al pasar 23:59, regresar a 00:00.
            if hh1 = 2 AND hh0 = 3 AND mm1 = 5 AND mm0 = 9 then
                hh1 <= "000";
                hh0 <= "0000";
            end if;
        end if;
    end process;
     
    --Asignación de señales.
    H1 <= STD_LOGIC_VECTOR(hh1);
    H0 <= STD_LOGIC_VECTOR(hh0);
    M1 <= STD_LOGIC_VECTOR(mm1);
    M0 <= STD_LOGIC_VECTOR(mm0);
end Behavioral;

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #5 en: 19 de Mayo de 2016, 15:21:59 »
Uff como te decia no me acuerdo mucho de VDHL, pero pienso que podrias simplificar en las condiciones que le diste.

Código: [Seleccionar]
    reloj: process (clk, reset) begin
        if reset = '1' then
            hh1 <= "000" ;
            hh0 <= "0000";
            mm1 <= "000" ;
            mm0 <= "0000";
            ss1 <= "000" ;
            ss0 <= "0000";
        elsif rising_edge(clk) then
            ss0 <= ss0 + 1;

            if ss0 = 10 then
                ss1 <= ss1 + 1;
                ss0 <= "0000";
            end if;

            if ss1 = 6 then
                mm0 <= mm0 + 1;
                ss1 <= "000";
            end if;

            if mm0 = 10 then
                mm1 <= mm1 + 1;
                mm0 <= "0000";
            end if;

            -- Al pasar 59 minutos, contar una hora.
            if mm1 = 6 then
                hh0 <= hh0 + 1;
                mm1 <= "000";
            end if;

            if hh0 = 9 then
                hh1 <= hh1 + 1;
                hh0 <= "0000";
            end if;

            -- Al pasar 24:00, regresar a 00:00.
            if hh1 = 2 AND hh0 = 4 then
                hh1 <= "000";
                hh0 <= "0000";
            end if;
        end if;
    end process;

Igual deberia existir una forma mas simple. O se podria crear un bloque que solo cuente hasta 60, y luego se repita. Para los minutos.

Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #6 en: 19 de Mayo de 2016, 16:30:33 »
 :-/ ok gracias por tu aporte lo voy a probar para ver si corre y te comento, lo que sigue despues seria poder guardar los registros en una memoria.

Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #7 en: 21 de Mayo de 2016, 10:04:12 »
 :) :) bueno ya realice la prueba en el programa y lo simule al parecer corre bien pero el conteo es muy lento,
 este es el codigo:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
ENTITY simulacion_final IS
END simulacion_final;
 
ARCHITECTURE behavior OF simulacion_final IS
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT contador_de_personas
    PORT(
         clk : IN  std_logic;
         reset : IN  std_logic;
         h1 : OUT  std_logic_vector(2 downto 0);
         h2 : OUT  std_logic_vector(3 downto 0);
         m1 : OUT  std_logic_vector(2 downto 0);
         m2 : OUT  std_logic_vector(3 downto 0);
         s1 : OUT  std_logic_vector(2 downto 0);
         s2 : OUT  std_logic_vector(3 downto 0)
        );
    END COMPONENT;
   

   --Inputs
   signal clk : std_logic := '0';
   signal reset : std_logic := '0';

    --Outputs
   signal h1 : std_logic_vector(2 downto 0);
   signal h2 : std_logic_vector(3 downto 0);
   signal m1 : std_logic_vector(2 downto 0);
   signal m2 : std_logic_vector(3 downto 0);
   signal s1 : std_logic_vector(2 downto 0);
   signal s2 : std_logic_vector(3 downto 0);

   -- Clock period definitions
   constant clk_period : time := 10 ns;
 
BEGIN
 
   -- Instantiate the Unit Under Test (UUT)
   uut: contador_de_personas PORT MAP (
          clk => clk,
          reset => reset,
          h1 => h1,
          h2 => h2,
          m1 => m1,
          m2 => m2,
          s1 => s1,
          s2 => s2
        );

   -- Clock process definitions
   clk_process :process
   begin
      clk <= '0';
      wait for clk_period/2;
      clk <= '1';
      wait for clk_period/2;
   end process;
 

   -- Stimulus process
   stim_proc: process
   begin      
      -- hold reset state for 100 ns.
      wait for 100 ns;   

      wait for clk_period*10;

      -- insert stimulus here

      wait;
   end process;

END;

esta es la simulacion:




Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #8 en: 21 de Mayo de 2016, 12:45:36 »
ahora me tocaría hacer la parte que guarda los registros y habilitar el censor que es lo mas difícil e integrarlo al codigo

Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #9 en: 21 de Mayo de 2016, 14:48:21 »
que pena ese código que publique es el de la simulacion, mas tarde estare publicando el código en vhdl de la sintaxis

Desconectado abelardo

  • PIC10
  • *
  • Mensajes: 8
Re:creación de un contador de personas que guarde 4 registros en vhdl
« Respuesta #10 en: 25 de Mayo de 2016, 17:44:14 »
este seria el codigo que simule pero no se que hacer con la variable sensor de entrada, esta es de suma importancia ya que el sensor cada ves que cambie va hacer que se guarden el registro. :)


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;


entity contador_de_personas is
    Port ( clk : in  STD_LOGIC;
           reset : in  STD_LOGIC;
         --sensor : in  STD_LOGIC;
           h1 : out  STD_LOGIC_VECTOR (2 downto 0);
           h2 : out  STD_LOGIC_VECTOR (3 downto 0);
           m1 : out  STD_LOGIC_VECTOR (2 downto 0);
           m2 : out  STD_LOGIC_VECTOR (3 downto 0);
           s1 : out  STD_LOGIC_VECTOR (2 downto 0);
           s2 : out  STD_LOGIC_VECTOR (3 downto 0));
end contador_de_personas;

architecture Behavioral of contador_de_personas is
    signal hora1: UNSIGNED(2 downto 0) := "000" ;
    signal hora2: UNSIGNED(3 downto 0) := "0000";
    signal mit1: UNSIGNED(2 downto 0) := "000" ;
    signal mit2: UNSIGNED(3 downto 0) := "0000";
    signal seg1: UNSIGNED(2 downto 0) := "000" ;
    signal seg2: UNSIGNED(3 downto 0) := "0000";   
begin
    reloj: process (clk, reset) begin
        if reset = '1' then
            hora1 <= "000" ;
            hora2 <= "0000";
            mit1 <= "000" ;
            mit2 <= "0000";
            seg1 <= "000" ;
            seg2 <= "0000";
        elsif rising_edge(clk) then
            seg2 <= seg2 + 1;

            if seg2 = 10 then
                seg1 <= seg1 + 1;
                seg2 <= "0000";
            end if;

            if seg1 = 6 then
                mit2 <= mit2 + 1;
                seg1 <= "000";
            end if;

            if mit2 = 10 then
                mit1 <= mit1 + 1;
                mit2 <= "0000";
            end if;

            -- Al pasar 59 minutos, contar una hora.
            if mit1 = 6 then
                hora2 <= hora2 + 1;
                mit1 <= "000";
            end if;

            if hora2 = 9 then
                hora1 <= hora1 + 1;
                hora2 <= "0000";
            end if;
           
            if hora1 = 2 AND hora2 = 4 then
                hora1 <= "000";
                hora2 <= "0000";
            end if;
        end if;
    end process;
   
    H1 <= STD_LOGIC_VECTOR(hora1);
    H2 <= STD_LOGIC_VECTOR(hora2);
    M1 <= STD_LOGIC_VECTOR(mit1);
    M2 <= STD_LOGIC_VECTOR(mit2);
    S1 <= STD_LOGIC_VECTOR(seg1);
    S2 <= STD_LOGIC_VECTOR(seg2);


end Behavioral;


 

anything