世间记忆的记录者———寄存器

介绍

在cpu的计算工作中,例如简单的两数相加就需要读取两个数据然后一起送入ALU中进行运算,所以我们就需要一种装置能存储这些数据,这便是寄存器的作用。

引脚图介绍

img1

  • 加载 当输入电平为1时output引脚输出数据,当输入电平为0时寄存器output引脚为高阻抗
  • 保存 当输入电平为1时寄存器接受保存数值引脚的数据并保存其中,为0时保存寄存器内的数据
  • 保存数据引脚 为数据输入引脚
  • output 受加载引脚控制
  • 始终输出 此引脚始终输出寄存器内的值

功能介绍

由上面的引脚我们可以知道,寄存器有着读入与取出数据,保存数据的功能,下面我们来介绍下寄存器的具体实现。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
module register_pluse (
input reg save_en, //加载引脚
input reg load_en, //保存引脚
input reg [7:0] data_in, //保存数据引脚

output [7:0] data_out, //output 引脚
output [7:0] data_out_always // 始终输出引脚
);


reg [7:0] data_reg=8'b 00000000; //寄存器中的数据储存器
reg [7:0] data_out_reg=8'b 00000000; //寄存器中用来输出的端口
assign data_out_always=data_reg;
assign data_out=data_out_reg;

always @(save_en or load_en or data_in) begin
if(save_en) begin
data_reg=data_in; //为高电平则储存数据
end
else begin
data_reg=data_reg; //为低电平则保持数据
end

if (load_en) begin
data_out_reg=data_reg; // 为高电平则输出
end
else begin
data_out_reg=8'b zzzzzzzz;// 为低电平则输出高阻抗
end
end
endmodule

modelsim测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

`timescale 1ns/1ns
module register_pluse_tb;

reg save_en=1'b 0;
reg load_en=1'b 0;
reg [7:0] data_in=8'b 00000000;

wire [7:0] data_out;
wire [7:0] data_out_always;

initial begin
//存入数据 1
#50 data_in=8'b 00000001;
save_en=1'b 1;
#50 save_en=1'b0;

//读取数据 1
#50 load_en=1'b1;

#50 load_en=1'b0;
//存入数据 3
#50 data_in=8'b 00000011;
save_en=1'b 1;
#50 save_en=1'b0;
//读取数据 3
#50 load_en=1'b1;
#50 load_en=1'b0;
end
// 实例寄存器
register_pluse register_pluse_my(
.save_en(save_en),
.load_en(load_en),
.data_in(data_in),

.data_out(data_out),
.data_out_always(data_out_always)
);

endmodule

结语

寄存器作为cpu中最为基础的单元,其的代码实现最为简单,但是其功能却为重要,其他的单元的工作都要围绕着寄存器展开,我将会在之后的文章中介绍其他的单元,敬请期待。

整点二次元

img2