Dudas sobre Programación en VHDL

Mostrar en cuatro displays de siete segmentos una palabra de cuatro caracteres. La palabra estará formada por las primeras 4 letras que son S T E F

lo que quiero hacer es mostrarlos en 4 displays pero con este efecto
0000
000S
00ST
0STE
STEF
TEF0
EF00
F000
0000

Lo primero que he realizado es saber q combinaciones necesito en los displays para generar estas letras
segmentos de mis display g f e d c b a
1 1 0 1 1 0 1 --s--
0 1 1 0 0 0 1 --t--
1 1 1 1 0 0 1 --e--
1 1 1 0 0 0 1 --f--
pero mi programacion de v.h.d.l no funciona =(
 
Última edición:
entity Unidad_3 is

port( CLK: in std_logic ;
Q: out std_logic_vector ( 6 downto 0 ));
end Unidad_3;

architecture behavioral of Unidad_3 is
begin
process (CLK)
begin
if (CLK'event and CLK = '1' ) then
if (Q = "0111111") then --0--
Q<= "1101101";
elsif (Q = "1101101") then --s--
Q<= "0110001";
elsif (Q = "0110001") then --t--
Q<= "1111001";
elsif (Q = "1111001") then --e--
Q<= "1110001";
else Q<= "1110001"; --f--
end if;
end if;
end process;
end behavioral;
 
Algunas observaciones

Fijate que asi como esta nunca va a pasar nada ya que Q no tiene un valor inicial. Lo que podes hacer es agregarle una swñal de reset y asignarle el primer valor en reset.

Lo otro es que en VHDL no se puede leer el valor de una salida, entonces lo que se hace es definir una señal interna y segun el valor que tenga, activar la logica y la salida.

Luego de esas correcciones ya tendrías la salida para un display, te falta pensar como hacer la logica para cuatro.
 
mira ya tengo la sincronia con 2 display solo me falta ajustarlo para que los sig dos funcionen =. tendras algun manual o algo q m pueda ayudar parte del libro de maxinez?
 
Hola

requiero la realizacion de un sistema secuencial para un trabajo en la universidad, el problema es que es circuito tiene un 555 como monoestable de unos 5sg, la tarea es realizar este temporizador en vhdl, las dudas me embargan ya que tengo practica con microprocesadores y no con este lenguaje, si es posible que alguien me oriente sobre este tema seria de gran ayuda, ya que no se si estos dispositivos tiene clock y como manejar esta señal.

Gracias
 
Los FPGA normalmente tienen señal de reloj, si tenes una referencia exacta de reloj, hacer un temporizador en definitiva es contar n pulsos de reloj. Si el reloj tiene periodo de 1us, un contador hasta mil puede hacer un retardo de hasta 1ms
 
gracias por la nota aclarativa, lo siguiente es como puedo crear una variable en vhdl, segun veo
varible axx: integer 0 to 100; esta bien declarada y al hacer esto la puedo usar para decrementarla en cada transicion del clk.
 
VHDL es distinto a un lenguaje de programacion comun. En un lenguaje como Basic o C creas una variable y ella ocupara una posicion de memoria. En VHDL lo que se hace es describir hardware. Por eso no pensamos en funcion de variables sino en funcion de elementos de hardware: compuertas, flipflops, contadores. Buscate algun libro de los que ya fueron recomendados en el foro y fijate como se define y usa un contador.
 
este es el algoritmo creado para resolver la aplicación, me podrías regalar tu opinión.

Código:
use IEEE.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity    CAR is             //definer la eentidad carro
PORT (IN1,IN2,CLK:IN STD_LOGIC; Q1,Q1N,Q2,Q2N:OUT STD_LOGIC);// entradas y salidas de la entidad
end CAR

Architecture  CAR_CONTROL of CAR is
signal (QT,fin: STD_LOGIC;cont:integer range o to 99000)

begin 
process (IN1,IN2,CLK,fin,cont)
begin 


if  (rising_edge(IN1) or RISING_EDGE(IN2)) then
      QT<= NOT QT;
          if  QT=1 then
                Q1<=0;
                Q1N<=0;
                Q2<=0;
                Q2N<=1;
            
            else //QT=0
                         Q2<=0;
                Q2N<=0;
                Q1<=0;
                Q1N<=1;
        end if 
        cont<=3000;
                          fin<=0;
 CICLO DE ESPERA 
    while  fin = 0 loop 
        
        if  ( clk'event  and  clk='1') then 
             cont<=cont -1;
                if cont= '0'
                    fin<='1';
                end if
        end if 
       end loop 
    
     
else 
        Q1<=1;
        Q2<=1;
        Q1N<=0;
        Q2N<=0;
        
end if
 
Última edición por un moderador:
Hola!

bueno, has hecho ya un esqueleto y eso es bueno

unas cuantas observaciones

En un dispositivo sincrono, como flip flops y contadores, hay solamente dos señales a tomar en cuenta en la sensitividad de los procesos

Reset ( que no usaste)
y clock

se usa rising edge solamente para la señal de clock, ya que es el clock el que muestrea la entrada y la presenta a la salida
reset normalmente resetea al flip flop o contador

un ejemplo tipico de flip flop

process (reset, clock)

if (reset = '0')
q<= '0';
elsif(rising_edge(clock))
q<= in;
end if;

end process

fijate que la señal in y q no aparecen en la lista de sensibilidad

Un contador es parecido a un flip flop con el agregado de una señal de load para cargar datos y una de enable para contar.

Una compañia que a mi me gusta es Altera, busca en su sitio y encontraras exactamente como escribir flip flops y contadores. Si todavia no queda algo claro pregunta

Suerte!
 
tengo un contador de 0 a 9999 con un pin de down/up con el cual el automaticamente comienza a contar ascendente o descendente, necesito quitarle el automatico y volverlo manual, de tal manera que le habilite un pulsador que cada vez que lo pulse cuente 1, 2, 3, 4, 5...etc
 

Adjuntos

  • 9999_CONTADOOR2 (1).rar
    796.9 KB · Visitas: 51
Bueno, debo hacer una máquina de estado, e implementarla en una FPGA, sucede que no tengo claro como podría multiplexar 4 displays 7 segmentos de la targeta para mostrar una secuencia en dichos displays, cada cierto segundo.
A continuación la secuencia que debe seguir cada segundo.

Ver el archivo adjunto 102910
Alguien tiene documentación de como hacer esa multiplexación de displays..
gracias.

Algo que se me ocurre es mostrar el mensaje al tiempo en todos los displays y tener 4 señales de reloj..diseñar divisores de frecuencia para que la la frecuencia sea tan rápida que el ojo humano no la perciba.. gracias.
 

Adjuntos

  • cats.jpg
    cats.jpg
    80.7 KB · Visitas: 5
Les comento, recién estoy haciendo mis primeros ensayos en VHDL usando el software QuartusII versión 13.1 de Altera.
La placa de desarrollo es la DE0, la intención es hacer un contador de 4 bits (muy simple creo yo) y para empezar está ok.
Bueno el código esta aquí:

-- contador 4 bits con clk y reset
Código:
library ieee;
use ieee.std_logic_1164.all;

entity contador is port (clk: in std_logic;
                 rst: in std_logic;
                   q: inout std_logic_vector (3 downto 0));
end contador;


architecture cuenta of contador is
begin 
process (clk,rst) begin 
    if (rst'event and rst = '0') then 
        q<= "0000";
        if (clk'event and clk = '0') then 
            q <= q+1;
        end if;
    end if;
end process;
end cuenta;
La pregunta es; al compilar me arroja el siguiente error:
Error (10327): VHDL error at contador.vhd(16): can\'t determine definition of operator "+" -- found 0 possible definitions

Buscando, encontré que usando la librería std_logic_unsigned se podría corregir dado que no es posible hacer una suma con datos del tipo std_logic y std_logic_vector, así que declaré la librería y nada, el error persiste.
He usado varias librerías sin resultado positivo. ¿Alguien tiene alguna pista sobre como corregir este error?

Saludos.
 
Última edición por un moderador:
Estimado aguevara, estas trabajando con operadores sobrecargados, por lo que tendrás que utiliza la librería IEEE para tal fin. Esto lo puedes solucionar declarando al inicio de tu descripción:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

Además recuerda en declarar las señales de manera correcta para poder realizar la operaciones de suma.

Cualquier duda revisa las librerías o comenta para dar mas ayuda.
Recuerda que VHDL NO TIENE EL MISMO TRATO QUE LENGUAJE C.



Otra aclaración, no es recomendable declarar un puerto como entrada y salida a la vez, sobre todo si recien estas comenzando a describir hardware.
 
Lo de las librerias ya las he definido como indicas y .. nada de nada el mismo error, a que te refieres con declarar las señales de manera correcta?, es que acaso debo diseñar el contador completamente con compuertas?? que si deseo omitir ese paso y ver al contador solo como una caja con 2 entradas y 4 salidas?? (no se si me explique)
 
Este anda, comparalo con el tuyo y fijate si entendes todos los cambios que hice, ya que todos son necesarios.

Código:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity counter is 
port (
	clk: in std_logic;
    rst: in std_logic;
    q: 	 out std_logic_vector (3 downto 0)
);
end counter;


architecture count of counter is
	signal cnt : std_logic_vector (3 downto 0);
begin 
process (clk,rst) begin 
    if (rst = '0') then 
        cnt <= (others => '0');
    elsif (clk'event and clk = '0') then 
        cnt <= cnt + 1;
    end if;
end process;
q <= cnt;
end count;

Te remarco algunos de los principales:

Usé out en lugar de inout para la salida q
No usé event para reset (es incorrecto usar event para reset, se usa para clock)
Usé la libreria unsigned
Usé una variable auxiliar (por que?)...
 
Última edición:
Atrás
Arriba