文章目录
一.多路选择器原理
1.1 二选一多路选择器原理
- 因为两个输入端,sel位宽取1位(即0/1即可表示选择的是in_a还是in_b)我们可以设sel=0时,out=in_a;sel=1时,out=in_b。
1.2 二选一多路选择器真值表
in_a | in_b | sel | out |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
1.3 四选一多路选择器原理
- 同二选一多路选择器原理一样,只不过变成了四个输入,那么就需要用两位宽的sel(00,01,10,11)分别表示选择输出out等于a,b,c,d的哪一个
二.主要代码及编译
2.1 以四选一多路选择器为例
module MUX4_1 (
input in_a,
input in_b,
input in_c,
input in_d,
input [1:0] sel,
output out
);
reg out_r;
always @(*) begin
case (sel)
2'b00:out_r = in_a;
2'b01:out_r = in_b;
2'b10:out_r = in_c;
2'b11:out_r = in_d;
default: ;
endcase
end
assign out = out_r;
endmodule
2.2 代码分析
-
四个输入信号,一个输入的选择信号,一个输出信号。选择信号需要两位位宽足够选择四个输入信号。
-
使用组合逻辑电路,always语句中需使用reg类型,所以先定义一个reg类型的out_r在always语句中使用,最后再用assign out = out_r实现同步。
-
组合逻辑中要用阻塞赋值“ = ”
-
case语句中default在无其他情况下可以不写,但是“ ; ”是一定要写的,容易在这个地方出现错误。
2.3 编译
-
Quartus上面的菜单栏中,如图中框1是全编译,如图中框2为分析综合。仅分析综合可以实现语法检错,并且比全编译要更快一些。
-
如上图所示即为全编译通过
2.4 原理图
- Quartus中点击Tools->Netlist Viewers->RTL viewer可以查看原理图
四.仿真及仿真效果
4.1 仿真代码
- 此处由于赋值的种类太多了,我只列举了其中几种。
`timescale 1ns/1ns
module tb_MUX4_1 ();
//激励信号
reg tb_in_a;
reg tb_in_b;
reg tb_in_c;
reg tb_in_d;
reg [1:0] tb_sel;
//输出信号
wire out;
//模块例化
MUX4_1 u_MUX4_1(
.in_a (tb_in_a),
.in_b (tb_in_b),
.in_c (tb_in_c),
.in_d (tb_in_d),
.sel (tb_sel),
.out(out)
);
initial begin
tb_in_a = 0;
tb_in_b = 0;
tb_in_c = 0;
tb_in_d = 0;
tb_sel = 2'b01;
#20;
tb_in_a = 0;
tb_in_b = 0;
tb_in_c = 1;
tb_in_d = 0;
tb_sel = 2'b10;
#20;
tb_in_a = 0;
tb_in_b = 1;
tb_in_c = 1;
tb_in_d = 0;
tb_sel = 2'b00;
#20;
tb_in_a = 1;
tb_in_b = 0;
tb_in_c = 1;
tb_in_d = 0;
tb_sel = 2'b00;
#20;
end
endmodule
4.2 仿真过程
- 将仿真文件添加进建立的工程中
- setting中添加仿真文件
- 点击菜单栏中Tools->Run Simulation Tools->RTL Simulation
4.3 波形及有关操作
-
打开波形后点击左上方的图标即可显示波形
-
观测例化模块波形按下图操作
-
回到wave界面对波形crtl+A,再ctrl+G可以对信号进行分类。再点击Restart和Run all,即可得到最终的信号波形