范文一:通用寄存器组
library ieee;
use ieee.std_logic_1164.all;
entity decoder_3_8 is
port(
I_L:in std_logic_vector(2 downto 0);
S1,S2_L,S3_L:in std_logic;
F_L:out std_logic_vector(7 downto 0)); end decoder_3_8;
architecture decoder_3_8p of decoder_3_8 is signal F_s :std_logic_vector(7 downto 0); begin
process(I_L,S1,S2_L,S3_L)
begin
case I_L is
when "000" => F_s <= "01111111";="">=>
when "001" => F_s <= "10111111";="">=>
when "010" => F_s <= "11011111";="">=>
when "011" => F_s <= "11101111";="">=>
when "100" => F_s <= "11110111";="">=>
when "101" => F_s <= "11111011";="">=>
when "110" => F_s <= "11111101";="">=>
when "111" => F_s <= "11111110";="">=>
when others => F_s <="11111111";>="11111111";>
end case;
if (S1 and not S2_L and not S3_L)='1' then F_L <= f_s;="">=>
else F_L <= "11111111";="">=>
end if;
end process;
end decoder_3_8p;
--底层16位寄存器
library ieee;
use ieee.std_logic_1164.all;
entity register16 is
port(
clk,clear,cs,wr:in std_logic;
d: in std_logic_vector(15 downto 0);
q: out std_logic_vector(15 downto 0)); end entity register16;
architecture registerp of register16 is
signal qin : std_logic_vector(15 downto 0);
begin
process(clk,clear,cs,wr,qin)
begin
if clear = '0' then
qin <= "0000000000000000";="">=>
elsif rising_edge(clk) then
if wr = '0' and cs = '0' then
qin <= d;="">=>
end if;
end if;
if cs = '0' and wr = '1' then
q <= qin;="">=>
else
q<= "zzzzzzzzzzzzzzzz";="">=>
end if;
end process;
end architecture registerp;
library ieee;
use ieee.std_logic_1164.all;
entity registergroup is port(
A:in std_logic_vector(15 downto 0);
B:out std_logic_vector(15 downto 0);
C:in std_logic_vector(2 downto 0);
clk2,clear2,wr2,sta,stb,stc:in std_logic); end entity registergroup;
architecture r_group of registergroup is
signal t:std_logic_vector(7 downto 0);
component decoder_3_8 port(
I_L:in std_logic_vector(2 downto 0);
S1,S2_L,S3_L:in std_logic;
F_L:out std_logic_vector(7 downto 0));
end component;
component register16 port(
clk,clear,cs,wr:in std_logic;
d:in std_logic_vector(15 downto 0);
q:out std_logic_vector(15 downto 0)); end component;
begin
g1:decoder_3_8 port map
(
S1=>sta,
S2_L=>stb,
S3_L=>stc,
I_L(0)=>C(0),
I_L(1)=>C(1),
I_L(2)=>C(2),
F_L(0) => t(0),
F_L(1) => t(1),
F_L(2) => t(2),
F_L(3) => t(3),
F_L(4) => t(4),
F_L(5) => t(5),
F_L(6) => t(6),
F_L(7) => t(7) );
g2:register16 port map
(
clk => clk2,
clear => clear2,
cs => t(0),
wr => wr2,
d=>A,
q=>B
);
g3: register16 port map
(
clk => clk2,
clear => clear2,
cs => t(1),
wr => wr2,
d => A,
q => B
);
g4: register16 port map
(
clk => clk2,
clear => clear2,
cs => t(2),
wr => wr2,
d => A,
q => B
);
g5: register16 port map
(
clk => clk2,
clear => clear2,
cs => t(3),
wr => wr2,
d => A,
q => B
);
g6: register16 port map
(
clk => clk2,
clear => clear2,
cs => t(4),
wr => wr2,
d => A,
q => B
);
g7: register16 port map
(
clk => clk2,
clear => clear2,
cs => t(5),
wr => wr2,
d => A,
q => B
);
g8: register16 port map
(
clk => clk2,
clear => clear2,
cs => t(6),
wr => wr2,
d => A,
q => B
);
g9: register16 port map
(
clk => clk2,
clear => clear2,
cs => t(7),
wr => wr2,
d => A,
q => B
);
end r_group;
范文二:通用寄存器组
题目,运算器部件实验:通用寄存器组
学 院 数学与信息学院 学科门类 工 学 专 业 12软件工程 学 号 2012436138 姓 名 王赛赛 指导教师 王兵
计算机组成原理实验报告
一、实验目的
1. 了解通用寄存器组的用途及对CPU的重要性。
2. 掌握通用寄存器的设计方法。
二、实验原理
通用寄存器组是CPU的重要组成部分。通用寄存器组中的寄存器的数目与CPU性能有关,CPU性能越高,通用寄存器组内的寄存器数目越多。由于计算逻辑运算需要两个操作数,因此通用寄存器组有两个读入端口,负责提供进行算术逻辑单元需要的元操作数和目的操作数。通用寄存器组有1个写端口,负责将运算结构保存到指定的寄存器内。
三、实验要求
1. 实验设计目标
设计一个通用寄存器组,满足以下要求:
(1) 通用寄存器组中有4个16位的寄存器。
(2) 当复位信号reset=0时,将通用寄存器组中的4个寄存器清零。
(3) 通用寄存器组中有两个读出端口,当DRWr=1时,在始终clk的上升沿将数据
总线上的数写入DR[1..0]指定的寄存器。
(4) 通用寄存器组有两个读出接口,一个对应算术逻辑单元的目的的操作数DR,
另一个对应算术逻辑单元的源操作数SR。DR[1..0]选择目的的操作数;SR[1..0]选择源
操作数。
(5) 设计要求层次设计。底层的设计实体有3个:16位寄存器,具有复位功能和允
许写功能;一个2-4译码器,对应寄存器写选择;一个4选1多路开光,负责选择寄存
器的读出。顶层设计构成一个完整的通用寄存器组。
2. 顶层设计实体的引脚要求
引脚要求对应关系如下:
(1) clk对应实验台上的时钟(单脉冲)。
(2) reset对应实验台上的CPU复位信号CPU_RST.
(3) SR[1..0]对应试验台开关SA,SA。 10
(4) DR[1..0]对应试验台开关SR,SR。 32
(5) DRWr对应实验台上开关SA。 5
(6) 目的操作数用试验台上的指示灯A~A显示,源操作数用试验台上的指示灯
R~R显示。 150
四、实验步骤
1. 将试验台设置成FPGA-CPU独立调试模式,REGSEL=0,CLKSEL=1,FDSEL=0,使
用试验台上的单脉冲,即STEP_CLK段路子短接,短路子RUN_CLK断开。
2. 将设计在Quartus2下输入,编译后下载到TEC-CA上的FPGA。
3. 将下列数据存入寄存器:
R0 OX3333
R1 OX5555
R2 OXAAAA
R3 OXFFFF
4. 在实验台指示灯A~A和R~R上观察各寄存器的值,填入表中。 150150
五、实验结果
~AR~RA150 150 步骤 R0 R1 R2 R3 R0 R1 R2 R3
0X0X0X00X0X0X0X00X(1)reset 0000 0000 000 0000 0000 0000 000 0000
(2)R0写入0X0X0X00X0X0X0X00X
0X3333 3333 0000 000 0000 3333 0000 000 0000
(3)R1写入0X0X0X00X0X0X0X00X
0X5555 0000 5555 000 0000 0000 5555 000 0000
(4)R2写入0X0X0XA0X0X0X0XA0X0XAAAA 0000 0000 AAA 0000 0000 0000 AAA 0000
(5)R3写入0X0X0X00X0X0X0X00X
0XFFFF 0000 0000 000 FFFF 0000 0000 000 FFFF
六、思考
实验中需要一个2-4译码器和2个四选一多路器,认真理解实验的原理,仔细完成实验的过程。
-8译码器和两个八选一如果通用寄存器组中要求有8个16位通用寄存器,则应用一个3
多路器,其他类似于4个的。
七、实验代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity regfile is
Port ( DR: in std_logic_vector(1 downto 0);
SR: in std_logic_vector(1 downto 0);
reset: in std_logic;
DRWr: in std_logic;
clk: in std_logic;
d_input: in std_logic_vector(15 downto 0);
DR_data: out std_logic_vector(15 downto 0);
SR_data: out std_logic_vector(15 downto 0)
);
end regfile;
architecture struct of regfile is
-- components
-- 16 bit Register for register file component reg
port (
clr: in std_logic;
D: in std_logic_vector(15 downto 0);
clock: in std_logic;
write: in std_logic;
sel: in std_logic;
Q: out std_logic_vector(15 downto 0)
);
end component;
-- 2 to 4 Decoder
component decoder_2_to_4
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 component;
-- 4 to 1 line multiplexer
component mux_4_to_1
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 component;
signal reg00, reg01, reg02, reg03
:std_logic_vector(15 downto 0);
signal sel00 ,sel01 ,sel02 ,sel03
: std_logic;
begin
Areg00: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel00 ,
Q => reg00
);
Areg01: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel01 ,
Q => reg01
);
Areg02: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel02 ,
Q => reg02
);
Areg03: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel03 ,
Q => reg03
);
-- decoder
des_decoder: decoder_2_to_4 port map
(
sel => DR,
sel00 => sel00 ,
sel01 => sel01 ,
sel02 => sel02 ,
sel03 => sel03
);
mux1: mux_4_to_1 PORT MAP(
Input0 => reg00 ,
Input1 => reg01 ,
Input2 => reg02 ,
Input3 => reg03 ,
sel => DR ,
out_put => DR_data
);
mux2: mux_4_to_1 PORT MAP(
input0 => reg00 ,
input1 => reg01 ,
input2 => reg02 ,
input3 => reg03 ,
sel => SR ,
out_put => SR_data
);
end struct;
范文三:通用寄存器组
一、 实验目的
(1) 了解通用寄存器组的用途及对CPU的重要性。
(2) 掌握通用寄存器组的设计方法。
二、 实验原理
通用寄存器组是CPU的重要组成部分。从存储器取来的数据要放在通用寄存器中;从外部设备取来的数据除DMA方式外,要放在通用寄存器中。向存储器输出的数据也是从通用寄存器中取出;向外部设备输出的数据除DMA方式外也是从通用寄存器中取出来的。由于从通用寄存器组中取数据比从存储器或者外部设备取数据快得多,因此参加算术运算和逻辑运算的数据一般是从通用寄存器组中取出,它向算术逻辑单元ALU提供了进行算术运算和逻辑运算所需要的两个操作数,同时又是运算结果的暂存地。通用寄存器组内寄存器的数目与CPU性能有关,CPU性能预告,通用寄存器组内的寄存器数目越多。由于算术逻辑运算需要两个操作数,因此通用寄存器组有两个读端口,负责提供进行算术逻辑单元需要的源操作数和目的操作数。通用寄存器组有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个寄存器被选中时,才允许对该寄存器进行写操作。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的选择端4选1多路选择器1从4个寄存器R0、R1、R2、R3的输出Q[15..0]选择1路送到DR_data[1..0],给算术逻辑单元提供目的操作数;选择信号sel[1..0]接DR[1..0]。4选1多路选择器2从4个寄存器R0、R1、R2、R3的输出Q[15..0]选择一路送到SR_data[1..0],给算术逻辑单元提供源操作数;选择信号sel[1..0]接SR[1..0]。
三、实验要求
.
1、实验设计目标
设计一个通用寄存器组,满足以下要求:
(1) 通用寄存器组有4个16位的寄存器。
(2) 当复位信号reset=0时,将通用寄存器组中的4个寄存器清零。 (3) 通用寄存器组中有1个写入端口,当DRWr=1时,在时钟clk的上升沿将数据总线上的数写入DR[1..0]指定的寄存器。
(4) 通用寄存器组中有两个读出端口,一个对应算术逻辑单元的目的操作数DR,另一个对应算术逻辑单元的源操作数SR。DR[1..0]选择目的操作数;SR[1..0]选择源操作数。
(5) 设计要求层次设计。底层的设计实体有3个:16位寄存器,具有复位功能和允许写功能;一个2-4译码器,对应寄存器写选择;一个4选1多路开关,负责选择寄存器的读出。顶层设计构成一个完整的通用寄存器组。 2、顶层设计实体的引脚要求
引脚要求对应关系如下
(1) clk对应实验台上的时钟(单脉冲)。
(2) reset对应试验台上的CPU复位信号CPU-RST。
(3) SR[1...0]对应试验台开关SA1,SA0。
(4) DR[1..0]对应试验台开关SA3,SA2。
(5) DRWr对应试验台开关SA5。
(6) 目的操作数用实验台上的指示灯A15~A0显示,源操作数用试验台上的指示灯R15~R0显示。
(7) d-input接开关SD15~SD0。
四、实验步骤
(1)将实验台设置成FPGA-CPU独立调试模式,REGSEL=0、CLKSEL=1、FDSEL=0。使用试验台上的单脉冲,即DTEP_CLK短路子短接,短路子RUN_CLK断开。
(2)将涉及在QuartusII下输入,编译后下载到TEC_CA上的FPGA中。 (3)将下列数据存入寄存器:
R0 0x3333
.
R1 0x5555
R2 0xAAAA
R3 oxFFFF
(4)在试验台指示灯A15~A0和R15~R0上观察各寄存器的值,并填入下表。 步骤 A15~A0 R15~R0
R0 R1 R2 R3 R0 R1 R2 R3 reset 0000 0000 0000 0000 0000 0000 0000 0000 R0写入ox3333 3333 0000 0000 0000 3333 0000 0000 0000 R1写入ox5555 3333 5555 0000 0000 3333 5555 0000 0000 R写入oxAAAA 3333 5555 AAA0000 3333 5555 AAAA 0000
A
R1写入oxFFFF 3333 FFFAAA0000 3333 FFFF AAAA 0000
F A
五、实验体会
在本次实验中主要应用的是层次设计的思想, 但是开始因为对原理理解的并不是很到位,所以在开始设计时,层次结构不清晰,将寄存器单独构造成一个实体,对于二四译码器,还有四选一多路器都在进程中编写 ,导致进程和实体之间出现了多驱动错误;并且在引用实体时,原信号和现有的信号量一定要对应恰当,否则会出现错误;当程序调试完毕,要理解如何应用仪器进行测试。
通过本次实验,对于寄存器、二四译码器和四选一多路器的原理及综合应用有了很深的了解。学会了如何综合多个部件来完成一个具有综合功能的实验。 六、源代码
library ieee;
use ieee.std_logic_1164.all; entity jicunqi is
port
( clk:in std_logic;
.
reset:in std_logic;
d_input:in std_logic_vector(15 downto 0);
sel:in std_logic;
wr :in std_logic;
q_output:out std_logic_vector(15 downto 0)
);
end entity;
architecture rtl of jicunqi is begin
process(clk,reset)
begin
if reset='0'then
q_output<="0000000000000000";>="0000000000000000";>
elsif(clk'event and clk='1')then
if(sel='1'and wr='1')then
q_output<=d_input;>=d_input;>
end if;
end if;
end process;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
entity choose4to1 is
port
(
input0,input1,input2,input3:in std_logic_vector(15 downto 0);
sel:in std_logic_vector(1 downto 0);
q_output:out std_logic_vector(15 downto 0)
);
.
end entity;
architecture rtl of choose4to1 is begin
process(sel)
begin
case sel is
when "00"=>
q_output<=input0;>=input0;>
when "01"=>
q_output<=input1;>=input1;>
when "10"=>
q_output<=input2;>=input2;>
when "11"=>
q_output<=input3;>=input3;>
end case;
end process;
end rtl;
library ieee;
use ieee.std_logic_1164.all; entity compile2_4 is
port
(
sel:in std_logic_vector(1 downto 0);
sel00,sel01,sel02,sel03:out std_logic
);
end entity;
architecture rtl of compile2_4 is begin
process(sel)
.
begin
case sel is
when "00"=>sel00<><><><='0';>='0';>
when "01"=>sel00<><><><='0';>='0';>
when "10"=>sel00<><><><='0';>='0';>
when "11"=>sel00<><><><='1';>='1';>
end case;
end process;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity tongyongjicunqi is
port(
clk:in std_logic;
reset: in std_logic;
DRWr:in std_logic;
DR:in std_logic_vector(1 downto 0);
SR:in std_logic_vector(1 downto 0);
d_input:in std_logic_vector(15 downto 0);
output_Sr: out std_logic_vector(15 downto 0);
output_Dr: out std_logic_vector(15 downto 0)
);
end tongyongjicunqi;
architecture behav of tongyongjicunqi is component jicunqi is
port(
clk:in std_logic;
reset:in std_logic;
.
d_input:in std_logic_vector(15 downto 0);
sel:in std_logic;
wr:in std_logic;
q_output:out std_logic_vector(15 downto 0)
);
end component;
component choose4to1 is
port
(
input0,input1,input2,input3:in std_logic_vector(15 downto 0);
sel:in std_logic_vector(1 downto 0);
q_output:out std_logic_vector(15 downto 0)
);
end component;
component compile2_4 is
port
(
sel:in std_logic_vector(1 downto 0);
sel00,sel01,sel02,sel03:out std_logic
);
end component;
signal sel00,sel01,sel02,sel03:std_logic;
signal out0,out1,out2,out3:std_logic_vector(15 downto 0); begin
R0: jicunqi port map (clk,reset,d_input,sel00,DRWr,out0);
R1: jicunqi port map (clk,reset,d_input,sel01,DRWr,out1);
R2: jicunqi port map (clk,reset,d_input,sel02,DRWr,out2);
R3: jicunqi port map (clk,reset,d_input,sel03,DRWr,out3);
selx:compile2_4 port map (DR,sel00,sel01,sel02,sel03);
SRx: choose4to1 port map (out0,out1,out2,out3,SR,output_SR); .
DRx: choose4to1 port map (out0,out1,out2,out3,DR,output_DR);
end behav;
.
范文四:实验四通用寄存器组
计算机组成原理实验报告
姓名 学号 班级
实验题目 实验 CPU 通用寄存器组
一、 实验目的
1. 了解通用寄存器组的用途及对 CPU 的重要性。
2. 掌握通用寄存器的设计方法。
二、 实验原理
通用寄存器组是 CPU 的重要组成部分。从存储器取来的数据要放在通用寄存器中;从外部设 备取来的数据除 DMA 方式外, 要放在通用寄存器中。 向存储器输出的数据也是从通用寄存器中取 出; 向外部设备输出的数据除 DMA 方式外也是从通用寄存器中取出来的。 由于从通用寄存器组中 取数据比从存储器或者外部设备取数据快得多, 因此参加算术运算和逻辑运算的数据一般是从通用 寄存器组中取出,它向算术逻辑单元 ALU 提供了进行算术运算和逻辑运算所需要的两个操作数, 同时又是运算结果的暂存地。通用寄存器组内寄存器的数目与 CPU 性能有关, CPU 性能预告,通 用寄存器组内的寄存器数目越多。 由于算术逻辑运算需要两个操作数, 因此通用寄存器组有两个读 端口, 负责提供进行算术逻辑单元需要的源操作数和目的操作数。 通用寄存器组有 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个寄存器被选中时,才允许对 该寄存器进行写操作。 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的选择端 4选 1多路选择器 1从 4个寄存器 R0、 R1、 R2、 R3的输出 Q[15..0]选择 1路送到 DR_data[1..0],给算术逻辑单元提供目的操作数;选择信号 sel[1..0]接 DR[1..0]。 4选 1多路选择器 2从 4个寄存器 R0、 R1、 R2、 R3的输出 Q[15..0]选择一路送到 SR_data[1..0],给算术逻辑单元提 供源操作数;选择信号 sel[1..0]接 SR[1..0]。
三、 实验要求
1、 实验设计目标
设计一个通用寄存器组,满足以下要求:
(1) 通用寄存器组中有 4哥 16位的寄存器。
(2) 当复位信号 reset=0时,将通用寄存器组中的 4哥寄存器清零。
(3) 通用寄存器组中有两个读出端口,当 DRWr=1时,在始终 clk 的上升沿将数据总线上的 数写入 DR[1..0]指定的寄存器。
(4) 通用寄存器组有两个读出接口,一个对应算术逻辑单元的目的的操作数 DR ,另一个对 应算术逻辑单元的源操作数 SR 。 DR[1..0]选择目的的操作数; SR[1..0]选择源操作数。 (5) 设计要求层次设计。 底层的设计实体有 3个:16位寄存器, 具有复位功能和允许写功能; 一个 2-4译码器,对应寄存器写选择;一个 4选 1多路开光,负责选择寄存器的读出。 顶层设计构成一个完整的通用寄存器组。
2、顶层设计实体的引脚要求
引脚要求对应关系如下:
(1) clk 对应实验台上的时钟(单脉冲) 。
(2) reset 对应实验台上的 CPU 复位信号 CPU_RST.
(3) SR[1..0]对应试验台开关 SA 1, SA 0。
(4) DR[1..0]对应试验台开关 SR 3, SR 2。
(5) DRWr 对应实验台上开关 SA 5。
(6) 目的操作数用试验台上的指示灯 A~A显示,源操作数用试验台上的指示灯 R 15~R0显示。
四、 实验步骤
1. 将试验台设置成 FPGA-CPU 独立调试模式, REGSEL=0, CLKSEL=1, FDSEL=0,使用试 验台上的单脉冲,即 STEP_CLK段路子短接,短路子 RUN_CLK断开。
2. 将设计在 Quartus2下输入,编译后下载到 TEC-CA 上的 FPGA 。
3. 将下列数据存入寄存器:
R0OX3333
R1OX5555
R2OXAAAA
R3OXFFFF
4. 在实验台指示灯 A 15~A0和 R 15~R0上观察各寄存器的值,填入表中。
五、 思考题
如果通用寄存器组中要求有 8个 16位通用寄存器,如何设计? 应用一个 3-8译码器和两个八选一多路器,其他类似于 4个的
附录:
实验代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity regfile is
Port ( DR: in std_logic_vector(1 downto 0);
SR: in std_logic_vector(1 downto 0);
reset: in std_logic;
DRWr: in std_logic;
clk: in std_logic;
d_input: in std_logic_vector(15 downto 0);
DR_data: out std_logic_vector(15 downto 0);
SR_data: out std_logic_vector(15 downto 0)
);
end regfile;
architecture struct of regfile is
-- components
-- 16 bit Register for register file
component reg
port (
clr: in std_logic;
D: in std_logic_vector(15 downto 0);
clock: in std_logic;
write: in std_logic;
sel: in std_logic;
Q: out std_logic_vector(15 downto 0) );
end component;
-- 2 to 4 Decoder
component decoder_2_to_4
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 component;
-- 4 to 1 line multiplexer
component mux_4_to_1
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 component;
signal reg00, reg01, reg02, reg03
:std_logic_vector(15 downto 0);
signal sel00 ,sel01 ,sel02 ,sel03
: std_logic;
begin
Areg00: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel00 ,
Q => reg00
);
Areg01: reg port map(
clr => reset, D => d_input , clock => clk , write => DRWr , sel => sel01 , Q => reg01 );
Areg02: reg port map(
clr => reset, D => d_input , clock => clk , write => DRWr , sel => sel02 , Q => reg02 );
Areg03: reg port map(
clr => reset, D => d_input , clock => clk , write => DRWr , sel => sel03 , Q => reg03 );
-- decoder
des_decoder: decoder_2_to_4 port map (
sel => DR,
sel00 => sel00 ,
sel01 => sel01 ,
sel02 => sel02 ,
sel03 => sel03
);
mux1: mux_4_to_1 PORT MAP( Input0 => reg00 ,
Input1 => reg01 ,
Input2 => reg02 ,
Input3 => reg03 ,
sel => DR ,
out_put => DR_data
);
mux2: mux_4_to_1 PORT MAP( input0 => reg00 , input1 => reg01 , input2 => reg02 , input3 => reg03 , sel => SR ,
out_put => SR_data
);
end struct;
范文五:通用寄存器组实验报告 附代码
通用寄存器组实验报告
一、 实验目的
1、 2、
了解通用寄存器组的用途及对CPU的重要性。 掌握通用寄存器组的设计方法。
二、 实验原理
通用寄存器组是CPU的重要组成部分。由于从通用寄存器组中取数据比从存储器或者外部设备取数据快得多,因此参加算术运算和逻辑运算的数据一般是从通用寄存器组中取出,它向算术逻辑单元ALU提供了进行算术运算和逻辑运算所需要的两个操作数,同时又是运算结果的暂存地。通用寄存器组内寄存器的数目与CPU性能有关,CPU性能预告,通用寄存器组内的寄存器数目越多。由于算术逻辑运算需要两个操作数,因此通用寄存器组有两个读端口,负责提供进行算术逻辑单元需要的源操作数和目的操作数。通用寄存器
1
组有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个寄存器被选中时,才允许对该寄存器进行写操作。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的选择端4选1多路选择器1从4个寄存器R0、R1、R2、R3的输出Q[15..0]选择1路送到DR_data[1..0],给算术逻辑单元提供目的操作数;选择信号sel[1..0]接DR[1..0]。4选1多路选择器2从4个寄存器R0、R1、R2、R3的输出Q[15..0]选择一路送到SR_data[1..0],给算术逻辑单元提供源操作数;选择信号sel[1..0]接SR[1..0]。
2
三、实验要求
1、实验设计目标
(1) 通用寄存器组有4个16位的寄存器。
(2) 当复位信号reset=0时,将通用寄存器组中的4个寄存器清零。 (3) 通用寄存器组中有1个写入端口,当DRWr=1时,在时钟clk的上升沿将数据总线上的数写入DR[1..0]指定的寄存器。
(4) 通用寄存器组中有两个读出端口,一个对应算术逻辑单元的目的操作数DR,另一个对应算术逻辑单元的源操作数SR。DR[1..0]选择目的操作数;SR[1..0]选择源操作数。
(5) 设计要求层次设计。底层的设计实体有3个:16位寄存器,具有复位功能和允许写功能;一个2-4译码器,对应寄存器写选择;一个4选1多路开关,负责选择寄存器的读出。顶层设计构成一个完整的通用寄存器组。
2、顶层设计实体的引脚连接
(1) clk对应实验台上的时钟(单脉冲)。
(2) reset对应试验台上的CPU复位信号CPU-RST。 (3) SR[1...0]对应试验台开关SA1,SA0。
(4) DR[1..0]对应试验台开关SA3,SA2。 (5) DRWr对应试验台开关SA5。
(6) 目的操作数用实验台上的指示灯A15~A0显示,源操作数用试验台上的指示灯R15~R0显示。
3
(7) d_input对应实验台开关SD15~SD0。 四、 实验步
骤及结果
1、将实验台设置成FPGA-CPU独立调试模式,
REGSEL=0、CLKSEL=1、FDSEL=0。使用试验台上的单
脉冲,即DTEP_CLK短路子短接,短路子RUN_CLK断开。
2、将涉及在QuartusII下输入,编译后下载到TEC_CA
上的FPGA中。 3、将下列数据存入寄存器: R0 0x3333 R1 0x5555 R2 0xAAAA R3 0xFFFF
4、在实验台指示灯A15~A0和R15~R0上观察各寄存器的
值,并填入下表1(数据全部采用16进制表示)。
表1 通用寄存器组实验
步骤 Reset R0写入0x3333 R1写入0x5555 R2写入
0xAAAA R1写入0xFFFF A15~A0 R0 0000 R1 0000 R2 0000 0000 0000 R3 R0 R15~R0 R1 0000 0000 5555 5555 FFFF R2
0000 0000 0000 AAAA AAAA R3 0000 0000 0000 0000 0000
0000 0000 0000 3333 0000 3333 03333 0000 3333 3333 5555
5555 AAAA 0000 3333 3333 FFFF AAAA 0000 3333 五、实
验收获
通过这次实验初步了解了通用寄存器组的工作原理,又学
会了实体间的分层设计思想。在分层设计过程中,要注意不
要让各层实体功能与联系打乱自己的
思维。底层实体各自完成自己的功能,供顶层实体通过输
4
入输出引脚总体调度连接使用。
library ieee;
use ieee.std_logic_1164.all; entity reg is port(
clock,sel,w,clr : in std_logic;
D:in std_logic_vector(15 downto 0); Q:out std_logic_vector(15 downto 0) ); end entity;
architecture rtl of reg is begin
process(clock,clr) begin
if(clock?event and clock=?1?)then if(w=?1? and sel=?1?)then Q(15 downto 0) end if; end if;
if(clr=?0?)then Q(15 downto 0)
end process; end rtl;
library ieee;
use ieee.std_logic_1164.all; entity t2_4 is
port(
sel:in std_logic_vector(1 downto 0); sel00,sel01,sel10,sel11:out std_logic ); end entity;
architecture rtl of t2_4 is begin
sel00 sel11library ieee;
use ieee.std_logic_1164.all; entity R4_to_1 is port(
input0,input1,input2,input3:in std_logic_vector(15 downto
5
0); sel:in std_logic_vector(1 downto 0); R_data:out std_logic_vector(15 downto 0)
); end entity;
architecture rtl of R4_to_1 is begin
process(input0,input1,input2,input3,sel) begin
case sel is
when \ when \
when \ when \
end case; end process; end rtl;
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(15 downto 0);
DR_data,SR_data:out std_logic_vector(15 downto 0) );
end entity;
architecture behav of registers is signal sel00,sel01,sel10,sel11:std_logic;
signal inp0,inp1,inp2,inp3:std_logic_vector(15 downto 0); component reg is port(
clock,sel,w,clr : in std_logic; D:in std_logic_vector(15 downto 0); Q:out
6
std_logic_vector(15 downto 0) );
百度搜索“就爱阅读”,专业资料、生活学习,尽在就爱阅读网
92to.com,您的在线图书馆! 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(15 downto 0); sel:in std_logic_vector(1 downto 0);
R_data:out std_logic_vector(15 downto 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 (
7
);
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, );
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 );
sel01=>sel01, sel10=>sel10, sel11=>sel11
end architecture;
百度搜索“就爱阅读”,专业资料、生活学习,尽在就爱阅读网
92to.com,您的在线图书馆!
8
9