1.2多路选择器
1.2.1不带优先级的多路选择器
四路选择器如下
代码如下
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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如下
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 带优先级的多路选择器
代码如下
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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多路分解器
一路输入,三路输出分解器代码如下
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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代码如下
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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级仿真波形如下