任务
- 实现74HC151的程序设计与仿真
- 用两片74HC151连接成1个16选1的数据选择器
74HC151
思路
数据选择器介绍 参照芯片的引脚设计
程序设计
//filename:74HC151.v
module mux74HC151(
input E_n,
input [2:0] S,
input [7:0] D,
output reg Y,Y_n
);
/*电路功能描述
1.(*)表示 always 块中所有输入信号都是敏感信号
2.输出信号在过程语句中被赋值,定义成 reg 型
*/
//E_n为使能端,低电平有效
//S[2:0] 为选择输入信号
//D[7:0] 为8路输入信号
//Y 信号输出
//Y_n:信号输出,低电平有效
always @(*) begin
if(!E_n) begin
//使能端有效
case(S)
3'b000:begin Y=D[0];Y_n=~D[0];end
3'b001:begin Y=D[1];Y_n=~D[1];end
3'b010:begin Y=D[2];Y_n=~D[2];end
3'b011:begin Y=D[3];Y_n=~D[3];end
3'b100:begin Y=D[4];Y_n=~D[4];end
3'b101:begin Y=D[5];Y_n=~D[5];end
3'b110:begin Y=D[6];Y_n=~D[6];end
3'b111:begin Y=D[7];Y_n=~D[7];end
endcase
end
else begin
Y=0;Y_n=1;
end
end
endmodule
仿真
//filename:tb_74HC151.v
`timescale 1ns/1ns
module tb_74HC151;
reg E_n;
reg [2:0] S;
reg [7:0] D;
wire Y,Y_n;
//实例化74HC151
mux74HC151 mux74HC151_inst(
.E_n(E_n),
.S(S),
.D(D),
.Y(Y),
.Y_n(Y_n)
);
initial begin
E_n=1;S=3'b111;D=8'b1111_1111;
#1
E_n=0;S=3'b111;D=8'b1111_1111;
#1
E_n=0;S=3'b000;D=8'b1111_1111;
#1
E_n=0;S=3'b000;D=8'b1111_1110;
#1
E_n=0;S=3'b001;D=8'b0101_0101;
#1
E_n=0;S=3'b010;D=8'b0101_0101;
#1
E_n=0;S=3'b011;D=8'b0101_0101;
#1
E_n=0;S=3'b100;D=8'b0101_0101;
#1
$stop;
end
endmodule

16选1数据选择器
思路
用两片实现,则1片代表高8位,1片代表低8位
当选择端最高位有效时,从高8位中的数据端读取;反之,从低8位中的数据端读取
程序设计
//filename:mux16to1.v
module mux16to1(
input E_n,
input [3:0] S,
input [15:0] D,
output reg Y,Y_n
);
/*电路功能描述
1.(*)表示 always 块中所有输入信号都是敏感信号
2.输出信号在过程语句中被赋值,定义成 reg 型
*/
//E_n为使能端,低电平有效
//S[3:0] 为选择输入信号
//D[15:0] 为8路输入信号
//Y 信号输出
//Y_n:信号输出,低电平有效
wire Y1,Y0,Y_n1,Y_n0;
//实例化调用74HC151
mux74HC151 mux1(
.E_n(~S[3]),
.S(S[2:0]),
.D(D[15:8]),
.Y(Y1),
.Y_n(Y_n1)
);
mux74HC151 mux0(
.E_n(S[3]),
.S(S[2:0]),
.D(D[7:0]),
.Y(Y0),
.Y_n(Y_n0)
);
always @(*) begin
if(!E_n) begin
Y=Y1|Y0;
Y_n=Y_n1|Y_n0;
end
else begin
Y=0;
Y_n=1;
end
end
endmodule
仿真
//filename:tb_mux16to1.v
`timescale 1ns/1ns
module tb_mux16to1;
reg E_n;
reg [3:0] S;
reg [15:0] D;
wire Y,Y_n;
mux16to1 mux16to1_inst(
.E_n(E_n),
.S(S),
.D(D),
.Y(Y),
.Y_n(Y_n)
);
initial begin
E_n=1;S=4'b1111;D=16'haaaa;
#1
E_n=0;S=4'b1111;D=16'haaaa;
#1
E_n=0;S=4'b0001;D=16'haaaa;
#1
E_n=0;S=4'b0010;D=16'haaaa;
#1
E_n=0;S=4'b0011;D=16'haaaa;
#1
E_n=0;S=4'b0100;D=16'haaaa;
#1
E_n=0;S=4'b0101;D=16'haaaa;
#1
E_n=0;S=4'b0110;D=16'haaaa;
#1
$stop;
end
endmodule
