跳转的称量者———判决器

介绍

在我们编写程序的时候我们会用到if语句判断一个条件是否成立然后执行不同的代码块 ,或者用while循环执行特定的代码块。这种让pc指针跳转的模块即为判决器(arbiter)

本章的判决器的功能为通过判决器指令判断reg3内的值是否符合我们的判断条件,如果符合会向pc指针写入reg0内的值,如果不符合pc指针自加。

引脚介绍

  • reg_0 连接reg_0的always端口

  • reg_3 连接reg_3的laways端口

  • arbiter_order 判决器的指令输入端口

  • arbiter_sel 的使能端口

  • pc_sel pc寄存器的写入使能端口

  • arbiter_out的输出端口

    判决器的指令表如下:
    注:预设值(anchoring_number)为判决器的标准值,在图灵完备中判决器为有符号判决器,本判决器为无符号判决器,故本章设定值为
    8’b 11110000
    img1

功能介绍

我们来看看如何使用判决器来进行判断操作,例如我们判断是否reg3的值是否等于预设值,如果等于跳转到特定位置,那么我们便需要先将要跳转位置的地址写入reg0,然后将reg3的值与预设值进行比较,如果相等则跳转到reg0所指向的位置。这就实现了c语言中if的实现while也是用类似的方法实现的。

代码实现

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
module arbiter (
input reg [7:0] reg_0,
input reg [7:0] reg_3,
input reg [2:0] arbiter_order,
input reg arbiter_sel,

output [7:0] arbiter_out,
output pc_sel
);
//将指令集定义成宏
parameter never =3'b000;
parameter value_zeros=3'b001;
parameter value_small_zero=3'b010;
parameter value_small_or_zero=3'b011;
parameter Always = 3'b100;
parameter value_not_equal_zero=3'b101;
parameter value_big_or_zero=3'b110;
parameter value_big_zero=3'b111;
//定义预设值
parameter anchoring_number=8'b11110000;

reg [7:0] arbiter_out_r;
reg pc_sel_r;

assign arbiter_out=arbiter_out_r;
assign pc_sel=pc_sel_r;
//经过判断后的输出
always @(arbiter_order or arbiter_sel )begin
if (arbiter_sel==1'b0) begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
else if (arbiter_sel==1'b1) begin
case(arbiter_order)
never: begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
value_zeros: begin
if (reg_3==anchoring_number) begin
arbiter_out_r<=reg_0;
pc_sel_r<=1'b1;
end
else begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
end
value_small_zero: begin
if (reg_3<anchoring_number) begin
arbiter_out_r<=reg_0;
pc_sel_r<=1'b1;
end
else begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
end
value_small_or_zero: begin
if (reg_3<=anchoring_number) begin
arbiter_out_r<=reg_0;
pc_sel_r<=1'b1;
end
else begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
end
Always: begin
arbiter_out_r<=reg_0;
pc_sel_r<=1'b1;
end
value_not_equal_zero: begin
if (reg_3!=anchoring_number) begin
arbiter_out_r<=reg_0;
pc_sel_r<=1'b1;
end
else begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
end
value_big_or_zero: begin
if (reg_3>=anchoring_number) begin
arbiter_out_r<=reg_0;
pc_sel_r<=1'b1;
end
else begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
end
value_big_zero: begin
if (reg_3>anchoring_number) begin
arbiter_out_r<=reg_0;
pc_sel_r<=1'b1;
end
else begin
arbiter_out_r<=8'b zzzzzzzz;
pc_sel_r<=1'b0;
end
end
endcase
end
end
endmodule

测试代码

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
`timescale 1ns/1ns
module arbiter_tb;

reg [7:0] reg_0;
reg [7:0] reg_3;
reg [2:0] arbiter_order;
reg arbiter_sel;

wire [7:0] arbiter_out;
wire pc_sel;


initial begin
reg_0=8'b11110000;
reg_3=8'b11110001;

arbiter_sel=1'b0;

#50arbiter_order=3'b000;
#50 arbiter_sel=1'b1;
#50 arbiter_order=3'b001;
#50 arbiter_order=3'b010;
#50 arbiter_order=3'b011;
#50 arbiter_order=3'b100;
#50 arbiter_order=3'b101;
#50 arbiter_order=3'b110;
#50 arbiter_order=3'b111;
end


arbiter arbiter_my(
.reg_0 (reg_0),
.reg_3 (reg_3),
.arbiter_order (arbiter_order),
.arbiter_sel (arbiter_sel),
.arbiter_out (arbiter_out)
.pc_sel (pc_sel)
);
endmodule

结语

在本教程中我们设计了cpu中判决器实现了判决功能,至此cpu的功能位的功能已全部实现,在下一章节中我们将将介绍pc计数器。

整点二次元

img1