计算机原理实验报告(推荐3篇)

时间:2025-05-29 14:19:03 admin 今日美文

计算机原理实验报告 第1篇

entity alu is

    Port ( clk : in STD_LOGIC;--时钟

           rst : in STD_LOGIC;--复位

           In_temp : in STD_LOGIC_VECTOR (15 downto 0); --操作数

           Out_Y : out STD_LOGIC_VECTOR (15 downto 0);--输出

           Flags :out STD_LOGIC_VECTOR(3 DOWNTO 0);--标志位为 OF 溢出标志位/CF carry flag/ZF 零标志位/SF 正负标志位 0 正 1 负

           stateCnt :out STD_LOGIC_VECTOR(6 DOWNTO 0));

end alu;

architecture Behavioral of alu is

    signal State : STD_LOGIC_VECTOR (2 downto 0):= _000_;--记录当前的状态,来判断该进行什么操作

    signal int_A, int_B,int_Y : INTEGER RANGE -32768 TO 32767:=0;

    signal temp_A, temp_B, temp_y: STD_LOGIC_VECTOR (15 downto 0);--定义临时操作数

    signal OP : STD_LOGIC_VECTOR(3 downto 0);--操作码

    signal Flag_OF : STD_LOGIC:= '0';--溢出标志

    signal Flag_CF : STD_LOGIC:= '0';--进位标志

    signal Flag_ZF : STD_LOGIC:= '0';--0 标志位

    signal Flag_SF : STD_LOGIC:= '0';--正负标志

    signal M: STD_LOGIC:='0';--扩展:对于带符号运算 ADC/SBB

begin

    process(rst,clk)

    VARIABLE int_T: INTEGER RANGE -32768 TO 32767:=0;

   VARIABLE TEMP_Y : STD_LOGIC_VECTOR(15 DOWNTO 0);

    begin

        IF (rising_edge(clk)) then

           if (State = _000_) then --状态 1,读取 A 数字转换;

               temp_A <= In_temp;

               stateCnt <= not _1000000_   ;

               Flag_OF <='0';

               Flag_CF <='0';

               Flag_ZF <='0';

               Flag_SF <='0';

               int_A <= CONV_INTEGER(In_temp); --将 A 输入转化为整形

               State <= _001_;

           elsif (State = _001_) then --状态 2,读取 B 数字转换;

               temp_B <= In_temp;

               stateCnt <= not _1111001_   ;      

               int_B <= CONV_INTEGER(In_temp); --将 B 输入转化为整形

               State <= _010_;

           elsif (State = _010_) then --状态 3,读 OP

               OP <= In_temp(3 downto 0);

               stateCnt <= not _0100100_   ;      

               State <= _011_;

           elsif (State = _011_) then--状态 4,进行运算;

               stateCnt <= not _0110000_   ;      

               CASE OP IS

                   WHEN _0000_ => --ADD 加

                       M <= '1';

                       int_T := int_A + int_B;

                       int_Y <= int_T;

                       TEMP_Y := TEMP_A + TEMP_B;

                       Out_Y <= CONV_STD_LOGIC_VECTOR(int_T,16);

                       if(temp_A(15) = '0' and temp_B(15) = '0' and temp_Y(15) = '1') then--进行溢出和是否进位判断

                           Flag_OF <= '1';

                       end if;

                       if(temp_A(15)='1' and temp_B(15)='1' and temp_Y(15)='0') then --进行溢出和是否进位判断

                           Flag_OF <= '1';

                           Flag_CF <='1';

                       end if;

                       if(CONV_STD_LOGIC_VECTOR(int_T,16) = _0000000000000000_) then --0 标志位与 0 进行比较

                           Flag_ZF <= '1';

                       end if;

                       if(INT_T < 0) then --通过符号位来判断正负标志位

                           Flag_SF <= '1';

                       end if;

                       State <= _100_;

                   WHEN _0001_ => --SUB 减

                       int_T := int_A - int_B;

                       if(int_T = 0) then

                           Flag_ZF <= '1';

                       end if;

                       if(int_T < 0) then

                           Flag_SF <= '1';

                       end if;

                       Out_Y <= CONV_STD_LOGIC_VECTOR(int_T,16);

                       State <= _100_;

                   WHEN _0010_ => --AND 逻辑与

                       Out_Y <= (temp_A AND temp_B);

                       temp_Y := (temp_A AND temp_B);

                       if(CONV_INTEGER(temp_Y) = 0) then

                           Flag_ZF <= '1';

                       end if;

                       if(CONV_INTEGER(temp_Y) < 0) then

                           Flag_SF <= '1';

                       end if;

                       State <= _100_;

                   WHEN _0011_ => --OR 逻辑或

                       Out_Y <= temp_A OR temp_B;

                       State <= _100_;

                   WHEN _0100_ => --XOR 逻辑异或

                       Out_Y <= temp_A XOR temp_B;

                       State <= _100_;

                   WHEN _0101_ => --NOT 逻辑非

                       Out_Y <= NOT temp_A;

                       State <= _100_;

                   WHEN _0110_ => --SLL 逻辑左移

                       if(temp_B(3 downto 0) /= _0000_) then

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SLL CONV_INTEGER(temp_B(3 downto 0)));

                       else

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SLL 1);

                       end if;

                       State <= _100_;

                   WHEN _0111_ => --SLA 算术左移

                       if(temp_B(3 downto 0) /= _0000_) then

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SLA CONV_INTEGER(temp_B(3 downto 0)));

                       else

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SLA 1);

                       end if;

                       State <= _100_;

                   WHEN _1000_ => --SRL 逻辑右移

                       if(temp_B(3 downto 0) /= _0000_) then

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SRL CONV_INTEGER(temp_B));

                       else

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SRL 1);

                       end if;

                       State <= _100_;

                   WHEN _1001_ => --SRA 算术右移

                       if(temp_B(3 downto 0) /= _0000_) then

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SRA CONV_INTEGER(temp_B(3 downto 0)));

                       else

                       Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) SRA 1);

                       end if;

                       State <= _100_;

                   WHEN _1010_ => --ROL 循环逻辑左移

                       if(temp_B(3 downto 0) = _0000_) then

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) ROL CONV_INTEGER(temp_B(3 downto 0)));

                       else

                           Out_Y <= TO_STDLOGICVECTOR(To_bitvector(temp_A) ROL 1);

                       end if;

                       State <= _100_;

                   WHEN OTHERS =>

                       Out_Y <= _1111111111111111_; --默认报错用-1

                       State <= _100_;

               end case;

           elsif (State = _100_) then--状态 5,输出 FLAGS;

              stateCnt <=  not _0011001_   ;      

               Flags(3) <= Flag_OF;

               Flags(2) <= Flag_CF;

               Flags(1) <= Flag_ZF;

               Flags(0) <= Flag_SF;

               State <= _000_;

           end if;

        end if;

        if (rst='0') then

           State <= _000_;

           Flags(3) <= '0';

           Flags(2) <= '0';

           Flags(1) <= '0';

           Flags(0) <= '0';

           Out_Y <= _0000000000000000_;

        END if;

    end process;

end Behavioral;

计算机原理实验报告 第2篇

(1)用VHDL语言实现一个简易的16位ALU。

(2)通过设计一个状态机,根据状态机状态的变化输入操作数和操作码,来实现不同运算。

(3)实验中ALU要求实现基本的算术运算、逻辑运算、移位运算等,具体功能如下表所示。合理设置每条指令的标志位,包括进位标志、溢出标志、最高位和全零标志。

ALU功能表:

操作码

ADD

A + B

SUB

A – B

AND

A and B

A or B

XOR

A xor B

NOT

not A

SLL

A sll B

逻辑左移B位

SLR

A srl B

逻辑右移B位

SAL

A sal B

算数左移B位

SAR

A sar B

算数右移B位

ROL

A rol B

循环左移B位

ROR

A ror B

循环右移B位

要求:ALU 的数据输入 A、B 的长度为 16 位,操作码 op 为 4 位,算术运算时数据用补码表示。

(4)将实验过程中进行的操作与结果数据记录在下表中。

输入数据

实际输出

与预期一致性

操作码

操作数A

操作数B

运算结果

标志位

0000

00000001

00000010

00000011

0000

(5)在教学计算机上验证实现的ALU功能。

计算机原理实验报告 第3篇

R1中的数值左移n次送OUT,其中nR2中的数值。(指令码从10开始)

(1)实验步骤

设置实验箱进入EM模式,ADR1022,依次设置DB

设置实验箱进入uPC模式。设置uPC=00PC=10;按NX三次,设R0=00,R1=01,R2=02,连续按下STEP键,观察实验结果。

记录实验结果。

(2)实验现象

OUTR1显示04R2显示00.

(3)实验结论

通过一系列正确的设计,我们成功地完成了“将R1中的数值左移n次送OUT”操作功能的实现。

完成R3=R0×R1,结果送OUT。(指令码从30开始)

(1)实验步骤

按Reset键初始化系统,并设置实验箱进入EM模式。ADR303D,依次设置DB

设置实验箱进入uPC模式。设置uPC=00PC=30;按NX三次,设R0=10,R1=02,连续按下STEP键,观察实验结果。

记录实验结果,关闭实验箱电源。

(2)实验现象

OUTA显示40R2显示00.

(3)实验结论

通过一系列正确的设计,我们成功地完成了“R3=R0×R1后结果送OUT”操作功能的实现。