Dudas sobre Programación en VHDL

Realmente soy muy nuevo con esto de las FPGA's. Sin embargo, he estado probando cada dispositivo extra. Sin embargo, no he logrado satisfactoriamente una señal variable (con un potenciómetro). Mi salida, la cual está a los 8 LED's, siempre me muestra números sin sentido. Después de varias pruebas, me recomendaron que programara al preamplificador y al ADC en un programa como máquina de estados, sin embargo, aún sigo teniendo el mismo problema. El programa lo adjunto más adelante, el cual escribe la ganancia al preamplificador, luego activa al ADC, esperando los 34 pulsos de reloj. Si se quiere tomar otra muestra, se tiene que presionar un pushbutton, el cual solo repite los estados del ADC. También posee una activación externa del preamplificador.

Aquí está el ucf de mi programa:

Código:
#PACE: Start of Constraints generated by PACE

#PACE: Start of PACE I/O Pin Assignments
NET "ad_conv"  LOC = "p11" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "amp_cs"  LOC = "n7" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "amp_shdn"  LOC = "p7" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "clk50"  LOC = "c9" | IOSTANDARD = LVCMOS33 ; 
NET "DAC_CS"  LOC = "n8" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 8 ; 
NET "data<0>"  LOC = "f12" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<1>"  LOC = "e12" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<2>"  LOC = "e11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<3>"  LOC = "f11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<4>"  LOC = "c11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<5>"  LOC = "d11" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<6>"  LOC = "e9" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "data<7>"  LOC = "f9" | IOSTANDARD = LVCMOS33  | SLEW = FAST  | DRIVE = 8 ; 
NET "FPGA_INIT_B"  LOC = "t3" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 4 ; 
NET "onpre"  LOC = "l13" | IOSTANDARD = LVTTL  | PULLUP ; 
NET "rstadc"  LOC = "k17" | IOSTANDARD = LVTTL  | PULLDOWN ; 
NET "rstpre"  LOC = "d18" | IOSTANDARD = LVTTL  | PULLDOWN ; 
NET "sel"  LOC = "l14" | IOSTANDARD = LVTTL | PULLUP ;
NET "SF_CE0"  LOC = "d16" | IOSTANDARD = LVCMOS33  | DRIVE = 4  | SLEW = SLOW ; 
NET "spi_clk"  LOC = "u16" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "spi_miso"  LOC = "n10" | IOSTANDARD = LVCMOS33 ; 
NET "spi_mosi"  LOC = "t4" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 
NET "SPI_SS_B"  LOC = "u3" | IOSTANDARD = LVCMOS33  | SLEW = SLOW  | DRIVE = 6 ; 

#PACE: Start of PACE Area Constraints

#PACE: Start of PACE Prohibit Constraints

#PACE: End of Constraints generated by PACE

Dejo el programa en el archivo adjunto
De antemano, gracias
 

Adjuntos

  • adc4_213.txt
    8.9 KB · Visitas: 157
Última edición por un moderador:
tengo que hacer un multiplexor 3 a 8 con enable activo en bajo (lm 74251) en vhdl con arquitectura estrutural, cuando el enable esta en '1' la salidad tiene que ser alta impedancia, el problema es que no como hacer la compuerta para que cuando el anable sea '1' obtener la salida deseada
 
Última edición por un moderador:
hola es sencillo suponiendo que enable sea una señal de entrada tipo bit como es en realizad y suponiendo que mi salida es un std_logic_vector(7 downto 0) y se llama sal, entonces se puede implementar asi:

if enable='1' then
sal<="zzzzzzzz";
end if;

y listo claro que depende de como declares las señales
 
hola pues miren basicamente lo que quiero hacer en realizar
en vhdl el desarrollo de un contador modulo 10 alguna
buena aportación?

y pues de ahi desarrollar otros contadores como le modifico?
gracias
:cry:
 
Hola soy nuevo en el foro, y pues tengo una especie de tarea y es crear, a partir de un circuito secuencial, un dado digital; empleando el concepto de maquina de moore y usando flip flops tipo D y que se pueda visualizar en un display 7 segmento de la Spartan 3.
Pero tengo un problema, por alguna razón solo visualizo la secuencia 1,4,5,6... en verdad necesito que alguien me ayude, he revisado las tablas de exitación y los mapas K pero no he encontrado errores algunos, ni siquiera en la conexión del circuito. Ahi he adjuntado las tablas espero que puedan ayudarme...
Gracias
 

Adjuntos

  • dadompk_113.rar
    79.5 KB · Visitas: 127
Me costó entenderlo al principio porque no incluiste un diagrama de flujo, ni aclaraste bien cuales eran las entradas/salidas del circuito.
Viendo la tabla de excitación, el estado no cambia cuando X=0, solo cuando X=1. Supongo que la idea es que al presionar X (X=1) un cierto tiempo el dado "ruede" hasta que se suelte X (X=0).
Las salidas S1,S2,S3 más una más que estaría siempre a 0 formarían una salida BCD que después la Spartan la utilizará para visualizar el valor en un display 7 segmentos.

Por otra parte, me alegra ver que un nuevo participante tiene el buen criterio de elegir un buen título, y postear algo hecho sin esperar que se lo resuelvan desde 0 acá. Así que va mi bienvenida a alguien que primero lo intenta y después si no sale pide ayuda!.

Bueno, encontré un error, es la 1ra vez que veo plantear las tablas de Karnaugh de esa manera así que lo tuve que hacer por mi parte.
El error está en la ecuación de D2 que queda:
D2 = /X Q2 + /Q1 Q2 + X Q1 /Q2 /Q3
La diferencia está en el último término, Q1 va sin negar.

Fijate que tu ecuación de D2 no se cumple para la fila 4 de la tabla.

Las ecuaciones de las salidas no las ví, si corrigiendo eso sigue sin salir volvé por acá que te damos una mano.

Saludos
 
ah discúlpame, no se como pude olvidar lo del diagrama de estados jaja, es que ayer estaba tan desesperado porque llevo 1 semana en esto y es para entregar el jueves. Y si con un botón de la Spartan el dado debe girar mientras el botón se mantenga presionado (X=1) y detenerse cuando se suelte (X=0).

Por otra parte las ecuaciones de salidas S3 S2 S1 estaban en el archivo "2.jpg". Se que hay otra forma de hacer el mapa de Karnaugh, pero jamás llegue a entenderla bien jeje y por eso empleo esta otra forma.

Y ya vi mi error tienes razón con lo de la ecuación D2, lo que pasa es que cuando hice el mapa de Karnaugh, del lado izquierdo puse dos veces en la tabla: /Q1 y /Q1, y debía ser /Q1 y Q1.

Muchísima gracias en verdad, no sabes cuanto te lo agradezco, ya por fin el dado funciona simulado en circuit maker, ahora solo debo pasarlo a Xilinx y listo...

MIL GRACIAS! de nuevo....
 
Ok cesaritox09, me alegra haber podido ayudar.
Otra cosa destacable es que respondiste comentando como te fué, muchas veces uno da una respuesta o propone una solución y el que hizo la pregunta desaparece.
Así que bienvenido colega a la comunidad, comenzaste con el pie derecho, jaja.

Saludos
 
El problema que tengo es que al hacer un sumador BCD en VHDL cuando compilo me marca 2 errores ya he intentado de todo y nada, ademas de todo estoy desesperado por que el proyecto es para mañana y no me queda espero me puedan ayudar les anexo el codigo que tengo.

-- Librerias aUtilizar --
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
-- Definiendo Suma (bcd1+bcd2) --
entity SumBCD is
Port ( bcd1 : in std_logic_vector(3 downto 0);
bcd2 : in std_logic_vector(3 downto 0);
cibcd: in std_logic;
bcdsum : out std_logic_vector(3 downto 0);
cobcd : out std_logic);
end SumBCD;
-- Comportamiento de SumBCD --
architecture uno of SumBCD is
component sum4bit is
Port ( a : in std_logic_vector(3 downto 0);
b : in std_logic_vector(3 downto 0);
cin : in std_logic;
sum : out std_logic_vector(3 downto 0);
cout : out std_logic);
end component sum4bit;
signal s,x: std_logic_vector(3 Downto 0);
signal c,K : std_logic;
begin
u1: sum4bit port
map(a(3)=>bcd1(3),a(2)=>bcd1(2),a(1)=>bcd1(1),a(0)=>bcd1(0),
b(3)=>bcd2(3),b(2)=>bcd2(2),b(1)=>bcd2(1),b(0)=>bcd2(0),
cin=>cibcd,sum(3)=>s(3),sum(2)=>s(2),sum(1)=>s(1),sum(0)=>s(0),cout=>c);
K <= (s(3)and s(2))or(s(3)and s(1))or(c);
x <= "0110" when k ='1' else
"0000";
u2: sum4bit port
map(a(3)=>s(3),a(2)=>s(2),a(1)=>s(1),a(0)=>s(0),b(3)=>x(3),b(2)=>x(2),b(1)=>x(1),b(0)=>x(0),
cin=>'0',sum(3)=>bcdsum(3),sum(2)=>bcdsum(2),sum(1)=>bcdsum(1),sum(0)=>bcdsum(0),
cout=>cobcd);

end uno;

y este es el error que me arroja el compilador
Error: Node instance "u1" instantiates undefined entity "sum4bit"
,
Error: Node instance "u2" instantiates undefined entity "sum4bit"
.

Espero de su valiosa ayuda ya que si no entrego esto voy a reprobar la asignatura! :(
 

Adjuntos

  • bcd_addervhd_197.zip
    700 bytes · Visitas: 44
saludos

asegura te de agregar en el espacio de trabajo el archivo con nombre sum4bit, con su respectivo codigo
cuando haces la compilación es necesario que este adjunto al proyecto...

asi no te marcara ese error.
 
Bueno disculpen que después de tanto tiempo me conecte al foro, pero estuve haciendo algunos trabajos con mi spartan. Respecto al adc de la spartan el código de arriba esta bueno, solo falta hacerle unos ajustes respecto a la señal de muestreo del adc, ya que para que pueda trabajar debe pasarse al estado bajo, por otro lado si se encuentra en estado alto mientras algún dispositivo trata de acceder al bus spi se pueden generar conflictos, por eso es mejor dejarlo en estado bajo mientras se escribe en el amplificador. Les dejo el código modificado y funcionando.
 

Adjuntos

  • adc.rar
    2.3 KB · Visitas: 111
Hola,
Estoy interesado en hacer un contador básico con dos entradas, y que éstas sean sin signo, es decir, que el contador me de A+B O A-B (con un multiplexor poder seleccionar si es la suma o la resta). El código vhdl no me da ningún error, pero al querer simularlo con ISE, me sale lo siguiente:

Multiple declarations of unsigned included via multiple use clauses; none are made directly visible

Unit contador ignored due to previous errors

Entity contador is not yet compiled

unsigned is not declared

El código es el siguiente:

PHP:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;

entity contador is
    Port ( entrada1 : in unsigned (3 downto 0);
             entrada2 : in  unsigned (3 downto 0);
             operacion : in  STD_LOGIC;
             salida : out  STD_LOGIC_VECTOR (3 downto 0));
end contador;

architecture Behavioral of contador is

signal numero: unsigned (3 downto 0);

begin

numero<=(a+b) when operacion='0' else (a-b)
salida<=std_logic_vector(numero)

end Behavioral;


Muchas gracias.
 
Última edición por un moderador:
Hola estoy haciendo un sumador en el cual tengo dos entradas A y B, en funcion de un selecctor puedo hacer A+B ; A-B, A+1; A-1. la cuestion es que solo puedo usar un sumador, por lo que he hecho lo siguiente:

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

entity sumador2 is
    Port ( a : in  unsigned (15 downto 0);
           b : in  unsigned (15 downto 0);
           ctrl : in  unsigned (1 downto 0);
           result : out  unsigned (15 downto 0));
end sumador2;

architecture Behavioral of sumador2 is
signal aux: unsigned (15 downto 0);
begin
[COLOR=YellowGreen]--Multiplexador[/COLOR]
with ctrl select
aux<= b when "00",
[COLOR=Red]-b[/COLOR] when "01",
"0000000000000001" when "10",
"1111111111111111" when others;
[COLOR=YellowGreen]-- Sumador[/COLOR]
result<= a+aux;

end Behavioral;
la cuestion es que no se como hacer A-B, para hacer el -1 lo e pasado a complemento A2

Gracias y un saludo
 
hola que tal mira solo consiste en invertir todo y sumarle uno te puede quedar de la siguiente manera, a ademas le agregue un bit mas a la salida para que veas tu suma completa.

PHP:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity sumador2 is
    Port ( a : in  std_logic_vector (15 downto 0);
           b : in  std_logic_vector (15 downto 0);
           ctrl : in  std_logic_vector(1 downto 0);
           result : out  std_logic_vector (16 downto 0));
end sumador2;

architecture Behavioral of sumador2 is
signal aux: std_logic_vector (15 downto 0);
begin
--Multiplexador
aux<=
    b when (ctrl ="00")else--sumas b
    ((not b)+'1') when (ctrl ="01")else--restas b por complemento a 2
    "0000000000000001" when (ctrl ="01")else--sumas 1
    "1111111111111111" when (ctrl ="11");--restas 1
-- Sumador
result<= '0'&(a+aux);

end Behavioral;
 
Hola,
Estoy interesado en hacer un contador básico con dos entradas, y que éstas sean sin signo, es decir, que el contador me de A+B O A-B (con un multiplexor poder seleccionar si es la suma o la resta). El código vhdl no me da ningún error, pero al querer simularlo con ISE, me sale lo siguiente:

Multiple declarations of unsigned included via multiple use clauses; none are made directly visible

Unit contador ignored due to previous errors

Entity contador is not yet compiled

unsigned is not declared



El código es el siguiente:

PHP:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;

entity contador is
    Port ( entrada1 : in unsigned (3 downto 0);
             entrada2 : in  unsigned (3 downto 0);
             operacion : in  STD_LOGIC;
             salida : out  STD_LOGIC_VECTOR (3 downto 0));
end contador;

architecture Behavioral of contador is

signal numero: unsigned (3 downto 0);

begin

numero<=(a+b) when operacion='0' else (a-b)
salida<=std_logic_vector(numero)

end Behavioral;


Muchas gracias.

Oye por que pusiste a+b y a-b si tus entradas se llaman entrada1 y entrada2 ??????
 
Última edición por un moderador:
hola pues miren basicamente lo que quiero hacer en realizar
en vhdl el desarrollo de un contador modulo 10 alguna
buena aportación?

y pues de ahi desarrollar otros contadores como le modifico?
gracias
:cry:

Este es el codigo de un contador ascendente y/o descente un poco tarde pero aqui esta
Código:
Library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity count_5 is
port
( clk,ad,reset: in std_logic;--ad es ascendente o descendente
out_data : buffer std_logic_vector (4 downto 0)
);
end count_5;

Architecture func of count_5 is
    begin
        process(clk,reset)
            begin
            if(reset='1') then
                out_data<="00000";
            elsif(clk' event and clk='1') then
                if (ad='0') then
                    out_data <= out_data + '1';
                else
                    out_data <= out_data - '1';
                end if;
            end if;
        end process;
end func;
 
Última edición por un moderador:
Buenos dias, estoy buscando alguien que me informe donde puedo encontrar el codigo VHDL de un covertidor BCD (8421) a BCD exceso 3.... pues no se de programacion en este lenguaje...agradezco la ayuda....saludos. :)
 
Hay dos formas de hacerlo. aqui te las pongo ambas:

Código:
Library IEEE;
use ieee.std_logic_1164.all;

Entity BCD_EX3 is
port
(
BCD: in std_logic_vector (3 downto 0);
BCD_3 : out std_logic_vector (3 downto 0)
);
end BCD_EX3;

Architecture flujo of BCD_EX3 is
begin
BCD_3<= "0011" when (BCD="0000")else--0
        "0100" when (BCD="0001")else--1
        "0101" when (BCD="0010")else--2
        "0110" when (BCD="0011")else--3
        "0111" when (BCD="0100")else--4
        "1000" when (BCD="0101")else--5
        "1001" when (BCD="0110")else--6
        "1010" when (BCD="0111")else--7
        "1011" when (BCD="1000")else--8
        "1100" when (BCD="1001")else--9
        "0000000"  ;
end flujo;
Código:
Library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity BCD_EX3 is
port
(
BCD: in std_logic_vector (3 downto 0);
BCD_3 : out std_logic_vector (3 downto 0)
);
end BCD_EX3;

Architecture flujo of BCD_EX3 is
begin

BCD_3<= BCD + "11";

end flujo;
 
Atrás
Arriba