📄 alu.vhd.bak
字号:
LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;USE IEEE.numeric_std.ALL;-- use packageUSE work.procmem_definitions.ALL;ENTITY alu ISPORT (a, b : IN STD_ULOGIC_VECTOR(width-1 DOWNTO 0);opcode : IN STD_ULOGIC_VECTOR(2 DOWNTO 0);result : OUT STD_ULOGIC_VECTOR(width-1 DOWNTO 0);zero : OUT STD_ULOGIC);END alu;ARCHITECTURE behave OF alu ISBEGINPROCESS(a, b, opcode)-- declaration of variablesVARIABLE a_uns : UNSIGNED(width-1 DOWNTO 0);VARIABLE b_uns : UNSIGNED(width-1 DOWNTO 0);VARIABLE r_uns : UNSIGNED(width-1 DOWNTO 0);VARIABLE z_uns : UNSIGNED(0 DOWNTO 0);VARIABLE r_uns1,d : UNSIGNED(2*width-1 DOWNTO 0);--variable t:UNSIGNED(width-1 downto 0);variable t,d1:unsigned(63 downto 0);variable a1,b1:integer;BEGIN-- initialize valuesa_uns := UNSIGNED(a);b_uns := UNSIGNED(b);r_uns := (OTHERS => '0');z_uns(0) := '0';-- select desired operationCASE opcode IS--multWHEN "011" =>--variable t,d:std_logic_vector(7 downto 0);d1:=(OTHERS => '0');t:=(OTHERS => '0');while t < b_uns loop d1:=d1 + a_uns; t:=t+1; end loop; --m<=d(8) or d(7); r_uns:=d1(63 downto 32) ;--r_uns1 :=a_uns * b_uns;--r_uns:=r_uns1(2*width-1 downto width);--divWHEN "100" =>a1:=(to_integer( unsigned(a)));b1:=(to_integer( unsigned(b))); while b1 < a1 loop a1:=a1-b1; end loop; r_uns:=a1;--std_ulogic_vector(to_unsigned(a1, 32));--r_uns :=a_uns / b_uns;-- addWHEN "010" =>r_uns := a_uns + b_uns;-- subWHEN "110" =>r_uns := a_uns - b_uns;-- andWHEN "000" =>r_uns := a_uns AND b_uns;-- orWHEN "001" =>r_uns := a_uns OR b_uns;-- sltWHEN "111" =>r_uns := a_uns - b_uns;IF SIGNED(r_uns) < 0 THENr_uns := TO_UNSIGNED(1, r_uns'LENGTH);ELSEr_uns := (OTHERS => '0');END IF;-- othersWHEN OTHERS => r_uns := (OTHERS => 'X');END CASE;-- set zero bit if result equals zeroIF TO_INTEGER(r_uns) = 0 THENz_uns(0) := '1';ELSEz_uns(0) := '0';END IF;-- assign variables to output signalsresult <= STD_ULOGIC_VECTOR(r_uns);zero <= z_uns(0);END PROCESS;END behave;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -