计算机组成原理课内实验报告三.docx
《计算机组成原理课内实验报告三.docx》由会员分享,可在线阅读,更多相关《计算机组成原理课内实验报告三.docx(14页珍藏版)》请在冰豆网上搜索。
计算机组成原理课内实验报告三
计算机组成与设计课内实验三
一、实验名称
层次结构设计(通用寄存器组)实验
二、实验目的
●了解通用寄存器组的用途及对CPU的重要性。
●掌握通用寄存器组的设计方法。
●掌握VHDL中层次结构的设计特点和方法;学习和掌握component语句和portmap语句。
●进一步学习和掌握case语句及其他语句的用法,完成各种寄存器、译码器及选择器的设计和实现。
三、实验原理
通用寄存器组是CPU的重要组成部分。
从存储器取来的数据要放在通用寄存器中;从外部设备取来的数据除DMA方式外,要放在通用寄存器中。
向存储器输出的数据也是从通用寄存器中取出的;向外部设备输出的数据除DMA方式外也是从通用寄存器中取出的。
由于从通用寄存器组中取数据比从存储器或者外部设备取数据速度快得多,因此参加算术运算和逻辑运算的数据一般是从通用寄存器组中取出的,它向算术逻辑单元ALU提供了进行算术运算和逻辑运算所需要的2个操作数,同时又是运算结果的暂存地。
通用寄存器组内寄存器的数目与CPU性能有关,CPU性能越高,通用寄存器组内的寄存器数目越多。
由于算术逻辑运算需要2个操作数,因此通用寄存器组有2个读端口,负责提供进行算术逻辑单元需要的源操作数和目的操作数。
通用寄存器组有1个写端口,负责将运算结果保存到指定的寄存器内。
根据通用寄存器组的功能要求,一个只有4个16位寄存器的通用寄存器组的框图如图所示。
图.4个16位寄存器组成的通用寄存器组
在图所示的电路中:
●Reset:
为低电平时,将4个16位寄存器R0—R3复位为0。
●寄存器:
它的write和sel有效,为高电平时,在时钟信号clk的上升沿将D端的输入D[15..0]写入寄存器,然后送到寄存器的输出Q[15..0]。
●4个寄存器的允许写信号write和外部产生的目的寄存器写信号DRWr直接相连。
●选择信号sel(每个寄存器):
它决定哪一个寄存器进行写操作。
4个寄存器的选择信号分别和2-4译码器产生的sel00、sel01、sel10和sel11相连。
只有当1个寄存器被选中(sel为高电平)时,才允许对该寄存器进行写操作。
●2-4译码器:
它的输入sel[1..0]接DR[1..0],2-4译码器对2位的输入信号sel[1..0]进行2-4译码,产生4个输出sel00、sel01、sel10和sel11,分别送往4个寄存器R0、R1、R2和R3的选择端sel。
●4选1多路选择器:
多路选择器1从4个寄存器R0、R1、R2和R3的输出Q[15..0]选择1路送到DR_data[1..0],给算术逻辑单元提供目的操作数;选择信号sel[1..0]接DR[1..0]。
多路选择器2从4个寄存器R0、R1、R2和R3的输出Q[15..0]选择1路送到SR_data[1..0],给算术逻辑单元提供源操作数;选择信号sel[1..0]接SR[1..0]。
四、实验要求
●实验设计目标
设计一个通用寄存器组,满足以下要求:
✓通用寄存器组中有4个16位的寄存器。
✓当复位信号reset=0时,将通用寄存器组中的4个寄存器清零。
✓通用寄存器组中有1个写入端口,当DRWr=1时,在时钟clk的上升沿将数据总线上的数写入DR[1..0]指定的寄存器。
✓通用寄存器组中有2个读出端口,一个对应算术逻辑单元的目的操作数DR,另一个对应算术逻辑单元的源操作数SR。
DR[1..0]选择目的操作数;SR[1..0]选择源操作数。
✓设计要求层次设计。
底层的设计实体有3个:
16位寄存器,具有复位功能和允许写功能;一个2-4译码器,对应寄存器写选择;一个4选1多路开关,负责选择寄存器读出。
顶层设计构成一个完整的通用寄存器组。
●顶层设计实体的引脚要求
引脚要求对应关系如下:
✓clk对应实验台上的时钟(单脉冲)。
✓reset对应实验台上的CPU复位信号CPU_RST。
✓SR[1..0]对应实验台开关SA1、SA0。
✓DR[1..0]对应实验台开关SA3、SA2。
✓DRWr对应实验台开关SA5。
✓目的操作数用实验台上的指示灯A15—A0显示,源操作数用实验台上的指示灯R15—R0显示。
五、实验步骤
●实验台设置成FPGA-CPU独立调试模式
REGSEL=0、CLKSEL=1、FDSEL=0。
使用实验台上的单脉冲,即STEP_CLK短路子短接,短路子RUN_CLK断开。
●将设计在QuartusⅡ下输入,编译后下载到TEC-CA上的FPGA中。
●将下列数据存入寄存器
R00x3333
R10x5555
R20xAAAA
R30xFFFF
●在实验台指示灯A15—A0和R15—R0上观察各寄存器的值,并填表1。
六、设计思路与源代码
●设计实体register_16
libraryieee;
useieee.std_logic_1164.all;
entityregister_16isport
(reset:
instd_logic;
d_input:
instd_logic_vector(15downto0);
clk:
instd_logic;
write:
instd_logic;
sel:
instd_logic;
q_output:
outstd_logic_vector(15downto0)
);
endregister_16;
architectureaofregister_16is
begin
process(reset,clk)
begin
ifreset='0'then
q_output<=x"0000";--复位
elsif(clk'eventandclk='1')then
ifsel='1'andwrite='1'then
q_output<=d_input;
endif;
endif;
endprocess;
enda;
●设计实体decoder2_to_4
libraryieee;
useieee.std_logic_1164.all;
entitydecoder2_to_4isport(
sel:
instd_logic_vector(1downto0);
sel00:
outstd_logic;
sel01:
outstd_logic;
sel02:
outstd_logic;
sel03:
outstd_logic);
enddecoder2_to_4;
architecturebehavioralofdecoder2_to_4is
begin
sel00<=(notsel
(1))and(notsel(0));
sel01<=(notsel
(1))andsel(0);
sel02<=sel
(1)and(notsel(0));
sel03<=sel
(1)andsel(0);
endbehavioral;
●设计实体mux4_to_1
libraryieee;
useieee_std_logic_1164.all;
entitymux4_to_1is
port(input0,input1,input2,input3
:
instd_logic_vector(15downto0);
sel:
instd_logic_vector(1downto0);
out_put:
outstd_logic_vector(15downto0));
endmux4_to_1;
architecturebehavioralofmux4_to_1is
begin
mux:
process(sel,input0,input1,input2,input3)
begin
caseselis
when"00"=>out_put<=input0;
when"01"=>out_put<=input1;
when"10"=>iut_put<=input2;
when"11"=>out_put<=input3;
endcase;
endprocess;
endbehavioral;
●顶层设计实体regfile
libraryieee;
useieeestd_logic_1164.all;
entityregfileis
port(wr_port:
instd_logic_vector(1downto0);
rd_port:
instd_logic_vector(1downto0);
reset:
instd_logic;
wen:
instd_logic;
clk:
instd_logic;
data:
instd_logic_vector(15downto0);
data_out:
outstd_logic_vector(15downto0)
);
endregfile;
architecturestructofregfileis
componentregister_16--16bit寄存器
port(reset,clk,write,sel:
instd_logic;
d_input:
instd_logic_vector(15downto0);
q_output:
outstd_logic_vector(15downto0));
endcomponent;
componentdecoder2_to_4--2—4译码器
port(sel:
instd_logic_vector(1downto0);
sel00,sel01,sel02,sel03:
outstd_logic);
endcomponent;
componentmux4_to_1--4选1多路开关
port(input0,input1,input2,input3
:
instd_logic_vector(15downto0);
sel:
instd_logic_vector(1downto0);
out_put:
outstd_logic_vector(15downto0));
endcomponent;
signalreg00,reg01,reg02,reg03:
std_logic_vector(15downto0);
signalsel00,sel01,sel02,sel03:
std_logic;
begin
Areg00:
register_16portmap(--16位寄存器R0
reset=>reset,--顶层设计实体的外部输入信号reset
d_input=>data,--顶层设计实体的外部输入信号data
clk=>clk,--顶层设计实体的外部输入信号clk
write=>wen,--顶层设计实体的外部输入信号wen
sel=>sel00,
q_output=>reg00
);
Areg01:
register_16portmap(--16位寄存器R1
reset=>reset,--顶层设计实体的外部输入信号reset
d_input=>data,--顶层设计实体的外部输入信号data
clk=>clk,--顶层设计实体的外部输入信号clk
write=>wen,--顶层设计实体的外部输入信号wen
sel=>sel01,
q_output=>reg01
);
Areg02:
reggister_16portmap(--16位寄存器R2
reset=>reset,--顶层设计实体的外部输入信号reset
d_input=>data,--顶层设计实体的外部输入信号data
clk=>clk,--顶层设计实体的外部输入信号clk
write=>wen,--顶层设计实体的外部输入信号wen
sel=>sel02,
q_output=>reg02
);
Areg03:
reggister_16portmap(--16位寄存器R3
reset=>reset,--顶层设计实体的外部输入信号reset
d_input=>data,--顶层设计实体的外部输入信号data
clk=>clk,--顶层设计实体的外部输入信号clk
write=>wen,--顶层设计实体的外部输入信号wren
sel=>sel03,
q_output=>reg03
);
decoder:
decoder2_to_4portmap(--2—4译码器
sel=>wr_port,--顶层设计实体的外部输入信号rd_port
sel00=>sel00,
sel01=>sel01,
sel02=>sel02,
sel03=>sel03
);
mux:
mux_4_to_1portmap(--4选1多路器
input0=>reg00,
input1=>reg01,
input2=>reg02,
input3=>reg03,
sel=>rd_port,--顶层设计实体的外部输入信号rd_port
out_put=>data_out--顶层设计实体的输出信号q_out
);
endstruct;
七、实验结果以及相关分析
如下图所示为仿真波形图。
分4个阶段:
第一个阶段置位端无效,产生一个写信号上升沿,将数据6存入寄存器1中;第二个阶段同样条件下将数据160存入寄存器3中;第3个阶段使得目的操作数输出端读出寄存器3中的内容,源操作数输出端读出寄存器1中的内容,如红色框框所示;第四个阶段置位端有效,两个输出端均输出0,如红色框所示。
八、课后题解答
●实验过程中填表格1结果:
表1通用寄存器组实验
步骤
A15—A0
R15—R0
R0
R1
R2
R3
R0
R1
R2
R3
reset后
0
0
0
0
0
0
0
0
R0写入0x3333后
0x3333
0x3333
0x3333
0x3333
0x3333
0
0
0
R1写入0x5555后
0x5555
0x5555
0x5555
0x5555
0
0x5555
0
0
R2写入0xAAAA后
0xaaaa
0xaaaa
0xaaaa
0xaaaa
0
0
0xaaaa
0
R3写入0xFFFF后
0xffff
0xffff
0xffff
0xffff
0
0
0
0xffff
●如果通用寄存器组中要求有8个16位通用寄存器,如何设计?
如果有八个16位通用寄存器,则需要使用3-8译码器代替2-4译码器,对应寄存器地址线位数需要改为3位。
其他部分与本实验相同。
●完成对附图(与上图结构类似,差别:
本题只有一个输出端口)所示的通用寄存器的访问并分析其仿真波形。
分析:
如果只有一个输出端口,则只需要在输出端连接一个多路选择器,其他部分与该实验相同。
下面只给出变化的部分代码:
✓regfile.vhd
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityregfileis
Port(DR:
instd_logic_vector(1downto0);
reset:
instd_logic;
DRWr:
instd_logic;
clk:
instd_logic;
d_input:
instd_logic_vector(15downto0);
DR_data:
outstd_logic_vector(15downto0)
);
endregfile;
architecturestructofregfileis
componentreg
port(
clr:
instd_logic;
D:
instd_logic_vector(15downto0);
clock:
instd_logic;
write:
instd_logic;
sel:
instd_logic;
Q:
outstd_logic_vector(15downto0)
);
endcomponent;
componentdecoder_2_to_4
port(
sel:
instd_logic_vector(1downto0);
sel00:
outstd_logic;
sel01:
outstd_logic;
sel02:
outstd_logic;
sel03:
outstd_logic
);
endcomponent;
componentmux_4_to_1
port(
input0,
input1,
input2,
input3:
instd_logic_vector(15downto0);
sel:
instd_logic_vector(1downto0);
out_put:
outstd_logic_vector(15downto0));
endcomponent;
signalreg00,reg01,reg02,reg03
:
std_logic_vector(15downto0);
signalsel00,sel01,sel02,sel03
:
std_logic;
begin
Areg00:
regportmap(
clr=>reset,
D=>d_input,
clock=>clk,
write=>DRWr,
sel=>sel00,
Q=>reg00
);
Areg01:
regportmap(
clr=>reset,
D=>d_input,
clock=>clk,
write=>DRWr,
sel=>sel01,
Q=>reg01
);
Areg02:
regportmap(
clr=>reset,
D=>d_input,
clock=>clk,
write=>DRWr,
sel=>sel02,
Q=>reg02
);
Areg03:
regportmap(
clr=>reset,
D=>d_input,
clock=>clk,
write=>DRWr,
sel=>sel03,
Q=>reg03
);
des_decoder:
decoder_2_to_4portmap
(
sel=>DR,
sel00=>sel00,
sel01=>sel01,
sel02=>sel02,
sel03=>sel03
);
mux1:
mux_4_to_1PORTMAP(
Input0=>reg00,
Input1=>reg01,
Input2=>reg02,
Input3=>reg03,
sel=>DR,
out_put=>DR_data
);
endstruct;
✓如下是修改后的仿真波形图。
分3个阶段,第一个阶段置位端为无效,产生一个写信号上升沿,将数据18读入寄存器0。
第二个阶段将寄存器0的数据读出,第3个阶段置位端有效,所以寄存器清零,对应输出也变成0。
✓如下是结构框图:
九、实验小结
通过本次实验,我对于vhdl语言层次化的设计方法又有了更加深刻的理解,对于相关方法的应用比较熟练自如了。
在这次实验中没有什么难点,思路也很清晰。
但更加深刻的感受是,我们在能够实现功能性要求的基础之上,能否更加优化设计,比如减小运行的代价,比如考虑该模块的通用性与接口的统一性等等。