寄存器实验
实验七:寄存器实验
实验题目:寄存器实验 实验类型:设计性
一、实验目的:掌握74HC574寄存器使用方法;掌握component 语句和port map 语句使用方法;掌握cop2000计算机组成原理实验仪的寄存器组实现方法;能用VHDL 语言完成寄存器组的设计与仿真验证。
二、实验仪器设备及实验环境:计算机组成原理实验室,微机一台,quartus II软件。 三、总的设计思想、实验原理:
Cop2000计算机组成原理实验仪是南京伟福实业有限公司开发的实验设备,为配合讲授与学习计算机组成原理课程而研制。
Cop2000具有8位字长结构,实现了8种运算功能的ALU 和4个8位字长的通用寄存器,同时ALU 使用两个暂存器A 和W ,从硬件构成上来说,其用74HC574来构成寄存器,对于A 、W 和4个通用寄存器R0、R1、R2、R3都是用该芯片来实现。为了实现通用寄存器写入和读出的选择,使用了两个2:4译码器。
现在要求在quartusII 环境下完成cop2000寄存器组的设计与仿真,可以先分别设计出8位寄存器74HC574和2:4译码器,然后使用component 语句和port map语句完成整体设计。
四、实验步骤设计:
(1)完成8位寄存器74HC574的设计。设计程序如下: 程序源代码
ENTITY shifter IS PORT ( data_in : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --输入的数据 n : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --移位的数量 dir : IN STD_LOGIC; --移动的方向 0:左 1:右 kind : IN STD_LOGIC_VECTOR(1 DOWNTO 0); clock : IN BIT; --手动时钟PULSE
data_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --移位的结果 ); END shifter;
ARCHITECTURE behav of shifter IS BEGIN
PROCESS (data_in, n, dir, kind)
V ARIABLE x ,y : STD_LOGIC_VECTOR(7 DOWNTO 0);
V ARIABLE c trl0,ctrl1,ctrl2 : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN
IF (clock'EVENT AND clock = '1')THEN --产生控制向量ctrl ctrl0 := n(0) & dir & kind(1) & kind(0); ctrl1 := n(1) & dir & kind(1) & kind(0); ctrl2 := n(2) & dir & kind(1) & kind(0);
CASE ctrl0 IS WHEN "0000" | "0001" | "0010" | "0100" | "0101" | "0110" => x := data_in; --n=0时不移动
WHEN "1000" => x := data_in(6 DOWNTO 0) & data_in(0); --算术左移1位 WHEN "1001" => x := data_in(6 DOWNTO 0) & '0'; --逻辑左移1位 WHEN "1010" => x := data_in(6 DOWNTO 0) & data_in(7); --循环左移1位 WHEN "1100" => x := data_in(7) & data_in(7 DOWNTO 1); --算术右移1位
WHEN "1101" => x := '0' & data_in(7 DOWNTO 1); --逻辑右移1位 WHEN "1110" => x := data_in(0) & data_in(7 DOWNTO 1); --循环右移1位 WHEN others => null; END CASE;
CASE ctrl1 IS
WHEN "0000" | "0001" | "0010" | "0100" | "0101" | "0110" => y := x; --n=0时不移动 WHEN "1000" => y := x(5 DOWNTO 0) & x(0) & x(0); --算术左移2位 WHEN "1001" => y := x(5 DOWNTO 0) & "00"; --逻辑左移2位 WHEN "1010" => y := x(5 DOWNTO 0) & x(7 DOWNTO 6); --循环左移2位 WHEN "1100" => y := x(7) & x(7) & x(7 DOWNTO 2); --算术右移2位 WHEN "1101" => y := "00" & x(7 DOWNTO 2); --逻辑右移2位 WHEN "1110" => y := x(1 DOWNTO 0) & x(7 DOWNTO 2); --循环右移2位 WHEN others => null; END CASE;
CASE ctrl2 IS
WHEN "0000" | "0001" | "0010" | "0100" | "0101" | "0110" => data_out data_out
WHEN "1001" => data_out data_out data_out data_out null; END CASE; END IF;
END PROCESS; END behav;
(2)完成2:4译码器的设计。设计程序如下: LIBRARY IEEE
USE IEEE STD_LOGIC_1164 ALL EN TITY decode 2_to_4_t IS
PART(sel IN STD_LOGIC_VECTOR(1DOWNTO 0); Sel 00,sel10,sel10,sel11 OUT STD_LOGIC); END EN TITY decode 2_to_4_t
ARCHITE CUTURE dec OF decoder 2_to_4_t IS BEGIN
PROCESS (sel) BEGIN
CASE(sel) IS
WHEN ‘00’=>sel00sel00sel00
WHEN ‘11’=>sel00NULL; END CASE; END PROCESS;
END ARCHITECTURE dec;
(3)完成顶层寄存器组的设计,设计程序如下:
library ieee;
use ieee.std_logic_1164.all; entity registers is port( clk,reset,DRWr:in std_logic; DR,SR:in std_logic_vector(1 downto 0); d_input:in std_logic_vector(3 downto 0); DR_data,SR_data:out std_logic_vector(3downto 0) ); end entity;
architecture behav of registers is
signal sel00,sel01,sel10,sel11:std_logic;
signal inp0,inp1,inp2,inp3:std_logic_vector(3 downto 0); component reg is port(
clock,sel,w,clr : in std_logic;
D:in std_logic_vector(3 downto 0); Q:out std_logic_vector(3 downto 0) );
end component; component t2_4 is port(
sel:in std_logic_vector(1 downto 0); sel00,sel01,sel10,sel11:out std_logic );
end component;
component R4_to_1 is port( input0,input1,input2,input3:in std_logic_vector(3 downto 0); sel:in std_logic_vector(1 downto 0); R_data:out std_logic_vector(3downto 0)
);
end component; begin
R0:reg port map ( clock=>clk, sel=>sel00, w=>DRWr, clr=>reset, D=>d_input, Q=>inp0 ); R1:reg port map ( clock=>clk, sel=>sel01, w=>DRWr, clr=>reset, D=>d_input, Q=>inp1 );
R2:reg port map ( clock=>clk, sel=>sel10, w=>DRWr, clr=>reset, D=>d_input, Q=>inp2 ); R3:reg port map ( clock=>clk, sel=>sel11, w=>DRWr, clr=>reset, D=>d_input, Q=>inp3 ); trans:t2_4 port map( sel=>DR, sel00=>sel00, sel01=>sel01, sel10=>sel10, sel11=>sel11 ); DR_d:R4_to_1 port map(
input0=>inp0, input1=>inp1, input2=>inp2, input3=>inp3, sel=>DR, R_data=>DR_data ); SR_d:R4_to_1 port map( input0=>inp0, input1=>inp1, input2=>inp2, input3=>inp3, sel=>SR, R_data=>SR_data );
end architecture;
(4)进行编译,通过后建立仿真波形文件,然后进行功能仿真。 (5)获得功能仿真波形图,对照查看,检查是否满足设计要求。 五、实验结果及分析: 功能仿真波形图如下:
分析说明如下:
完成时序仿真之后在Assignment 的Settings 中选定仿真类型为Function (功能仿真),对波形图进行保存然后运行,即生成功能仿真图。从图中可以看到,延迟现象得到解决,各个波段输入对应输出更加清楚。在时序仿真中弄不太明白的clock 的作用也在这里得到解决:clock=1左/右移功能实现,clock=0功能未执行,输出保留为上一个波段的结果。
六、自我评价与总结:
通过这次的实验,我移位寄存器无论从功能还是原理方面都有了较为系统的了解和学习。
这次实验没有给现成的代码,不过在网上可以找到对应的源代码,而且源代码附着较为详细的注释,方便了我的学习。找到源代码之后的编译、仿真部分因为熟能生巧,都较为顺利。但一开始仿真时候波段的值没有选好,乱七八糟的找不到对比,这对理解分析功能造成了一定的困惑。多次重复试验之后,终于画出来可以帮助我更好理解左/右移意义的仿真图。虽然有点繁琐,但是所幸有所收获。
在不知不觉中,我们已经完成了七个实验。随着实验越做越多,一方面我们自身对软件的熟悉度越来越高,另一方面实验的题目越来越“抽象”,功能也是越来越复杂。这次实验只有题目,没有细节的真值表功能表等等,但在自己研究摸索的过程中,收获得更多。实验不是照本宣科敲代码,更重要是有自己的思考和收获,这种在不断研究和探索的过程中培养出来的学习能力,才是实验带给我们最宝贵的财富(当然实验结果也是很重要滴~)!
实验所需资料:
(1)74HC574情况。
(2)COP2000的寄存器组情况。
下面的波形图不是quartus II 上仿真出来的波形,只是说明该寄存器组应具有的读/写功能情况。