TODOPIC

Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: jabo_javi en 20 de Abril de 2007, 18:11:28

Título: cronometro sincrono
Publicado por: jabo_javi en 20 de Abril de 2007, 18:11:28
necesito que le echen un vistazo a este cronometro aver si de momento tiene buena pinta, esk es mi primor trabajo.

NOTA : es solo un cronometro de 4 displays pero solo tengo exo de momento un bloque, es decir para el primer display

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY bloque_1 IS
   PORT ( reset,clk,x : IN  STD_LOGIC;
          a : OUT STD_LOGIG_VECTOR(3 DOWNTO 0);
          y : OUT STD_LOGIC);
END bloque_1;

ARCHITECTURE bloque_1_a OF bloque_1 IS
   TYPE estados IS (0,1,2,3,4,5,6,7,8,9);
   SIGNAL e_actual:estados;
BEGIN
   PROCESS(reset,clk)
   BEGIN
       IF reset='0' THEN
               e_actual <= 0;
        ELSIF(clk'EVENT AND clk='1')THEN
              CASE e_actual IS
                   WHEN 0 =>
                           IF x='0' THEN e_actual<=0;
                           ELSE e_actual<=1;
                           END IF;
                   WHEN 1 =>
                           IF x='0' THEN e_actual<=1;
                           ELSE e_actual<=2;
                           END IF;   
                   WHEN 2 =>
                           IF x='0' THEN e_actual<=2;
                           ELSE e_actual<=3;
                           END IF;
                   WHEN 3 =>
                           IF x='0' THEN e_actual<=3;
                           ELSE e_actual<=4;
                           END IF;
                   WHEN 4 =>
                           IF x='0' THEN e_actual<=4;
                           ELSE e_actual<=5;
                           END IF;
                   WHEN 5 =>
                           IF x='0' THEN e_actual<=5;
                           ELSE e_actual<=6;
                           END IF;
                   WHEN 6 =>
                           IF x='0' THEN e_actual<=6;
                           ELSE e_actual<=7;
                           END IF;
                   WHEN 7 =>
                           IF x='0' THEN e_actual<=7;
                           ELSE e_actual<=8;
                           END IF;
                   WHEN 8 =>
                           IF x='0' THEN e_actual<=8;
                           ELSE e_actual<=9;
                           END IF;
                   WHEN 9 =>
                           IF x='0' THEN e_actual<=9;
                           ELSE e_actual<=0;
                           END IF;
              END CASE;
       END IF;
   END PROCESS;     

   PROCESS ( e_actual, x)
   BEGIN
      CASE e_actual IS
            WHEN 0 =>
                 a <= "0000" ;
                 y <= '0';
            WHEN 1 =>
                 a <= "0001" ;
                 y <= '0';
            WHEN 2 =>
                 a <= "0010" ;
                 y <= '0';
            WHEN 3 =>
                 a <= "0011" ;
                 y <= '0';
            WHEN 4 =>
                 a <= "0100" ;
                 y <= '0';
            WHEN 5 =>
                 a <= "0101" ;
                 y <= '0';
            WHEN 6 =>
                 a <= "0110" ;
                 y <= '0';
            WHEN 7 =>
                 a <= "0111" ;
                 y <= '0';
            WHEN 8 =>
                 a <= "1000" ;
                 y <= '0';
            WHEN 9 =>
                 a <= "1001" ;
                 y <='1';
      END CASE ;
   END PROCESS ;
END bloque_1_a


las salidas "a" ---> iran a un BCD 7 segmentos
la salida "y" ----> ira  a la entrada del siguiente bloque para acer la funcion de la X

me parece k lo de la "y" esta mal metida. alguien me prodria decir como acer k la "y" valga uno solo cuando se pasa del estado 9 al 0??

muchas gracias
Título: Re: cronometro sincrono
Publicado por: Modulay en 21 de Abril de 2007, 02:27:16
Hay unos cuantos errores en tu codigo.
Es bueno que conforme vayas escribiendo,vayas compilando para poder comprobar y corregir los errores que pueda haber.

TYPE estados IS (0,1,2,3,4,5,6,7,8,9);
Esta linea tira error al compilar,ya que al parecer no se pueden usar literales numericos en las definiciones de tipos.Una via alternativa podria ser ponerlo asi:

TYPE estados IS (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9);

...y obviamente hacer los cambios pertinentes en el resto del codigo

Una observacion sobre lo siguiente:

PROCESS(reset,clk)
   BEGIN
       IF reset='0' THEN
               e_actual <= s0;
        ELSIF(clk'EVENT AND clk='1')THEN
...
...

Tal y como lo has estructurado no cubres todos los casos posibles,ya que puede darse un flanco de subida en "reset" sin haber evento en clk y no lo contemplas.
Si lo que quieres es que el reset sea asincrono deberias ponerlo de esta forma:

PROCESS(reset,clk)
   BEGIN
       IF reset='0' THEN                     -- Reset activo
               e_actual <= s0;
       ELSE                                       -- Cualquier otro caso que no sea reset activo
               IF(clk'EVENT AND clk='1')THEN
                     ......
                     ......

A ver si puedes explicar con un poquito mas de detalle como es el diagrama de bloqes de tu sistema y como interactuan entre si los bloques y cuales son las señales implicadas, ya que creo que tu codigo es un poco redundante y se podria escribir de forma mas sencilla,prescindiendo del segundo proceso

¿A que te refieres con que "y" debe permanecer a 1 durante la transicion de "s9" a "s0"?
Lo apropiado es que permanezca a 1 durante todo el tiempo que se permanezca en el estado "s9" para indicar fin de cuenta ¿no?.Tal y como esta ahora es lo que hace
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 21 de Abril de 2007, 03:50:52
haber me voy ha explicar mejor.

Mi intencion es hacer un reloj sincrono en una EPM3064ALC44-10N.

las entradas del reloj seran " x , clk y reset ": 

X --> Sera un interruptor que cuando este activado el cronometro empezara a funcionar y cunado se baje a cero el cronometro se detiene
clk --> la señal de reloj k la tendre k ajustar para k tenga un periodo de 10ms
reset (asincrono) --> cuando se active el reset el cronometro se vuelve a cero independientemente de las otras entradas


las salidas iran a un BCD 7 segmentos para despues ir a un display


El diagrama de bloques es el siguiente:


BLOQUE_1

entradas: x,clk,reset
salidas: a0,a1,a2,a3,y1
a0,a1,a2,a3 --> son las salidas que iran a un multiplexor
y1 --> es la señal que cuando se pasa en el display de 9 a 0 en el siguiente display hace que cambie al siguiente numero

BLOQUE_2

entradas: y1,clk,reset
salidas: b0,b1,b2,b3,y2
b0,b1,b2,b3 --> son las salidas que iran a un multiplexor
y2 --> es la señal que cuando se pasa en el display de 9 a 0 en el siguiente display hace que cambie al siguiente numero

BLOQUE_3

entradas: y2,clk,reset
salidas: c0,c1,c2,c3,y3
c0,c1,c2,c3 --> son las salidas que iran a un multiplexor
y3 --> es la señal que cuando se pasa en el display de 9 a 0 en el siguiente display hace que cambie al siguiente numero

BLOQUE_4

entradas: y3,clk,reset
salidas: d0,d1,d2,d3
d0,d1,d2,d3 --> son las salidas que iran a un multiplexor


MULTIPLEXOR

el multiplexor es porque solo tengo un BCD 7 segmentos

DECODIFICADOR

para elegir a que display le tiene que ir la informacion del BCD en ese momento porque al tener solo uno se necesita el decodificador k a sus salidas iran conectados a un transistor k este estara conectado a un display.

Ahora os enseño como tengo el programa despues de alguna modificacion y alguna prueba que he hecho

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY cronometro IS
   PORT ( reset,clk,x : IN  STD_LOGIC;
          z           : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
          y           : OUT STD_LOGIC);
END cronometro;

ARCHITECTURE cronometro_a OF cronometro IS
   TYPE estados IS (a,b,c,d,e,f,g,h,i,j);
   SIGNAL e_actual:estados;
BEGIN
   PROCESS(reset,clk)
   BEGIN
       IF reset='0' THEN
               e_actual <= a;
        ELSIF(clk'EVENT AND clk='1')THEN
              CASE e_actual IS
                   WHEN a =>
                           IF x='0' THEN e_actual<=a;
                           ELSE e_actual<=b;
                           END IF;
                   WHEN b =>
                           IF x='0' THEN e_actual<=b;
                           ELSE e_actual<=c;
                           END IF;   
                   WHEN c =>
                           IF x='0' THEN e_actual<=c;
                           ELSE e_actual<=d;
                           END IF;
                   WHEN d =>
                           IF x='0' THEN e_actual<=d;
                           ELSE e_actual<=e;
                           END IF;
                   WHEN e =>
                           IF x='0' THEN e_actual<=e;
                           ELSE e_actual<=f;
                           END IF;
                   WHEN f =>
                           IF x='0' THEN e_actual<=f;
                           ELSE e_actual<=g;
                           END IF;
                   WHEN g =>
                           IF x='0' THEN e_actual<=g;
                           ELSE e_actual<=h;
                           END IF;
                   WHEN h =>
                           IF x='0' THEN e_actual<=h;
                           ELSE e_actual<=i;
                           END IF;
                   WHEN i =>
                           IF x='0' THEN e_actual<=i;
                           ELSE e_actual<=j;
                           END IF;
                   WHEN j =>
                           IF x='0' THEN e_actual<=j;
                           ELSE e_actual<=a;
                           END IF;
              END CASE;
       END IF;
   END PROCESS;     

   PROCESS ( e_actual,clk)
   BEGIN
      IF(clk'EVENT AND clk='1')THEN
         CASE e_actual IS
               WHEN a =>
                 z <= "0000" ;     
               WHEN b =>
                 z <= "0001" ;                 
               WHEN c =>
                 z <= "0010" ;                 
               WHEN d =>
                 z <= "0011" ;               
               WHEN e =>
                 z <= "0100" ;               
               WHEN f =>
                 z <= "0101" ;                 
               WHEN g =>
                 z <= "0110" ;               
               WHEN h =>
                 z <= "0111" ;               
               WHEN i =>
                 z <= "1000" ;                 
               WHEN j =>
                 z <= "1001" ;
               WHEN OTHERS =>
                 z <= "----";               
         END CASE ;
      END IF;       
   END PROCESS;
   PROCESS(e_actual,x)
   BEGIN
      CASE e_actual IS
           WHEN a =>
                  y <= x;
           WHEN OTHERS =>
                  y <= '0';           
      END CASE;
   END PROCESS;

END cronometro_a;



espero haberme expresado bien, muchas gracias por la ayuda
Título: Re: cronometro sincrono
Publicado por: Modulay en 21 de Abril de 2007, 12:03:25
Vuelvo a hacerte hincapie en la forma de implementar el IF del proceso principal.Deben evitarse a toda costa las ambiguedades en el codigo,que aunque tal y como lo pusiste pueda funcionar,tambien puede dar lugar a logica erronea tras la sintesis.
Puedes omitir los procesos 2º y 3º,es mas,ademas de estar registrando innecesariamente las señales "y" y "z" cuando puedes resolverlas de forma combinacional,la actualizacion de "z" no se producira en el mismo flanco que actualiza "e_actual" sino en el siguiente,cuando "e_actual" ha adoptado un nuevo valor (las señales no se actualizan instantaneamente).
Se me ocurren dos opciones....que hagas las asignaciones de "z" dentro del proceso principal,junto a cada asignacion de "e_actual",o bien que lo hagas de forma combinacional:

Código: VHDL
  1. with e_actual select
  2.            z <= "0000" when a,
  3.                    "0001" when b,
  4.                    "0010" when c,
  5.                    "0011" when d,
  6.                    "0100" when e,
  7.                    "0101" when f,
  8.                    "0110" when g,
  9.                    "0111" when h,
  10.                    "1000" when i,
  11.                    "1001" when others;
  12.  
  13. y <= x when e_actual = a else '0';
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 21 de Abril de 2007, 13:15:27
vamos aver si me a kedado claro:

En primer lugar, gracias por ayudarme. ahora vamos al lio.

el IF del proceso principal al que haces referencia, segun los apunte (de mi profesor) el lo pone asi y como el profesor siempre tiene la razon pues.... Pero aun asi me gustaria entender porque dices que esta mal, asi que si puedes explicarlo un poquito no estaria mal

por ultimo aver si es asi como dices que he de ponerlo:


LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY cronometro IS
   PORT ( reset,clk,x : IN  STD_LOGIC;
          z           : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
          y           : OUT STD_LOGIC);
END cronometro;

ARCHITECTURE cronometro_a OF cronometro IS
   TYPE estados IS (a,b,c,d,e,f,g,h,i,j);
   SIGNAL e_actual:estados;
BEGIN
   PROCESS(reset,clk)
   BEGIN
       IF reset='0' THEN
               e_actual <= a;
        ELSIF(clk'EVENT AND clk='1')THEN
              CASE e_actual IS
                   WHEN a =>
                           IF x='0' THEN e_actual<=a;
                           ELSE e_actual<=b;
                           END IF;
                   WHEN b =>
                           IF x='0' THEN e_actual<=b;
                           ELSE e_actual<=c;
                           END IF;   
                   WHEN c =>
                           IF x='0' THEN e_actual<=c;
                           ELSE e_actual<=d;
                           END IF;
                   WHEN d =>
                           IF x='0' THEN e_actual<=d;
                           ELSE e_actual<=e;
                           END IF;
                   WHEN e =>
                           IF x='0' THEN e_actual<=e;
                           ELSE e_actual<=f;
                           END IF;
                   WHEN f =>
                           IF x='0' THEN e_actual<=f;
                           ELSE e_actual<=g;
                           END IF;
                   WHEN g =>
                           IF x='0' THEN e_actual<=g;
                           ELSE e_actual<=h;
                           END IF;
                   WHEN h =>
                           IF x='0' THEN e_actual<=h;
                           ELSE e_actual<=i;
                           END IF;
                   WHEN i =>
                           IF x='0' THEN e_actual<=i;
                           ELSE e_actual<=j;
                           END IF;
                   WHEN j =>
                           IF x='0' THEN e_actual<=j;
                           ELSE e_actual<=a;
                           END IF;
              END CASE;
       END IF;
   END PROCESS;     


with e_actual select
  z <= "0000" when a,
          "0001" when b,
          "0010" when c,
          "0011" when d,
          "0100" when e,
          "0101" when f,
          "0110" when g,
          "0111" when h,
          "1000" when i,
          "1001" when others;

y <= x when e_actual = a else '0';

END cronometro_a;


Título: Re: cronometro sincrono
Publicado por: Modulay en 22 de Abril de 2007, 10:36:31
Exactamente,asi como lo has escrito deberia marchar bien.
En cuanto al dilema del IF pues es lo que te comente antes.Las condiciones de los IF deben ser totalmente excluyentes.Esto es parecido a programar software pero no es software y los resultados no tienen por que ser equivalentes...no digo que este mal,de hecho puede ser totalmente valido en la mayoria de ocasiones,pero dependiendo sobre todo de la herramienta de sintesis que se use se pueden obtener esquemas logicos incorrectos.
Asi es como me lo explico mi profesor a mi y esas son las razones que me dio.Las ambiguedades hay que evitarlas a toda costa ya que,si bien un software de sintesis puede resolverte la papeleta sin problemas,otro software diferente puede hacer una interpretacion incorrecta del codigo y desembocar en un diseño no valido
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 22 de Abril de 2007, 10:51:54
muchas gracias por la ayuda prestada que me a servido de mucho. Ya comentare que tal cuando lo programe.


Ahora la duda que me surge es: necesito una señal de entrada(clk) cuadrada 0 a 5 con una frecuencia de 100Hz, pero como la consigo?

los circuitos integrados que tengo son los siguientes:

             74HC14
             74HC244
             CD4511

como consigo la señal?
gracias
Título: Re: cronometro sincrono
Publicado por: Modulay en 22 de Abril de 2007, 10:56:25
Si no me equivoco estas trabajando con una fpga ¿por que echas mano de tanto hard externo cuando la fpga puede hacertelo practicamente todo?
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 22 de Abril de 2007, 13:14:30
pues porque no tengo mucha idea. La cosa es que nos a dicho que hagamos algo con la placa pero no nos a dado muchos conocimientos. Como se podria hacer el clk con  la EPM3064ALC44-10N? muchas gracias
Título: Re: cronometro sincrono
Publicado por: Modulay en 22 de Abril de 2007, 15:27:16
Imagino que la fpga estara integrada en una tarjeta entrenadora o algo asi y que tendra un cristal oscilador conectado.
Si es asi puedes tomar la señal de reloj de ahi y mediante modelado vhdl hacer un divisor de frecuencia que tenga como entrada esa señal de clock principal y como salida o salidas las señales de reloj a diferentes frecuencias que pueda requerir tu diseño.Esto es muy facil de hacer.Una solucion valida cuando las frecuencias de funcionamiento no son altas es mediante el uso de contadores:

Código: VHDL
  1. -- Supongamos una frecuencia de entrada de 50 MHz y queremos una frecuencia de salida de 100 Hz y otra de 500 HZ
  2. -- 50000000 / 100 = 500000 cuentas
  3. -- 50000000 / 500 = 100000 cuentas
  4.  
  5. entity divisor_frecuencia is
  6.     port(clkin: in std_logic;
  7.            clk100: out std_logic;
  8.            clk500: out std_logic);
  9.  
  10. end divisor_frecuencia;
  11.  
  12.  
  13. architecture Behavioral of divisor_frecuencia is
  14.    signal clk100i,clk500i: std_logic;
  15.  
  16. begin
  17.  
  18.   reloj100: process(clkin,reset)
  19.     variable contador100: integer;
  20.   begin
  21.     if(reset = '0') then
  22.       contador100 := 0;
  23.       clk100i <= '0';
  24.     else
  25.       if (clkin'event and clkin = '1') then
  26.          if (contador100 = 250000) then
  27.             clk100i <= not clk100i; -- Invertimos clk100i cada semiperiodo
  28.             contador100 := 0;
  29.          else
  30.             contador100 := contador100 + 1;
  31.          end if;
  32.       end if;
  33.     end if;
  34.   end process;
  35.  
  36. reloj500: process(clkin,reset)
  37. begin
  38.   -- Igual que el anterior pero implementando una cuenta apropiada para actuar sobre clk500i
  39. end process;
  40.  
  41. clk100 <= clk100i;
  42. clk500 <= clk500i;
  43.  
  44. end Behavioral;
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 22 de Abril de 2007, 16:59:30
lo del cristal oscilador que yo sepa no tengo.

lo que tengo es esto, aver si me explico bien:

la FPGA, y una tarjeta con lo siguiente:

condensadores
resistencias
diodos
LEDs
2N2222
pulsadores
interruptores
LM1117T-3.3
LM7805C
74 HC14
74HC244
CD4511
displays


no hay nada mas, solo tengo eso, weno tb hay tiras de pines
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 22 de Abril de 2007, 19:42:34
me parece k le e visto un fallo al programa. es en la parte de la variable "y"

lo k tengo puesto es lo siguiente:
 y <= x when e_actual = a else '0';

pero con esto cuando empieza el cronometro a contar, es decir clk='1' y x='1' la salida y se pone a 1 y no deveria de ser asi; no es cierto? lo comprobaria con el programa pero esk no lo tengo ahora. muchas gracias otra vez
Título: Re: cronometro sincrono
Publicado por: Modulay en 23 de Abril de 2007, 06:40:56
Tienes razon.si es para indicar fin de cuenta deberia ser:

y <= x when e_actual = j else '0';

La tarjeta seguro que tiene algun tipo de oscilador.
¿No tiene nada parecido a lo de la imagen?

(http://img177.imageshack.us/img177/4338/cristalesoa8.jpg)

Título: Re: cronometro sincrono
Publicado por: jabo_javi en 23 de Abril de 2007, 08:38:22
mi tarjeta no tiene ningun oscilador de los que me comentas o por lo menos eso creo yo. Lo unico que tiene son todos los componentes que te e indicado en un comentario anterior. me parece que igual tengo que cambiar de poryecto porque si no puedo generar la entrada de reloj no tengo nada.jaja. ves alguna solucion?
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 23 de Abril de 2007, 09:40:56
buscando por internet he encontrado esto:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY clkconvert IS
GENERIC(max: integer :=100);
PORT(
IN_CLK,Reset,E          :IN               STD_LOGIC;
OUT_CLK                   :BUFFER     STD_LOGIC);

END clkconvert;

ARCHITECTURE Behaviour OF clkconvert IS
SIGNAL Q:INTEGER RANGE 0 TO max;
BEGIN
   PROCESS(IN_CLK,Reset,E)
BEGIN
      IF Reset=’1’ THEN
      Q<=0;
      ELSIF(IN_CLK’EVENT AND IN_CLK=’1’)THEN
      IF E=’1’THEN
      Q<=Q+1;
          IF Q=max THEN
          OUT_CLK<=NOT OUT_CLK;
          Q<=0;
          END IF;
      END IF;
     END IF;
  END PROCESS;
END Behaviour;


lo que pasa que no lo entiendo y no se si puede ser esto lo que busco


Título: Re: cronometro sincrono
Publicado por: Modulay en 23 de Abril de 2007, 10:20:21
Ese proceso hace lo mismo que el que te puse yo.
Necesitas una fuente de reloj externa a la fpga,como por ejemplo un cristal.
Me cuesta creer que la tarjeta que estas usando no traiga uno.
¿que modelo de tarjeta es? ¿no tienes un manual o alguna referencia?
Título: Re: cronometro sincrono
Publicado por: Sirkius en 23 de Abril de 2007, 16:35:19
A mi también me cuesta creerlo. Además de un oscilador en la plaquita suele venir para conectar un oscilador externo, si no la FPGA sería prácticamente inútil (lo puramente combinacional no tiene gracia :P).
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 23 de Abril de 2007, 18:19:49
aver os escrivo la hoja de componentes, ya que no hay forma de poder subirla


Zocalo PLCC 44 pines
Zocalo DIP 20 pines
Zocalo DIP 14 pines
Zocalo DIP 16 pines
cable 10 hilos
condensador electrolitico 10microfaradios/10V
12 condensadores plastico 0.1microfaradios/50V
5 LED 3mm rojo
4 Diodo 1N4007
jack de alimentacion
tira de pines 2x22
tira de pines 2x5
tira de pines 26
tira de pines 3
conector DB-25 Macho para cable
4 transistor NPN 2N2222
SIP de 8 resistencias 10K
SIP de 8 resistencias 2.2k
resistencias
microinterruptores DIP-SW 8
5 pulsador
LM1117T-3.3
74HC14
LM7805C
74HC244
CD4511
EPM3064ALC44
2 TDSR5160 Display catodo comun
Título: Re: cronometro sincrono
Publicado por: Modulay en 23 de Abril de 2007, 18:38:42
Mira a ver que hay conectado en los pines 2 y 43

(http://img377.imageshack.us/img377/6103/fpgahw8.jpg)
Título: Re: cronometro sincrono
Publicado por: Modulay en 23 de Abril de 2007, 18:45:38
Si tienes un manual de la placa o algo subelo aqui:

http://www.sharebigfile.com (http://www.sharebigfile.com)
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 23 de Abril de 2007, 19:15:46
aki esta una foto de la tajeta que he de usar:

http://www.sharebigfile.com/file/151073/Imagen050-jpg.html


si kereis con mas detalle alguna parte decirmelo
Título: Re: cronometro sincrono
Publicado por: Modulay en 23 de Abril de 2007, 21:03:19
Parece ser que tienes una tarjeta de la que no te han facilitado su correspondiente manual (sin el cual poco puedes hacer) y que al parecer tampoco cuenta con circuito oscilador.Yo que tu le daba una buena colleja al profe...
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 24 de Abril de 2007, 13:42:26
esto es mi oscilador: 74HC14 con eso e de conseguir una frecuencia de 100Hz
Título: Re: cronometro sincrono
Publicado por: Sirkius en 24 de Abril de 2007, 15:41:21
Umhh, vamos que tienes que hacer un oscilador casero (sin cristal)... mira, si conectas dos hc14 así (a ver si me sale):

--------------
|                |
|-HC---HC--

Eso oscila por si solo, pero para controlar la frecuencia (así solo tendrías ruido), tienes que cambiar el cable por un circuito resonante. En comunicaciones usamos mucho condensador y bobina (no sé las limitaciones que tienes), de forma que f0 = 1/(2*pi*sqrt(L*C))... Pero para hacerlo con condensador y bobina convence a tu profesor para que te deje usar un LM555 o similar que si bien no es nada estable comparado con un cristal para 100 Hz tienes más que suficiente.

PD: el hc14 es un inversor con histéresis, no es un oscilador!
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 24 de Abril de 2007, 18:33:05
voy a intentar pasar los esquemas de la tarjeta
Título: Re: cronometro sincrono
Publicado por: Modulay en 24 de Abril de 2007, 18:33:13
Implementes como implementes el circuito oscilador sigues necesitando el manual de usuario de la placa,ya que necesitarás conocer los diagramas de conexiones de los elementos para poder llevar a cabo tu diseño,además de los detalles de programación de la fpga,etc...Si tu profesor no te lo ha facilitado deberías preguntarle
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 24 de Abril de 2007, 18:42:30
http://www.sharebigfile.com/file/152049/cronometro-doc.html
Título: Re: cronometro sincrono
Publicado por: Modulay en 25 de Abril de 2007, 15:35:46
Bueno,parece que tienes un oscilador del tipo que te ha comentado Sirkius (74HC14) conectado al primer bus de reloj de la pld.
Al parecer la frecuencia de oscilación es bastante baja,aunque deberías comprobarlo con un osciloscopio y determinar de forma exacta cual es dicha frecuencia.
Una vez lo sepas ya puedes seguir con tu diseño por una vía u otra para obtener las señales de reloj que necesites
Título: Re: cronometro sincrono
Publicado por: jabo_javi en 25 de Abril de 2007, 17:54:32
muchas gracias por la ayuda si tengo alguna otra duda ya la comentare por aki