You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			VHDL
		
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			VHDL
		
	
| -- The Potato Processor - A simple processor for FPGAs
 | |
| -- (c) Kristian Klomsten Skordal 2014 <kristian.skordal@wafflemail.net>
 | |
| 
 | |
| library ieee;
 | |
| use ieee.std_logic_1164.all;
 | |
| 
 | |
| package pp_utilities is
 | |
| 
 | |
| 	--! Converts a boolean to an std_logic.
 | |
| 	function to_std_logic(input : in boolean) return std_logic;
 | |
| 
 | |
| 	-- Checks if a number is 2^n:
 | |
| 	function is_pow2(input : in natural) return boolean;
 | |
| 
 | |
| 	--! Calculates log2 with integers.
 | |
| 	function log2(input : in natural) return natural;
 | |
| 
 | |
| 	-- Gets the value of the sel signals to the wishbone interconnect for the specified
 | |
| 	-- operand size and address.
 | |
| 	function wb_get_data_sel(size : in std_logic_vector(1 downto 0); address : in std_logic_vector)
 | |
| 		return std_logic_vector;
 | |
| 
 | |
| end package pp_utilities;
 | |
| 
 | |
| package body pp_utilities is
 | |
| 
 | |
| 	function to_std_logic(input : in boolean) return std_logic is
 | |
| 	begin
 | |
| 		if input then
 | |
| 			return '1';
 | |
| 		else
 | |
| 			return '0';
 | |
| 		end if;
 | |
| 	end function to_std_logic;
 | |
| 
 | |
| 	function is_pow2(input : in natural) return boolean is
 | |
| 		variable c : natural := 1;
 | |
| 	begin
 | |
| 		for i in 0 to 31 loop
 | |
| 			if input = c then
 | |
| 				return true;
 | |
| 			end if;
 | |
| 
 | |
| 			c := c * 2;
 | |
| 		end loop;
 | |
| 
 | |
| 		return false;
 | |
| 	end function is_pow2;
 | |
| 
 | |
| 	function log2(input : in natural) return natural is
 | |
| 		variable retval : natural := 0;
 | |
| 		variable temp   : natural := input;
 | |
| 	begin
 | |
| 		while temp > 1 loop
 | |
| 			retval := retval + 1;
 | |
| 			temp := temp / 2;
 | |
| 		end loop;
 | |
| 
 | |
| 		return retval;
 | |
| 	end function log2;
 | |
| 
 | |
| 	function wb_get_data_sel(size : in std_logic_vector(1 downto 0); address : in std_logic_vector)
 | |
| 		return std_logic_vector is
 | |
| 	begin
 | |
| 		case size is
 | |
| 			when b"01" =>
 | |
| 				case address(1 downto 0) is
 | |
| 					when b"00" =>
 | |
| 						return b"0001";
 | |
| 					when b"01" =>
 | |
| 						return b"0010";
 | |
| 					when b"10" =>
 | |
| 						return b"0100";
 | |
| 					when b"11" =>
 | |
| 						return b"1000";
 | |
| 					when others =>
 | |
| 						return b"0001";
 | |
| 				end case;
 | |
| 			when b"10" =>
 | |
| 				if address(1) = '0' then
 | |
| 					return b"0011";
 | |
| 				else
 | |
| 					return b"1100";
 | |
| 				end if;
 | |
| 			when others =>
 | |
| 				return b"1111";
 | |
| 		end case;
 | |
| 	end function wb_get_data_sel;
 | |
| 
 | |
| end package body pp_utilities;
 |