Advertisement
Mikestriken

Sign_Extender

Apr 7th, 2023 (edited)
1,854
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 5.06 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use IEEE.NUMERIC_STD.ALL;
  4.  
  5. entity sign_extender is
  6.     port (
  7.         instruction_input : in std_logic_vector(31 downto 0);
  8.         extended_output : out std_logic_vector(63 downto 0)
  9.         -- debug_output_64 : out std_logic_vector(63 downto 0);
  10.         -- debug_output_11 : out std_logic_vector(10 downto 0);
  11.         -- debug_output_bool : out boolean
  12.     );
  13. end entity sign_extender;
  14.  
  15. architecture Dataflow of sign_extender is
  16.     -- Handy Constants
  17.     constant ADD_R : std_logic_vector(10 downto 0) := "10001011000"; -- 11 bits
  18.     constant SUB_R : std_logic_vector(10 downto 0) := "11001011000"; -- 11 bits
  19.     constant LSL_R : std_logic_vector(10 downto 0) := "11010011011"; -- 11 bits
  20.     constant LSR_R : std_logic_vector(10 downto 0) := "11010011010"; -- 11 bits
  21.     constant AND_R : std_logic_vector(10 downto 0) := "10001010000"; -- 11 bits
  22.     constant OR_R  : std_logic_vector(10 downto 0) := "10101010000"; -- 11 bits
  23.     constant LDUR_D : std_logic_vector(10 downto 0) := "11111000010"; -- 11 bits
  24.     constant STUR_D : std_logic_vector(10 downto 0) := "11111000000"; -- 11 bits
  25.     constant BR_R  : std_logic_vector(10 downto 0) := "11010110000"; -- 11 bits
  26.     constant ADDI_I : std_logic_vector(9 downto 0) := "1001000100"; -- (10 downto 1) bits
  27.     constant SUBI_I : std_logic_vector(9 downto 0) := "1101000100"; -- (10 downto 1) bits
  28.     constant MOVZ_IM : std_logic_vector(8 downto 0) := "110100101"; -- (10 downto 2) bits
  29.     constant CBNZ_CB : std_logic_vector(7 downto 0) := "10110101"; -- (10 downto 3) bits
  30.     constant CBZ_CB : std_logic_vector(7 downto 0) := "10110100"; -- (10 downto 3) bits
  31.     constant B_B   : std_logic_vector(5 downto 0) := "000101"; -- (10 downto 5) bits
  32.    
  33.     -- Handy signal
  34.     signal Opcode : std_logic_vector(10 downto 0);
  35. begin
  36.     Opcode <= instruction_input(31 downto 21);
  37.     -- debug_output_11 <= Opcode ;
  38.     -- debug_output_64 <= std_logic_vector(resize(signed(instruction_input(23 downto 5)),extended_output'length));
  39.     -- debug_output_bool <= Opcode(10 downto 3) = CBZ_CB;
  40.    
  41.  
  42.                        -- R Format
  43.     extended_output <= std_logic_vector(resize(signed(instruction_input(15 downto 10)),extended_output'length)) when Opcode = ADD_R or
  44.                                                                                                                      Opcode = SUB_R or
  45.                                                                                                                      Opcode = LSL_R or
  46.                                                                                                                      Opcode = LSR_R or
  47.                                                                                                                      Opcode = AND_R or
  48.                                                                                                                      Opcode = OR_R or
  49.                                                                                                                      Opcode = BR_R else
  50.                        
  51.                        -- I Format
  52.                        std_logic_vector(resize(signed(instruction_input(21 downto 10)),extended_output'length)) when Opcode(10 downto 1) = ADDI_I or
  53.                                                                                                                      Opcode(10 downto 1) = SUBI_I else
  54.                        
  55.                        -- D Format pos
  56.                        std_logic_vector(resize(signed(instruction_input(20 downto 12)),extended_output'length)) when (Opcode = LDUR_D or Opcode = STUR_D) and
  57.                                                                                                                      (instruction_input(11 downto 10) = "01") else
  58.                        
  59.                        -- D Format neg
  60.                        std_logic_vector( not (resize( signed(instruction_input(20 downto 12)),extended_output'length)) + to_signed(1, extended_output'length)) when (Opcode = LDUR_D or Opcode = STUR_D) and
  61.                                                                                                                               (instruction_input(11 downto 10) = "10") else
  62.                        
  63.                        -- B Format
  64.                        std_logic_vector(resize(signed(instruction_input(25 downto 0)),extended_output'length)) when Opcode(10 downto 5) = B_B else
  65.                        
  66.                        -- CB Format
  67.                        std_logic_vector(resize(signed(instruction_input(23 downto 5)),extended_output'length)) when Opcode(10 downto 3) = CBNZ_CB or
  68.                                                                                                                     Opcode(10 downto 3) = CBZ_CB else
  69.                        
  70.                        -- IM Format
  71.                        std_logic_vector(resize(signed(instruction_input(20 downto 5)),extended_output'length)) when Opcode(10 downto 2) = MOVZ_IM
  72.                        
  73.                        -- Unknown
  74.                        else (others => 'X');
  75. end Dataflow;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement