TODOPIC
Otros Microcontroladores / Dispositivos programables => Lógica Programable => Mensaje iniciado por: wiston80 en 16 de Mayo de 2009, 01:05:31
-
hola parceros estoy aprendiendo a trabajar en VHDL y estoy trabajando en un osciloscopio como proyecto, por ahora tengo una rutina para generar syncronismos y no me corre el programa aqui les dejo el programa y los errores que me dice ojala me pueden ayudar
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity VGA_SYNC is
Port ( clock_25Mhz : in STD_LOGIC_VECTOR (0 downto 0);
red : in STD_LOGIC_VECTOR (0 downto 0);
green : in STD_LOGIC_VECTOR (0 downto 0);
blue : in STD_LOGIC_VECTOR (0 downto 0);
red_out : out STD_LOGIC_VECTOR (0 downto 0);
green_out : out STD_LOGIC_VECTOR (0 downto 0);
blue_out : out STD_LOGIC_VECTOR (0 downto 0);
horiz_sync_out : out STD_LOGIC_VECTOR (0 downto 0);
vert_sync_out : out STD_LOGIC_VECTOR (0 downto 0);
pixel_row : out STD_LOGIC_VECTOR (9 downto 0);
pixel_column : out STD_LOGIC_VECTOR (9 downto 0));
end VGA_SYNC;
architecture Behavioral of VGA_SYNC is
SIGNAL horiz_sync, vert_sync : STD_LOGIC;
SIGNAL video_on, video_on_v, video_on_h : STD_LOGIC;
SIGNAL h_count, v_count : STD_LOGIC_VECTOR( 9 DOWNTO 0 );
begin
video_on <= video_on_H AND video_on_V;
PROCESS
BEGIN
LINEA 56 wait until(clock_25Mhz'EVENT AND clock_25Mhz='1' );
IF ( h_count = 799 ) THEN
h_count <= "0000000000";
ELSE
h_count <= h_count + 1;
END IF;
IF ( h_count <= 755 ) AND (h_count >=659 ) THEN
horiz_sync <= '0';
ELSE
horiz_sync <= '1';
END IF;
LINEA 67 IF ( v_count >= 524 ) AND ( h_count => 699 ) THEN
v_count <= "0000000000";
ELSIF ( h_count = 699 ) THEN
v_count <= v_count + 1;
END IF;
LINEA 72IF ( v_count <= 494 ) AND ( v_count = >493 ) THEN
vert_sync <= '0';
ELSE
vert_sync <= '1';
END IF;
IF ( h_count <= 639 ) THEN
video_on_h <= '1';
pixel_column <= h_count;
ELSE
video_on_h <= '0';
END IF;
IF ( v_count <= 479 ) THEN
video_on_v <= '1';
pixel_row <= v_count;
ELSE
video_on_v <= '0';
END IF;
LINEA 90 red_out <= red AND video_on;
LINEA 91 green_out <= green AND video_on;
LINEA 92 blue_out <= blue AND video_on;
LINEA 93 horiz_sync_out <= horiz_sync;
LINEA 94 vert_sync_out <= vert_sync;
END PROCESS;
end Behavioral;
ERROR:HDLParsers:808 Line 56. = can not have such operands in this context.
ERROR:HDLParsers:842 Line 67. The type of the element in aggregate does not correspond to any array type.
ERROR:HDLParsers:164 Line 72. parse error, unexpected GT
ERROR:HDLParsers:808 Line 90. AND can not have such operands in this context.
ERROR:HDLParsers:808 Line 91. AND can not have such operands in this context.
ERROR:HDLParsers:808 Line 92. AND can not have such operands in this context.
ERROR:HDLParsers:800 Line 93. Type of horiz_sync_out is incompatible with type of horiz_sync.
ERROR:HDLParsers:800 Line 94. Type of vert_sync_out is incompatible with type of vert_sync.
-
que tal winston mmm a ojo de buen cubero jejeje lo primero que esta mal es tus comparaciones pues la señal h_count y V_count son tipo std logic vector y cuando realizas la comparacion digamos "IF ( h_count = 799 ) THEN" la haces en tipo entero es decir para que la sintetizacion sea correcta ó cambias todos los valores a su correspondiente en std_logic es decir "010010011" solo es un ejemplo.
O bien cambia tus contadores a tipo integer asi debe de sintetizar espero te sirva saludos
-
Hola Winston,
Con respecto a tus dudas, va lo siguiente:
1. Cuando declares un señal que tenga un solo bit, es preferible que la declares como STD_LOGIC y no como STD_LOGIC_VECTOR(0 downto 0), esta ultima es aceptada, pero crea un conflicto con el compilador cuando se compara con otra que sí es STD_LOGIC. Corrige tu entidad.
Es por este motivo que existen errores en las lineas 56, 90, 91, 92, 93 y 94.
2. Ahora con respecto a los IF... THEN, cuando compares una señal que es de tipo STD_LOGIC_VECTOR no puedes hacerlo asi (v_count >= 524), la forma correcta es:
(v_count = X"524") ; en el formato hexadecimal.
(v_count = "0000110011"); en el formato binario.
Es por este motivo los errores en la lineas 67 y 72.
Saludos desde Lima - Perú. :lol:
-
Exelente me corre perfecto te agradezco mucho los estare molestando