end loop; temp2(0) := '0'; c <= alu_b(15); v<='0';
when \temp2(15) := '0'; for I in 15 downto 1 loop temp2(I-1) := alu_b(I); end loop;
temp2(15) := '0'; c <= alu_b(0); v<='0';
when others=>
temp2 := \
end case;
alu_out <= temp2;
if temp2 = \else z<='0'; end if;
if temp2(15) = '1' then s<='1'; else s<='0';
end if;
end process; end behave;
这部分主要要注意的地方就是标志位C和V的数值。溢出标志位OF:在运算过程中,如操作数超出了机器能标似的范围称为溢出,此时OF位置1,否则置0。进位标志CF:记录运算时从最高有效位产生的进位值,例如,执行加法指令时,最高有效位有进位时置1,否则置0。后文对此进一步解释说(page 59),OF用来表示带符号数的溢出,CF用来表示无符号数的溢出。
根据这一说明,可以这样判断V和C标志位的值:
V:如果正数(符号位为0)与正数之和为负数(符号位为1),或是负数与负数之和为正数,则发生了溢出,V置1;
C:两数之和大于1111111111111111,则产生了进位,C置1;被减数小于减数,则产生借位,C置1。注意要使用无符号数的比较符号>、<需包含库函数ieee.std_logic_arith和ieee.std_logic_unsigned。
另外要注意的是,只有算术运算需要考虑进位和溢出标志位,逻辑运算,除非带C移位和循环,否则无需考虑这两个标志位。
(2) 数据选择器BUS_MUX:组合逻辑器件,其输入包括:源寄存器数据,目
标寄存器数据,带符号位扩展的偏移地址,PC,以及从内存读取的立即数、跳转地址等数据。在3位控制信号alu_in的控制下它进行ALU 模块A、B端输入的选择:
alu_in_sel 000 001 010 011 100 101
由Quartus生成的.bsf图如下:
ALU_A SR SR 0 OFFSET 0 0 ALU_B DR 0 DR PC PC DATA
其VHDL语言的行为描述如下: library ieee;
use ieee.std_logic_1164.all;
entity bus_mux is
port( alu_in_sel : in std_logic_vector(2 downto 0); data,pc,offset,sr,dr : in std_logic_vector(15 downto 0); alu_sr,alu_dr : out std_logic_vector(15 downto 0)); end bus_mux;
architecture behave of bus_mux is begin
process(alu_in_sel,data,pc,offset,sr,dr) begin case alu_in_sel is
when \alu_sr<=sr; alu_dr<=dr; when \ alu_sr<=sr;
alu_dr<=\when \
alu_sr<=\alu_dr<=dr; when \alu_sr<=offset;
alu_dr<=pc;
when \
alu_sr<=\alu_dr<=pc; when \
alu_sr<=\alu_dr<=data;
when others=>
alu_sr<=\alu_dr<=\
end case; end process; end behave;
由于在我们的设计中只有ALU部件有加法器的功能,而对程序计数器的自增并没有再另设一个加法器,故ALU的输入组合情况较多。在对全部指令的执行步骤进行了分析后,共列出了表中所示的6种情况,故使用了3位控制信号。
(3) 器件T1:组合逻辑器件,用于产生ALU的进位输入Cin,受两位控制信
号SCI的选择控制,输入为标志寄存的输出FLAG_C:
SCI 00 01 10
由Quartus生成的.bsf图如下:
Cin 0 1 FLAG_C
其VHDL语言的行为描述如下: library ieee;
use ieee.std_logic_1164.all;
entity t1 is
port(flag_c:in std_logic;
sci:in std_logic_vector(1 downto 0); alu_cin:out std_logic); end t1;
architecture behave of t1 is begin
process(sci,flag_c) begin case sci is
when \alu_cin<='0'; when \alu_cin<='1'; when \alu_cin<=flag_c; when others=> alu_cin<='0'; end case;
end process; end behave;
(4) 标志寄存器FLAG_REG:时序逻辑部件,带有清零端RESET,输出只在
时钟正跳变时发生变化;接收ALU的标志位输出,在控制信号SST的控制下输出实际需要的标志位:
SST 00 01 10 11 0 1 C C Z V 接受ALU的运算结果 Z Z Z V V V S S S S
由Quartus生成的.bsf图如下:
其VHDL语言的行为描述如下: library ieee;
use ieee.std_logic_1164.all;
entity flag_reg is
port( sst: in std_logic_vector(1 downto 0); c,z,v,s,clk,reset: in std_logic;

