♻️ 资源
大小:22.9MB
➡️资源下载:https://download.csdn.net/download/s1t16/87425386
1.通用寄存器组实验内容
1.1实验目的
1.了解通用寄存器组的用途及对CPU的重要性;- 掌握通用寄存器组的设计方法。
1.2实验原理
通用寄存器组是 CPU 的重要组成部分。从存储器取来的数据要放在通用寄存器中;从外部设备取来的数据要放在通用寄存器中。向存储器输出的数据也是从通用寄存器中取出的;向外部设备输出的数据也是从通用寄存器中取出的。由于从通用寄存器组中取数据比从存储器或者外部设备取数据快得多,因此参加算术运算和逻辑运算的数据一般是从通用寄存器组中取出的,它向算术逻辑单元 ALU 提供了进行算术和逻辑运算所需要的两个操作数,同时又是运算结果的暂存地。
通用寄存器组内寄存器的数目与CPU性能有关,CPU性能越高,通用寄存器组内的寄存器数目越多。由于算术逻辑运算需要两个操作数,因此通用寄存器组有两个读端口,负责提供进行算术逻辑单元需要的源操作数和目的操作数。通用寄存器组有1个写端口,负责将运算结果保存到指定的寄存器内。根据通用寄存器组的功能要求,一个只有4个16位寄存器的通用寄存器的框图如图所示。
图1 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[15..0],给算术逻辑单元提供源操作数或是目的操作数;选择信号 sel[1..0]接 DR[1..0]。4 选 1 多路选择器 2 从 4 个寄存器 R0、R1、 R2、R3 的输出 Q[15..0]选择 1 路送到 SR-data[15..0],给算术逻辑单元提供源操作数;选择信号 sel[1..0]接SR[1..0]。
2.通用寄存器组实验步骤与分析
2.1. 通用寄存器组的设计
层次结构设计是设计较大规模硬件的必要手段,也是VHDL的重要优点。层次结构的设计方法是把一个大的系统划分为若干子系统,顶层描述各子系统的接口条件和各子系统之间的关系。各子系统的具体实现放在低层描述。同样,一个子系统也可以划分为若干更小的子系统,一直划分下去,直到最基本的子系统为止。例如,一个简单的CPU可以划分为通用寄存器、运算器、控制器和访问存储器部分等子系统。划分子系统时通常把功能上联系比较紧密的部分划分为一个子系统。一个系统中划分的子系统不宜过多,否则容易影响可读性,造成杂乱无章的感觉。
在用VHDL设计的系统中,层次化设计的概念和原理图层次化设计的概念相似,即在较高层设计中引用低层的或外部的元件。VHDL层次化设计中的元件(component)和低层的实体(entity)-结构体(architecture)“对”相对应。在硬件中通常把与门、触发器和计数器之类称为元件(component),但在VHDL语言中,component除了可以表示这些基本的元件外,也可以表示一个子系统。在VHDL层次结构设计中,较高层设计实体往往把较低层设计实体当作一个元件处理。在VHDL中,对元件的引用称之了例化,一个元件可以被例化多次。
本实验中用到的通用寄存器组的设计就采用这种层次结构设计方法。
2.2设计要求
(1)寄存器组中包含4个16位的寄存器;
(2)当reset信号为低时,4个寄存器复位为0,寄存器的时钟信号为clk;
(3)DR端口为读写端口。写操作时,输入数据通过此端口写入指定的寄存器;读操作时,将对应DR端口指定寄存器的内容送往寄存器文件输出端DR_data。
(4)寄存器组中有一个写允许信号DRWr,当DRWr为1时,clk上升沿将输入到寄存器组的16位数据d_input写入DR端口指定的寄存器中。
(5)SR为读端口。读操作时,将对应SR端口指定寄存器的内容送住寄存器文件输出端SR_data。
2.3设计方案
根据设计要求,设计方案如下:
(1)低层设计实体 register_16,完成寄存器复位和读写功能;
(2)低层设计实体 mux4_to-1,完成选择哪一个寄存器的值送往寄存器组的输出。这是一个 4 选 1 选择器;
(3)低层设计实体 decoder2_to_4,完成选择写哪一个寄存器,这是一个 2-4 译码器。
(4)高层设计实体 regifile,负责 3 个低层设计实体的连接,完成寄存器组的全部功能。
2.4设计实现
(1)设计实体register_16
library ieee; use ieee.std_logic_1164.all; entity register_16 is port (reset: in std_logic; d_input: in std_logic_vector(15 downto 0); clk: in std_logic; write: in std_logic; sel: in std_logic; q_output: out std_logic_vector(15 downto 0) ); end register_16; architecture a of register_16 is begin process(reset,clk) begin if reset='0' then q_output<=x"0000"; elsif(clk'event and clk='1') then if sel='1' and write='1' then q_output<=d_input; end if; end if; end process; end a;(2)设计实体decoder2_to_4
library ieee; use ieee.std_logic_1164.all; entity decoder2_to_4 is port(sel: in std_logic_vector(1 downto 0); sel00: out std_logic; sel01: out std_logic; sel02: out std_logic; sel03: out std_logic ); end decoder2_to_4; architecture behavioral of decoder2_to_4 is begin sel00<=(not sel(1)) and (not sel(0)); sel01<=(not sel(1)) and sel(0); sel02<= sel(1) and (not sel(0)); sel03<= sel(1) and sel(0); end behavioral;(3)设计实体mux4_to_1
ibrary ieee; use ieee.std_logic_1164.all; entity mux4_to_1 is port(input0,input1,input2,input3: in std_logic_vector(15 downto 0); sel: in std_logic_vector(1 downto 0); out_put: out std_logic_vector(15 downto 0)); end mux4_to_1; architecture behavioral of mux4_to_1 is begin mux: process(sel, input0,input1,input2,input3) begin case sel is when "00" => out_put<= input0; when "01" => out_put<= input1; when "10" => out_put<= input2; when "11" => out_put<= input3; end case; end process; end behavioral;2.5实验任务
使用顶层采用原理图、底层采用 VHDL 描述语言的层次结构设计方法设计一个工程文件,该工程文件顶层实体的连接图如图3所示。
图3-2 顶层设计实体连接图
图3顶层设计实体连接图
按图3-2连线,按图3-3绑定输入和输出引脚。编译通过下载到实验台上后,先按RESET “复位”按钮,清除通用寄存器组的内容。然后先通过ROM对通用寄存器组进行赋值,再从通用寄存器组中把赋值的内容读出来,观察实验台相应的信号指示灯,验证是否和前面写入通用寄存器组的数据是否一致。具体操作步骤如下:
对于通用寄存器文件写操作:
(1)I8开关拨上(置“1”,regfile赋值操作);
(2)拨动开关“B1B0”,设置ROM的读地址值;
(3)拨动开关“A3A2”,设置要写入数据的R端口号;
(4)按“手动时钟”,产生读ROM数据和写regfile的时钟信号,对DR端口地址指定的寄存器完成赋值操作。
重复(2)~(4)步,分别写入4个不同的值到4个不同的寄存器中。
对于通用寄存器文件读操作:
(1)I8开关拨下(置“0”,读regfile操作);
(2)拨动开关“A3A2”,设置要读出数据的DR端口地址;
(3)拨动开关“A1A0”,设置要读出数据的SR端口地址;
(4)按“手动时钟”,产生读时钟信号,读出DR端口和SR端口地址指定的两个寄存器的内容。
重复(2)和(4)步,可分别读出4个不同寄存器的值。观察指示灯IR15IR0和D15D0的变化。
记录实验现象,写操作填入表3-1中,读操作填入表3-2中。
表3-1 寄存器写操作
通过ROM对通用寄存器文件赋值 | |||||
ROM地址 | ROM数据 | DR端口地址 | 写使能 | 读写时钟 | IR15~1R0显示数据 |
B1B0 | A3A2 | I8 | sw_clk | ||
00 | |||||
01 | |||||
10 | |||||
11 |
表3-2 寄存器读操作
读通用寄存器文件数据 | |||||
DR端口 | SR端口 | 写使能 | 读写时钟 | DR端口读出数据 | SR端口读出数据 |
A3A2 | A1A0 | I8 | sw_clk | IR15~IR0 | D15~D0 |
图3-3(1) 顶层设计实体的引脚要求
图3-3(2) 顶层设计实体的引脚要求
3.通用寄存器组实验结果与总结
3.1实验结果
记录实验现象,填入下表中。
表3-1 寄存器写操作
通过ROM对通用寄存器文件赋值 | |||||
ROM地址 | ROM数据 | DR端口地址 | 写使能 | 读写时钟 | 显示数据 |
B1B0 | A3A2 | I8 | sw_clk | IR15~1R0 | |
00 | 5555 | 00 | 1 | 1 | 0101010101010101 |
01 | AAAA | 01 | 1 | 1 | 1010101010101010 |
10 | 6666 | 10 | 1 | 1 | 0110011001100110 |
11 | CCCC | 11 | 1 | 1 | 1100110011001100 |
表3-2 寄存器读操作
读通用寄存器文件数据 | |||||
DR端口 | SR端口 | 写使能 | 读写时钟 | DR端口读出数据 | SR端口读出数据 |
A3A2 | A1A0 | I8 | sw_clk | IR15~IR0 | D15~D0 |
00 | 00 | 1 | 1 | 0101010101010101 | 0101010101010101 |
01 | 01 | 1 | 1 | 1010101010101010 | 1010101010101010 |
10 | 10 | 1 | 1 | 0110011001100110 | 0110011001100110 |
11 | 11 | 1 | 1 | 1100110011001100 | 1100110011001100 |
实验结果与预期相符,实验成功。
图9 实验结果1
图10 实验结果2
图11 实验结果3
3.2实验体会
本次实验相较于以往的两次实验难度加大了许多,任务量也增加了许多。在详细地听完老师的讲解后,自己操作还是会出很多错误。往往会出现不知道下一步该做什么的情况,说明对实验步骤还不是很熟悉,要多练习,争取达到熟练。
其次,本次实验对实验原理提出了很高的要求。不能只是照着实验书“照猫画虎”,而是要对实验原理达到滚瓜烂熟的程度,对哪个引脚控制什么信号、应该出现什么实验现象要心里有底,不能蒙混过关。
最后,本次实验也需要分配大量引脚,增大了任务量。在引脚分配时,一定要小心,否则将会导致编译不通过。在本次实验中,我们也出现了一个小插曲,由于软件的授权破解未做好,导致我们浪费了很多时间。因此,注重细节将是以后做实验时需要着重注意的问题。