1、实验目的
实现四选一多路选择器代码的编写与仿真验证
2、实验原理
使用两位宽的sel信号根据其值对输入的四路信号进行选择。
3、代码设计
RTL代码如下:
verilog
module mux4to1(
input wire a, // 输入 a
input wire b, // 输入 b
input wire c, // 输入 c
input wire d, // 输入 d
input wire [1:0] sel, // 两位选择信号
output wire y // 输出 y
);
assign y = (sel == 2'b00) ? a :
(sel == 2'b01) ? b :
(sel == 2'b10) ? c : d;
endmodule
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
代码实现了一个4选1多路选择器。根据输入的选择信号 sel,在两个输入信号a b c d之间选择一个作为输出y。当选择信号sel为00时,输出y等于输入信号a;当sel为01时,输出y等于输入信号b;当sel为10时,输出y等于输入信c;当sel为11时,输出y等于输入信号d。
测试代码如下:
verilog
timescale 1ns / 1ps
module tb_mux4to1;
// 定义仿真中的输入和输出信号
reg a;
reg b;
reg c;
reg d;
reg [1:0] sel;
wire y;
// 实例化4选1多路选择器
mux4to1 uut (
.a(a),
.b(b),
.c(c),
.d(d),
.sel(sel),
.y(y)
);
//紫光全局复位原语,仿真需要添加
GTP_GRS GRS_INST(
.GRS_N(1'b1)
);
// 初始化和仿真信号激励
initial begin
// 打印波形信号头部
$monitor("a = %b, b = %b, c = %b, d = %b, sel = %b, y = %b", a, b, c, d, sel, y);
// 初始化输入信号
a = 0; b = 0; c = 0; d = 0; sel = 2'b00;
#10; // 等待 10ns
a = 1; sel = 2'b00; // 选择 a
#10;
b = 1; sel = 2'b01; // 选择 b
#10;
c = 1; sel = 2'b10; // 选择 c
#10;
d = 1; sel = 2'b11; // 选择 d
#10;
// 结束仿真
$stop;
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
40
41
42
43
44
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
代码中通过timescale 1ns / 1ns设置时间单位和精度为1纳秒。定义了输入信号a、b、c、d、sel和输出信号y。然后实例化待测试的多路选择器模块mux4to1,并命名为uut,将其输入和输出连接到相应信号上。在紫光系列FPGA中,为了仿真环境正常复位,添加了紫光 特定的全局复位原语。initial begin块用于初始化信号和提供仿真激励,通过monitor输出信号变化,每隔10纳秒改变输入信号的值,测试不同条件下多路选择器的输出。仿真过程中,通过观察a、b、c、d、sel的变化,验证输出y的正确性,最后用stop结束仿真。
4、实验对象
四选一电路实验现象结果展示图所示:
四选一电路实验结果波形图所示:
结合modelsim命令行打印的信息与wave窗口的波形来看,实验符合预期,代码正确。