数据选择器
数据选择器,可根据给定的输入地址代码,从一组输入信号中选出指定的一个,送至输出端。
四选一数据选择器,从四个端口中任意选择一个,送至输出端。设定四个端口为din[0]、din[1]、din[2]、din[3],表示四个端口需要两个选择信号(22 =4),设为del[0]、del[1],将输出信号设为dout。
verilog实现
代码如下
module MUX(
din,
sel,
dout
);
input[3:0] din;//四个端口,故位宽为4
input[1:0] sel;//两个选择信号,故位宽为2
output dout;
reg dout;
always @(*)begin
if(sel==2'b00)
dout=din[0];
if(sel==2'b01)
dout=din[1];
if(sel==2'b10)
dout=din[2];
if(sel==2'b11)
dout=din[3];
end
endmodule
testbench
代码如下
`timescale 1ns/1ns
module MUX_test; //MUX_test为测试文件名字
reg [3:0]din; //输入信号对应reg类型
reg [1:0]sel;
wire dout; //输出信号对应wire类型
MUX u_MUX( //MUX为被例化的模块名,u_MUX为例化模块名
.din(din), //括号外为被例化的端口名,括号内为例化端口名
.sel(sel),
.dout(dout)
);
//以下四个always颇为巧妙,具体看下方解释
always # 10 din[0]=~din[0];
always # 20 din[1]=~din[1];
always # 40 din[2]=~din[2];
always # 80 din[3]=~din[3];
initial
begin
sel=1'b0;
din=4'b0;
#160 $stop;
end
always #10 sel=sel+1;//din的值10ns变换一次,故而将sel的每一个值延时10ns
endmodule
四个always实现了din四个端口的值从0000变化到了1111,如下表所示
时间变化 | 信号变化 | din |
---|---|---|
0 | 无 | 0000 |
10ns | din[0]取反 | 0001 |
20ns | din[0]取反,din[1]取反 | 0010 |
30ns | din[0]取反 | 0011 |
40ns | din[0]取反,din[1]取反,din[2]取反 | 0100 |
50ns | din[0]取反 | 0101 |
60ns | din[0]取反,din[1]取反 | 0110 |
70ns | din[0]取反 | 0111 |
80ns | din[0]取反,din[1]取反,din[2]取反,din[3]取反 | 1000 |
90ns | din[0]取反 | 1001 |
100ns | din[0]取反,din[1]取反 | 1010 |
110ns | din[0]取反 | 1011 |
120ns | din[0]取反,din[1]取反,din[2]取反 | 1100 |
130ns | din[0]取反 | 1101 |
140ns | din[0]取反,din[1]取反 | 1110 |
150ns | din[0]取反 | 1111 |
使得din的值有多种取值并无多意,只想体现del的选择功能,无论din的值如何,由del的值决定输出哪个端口,也可以将din的值固定为一个值,也可以体现选择功能。
del的值与端口号的对应如下:
del | dout |
---|---|
00 | din[0] |
01 | din[1] |
10 | din[2] |
11 | din[3] |
假定某时din的值为1101,而此时del的值为10,故而din[2]为输出端口,输出的值与din的值无关,但波形图一致(输出与被选端口的波形)。
波形图如下:
对准一个时间段,可观察到被选定的端口号的波形,与输出波形一致。
以上均为学习笔记,若有错误,欢迎大家指出,一定积极讨论并予以改正