1组合逻辑电路多路选择器与多路分解器

1.2多路选择器

1.2.1不带优先级的多路选择器

四路选择器如下

代码如下

View Code
 1 module multiplexer
2 (
3 input iA,
4 input iB,
5 input iC,
6 input iD,
7 input [1:0] iSel,
8 output reg oQ
9 );
10
11 always @(*)
12 begin
13 case(iSel)
14 2'b00 : oQ=iA;
15 2'b01 : oQ=iB;
16 2'b10 : oQ=iC;
17 2'b11 : oQ=iD;
18 endcase
19 end
20
21 endmodule

case语句如果没有全部包含所有的情况,则一般要用default语句将信号默认赋值为0,否则会出现锁存器,使得仿真结果不一致。

RTL级视图如下:

testbench如下

View Code
 1 `timescale 1 ns/ 1 ns
2 module logics_tb();
3
4 reg ia;
5 reg ib;
6
7 wire oAnd;
8 wire oOr;
9 wire oNot;
10
11 initial
12 begin
13 ia=0;
14 #40 ia=1;
15 #40 ia=0;
16 #40 ia=1;
17 #40 ia=0;
18 end
19
20 initial
21 begin
22 ib=0;
23 #40 ib=0;
24 #40 ib=1;
25 #40 ib=1;
26 #40 ib=0;
27 end
28
29 logics logics_inst
30 (
31 .iA(ia),
32 .iB(ib),
33 .oAnd(oAnd),
34 .oOr(oOr),
35 .oNot(oNot)
36 );
37
38 endmodule

initial语句和always语句左边的信号类型都要为reg。

RTL级仿真图形如下

1.2.2 带优先级的多路选择器

代码如下

View Code
 1 module multiplexer
2 (
3 input iA,
4 input iB,
5 input iC,
6 input iD,
7 input [1:0] iSel,
8 output reg oQ
9 );
10
11 always @(*)
12 if(iSel==2'b00)
13 oQ=iA;
14 else if(iSel==2'b01)
15 oQ=iB;
16 else if(iSel==2'b10)
17 oQ=iC;
18 else
19 oQ=iD;
20
21 endmodule

RTL级视图如下


1.2.3多路分解器

一路输入,三路输出分解器代码如下

View Code
 1 module de_multiplexer
2 (
3 input iA,
4 input [1:0] iSel,
5 output reg oA,
6 output reg oB,
7 output reg oC
8 );
9
10 always @(*)
11 begin
12 oA=0;oB=0;oC=0;
13 case(iSel)
14 2'b00 : oA=iA;
15 2'b01 : oB=iA;
16 2'b10 : oC=iA;
17 default :;
18 endcase
19 end
20
21 endmodule

RTL级视图如下

testbench代码如下

View Code
 1 `timescale 1ns/1ns
2 module de_multiplexer_tb;
3 reg ia;
4 reg [1:0] isel;
5 wire oa;
6 wire ob;
7 wire oc;
8
9 initial
10 begin
11 ia=0;
12 forever
13 #10 ia=~ia;
14 end
15
16 initial
17 begin
18 isel=2'b00;
19 #20 isel=2'b01;
20 #20 isel=2'b10;
21 #20 isel=2'b11;
22 #20 $stop;
23 end
24
25 de_multiplexer de_multiplexer_inst
26 (
27 .iA(ia),
28 .iSel(isel),
29 .oA(oa),
30 .oB(ob),
31 .oC(oc)
32 );
33
34 endmodule

RTL级仿真波形如下

原文地址:https://www.cnblogs.com/yuesheng/p/2123909.html