Dudas sobre Programación en VHDL

bueno yo en el post de curso para iniciarse con fpga puse una alu q restaba sumaba, comparaba y otras funciones solo tocaria pensar para hacer el divisor pero eso si no es tan facil de hacerlo revisa el alu y me cuentas
 
busca en el link de circuitos logicos combiancionales y secuenciales luego busca ahi el link curso para iniciarce con fpga la ultima pagina y listo por ahi te aparece lo q te dije
 
Como estan amigos del foro de electrónica, recien empiezo en lo que es VHDL y esto tratando de hacer un contador digital de 7 bits, en esta parte no tuve ningún problema, pero en la parte de simulación el programa en elXilinx ISE 12.1 me da periodos de reloj de 50MHz en frecuencia y quiero bajarla a 1Hz, estaria muy agradecido si me pudieran ayudar en esta tarea.

El diseño del contador de 7 bit es el siguiente:

Código:
-- Contador de 7 bits --

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

Entity contador is
        Port(clk : in std_logic;
               X  : inout std_logic_vector(2 downto 0):="000");
End contador;

Architecture flujo of contador is
begin
    process (clk)
begin
        if (clk'event and clk = '0') then
                      X <= X + 1;
        end if;
    end process;
end flujo;
 
Última edición por un moderador:
ocupas dividir la frecuencia con un contador, por ejemplo haces el caclculo para ver cuantos pulsos de reloj ocupas y le das un valor de 1, y se ponga en cero y asi consecutivamente, ;D.
Código:
Library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity div_50MHz is
port
(
osc_50MHz: in std_logic;
clk : buffer std_logic:='0'
);
end div_50MHz;

Architecture flujo of div_50MHz is
signal conteo: integer range 0 to 25000000;
begin
process(osc_50MHz)
    begin
    if(osc_50MHz' event and osc_50MHz='1')then
    conteo<=conteo +1;
        if(conteo=25000000)then
        conteo<=0;
        clk<=not(clk);
        end if;
    end if;    
end process;    
end flujo;
 
FUNCIONAMIENTO
El Registro de Desplazamiento, además del almacenamiento de datos propios del registro, es capaz de establecer comunicación entre los elementos (Flip- Flops) vecinos permitiendo el transporte de datos (de forma serie)a derecha e izquierda del registro. Por consiguiente, las operaciones que un registro de desplazamiento puede contener son: inicialización, carga de datos, desplazamiento a la derecha, desplazamiento a la izquierda y no operación.

Todas las operaciones, excepto la de inicialización asíncrona pueden estar controladas a través de una señal de control, ctrl, de dos bits.

A continuación se muestra la tabla de estados del registro de desplazamiento. Para los desplazamientos a derecha e izquierda, se necesita, además, una señal de entrada serie por la izquierda il, y otra por la derecha ir, respectivamente.


A partir de la descripción de la tabla de estados del registro de desplazamiento es fácil comprender la descripción VHDL. LA descripción se ha realizado de forma genérica y se ha implementado para n=6 (bus de 6 datos). Se puede observar cuán fácil es implementar los distintos modos de funcionamiento del registro de desplazamiento utilizando la instrucción if-then. Además se ha implementado la instrucción if then <=0 para implementar el modo Noop del registro de desplazamiento.


Código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Proyecto is --Declarando puertos, variables de entrada y salida
    Port ( datos 	: in bit_vector(5 downto 0); --6 interruptores
           right	: in bit;	--pulsador hacia la derecha
           left	: in bit;	--pulsador hacia la izquierda
           muestra	: in bit;	--pulsador para cargar
           leds 	: out bit_vector(5 downto 0):="000000";	 --leds
           clock	: in bit);--reloj
end Proyecto; --Fin de la declaración

architecture Digitales of Proyecto is  --declaramos variables intermedias
signal temp:   bit_vector(5 downto 0):="000000";	--registro
signal salida: bit_vector(5 downto 0):="000000";	--temporal para el desplazamiento
signal correi: bit:='0';  			 --ya duro los 250ms undido el pulsador hacia la izq
signal corred: bit:='0';			 --ya duro los 250ms undido el pulsador hacia la der
signal contador: integer range 0 to 12500000; --contador para el clock de 50Mhz = 250ms
	
begin						 --iniciamos la programacion
process(clock)					 --cada vez que cambie el clock
begin	
	if clock'event and clock='1' then	--revisa si hay flanco de subida
		if muestra='1' then		--si undi el pulsador para cargar
			salida<=temp;		--carguemelo en el registro
			temp<=datos;
		end if;
	
		if left='1' then  				 --si se presiona el de la izq
			if contador=12500000 then	 --contador de 250ms
				correi <='1';		--si ya duro los 250ms, active correi
				contador<=0;		--y reinicieme el contador
			else	    --sino
				contador<=contador+1;	 --siga contando
			end if;
		end if;
	
		if correi='1' then         --si se mantuvo presionado el pulsador por mas de 250ms
			salida	<= temp; --cargueme lo del registro al temporal
			temp(5 downto 1) <=salida(4 downto 0); --desplace los 5 primeros bits hacia la izq
			temp(0)	<= salida(5);	--y el ultimo de la derecha pasa a ser el primero de la izq		
			correi<='0'; --y desactivamos correi
		end if;		

		if right='1' then	--el mismo procedimiento que el desplazamiento a la derecha
			if contador=12500000 then
				corred <='1';
				contador<=0;
			else
				contador<=contador+1;
			end if;
		end if;

		if corred='1' then
			salida	<= temp;
			temp(4 downto 0) <=salida(5 downto 1);
			temp(5)	<= salida(0);
			corred <= '0';
		end if;
		leds <= temp; --mostramos el registro en los leds
	end if;
end process;
end Digitales;



///////////////
asignacion de pines
/////////////
#PACE: Start of Constraints generated by PACE

#PACE: Start of PACE I/O Pin Assignments
NET "clock"  LOC = "p77"  ;
NET "datos<0>"  LOC = "p89"  ;
NET "datos<1>"  LOC = "p88"  ;
NET "datos<2>"  LOC = "p87"  ;
NET "datos<3>"  LOC = "p86"  ;
NET "datos<4>"  LOC = "p84"  ;
NET "datos<5>"  LOC = "p83"  ;
NET "leds<0>"  LOC = "p46"  ;
NET "leds<1>"  LOC = "p45"  ;
NET "leds<2>"  LOC = "p44"  ;
NET "leds<3>"  LOC = "p43"  ;
NET "leds<4>"  LOC = "p42"  ;
NET "leds<5>"  LOC = "p41"  ;
NET "left"  LOC = "p57"  ;
NET "muestra"  LOC = "p58"  ;
NET "right"  LOC = "p59"  ;

#PACE: Start of PACE Area Constraints
#PACE: Start of PACE Prohibit Constraints
#PACE: End of Constraints generated by PACE
 
buenas noches...
me podrian ayudar...
tengo q programar una memoria gal 16v8c con las funciones de una alu de 4 bits.
me toca utilizar el lenguaje abel, el programa se llama splever.
les agradeceria si me ayudan.
 
Hola amigos tengo una duda con VHDL, espero que me puedan ayudar. Tengo unos códigos para un programa que es un poco largo, dentro de esos hacen referencia a otros subprogramas mediante el uso de la palabra work.nombredelsubprograma Quiero implementar el pograma en general mediante el ISE de Xilinx para una Spartan3, mi pregunta es como debo relacionar el programa màs grande con los subrogramas, es decir, si todos los codigos los pongo en un mismo codigo, o como hacer para que funcione todo en su conjunto. Gracias.
 
Hola a todos me encuentro realizando el algoritmo de cifrado MD5 en vhdl para implantarlo en un FPGA virtex II pro XUP, pero me encuentro atorado tratando de hace un circuito que pueda recibir el mensaje, calcular la longitud y luego hacer el relleno de bits para que sea un nuevo mensaje multiplo de 512 bits, agradeceria si alguien ha realizado un trabajo similar que me pudiera auxiliar, aclaro es un trabajo para mi proyecto de fin de carrera no tiene fines de lucro
 
algoritmo de cifrado MD5


MD5, no es un algoritmo de cifrado, es una función hash. Por cierto bastante insegura y obsoleta. Deberias de por lo menos trabajar con SHA-3.


me encuentro atorado tratando de hace un circuito que pueda recibir el mensaje, calcular la longitud y luego hacer el relleno de bits para que sea un nuevo mensaje multiplo de 512 bits.

Te encuentras atorado con todo.

aclaro es un trabajo para mi proyecto de fin de carrera

Muy fácil para proyecto de fin de carrera.


Bueno, te recomiendo la siguiente referencia:


Francisco Rodríguez-Henríquez, N. A. Saqib, A. Díaz-Pérez, and Cetin Kaya Koc. Cryptographic Algorithms on Recongurable Hardware (Signals and Communication Technology). Springer-Verlag New York, Inc., Secaucus, NJ, USA, 2006.


También hay que saber buscar...

http://scholar.google.com.mx/scholar?q=MD5+FPGA+Implementation&hl=es&btnG=Buscar&lr=
 
Última edición:
Hola yo de nuevo, bueno les quiero comentar que respecto al tema anterior, agradezco la ayuda, pero no me supe explicar, estoy realizando la implementación del MD5 (Message Digest Algorith 5), del SHA-1 2 y 3 pero soy algo novato en vhdl y si alguien tiene una idea de como realizar los primeros pasos que son el relleno de bits y la concatenación de la longitud, se lo agradeceria. Quiero usar una tarjeta de desarrollo para conectarla a una PC y enviarle el mensaje por terminal rs232 y visualizar el resultado en la pantalla de la PC.
 
Buenas noches compañeros.

EL anterior semestre empeze aprendiendo y poniendo ejemplos de Vhdl. Aunque aun son muy basicos pues ya estoy entrando a problemas mas complejos en este semestre en la facultad.

Bueno desde ya les doy la direccion de puro ejemplos de VHDL
http://electronico-etn.blogspot.com/search/label/VHDL
espero tambien si me puedan ayudar en mi proyecto de este semestre un sintetizador de musica en vhdl. Mencionar que la tarjeta DE2 de Altera, tiene este proyecto como ejemplo, pero esta en HDL. hay manera de cambiar con algun programa el hdl a vhdlk? o lo tengo que hacer manual. Espero puedan ayudarme.
 
Hola,que tal. Pues veran,soy algo nuevo en esto de programar en VHDL, y he tenido un problema que no he podido resolver desde hace un buen tiempo aunque he buscado por todos lados.
Lo que debo hacer es un ALU de 3 bits( lleva 8 operaciones),donde cada operacion se realiza mediante un componente individual(suma,resta,etc.). El problema es que cuando quiero usar el componente dentro de un when-case para seleccionar la operacion, siempre me envia un mensaje de error y no logro resolverlo.
Este es el codigo que tengo

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

entity ALU is
port(A,B,Op : in std_logic_vector(2 downto 0);
     CI:in std_logic;
     CO:out std_logic;
     res : out std_logic_vector(2 downto 0));

end;

architecture behavioral of ALU is

component suma1
port (A, B, CI :in std_logic;
      S, CO : out std_logic);
end component;
signal X: std_logic_vector(1 downto 0);

begin

process(Op)
begin
case Op is
when "000" => x1: suma1 port map (A(0), B(0), CI, res(0), X(0));
	            x2: suma1 port map (A(1), B(1), X(0), res(1), X(1));
                    x3: suma1 port map (A(2), B(2), X(1), res(2), CO);
when others => res <= A;
end case;

end process;

end behavioral;

El error es en la linea 25(en el when): :25:18:25:22|Expecting statement
Done: failed with exit code: 0100.
Hasta ahora solo quise implementar la suma para ver que funcionara. Y probe el componente de la suma de 1 bit y funciona bien.
Bien,eso es todo, gracias,hasta luego.
 
Última edición por un moderador:
Hola que tal a todos, primero que nada les digo que soy nuevo en el foro y tambien en el ámbito de la electronica, tengo un puequeño proyecto, es un contador que va del 0 al 9 de forma ascendente, pero ahora me gustaria saber si me pueden ayudar a que haga este procedimiento pero en forma descendente, ahora les pongo el codigo con el cual hice el contador, espero que me puedan ayudar, se los agradeceria mucho.

Código:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity nueve is
	Port ( 
		clk 	: in bit;
		salida 	: out integer range 0 to 10
			);
end nueve;

architecture algoritmo of nueve is
begin
	process (clk)
	variable temporal: integer range 0 to 10;
begin
	if clk='1'and clk'event then
	temporal:=temporal +1;
		if temporal=10 then
		temporal:=0;
		end if; 
	end if;
salida<=temporal;

end process;
end algoritmo;

De antemano muchas gracias a todos.

Edito: Las salidas son cuatro leds que representan en binario.
 
Última edición:
HOLA! bluecode1908:

yo tambien soy nuevo en el foro y bueno tratare de hacer lo posible para ayudarte:

antes que nada tratare de dejarte comentarios en cada linea que se necesite:
Código:
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;

entity cont9 is
   port( clk,reset,updown: in std_logic; --en este caso puse un reset al contador, ademas de hacerlo ascendente-desdendente con updown
         Q: out std_logic_vector(3 downto 0)); --en este caso para representar el nueve se necesitan 4 bits ya que en binario el nueve es '1001' puse un std_logic_vector el cual la cuenta se hace desde el 3 hasta el cero (3 downto) esto es traducido por el codigo como cuatro salidas: Q(3), Q(2), Q(1), y Q(0) todo eso anexado a Q

end cont9;

architecture arqcont9 of cont9 is
begin
   process (clk,reset) begin
     if (clk'event and clk = '1') then --la asignacion de la señal de reloj
	   if (updown = '1') then --aqui se usa un if para la condicion del updown el cual va a regir si es ascendente o desdendente, en este caso cuando sea 1 sera ascendente mi contador
        Q <= Q + 1; --aqui se indica la condicion, Q pasara a ser Q + 1, esto significa que sumare un 1 a Q cada vez ke la señal de reloj este ne flanco de subida y tenga un 1 en updown
          if (reset = '1' or Q = "1001") then --aqui hay una condicion anidada en otra condicion, ya que si no se implementa, nuestro contador llegara a su maxima cuenta de cuatro bits que es '1111' o en pocas palabras 15, pero como solo la cuenta es hasta el 9, cuando pase de ese conteo se reiniciara, asi que cuando Q sea igual a 9 en binario, o ('or' como esta implementado en mi condicion) mi señal de reset sea igual a 1 tendra que reiniciarse
             Q <= "0000"; --nuestro Q regresara al principio
          end if;
	   else --este else indica cuando updown es igual a 0
	    Q <= Q - 1; --en este caso a Q se le restara 1 cada flanco de subida de nuestro reloj
		  if (Q = "0000") then --aqui hay 2 if anidados, el primero me indica que si en el conteo llega a 0:
		     Q <= "1001"; --el siguiente conteo sera a 9
		  end if;
		  if (reset = '1') then --el otro if esta asignado a mi reset, cuando este vale 1:
		     Q <= "0000"; -- Q se reiniciara en 0
		  end if;
		end if;
     end if;
   end process;
end arqcont9;

Hay muchas maneras para programar un contador en VHDL, hay algunas mas elegantes que otras, en lo personal esta forma de programar con el std_arith, usando operaciones aritmeticas se me hace lo mas correcto para este caso, ya que es muy simple.

Tambien existe otro metodo, si tienes la maquina de estados ya sea de mealy o moore, puedes traducirlo en VHDL, en lo particular es muy elegante esta forma, ya que utiliza las variables 'type' y 'signal', las cuales te crean variables que no tienen importancia como entradas o salidas, pero son importantes en la funcion interna de este ya que son los estados de tu maquina, pero la desventaja es que tambien necesitan de espacio en el PLD, en pocas palabras el compilador le asigna pines, asi que en este caso, en vez de usar 4, usarias 8, e imaginemos que quieres que tu salida ya este decodificada para ir conectado directamente a tu display, serian 11, y lamentablemente la GAL 22V10 solo tiene 10 salidas asi que este metodo quedara descartado por ahora.

Bueno espero y esta informacion te haya sido util, suerte bluecode1908!
 
Atrás
Arriba