Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY Sumador IS
GENERIC(No: INTEGER :=4);
PORT(
A,B : in std_logic_vector(No-1 DOWNTO 0);
Cin : in std_logic;
S : out std_logic_vector(No-1 DOWNTO 0);
Cout: out std_logic;
Z,N: out std_logic
);
END Sumador;
ARCHITECTURE bits_4 OF Sumador IS
BEGIN
PROCESS (A, B, Cin)
VARIABLE suma: std_logic_vector(No DOWNTO 0);
BEGIN
suma := ('0' & A) + ('0' & B) + Cin;
S <= std_logic_vector (suma(No-1 DOWNTO 0));
Cout <= std_logic(suma(No));
N <= std_logic(suma(No-1));
IF std_logic_vector(suma(No-1 DOWNTO 0)) = 0
THEN z <= '1';
ELSE z <= '0';
END IF;
END PROCESS;
END bits_4;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity contstop is
port (reloj,reset,stop: in std_logic;
hex3,hex2,hex1 : out bit_vector (6 downto 0));
end contstop;
architecture estructural of contstop is
subtype vector is bit_vector(6 downto 0);
function conversion(bcd: integer) return vector is
begin
case bcd is
when 0 => return "0000001";
when 1 => return "1001111";
when 2 => return "0010010";
when 3 => return "0000110";
when 4 => return "1001100";
when 5 => return "0100100";
when 6 => return "0100000";
when 7 => return "0001111";
when 8 => return "0000000";
when 9 => return "0000100";
when others => return "1111111";
end case;
end conversion;
begin
process (reloj,reset)
variable contador: integer:=546;
variable resultado3: integer;
variable resultado2: integer;
variable resultado1: integer;
variable resul: integer;
variable tiempo: integer;
begin
if (reset='1') then
contador:=546;
elsif(reloj='1' and reloj'event) then
if (tiempo=5000000) then
tiempo:=0;
contador:=(contador - 1);
resultado3:=(contador / 100);
resul:=(contador REM 100);
resultado2:=(resul / 10);
resultado1:=(resul REM 10);
else tiempo:=(tiempo + 1);
end if;
end if;
if (contador=0) then
contador:=546;
end if;
hex3<=conversion(resultado3);
hex2<=conversion(resultado2);
hex1<=conversion(resultado1);
end process;
end estructural;
Hola! Tengo que diseñar un osciloscopio digital con un CAD y la FPGA de la familia Spartan3E. Sé que tendré que coger la señal sinusoidal, muestrearla, guardar esos valores en una memoria RAM,procesarlos y despúes reconstruir la señal para representarla en un LCD gráfico. Lo que me gustaría es si alguien me podría ayudar en cuanto a plantear el diagrama de las secuencias de operaciones y qué circuitos auxiliares me harían falta. Por ejemplo, necesito, mínimo una RAM, registro de desplazamiento, etc.,....
Muchas Gracias por todo.
Estoy realizando un contador decreciente que empieza su cuenta en 546, tiene un reset, un reloj interno de 50mhz y el stop.
el programa funciona perfectamente en la FPGA de altera quartusII, CycloneII con su conteo decreciente a un 1 segundo y el reset.
mi problema es que no se como implementar la "para" del conteo cuando pulse un pushbutton y empieze de nuevo el conteo cuando vuelva y presione el mismo pbutton.
la idea es que siga decrementandose desde el valor donde fue el stop.
gracias...
agradeceria alguna solucion, ya he intentado muchas y no dan resultadosss.
WHEN esta1 =>
IF m = ‘1’ AND s3 = ‘1’ THEN
prox_est <= esta2;
ELSE
prox_est <= esta1;
END IF;
WHEN esta2 =>
IF p = ‘1’ THEN
prox_est <= esta6;
ELSIF s2 = ‘1’ THEN
prox_est z= esta3;
ELSE
prox_est <= esta2;
END IF;
CASE estado IS
WHEN activo =>
IF stop = ‘1’ THEN
--cambia de valor la bandera "estado"
estado <= detenido
ELSE
-- Gatilla el retraso para antirebotes ?
-- Proceso de la cuenta de tiempo
...
ENDIF
WHEN detenido =>
IF stop = ‘1’ THEN
--cambia de valor la bandera "estado"
estado <= activo
ELSE
-- No hace nada o hace otra cosa
-- Gatilla el retraso para antirebotes ?
ENDIF
END CASE:
Respecto a la implementación de un "osciloscopio" digital, por la capacidad disponible que estoy viendo en algunos chips (1MB de RAM), me parece que dentro de la misma FPGA podría ir la memoria para captura de datos, los contadores para generar la dirección y los retardos.
Sólo quedaría afuera el conversor AD y el circuito de adaptación de la señal analógica, algunos botones, el GLCD, y el puerto para salir a la pc via LPT.
Por supuesto también el puerto para programación JTAG.
Lo que me parece complicado es la factura de las placas por el tema de las bolillas de contacto que tienen los chips de muchos pines.
¿ Van soldadas las bolillas o solo hacen contacto ?
Las de gran cantidad de contactos ¿ es necesario que las placas sean multicapa ?
Saludos
PD: Algunos enlaces que puse antes no andan porque el servidor está en mantenimiento. Calculo que en un par de días (?) lo restablecen.![]()
entity CONTA is
(mclk: in STD_LOGIC;
clr: in STD_LOGIC;
clk190: out STD_LOGIC;
d: out STD_LOGIC_VECTOR (6 downto 0);
an: out STD_LOGIC_VECTOR (3 downto 0));
end CONTA;
architecture Behavioral of CONTA is
signal q: STD_LOGIC_VECTOR (27 downto 0);
signal count: STD_LOGIC_VECTOR (3 downto 0);
signal clk48: STD_LOGIC;
signal a: STD_LOGIC_VECTOR (3 downto 0);
begin
--CONTA
process (mclk, clr)
begin
if clr = '1' then
q <= x "0000000";
else if mclk' event and mclk = '0' then
q <= q+1;
end if;
end process;
clk48 <= q(26); --.745 hz
clk190 <= q(27); --.255hz
process (clk48, clr)
begin
if clr = '1' then
count <= "0000";
else if clk48' event and clk48 = '0' then
if count = "1001" then
count <= "0000";
else
count <= count + 1;
end if;
end if;
end process;
a <= count;
an <= "0111";
process (a) begin
case a is
when "0000" => d <= "0000001";
when "0001" => d <= "1001111";
when "0010" => d <= "0010010";
when "0011" => d <= "0000110";
when "0100" => d <= "1001100";
when "0101" => d <= "0100100";
when "0110" => d <= "0100000";
when "0111" => d <= "0001111";
when "1000" => d <= "0000000";
when "1001" => d <= "0000100";
when others => d <= "1111001";
end case;
end process;
end Behavioral;
aaaaaaaaaaaaaaaaaaaaaa
--Decodificador
library ieee;
use ieee.std_logic_1164.all;
entity deco is
port (a: in std_logic_vector(3 downto 0)
s: out std_logic_vector(6 downto 0))
end deco;
architecture deco1 of deco is
begin
process (a) begin
case a is
when "0000" => s <= "1111110";
when "0001" => s <= "0110000";
when "0010" => s <= "1101101";
when "0011" => s <= "0101011";
when "0100" => s <= "1011011";
when "0101" => s <= "1011111";
when "0110" => s <= "1110000";
when "0111" => s <= "1110000";
when "1000" => s <= "1111111";
when "1001" => s <= "1111011";
when others => s <= "1111110";
end case;
end process;
end deco1;
Hola a todos, me pregunto si alguien puede ayudarme con el diseño en VHDL de un PWM que se controle mediante una señal digital de 8 bits. El ancho de pulso para el pwm puede ser de 1ms a 8ms.
Si alguien tiene alguna idea de lo que tengo que hacer se los agradeceria mucho, ya que soy nuevo en esto de los FPGA.
architecture beh of control_pwm is
signal cnt : std_logic_vector(7 downto 0);
begin
process (clk, nrst)
begin
if nrst = '0' then
pwm_out <= '0';
cnt <= (others => '0');
elsif clk'event and clk = '1' then
cnt <= cnt + x"01";
if (cnt > control_pwm) then
pwm_out <= '0';
else
pwm_out <= '1';
end if;
end if;
end process;
Y basándome en mi experiencia, que tampoco es muchaTanto los CPLDs como las FPGAs contienen un gran número de elementos lógicos programables. Si medimos la densidad de los elementos lógicos programables en puertas lógicas equivalentes (número de puertas NAND equivalentes que podríamos programar en un dispositivo) podríamos decir que en un CPLD hallaríamos del orden de decenas de miles de puertas lógicas equivalentes y en una FPGA del orden de cientos de miles hasta millones de ellas. Aparte de las diferencias en densidad entre ambos tipos de dispositivos, la diferencia fundamental entre las FPGAs y los CPLDs es su arquitectura. La arquitectura de los CPLDs es más rígida y consiste en una o más sumas de productos programables cuyos resultados van a parar a un número reducido de biestables síncronos (también denominados flip-flops). La arquitectura de las FPGAs, por otro lado, se basa en un gran número de pequeños bloques utilizados para reproducir sencillas operaciones lógicas, que cuentan a su vez con biestables síncronos. La enorme libertad disponible en la interconexion de dichos bloques confiere a las FPGAs una gran flexibilidad.
Otra diferencia importante entre FPGAs y CPLDs es que en la mayoría de las FPGAs se pueden encontrar funciones de alto nivel (como sumadores y multiplicadores) embebidas en la propia matriz de interconexiones, así como bloques de memoria