Initial commit
This commit is contained in:
		
							
								
								
									
										113
									
								
								Libs/NanoBlaze/hdl/alu_RTL.vhd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								Libs/NanoBlaze/hdl/alu_RTL.vhd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| ARCHITECTURE RTL OF alu IS | ||||
|  | ||||
|   signal aluCodeInt: unsigned(aluCode'range); | ||||
|   signal aArith: signed(opA'high+1 downto 0); | ||||
|   signal bArith: signed(opA'high+1 downto 0); | ||||
|   signal cInArith: signed(1 downto 0); | ||||
|   signal cInShift: std_ulogic; | ||||
|   signal yArith: signed(aluOut'high+1 downto 0); | ||||
|   signal aluOutInt: signed(aluOut'range); | ||||
|  | ||||
| BEGIN | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                       -- clear aluCode don't care LSB for shifts | ||||
|   aluCodeInt(aluCode'high downto 1) <= unsigned(aluCode(aluCode'high downto 1)); | ||||
|  | ||||
|   cleanupLsb: process(aluCode) | ||||
|   begin | ||||
|     if aluCode(aluCode'high) = '1' then | ||||
|       aluCodeInt(0) <= '0'; | ||||
|     else | ||||
|       aluCodeInt(0) <= aluCode(0); | ||||
|     end if; | ||||
|   end process cleanupLsb; | ||||
|  | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                              -- values for arithmetic operations | ||||
|   aArith <= signed(resize(unsigned(opA), aArith'length)); | ||||
|   bArith <= signed(resize(unsigned(opB), bArith'length)); | ||||
|   cInArith <= (0 => cIn, others => '0'); | ||||
|  | ||||
|   process(aluCode, cIn, opA) | ||||
|   begin | ||||
|     case aluCode(2 downto 1) is | ||||
|       when "00"   => cInShift <= cIn; | ||||
|       when "01"   => cInShift <= opA(opA'high); | ||||
|       when "10"   => cInShift <= opA(opA'low); | ||||
|       when "11"   => cInShift <= aluCode(0); | ||||
|       when others => cInShift <= '-'; | ||||
|     end case; | ||||
|   end process; | ||||
|  | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                                                -- alu operations | ||||
|   aluOperation: process( | ||||
|     aluCodeInt, | ||||
|     opA, opB, | ||||
|     aArith, bArith, cInArith, | ||||
|     cInShift, | ||||
|     yArith, aluOutInt | ||||
|   ) | ||||
|     variable xorAcc: std_ulogic; | ||||
|   begin | ||||
|     yArith <= (others => '-'); | ||||
|     cOut   <= '-'; | ||||
|     aluOutInt <= (others => '-'); | ||||
|     case to_integer(aluCodeInt) is | ||||
|       when  0 =>                                        -- LOAD sX, kk | ||||
|         aluOutInt <= opB; | ||||
|       when  2 =>                                        -- INPUT sX, pp | ||||
|         aluOutInt <= opB; | ||||
|       when  3 =>                                        -- FETCH sX, ss | ||||
|         aluOutInt <= opB; | ||||
|       when  5 =>                                        -- AND sX, kk | ||||
|         aluOutInt <= opA and opB; | ||||
|         cOut      <= '0'; | ||||
|       when  6 =>                                        -- OR sX, kk | ||||
|         aluOutInt <= opA or opB; | ||||
|         cOut      <= '0'; | ||||
|       when  7 =>                                        -- XOR sX, kk | ||||
|         aluOutInt <= opA xor opB; | ||||
|         cOut      <= '0'; | ||||
|       when  9 =>                                        -- TEST sX, kk | ||||
|         aluOutInt <= opA and opB; | ||||
|         xorAcc := '0'; | ||||
|         for index in aluOutInt'range loop | ||||
|           xorAcc := xorAcc xor aluOutInt(index); | ||||
|         end loop; | ||||
|         cOut      <= xorAcc; | ||||
|       when 10 =>                                        -- COMPARE sX, kk | ||||
|         yArith    <= aArith - bArith; | ||||
|         aluOutInt <= yArith(aluOut'range); | ||||
|         cOut      <= yArith(yArith'high); | ||||
|       when 12 =>                                        -- ADD sX, kk | ||||
|         yArith    <= aArith + bArith; | ||||
|         aluOutInt <= yArith(aluOut'range); | ||||
|         cOut      <= yArith(yArith'high); | ||||
|       when 13 =>                                        -- ADDCY sX, kk | ||||
|         yArith    <= (aArith + bArith) + cInArith; | ||||
|         aluOutInt <= yArith(aluOut'range); | ||||
|         cOut      <= yArith(yArith'high); | ||||
|       when 14 =>                                        -- SUB sX, kk | ||||
|         yArith    <= aArith - bArith; | ||||
|         aluOutInt <= yArith(aluOut'range); | ||||
|         cOut      <= yArith(yArith'high); | ||||
|       when 15 =>                                        -- SUBCY sX, kk | ||||
|         yArith    <= (aArith - bArith) - cInArith; | ||||
|         aluOutInt <= yArith(aluOut'range); | ||||
|         cOut      <= yArith(yArith'high); | ||||
|       when 16 to 23 =>                                  -- SL sX | ||||
|         aluOutInt <= opA(opA'high-1 downto 0) & cInShift; | ||||
|         cOut      <= opA(opA'high); | ||||
|       when 24 to 31 =>                                  -- SR sX | ||||
|         aluOutInt <= cInShift & opA(opA'high downto 1); | ||||
|         cOut      <= opA(0); | ||||
|       when others => | ||||
|         aluOutInt <= (others => '-'); | ||||
|     end case; | ||||
|   end process aluOperation; | ||||
|  | ||||
|   aluOut <= aluOutInt; | ||||
|   zero <= '1' when aluOutInt = 0 else '0'; | ||||
|  | ||||
| END ARCHITECTURE RTL; | ||||
		Reference in New Issue
	
	Block a user