verilog仿真——8选1数据选择器74HC151

任务

  • 实现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

Leave a comment

Your email address will not be published. Required fields are marked *