计算机原理实验报告 第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
,其中n
是R2
中的数值。(指令码从10
开始)
(1)实验步骤
设置实验箱进入EM
模式,ADR
从10
到22
,依次设置DB
。
设置实验箱进入uPC
模式。设置uPC=00
,PC=10
;按NX
三次,设R0=00
,R1=01
,R2=02
,连续按下STEP
键,观察实验结果。
记录实验结果。
(2)实验现象
OUT
和R1
显示04
,R2
显示00
.
(3)实验结论
通过一系列正确的设计,我们成功地完成了“将R1中的数值左移n次送OUT”操作功能的实现。
完成R3=R0×R1
,结果送OUT
。(指令码从30
开始)
(1)实验步骤
按Reset键初始化系统,并设置实验箱进入EM
模式。ADR
从30
到3D
,依次设置DB
。
设置实验箱进入uPC
模式。设置uPC=00
,PC=30
;按NX
三次,设R0=10
,R1=02
,连续按下STEP
键,观察实验结果。
记录实验结果,关闭实验箱电源。
(2)实验现象
OUT
和A
显示40
,R2
显示00
.
(3)实验结论
通过一系列正确的设计,我们成功地完成了“R3=R0×R1
后结果送OUT
”操作功能的实现。