Una serie de videos en relación a GHDL
Blog cajón desastre (CBTis 44 / TecNM Teziutlán) https://github.com/maigke ( tiene muy poca aportación)
Mostrando entradas con la etiqueta vhdl. Mostrar todas las entradas
Mostrando entradas con la etiqueta vhdl. Mostrar todas las entradas
sábado, 21 de octubre de 2017
martes, 23 de agosto de 2016
Definiendo pines para GAL16V22 de Lattice
Esta prueba la hice desde una box Fedora, instalando el software de Lattice para programar sus dispositivos Lógicos.
En ABEL, la definición de los pines a utilizar cuando se programa una GAL, se hace desde el inicio, sin embargo, en VHDL la cosa no está tan simple, leyendo varios foros, encontre que habria que usar unas sentencias pero no se indica de forma muy genérica.
El código que se presenta a continuación, es un divisor de frecuencias, que tiene dos entradas y una salida, nótese que en este caso, se asigna al pin 6 la entrada de reset para el reloj, y que la declaración de los atributos LOC se hace en el ámbito del instanciamiento de la Entidad que se crea.
Esto solo lo he probado con Lattice y una GAL22V10 simulada en Proteus.
-------------------------------------------------------------------------------
--
-- Company :
-- Engineer: miguel
--
-- Create Date: 04/11/2015 04:50:28
-- Project Name: clk381Hz
-- Module Name: clk381Hz.vhd
-- Description:
--
-- Additional Comments:
--
-------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all; -- Para std_logic
use IEEE.numeric_std.all; -- Para unsigned
entity clk381Hz is
Port (
entrada: in STD_LOGIC;
reset : in STD_LOGIC;
salida : out STD_LOGIC
);
attribute LOC: string;
attribute LOC of reset : signal is "6";
end clk381Hz;
architecture arq1 of clk381Hz is
signal temporal: STD_LOGIC;
signal contador: integer range 0 to 250 := 0;
begin
divisor_frecuencia: process (reset, entrada) begin
if (reset = '0') then
temporal <= '0';
contador <= 0;
elsif (entrada 'event and entrada = '1') then
if (contador = 250) then
temporal <= NOT(temporal);
contador <= 0;
else
contador <= contador+1;
end if;
end if;
end process;
salida <= temporal;
end arq1;
En ABEL, la definición de los pines a utilizar cuando se programa una GAL, se hace desde el inicio, sin embargo, en VHDL la cosa no está tan simple, leyendo varios foros, encontre que habria que usar unas sentencias pero no se indica de forma muy genérica.
El código que se presenta a continuación, es un divisor de frecuencias, que tiene dos entradas y una salida, nótese que en este caso, se asigna al pin 6 la entrada de reset para el reloj, y que la declaración de los atributos LOC se hace en el ámbito del instanciamiento de la Entidad que se crea.
Esto solo lo he probado con Lattice y una GAL22V10 simulada en Proteus.
-------------------------------------------------------------------------------
--
-- Company :
-- Engineer: miguel
--
-- Create Date: 04/11/2015 04:50:28
-- Project Name: clk381Hz
-- Module Name: clk381Hz.vhd
-- Description:
--
-- Additional Comments:
--
-------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all; -- Para std_logic
use IEEE.numeric_std.all; -- Para unsigned
entity clk381Hz is
Port (
entrada: in STD_LOGIC;
reset : in STD_LOGIC;
salida : out STD_LOGIC
);
attribute LOC: string;
attribute LOC of reset : signal is "6";
end clk381Hz;
architecture arq1 of clk381Hz is
signal temporal: STD_LOGIC;
signal contador: integer range 0 to 250 := 0;
begin
divisor_frecuencia: process (reset, entrada) begin
if (reset = '0') then
temporal <= '0';
contador <= 0;
elsif (entrada 'event and entrada = '1') then
if (contador = 250) then
temporal <= NOT(temporal);
contador <= 0;
else
contador <= contador+1;
end if;
end if;
end process;
salida <= temporal;
end arq1;
miércoles, 28 de octubre de 2015
Uso de sll srl en ghdl, ejemplo con registro de corrimiento
Al tratar de usar la instrucción de corrimiento sll o srl en GHDL, así como en el software de altera Quartus II, obtenida el siguiente error:
no function declarations for operator "sll" en GHDL
can't determine definition of operator ""sll"" -- found 0 possible definitions en Quartus II
en uno de los foros indican que sll, ni srl estan definidos en numeric.std (https://mail.gna.org/public/ghdl-discuss/2008-12/msg00032.html), en este mismo foro, recomiendan cambiar la libreria numeric_std.all por la libreria numeric_bit.all (https://mail.gna.org/public/ghdl-discuss/2008-12/msg00033.html
https://mail.gna.org/public/ghdl-discuss/2008-12/msg00028.html
Sin embargo profundizando un poco mas y no conforme con esta situación, en otro foro, se encontró lo siguiente
-- Solo es posible usar los desplazamientos hasta vhdl 2008
-- y el cual no está bien soportado en los modernos sintetizadores
-- de los fpga y asic
-- a modo de parche(workaround) es convertir la señal a tipo unsigned de
-- la libreria ieee.numeric.std hacer el corrimiento y devolver a std logic
-- vector (wjl, 21/02/2014)
--http://stackoverflow.com/questions/20024887/trying-to-leftshiftlogical-sll-in-vhdl-for-logic-vector-getting-errorfound
de este modo se puede hacer lo siguiente
Y este es el banco de pruebas
Mi agradecimiento al Prof. Garrido, por el desarrollo de la herramienta UMHDL con la cual, mis estudiantes de Ing Mecatrónica de la materia Electrónica Digital, se encuentran desarrollando las simulaciones en VHDL.
no function declarations for operator "sll" en GHDL
can't determine definition of operator ""sll"" -- found 0 possible definitions en Quartus II
en uno de los foros indican que sll, ni srl estan definidos en numeric.std (https://mail.gna.org/public/ghdl-discuss/2008-12/msg00032.html), en este mismo foro, recomiendan cambiar la libreria numeric_std.all por la libreria numeric_bit.all (https://mail.gna.org/public/ghdl-discuss/2008-12/msg00033.html
https://mail.gna.org/public/ghdl-discuss/2008-12/msg00028.html
Sin embargo profundizando un poco mas y no conforme con esta situación, en otro foro, se encontró lo siguiente
-- Solo es posible usar los desplazamientos hasta vhdl 2008
-- y el cual no está bien soportado en los modernos sintetizadores
-- de los fpga y asic
-- a modo de parche(workaround) es convertir la señal a tipo unsigned de
-- la libreria ieee.numeric.std hacer el corrimiento y devolver a std logic
-- vector (wjl, 21/02/2014)
--http://stackoverflow.com/questions/20024887/trying-to-leftshiftlogical-sll-in-vhdl-for-logic-vector-getting-errorfound
de este modo se puede hacer lo siguiente
------------------------------------------------------------------------------- -- -- Company : Instituto Tecnologico Superior de Teziutlan -- Engineer: Miguel Montiel Mtz -- -- Create Date: 26/10/2015 11:54:35 -- Project Name: RegUniversal -- Module Name: RegUniversal.vhd -- Description: -- El registro opera de la siguiente manera -- S0 S1 | Accion -- 0 0 | Hold -- 0 1 | Desplazamiento a la izquierda -- 1 0 | Load -- 1 1 | Desplazamiento a la derecha -- Additional Comments: -- contiene a demas las siguientes terminales -- CLk reloj -- S0,S1 señales de control -- D0..D3 entrada de datos -- RST Reset -- Q0..Q3 Salida de datos -- L entrada serie desplazamiento a la izquierda -- R entrada serie desplazamiento a la derecha ------------------------------------------------------------------------------- library IEEE; use IEEE.std_logic_1164.all; -- Para std_logic use IEEE.numeric_std.all; -- Para unsigned entity RegUniversal is port( CLK: in std_logic; S: in std_logic_vector(1 downto 0); D: in std_logic_vector(3 downto 0); RST, L, R: in std_logic; Q, Qn: out std_logic_vector(3 downto 0) ); end RegUniversal; architecture arq1 of RegUniversal is signal qq : std_logic_vector(3 downto 0); signal xqq:std_logic_vector(3 downto 0); begin process (clk, rst, s) begin if ( rst = '0') then qq <= "0000"; elsif( clk 'event and clk = '1') then if ( s = "00") then --hold qq <= qq; elsif ( s = "01") then --desplaza a la izquierda -- Solo es posible usar los desplazamientos hasta vhdl 2008 -- y el cual no está bien soportado en los modernos sintetizadores -- de los fpga y asic -- a modo de parche(workaround) es convertir la señal a tipo unsigned de -- la libreria ieee.numeric.std hacer el corrimiento y devolver a std logic -- vector (wjl, 21/02/2014) --http://stackoverflow.com/questions/20024887/trying-to-leftshiftlogical-sll-in-vhdl-for-logic-vector-getting-errorfound qq <= std_logic_vector(unsigned (qq) SLL 1); qq(0) <= L; elsif ( s = "10") then -- load qq <= d; else -- desplaza a la derecha qq <= std_logic_vector(unsigned(qq) srl 1); qq(3) <= r; end if; end if; q <= qq; qn <= not qq; end process; end arq1;
Y este es el banco de pruebas
library IEEE; use IEEE.std_logic_1164.all; -- Para std_logic use IEEE.numeric_std.all; -- Para signed, unsigned entity RegUniversal_tb is end RegUniversal_tb; architecture Testbench of RegUniversal_tb is -- Component Declaration for the Unit Under Test (UUT) component RegUniversal port( CLK: in std_logic; S: in std_logic_vector(1 downto 0); D: in std_logic_vector(3 downto 0); RST, L, R: in std_logic; Q, Qn: out std_logic_vector(3 downto 0) ); end component; -- Select an architecture if needed (default is last one analyzed). --for uut: RegUniversal use entity WORK.RegUniversal(arq1); -- Inputs/Outputs -- signal ... signal s: std_logic_vector ( 1 downto 0); signal d: std_logic_vector ( 3 downto 0); signal rst, l, r: std_logic; signal q, qn: std_logic_vector( 3 downto 0); -- Clock (uncomment if needed) -- SustituirY finalmente la simulaciónpor el nombre de puerto apropiado signal clk : std_logic := '0'; constant clock_period : time := 50 ns; signal clock_on : boolean := true; begin -- Instantiate the Unit Under Test (UUT) uut: RegUniversal port map ( clk, s,d,rst,l,r,q,qn); -- Clock process (uncomment if needed) -- Descomentar en caso de requerir senial de reloj -- Sustituir por el nombre de puerto apropiado clock_process : process begin while (clock_on) loop clk <= '0'; wait for clock_period/2; clk <= '1'; wait for clock_period/2; end loop; --assert (false) report ("Finished") severity error; -- Wait forever wait; end process; -- Stimulus process stim_proc: process begin -- hold reset state for 100 ns rst <= '0'; wait for 100 ns; --------------------------------------------------------- -- insert stimulus here --------------------------------------------------------- -- Test case 1 -- ... Asignaciones a seniales de entrada ... rst <= '1'; s <= "10" ; d <= X"A"; wait for 100 ns; rst <= '1'; s <= "00" ; d <= X"0"; wait for 100 ns; rst <= '1'; s <= "10" ; d <= X"1"; wait for 100 ns; rst <= '1'; s <= "11" ; d <= X"7";r <= '1'; wait for 100 ns; rst <= '1'; s <= "11" ; d <= X"3";r <= '1'; wait for 100 ns; -- assert ( ) report "Error case 1" severity error; -- Test case 2 -- ... Asignaciones a seniales de entrada ... wait for 100 ns; -- assert ( ) report "Error case 2" severity error; -- Stop clock -- clock_on <= false; -- Wait forever wait; end process; end Testbench;

Mi agradecimiento al Prof. Garrido, por el desarrollo de la herramienta UMHDL con la cual, mis estudiantes de Ing Mecatrónica de la materia Electrónica Digital, se encuentran desarrollando las simulaciones en VHDL.
domingo, 9 de agosto de 2015
codificador de prioridad 74x148 en GHDL usando solo estandares IEEE
En el siguiente código se muestra la implementación y simulación de un codificador de prioridad 74x148 que viene de ejempl en el libro Diseño Digital: Principios y prácticas de John F. Wakerly.
El problema que encontré al tratar de compilar en primera instancia este código para el codificador de prioridad, es que usa la función conv_std_logic_vector. La cual, en la libreria IEEE.numeric_std no está definida.
Esto es un problema y de acuerdo a lo leido en los siguientes links
link1, link2, y link3, el uso de esta función se implementa al incluir a std_arith, la cual no es un estándar del IEEE, y que solo fue un "invento" de synopsys. Aunque cabe señalar los siguiente:
Muchos colaboradores de los hilos de los foros consultados, argumentan que nunca han tenido algún problema de compatibilidad al hacer uso de std_arith, y que esto se puede implementar, al pasarle el respectivo parámetro al "compilador" del VHDL.
Pero siguiendo estándares, la implementación del codificador se puede realizar de la siguiente manera:
El testbench usado para la prueba de este código es el que se muestra a continuación:
Y la salida de la señales son las siguientes:
SSSSSS
Se señala que se utilizó la herramienta UMHDL v2.00 de Pablo Garrido de la Universidad Miguel Hernández, de Elche, en su versión para sistema operativo Linux
La siguiente dirección es la indicada por el software, en la sección de acerca de..
http://labatc.umh.es:50005/pgarrido/
El problema que encontré al tratar de compilar en primera instancia este código para el codificador de prioridad, es que usa la función conv_std_logic_vector. La cual, en la libreria IEEE.numeric_std no está definida.
Esto es un problema y de acuerdo a lo leido en los siguientes links
link1, link2, y link3, el uso de esta función se implementa al incluir a std_arith, la cual no es un estándar del IEEE, y que solo fue un "invento" de synopsys. Aunque cabe señalar los siguiente:
Muchos colaboradores de los hilos de los foros consultados, argumentan que nunca han tenido algún problema de compatibilidad al hacer uso de std_arith, y que esto se puede implementar, al pasarle el respectivo parámetro al "compilador" del VHDL.
Pero siguiendo estándares, la implementación del codificador se puede realizar de la siguiente manera:
library IEEE; use IEEE.std_logic_1164.all; -- Para std_logic use IEEE.numeric_std.all; -- Para unsigned entity v74x148b is port( EI_L: in std_logic; I_L : in std_logic_vector(7 downto 0); A_L : out std_logic_vector(2 downto 0); EO_L, GS_L : out std_logic ); end v74x148b; architecture arq1 of v74x148b is signal EI: std_logic; signal I : std_logic_vector(7 downto 0); signal A : std_logic_vector(2 downto 0); signal EO,GS:std_logic; begin codif: process (EI_L, I_L, EI, EO, GS,I,A) variable j: integer range 7 downto 0; begin EI <= not EI_L; I <= not I_L; EO<= '1'; GS<= '0'; A<= "000"; if(EI) = '0' then EO <= '0'; else for j in 7 downto 0 loop if I(j) = '1' then GS<= '1'; EO<= '0'; A<= std_logic_vector(to_unsigned(j,A 'length)); exit; end if; end loop; end if; A_L <= not A; GS_L <= not GS; EO_L <= not EO; end process; end arq1;
El testbench usado para la prueba de este código es el que se muestra a continuación:
library IEEE; use IEEE.std_logic_1164.all; -- Para std_logic use IEEE.numeric_std.all; -- Para signed, unsigned entity v74x148b_tb is end v74x148b_tb; architecture Testbench of v74x148b_tb is -- Component Declaration for the Unit Under Test (UUT) component v74x148b port( EI_L: in std_logic; I_L : in std_logic_vector(7 downto 0); A_L : out std_logic_vector(2 downto 0); EO_L, GS_L : out std_logic ); end component; signal EI_L: std_logic; signal I_L : std_logic_vector(7 downto 0); signal A_L : std_logic_vector(2 downto 0); signal EO_L,GS_L:std_logic; begin uut: v74x148b port map ( EI_L => EI_L, I_L => I_L, A_L => A_L, EO_L => EO_L, GS_L => GS_L); stim_proc: process begin I_L <= "11111111"; EI_L <= '1'; wait for 10 ns; I_L <= "00000000"; EI_L <= '1'; wait for 10 ns; I_L <= "11111111"; EI_L <= '0'; wait for 10 ns; I_L <= "10000000"; EI_L <= '0'; wait for 10 ns; I_L <= "11000000"; EI_L <= '0'; wait for 10 ns; I_L <= "11100000"; EI_L <= '0'; wait for 10 ns; I_L <= "11110000"; EI_L <= '0'; wait for 10 ns; I_L <= "11111000"; EI_L <= '0'; wait for 10 ns; I_L <= "11111100"; EI_L <= '0'; wait for 10 ns; I_L <= "11111110"; EI_L <= '0'; wait for 10 ns; end process; end Testbench;
Y la salida de la señales son las siguientes:
SSSSSS
Se señala que se utilizó la herramienta UMHDL v2.00 de Pablo Garrido de la Universidad Miguel Hernández, de Elche, en su versión para sistema operativo Linux
La siguiente dirección es la indicada por el software, en la sección de acerca de..
http://labatc.umh.es:50005/pgarrido/
viernes, 17 de julio de 2015
viernes, 22 de noviembre de 2013
Qucs, subcircuitos, VHDL en Manjaro
Buenos dias les comparto un video que recién edité
Suscribirse a:
Entradas (Atom)