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.