OpenCores
URL https://opencores.org/ocsvn/special_functions_unit/special_functions_unit/trunk

Subversion Repositories special_functions_unit

[/] [special_functions_unit/] [Open_source_SFU/] [log2_vhdl/] [parts/] [left_shifter.vhd] - Rev 4

Compare with Previous | Blame | View Log

-- Nombre de archivo	: left_shifter.vhd
--	Titulo				: desplazador a la izquierda 
-----------------------------------------------------------------------------	
-- Descripcion			: Desplaza el dato a la izquierda segun el numero de
--							  desplazamientos indicado. El costado derecho se
--							  rellena con ceros. Segun el ancho del dato se calcula
--							  el total de desplazamientos y los bits del dato de salida:
--									DATA_BITS =23
--									i_data[22:0]
--									i_shifts[4:0]
--									o_dataShift[31:0]
--							  Para realizar el desplazamiento se utilizan multiplexores,
--							  siguiendo el ejemplo anterior: 32 multiplexores.
--							  
--		DATA_BITS		: Ancho del dato a desplazar
-- 	i_data			: Dato a desplazar
-- 	i_shifts			: Numero de desplazamientos
-- 	o_data			: Dato desplazado
--
-----------------------------------------------------------------------------	
-- Universidad Pedagogica y Tecnologica de Colombia.
-- Facultad de ingenieria.
-- Escuela de ingenieria Electronica - extension Tunja.
-- 
-- Autor: Cristhian Fernando Moreno Manrique
-- Marzo 2020
-----------------------------------------------------------------------------	
library ieee;
	use ieee.std_logic_1164.all;
	use ieee.numeric_std.all;
	use work.log2_pkg.all;
 
 
entity left_shifter is 
 
	generic (DATA_BITS					: 		natural := 5);	-- Result[31:1] & cout
	port	  (i_data						: in	std_logic_vector(DATA_BITS-1 downto 0);
				i_shifts						: in	std_logic_vector(f_log2(DATA_BITS)-1 downto 0);
				o_dataShift					: out std_logic_vector(DATA_BITS-1 downto 0));
end entity;
-----------------------------------------------------------------------------				
 
architecture main of left_shifter is	
	type shift_data is array(0 to 2**f_log2(DATA_BITS)-1) of std_logic_vector(2**f_log2(DATA_BITS)-1 downto 0);
	signal w_mx_input	: shift_data;
begin	
 
 
	DN: process(i_data)
	begin
		for i in 0 to 2**f_log2(DATA_BITS)-1 loop
			if(i<(DATA_BITS)) then
				w_mx_input(0)(i) <= i_data(i);
			else
				w_mx_input(0)(i) <= '0';
			end if;
		end loop;
	end process DN;
 
 
 
	MUXi: for i in 1 to 2**f_log2(DATA_BITS)-1 generate
		w_mx_input(i)<= w_mx_input(i-1)(2**f_log2(DATA_BITS)-2 downto 0) & '0';
	end generate MUXi;
 
 
 
	-- se genera una cantidad de mux igual al numero de bits del dato de entrada
 
	MX: for i in 0 to o_dataShift'left generate		
			-- mux_shifter1					: mux
			-- generic map(SELECT_BITS 	=> i_shifts'length,
							-- DATA_BITS		=> 1)
			-- port map	  (i_data			=>	w_mx_input(i),
							-- i_select			=> i_shifts,
							-- o_data			=> o_dataShift(i downto i));
		o_dataShift(i) <= w_mx_input(to_integer(unsigned(i_shifts)))(i);
 
	end generate MX;
 
end main;

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2022 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.