Ayudita con un código en VHDL

Hola, pues vereis, tengo que hacer una practica en VHDL cuyo enunciado es el siguiente:

"Utilizando VHDL crear un generador de frecuencia programable. Este sistema ha de contar con una entrada de frecuencia de referencia procedente del oscilador de 25.175MHz disponible en la placa UP2 y cuatro entradas de configuración que pueden provenir de los conmutadores de la placa UP2. El sistema ha de proporcionar como salida una señal de reloj cuya frecuencia ha de corresponder a N*1MHz donde N es el valor binario de la palabra de entrada presente en las cuatro entradas de configuración.Será necesario comprobar el funcionamiento del generador midiendo la frecuencia de salida en el osciloscopio."

Total, que yo felizmente he hecho lo siguiente:

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

library ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;

ENTITY genfrec is
PORT (
limite: in bit_vector(3 downto 0);
oscilador: in bit ;
salida: out bit
);
END genfrec;

ARCHITECTURE cambio OF genfrec IS

signal limitedec: integer;

BEGIN

with limite select
limitedec <= 10 when "0001",
10 when "0010",
10 when "0011",
10 when "0100",
10 when "0101",
10 when "0110",
10 when "0111",
10 when "1000",
10 when "1001",
10 when "1010",
10 when "1011",
10 when "1100",
10 when "1101",
10 when "1111",
10 when others;

proceso_cambio: PROCESS (limite, oscilador, salida)

variable contador: integer;
contador:=0;

BEGIN
salida <='1';
IF oscilador'event AND oscilador='1' THEN
contador := contador+1;
end if;
IF contador=limitedec THEN
contador := 0;
IF salida='1' THEN
salida <= '0';
else
salida <='1';
end if;
end if;

END PROCESS proceso_cambio;
END cambio;
--------------------------------------------------------

He puesto para todos los valores del switch que limitedec sea 10 para probar que realmente me reduce la frecuencia entre 10. Y una vez comprobara que funciona pues ya lo cambiaria y le iría poniendo valores, pero esq he exo la asignacion de pines correspondiente, me compila, pero no hay forma de que la simulacion me funcione, me da la salida en alta impedancia... que es lo que le falla al código!?
Creo que estoy emperrado en que eso deberia ir y hay algo muy obvio que no veo, a ver si algun entendido en VHDL lo ve pq ya me toy desesperando!

Mil gracias a quien se haya leido todo el tocho! ;-)

Edit: El código sale sin los espacios que deberia tener pq no me los borra solo al darle a enviar :( en cuanto alguien escriba adjunto un txt con el codigo ordenado ya que ahora no me deja adjuntar archivos
Entiendo muy poco de VHDL (el año que viene a ver si me enseñan algo...), pero salida no debería ser "buffer" para poder hacer la comparación?
_MoeB_ está baneado por "Troll brutal"
Hola,

Mira a ver si poniendo una nueva entrada llamada RESET y cambiando esto te funciona:

proceso_cambio: PROCESS (limite, oscilador, salida)

variable contador: integer;
contador:=0;

BEGIN
IF RESET='1' then
salida <='0'; -- Cuando se resetea el sistema la salida es 0
ELSIF oscilador'event AND oscilador='1' THEN
contador := contador+1;
end if;
IF contador=limitedec THEN
contador := 0;
IF salida='1' THEN
salida <= '0';
else
salida <='1';
end if;
end if;

END PROCESS proceso_cambio;



Recuerda en VHDL todo sucede al mismo tiempo, no es como en C, C++, Java etc. los cuales son sequenciales.


Dime si te funciona :-)

Un saludo
Hola! ante todo gracias!
Yo tb entiendo muy poquito de VHDL de ahí que no sepa seguro si es lo que dices. He pensado que a lo mejor tengo que definir el reloj de entrada (oscilador) y la salida como STD_LOGIC.. ahora mismo no puedo probarlo, esta tarde pruebo como dices, y como digo yo a ver si sale ;)

Edit: Moeb hemos escrito casi a la vez jeje pero a ver, si yo hago un proceso, todo lo que haya dentro del proceso es secuencial no!? como en C, C++, etc..

Adjuntos

_MoeB_ está baneado por "Troll brutal"
Hola,

Me acabo de dar cuenta de un detalle:

Como bien dices cambia esto:

PORT (
limite: in std_logic_vector(3 downto 0);
oscilador: in std_logic ;
salida: out std_logic);

y tambien esto:

signal limitedec: integer;
signal sld: std_logic:='0';


entonces haces esto:

BEGIN
IF RESET='1' then
salida <='0';
IF oscilador'event AND oscilador='1' THEN
contador := contador+1;
salida<= sld;
end if;
IF contador=limitedec THEN
contador := 0;
IF sld='1' THEN
sld <= '0';
else
sld <='1';
end if;
end if;

END PROCESS proceso_cambio;



YOO: Moeb hemos escrito casi a la vez jeje pero a ver, si yo hago un proceso, todo lo que haya dentro del proceso es secuencial no!? como en C, C++, etc..


Por ejemplo:

IF RESET='1' then
salida <='0';
IF oscilador'event AND oscilador='1' THEN
contador := contador+1;
salida<= sld;
end if;

Una vez que el evento del oscilador ocurre, todo lo que hay dentro del IF, se ejecuta a la vez. Es decir el contador se incrementa y el estado de la salida se actualiza.


PD: Me cuesta muchisimo explicar las cosas en Castellano, lo facil que es en ingles ;-)
Muchas gracias por tu ayuda moeb, al final he conseguido que funcione! :D:D:D
Esq tenia un pequeño error de concepto yo con las señales, y ademas el if que hacia debia estar dentro del otro if.. como no se explicarme bien por aqui adjunto el codigo para que lo veas por ti mismo ^^

Mil Gracias de nuevo!

Pd: hay alguna forma de obtener en vhdl la parte entera de un numero?

Adjuntos

_MoeB_ está baneado por "Troll brutal"
Hola,


Me alegro muchisimo que te haya funcionado.

Yo llevo todo el fin de semana peleandome con un bloque de codigo y aun no he conseguido que me funcione (se pierden los datos dentro del bloque y no sale ninguna senyal).


Bueno, a ver si consigo que funcione hoy.

Un saludo
Moeb, no quiero abusar de tu confianza.. pero si tienes un ratillo y puedes exarle un vistazo a este nuevo ejercicio me harias un gran favor. El ejercicio en cuestion es el siguiente:

"Utilizando VHDL, diseñar un pequeño medidor de frecuencia digital para el rango de entrada 1-90kHz. El sistema contarña con una entrada por la que se untroducirá una señal de reloj obtenida de los generadores del laboratorio y qye se ajustará al rango de entrada anterior. El medidor, usando como referencia el oscilador de la placa UP2 (25.125MHz), representará en los displays de 7 segmentos la medida de la fecuencia de entrada obtenida con el osciloscopio, habrá quede calibrarse el medidor diseñado."

Pues el caso es que el codigo que he implementado es el que adjunto.
El problema es que creo que computacionalmente está super sobrecargado, y ademas, no se como almacenar el contador final, llevo dandole vueltas un tiempo y no hay manera, no me gusta la forma en que lo hago.
Si le fijo un valor al contador final (contador2) todo se ejecuta correctamente y sale lo que deberia por el display... no entiendo pq no funciona asi.
A ver si alguien consigue descifrar que falla!

Muchisimas gracias y perdona xq me has dado la mano y te he cogido el brazo o más! :P

Un saludo!

Adjuntos

7 respuestas