Verilog——74HC151八选一数据选择器并扩展为16选1数据选择器

Verilog——74HC151八选一数据选择器并扩展为16选1数据选择器

74HC151的仿真

设计思路

采用行为级建模,根据74HC151八选一数据选择器的功能表编程即可。在这里插入图片描述

代码实现

设计模块
//filename:_74HC151v
module _74HC151(
input E,
input [2:0] S,
input [7:0] D,
output reg Y,
output Y1);   
/*
输入输出端口说明:
输入端口:S为选择输入端,E使能端。
输出端口:Y为输出,Y1为Y取反
*/
always@(*)
begin
	//E高电平时无效。
    if(E)    Y=0;
    else begin
	case(S)
	    3'b000:Y=D[0];
	    3'b001:Y=D[1];
	    3'b010:Y=D[2];
	    3'b011:Y=D[3];
	    3'b100:Y=D[4];
	    3'b101:Y=D[5];
	    3'b110:Y=D[6];
	    3'b111:Y=D[7];    //根据输入S选择数据
	endcase
    end
end
assign Y1=~Y;   //输出变量有两个端子,Y1为Y取反
endmodule

测试模块
//filename:tb_74X138
//filename:tb_74HC151.v
`timescale 10ns/1ns
module tb_74HC151();
reg E;
reg [2:0] S;
reg [7:0] D;
wire Y;
wire Y1;

_74HC151 U0(E,S,D,Y,Y1);//元件实例化。
initial
	$monitor($time,"\tE=%b,S=%b,D=%b,Y=%B,Y1=%b",E,S,D,Y,Y1);//监视器监视。
initial  begin
	E=1;S=3'b000;D=8'b1111_0000;
	#5;
	E=0;S=3'b000;D=8'b1111_0000;
	#5;
	E=1;S=3'b111;D=8'b1111_0000;
	#5;
	E=0;S=3'b111;D=8'b1111_0000;
	#5;
	$stop;
end
endmodule

仿真

在这里插入图片描述
在这里插入图片描述

用74LS151构成16选一数据选择器

设计思路

74LS属于TTL类型的集成电路,而74HC属于CMOS集成电路。性能上面有差异,但是功能表相同,所以级联时用到的单元可以用前面的模型。书上给出了了两片74HC151的级联,我们可以根据原理图进行行为级建模
在这里插入图片描述

代码实现

设计模块
//filename:_74HC151v
module _74HC151(
input E,
input [2:0] S,
input [7:0] D,
output reg Y,
output Y1);   
/*
输入输出端口说明:
输入端口:S为选择输入端,E使能端。D为八个输入信号。
输出端口:Y为输出,Y1为Y取反
*/
always@(*)
begin
	//E高电平时无效。
    if(E)    Y=0;
    else begin
	case(S)
	    3'b000:Y=D[0];
	    3'b001:Y=D[1];
	    3'b010:Y=D[2];
	    3'b011:Y=D[3];
	    3'b100:Y=D[4];
	    3'b101:Y=D[5];
	    3'b110:Y=D[6];
	    3'b111:Y=D[7];    //根据输入S选择数据
	endcase
    end
end
assign Y1=~Y;   //输出变量有两个端子,Y1为Y取反
endmodule

module _16to1(
input E,
input [2:0] S,
input [7:0] D0,D1,
output L,
output L1);
/*
输入输出端口说明:
输入端口:S为选择输入端,E使能端。D0,D1为八个输入信号。
输出端口:L为输出,L1为Y取反
*/
wire Y0,Y1,Y2,Y3;
wire E1;
assign E1=~E;  //当E=1时 U0被禁止,U1工作;当E=0时,U0工作,U1被禁止

_74HC151 U0(E,S,D0,Y0,Y1);//元件实例化。
_74HC151 U1(E1,S,D1,Y2,Y3);//元件实例

or (L,Y0,Y2);
and (L1,Y1,Y3);  //门及描述。
endmodule
测试模块
//filename:tb_74HC151.v
`timescale 10ns/1ns
module tb_16to1();
reg E;
reg [2:0] S;
reg [7:0] D0,D1;
wire L;
wire L1;

_16to1 U(E,S,D0,D1,L,L1);//元件实例化。
initial
	$monitor($time,"\tE=%b,S=%b,D0=%b,D1=%b,L=%B,L1=%b",E,S,D0,D1,L,L1);//监视器监视。
initial  begin
	E=1;S=3'b000;D0=8'b1111_0000;D1=8'b0000_1111;//使能端无效。
	#5;
	E=0;S=3'b000;D0=8'b1111_0000;D1=8'b0000_1111;    //使能端有效。
	#5;
	E=1;S=3'b111;D0=8'b1111_0000;D1=8'b0000_1111;//使能端无效。
	#5;
	E=0;S=3'b111;D0=8'b1111_0000;D1=8'b0000_1111;//使能端有效。
	#5;
	$stop;//停止仿真。
end
endmodule

仿真

在这里插入图片描述
在这里插入图片描述

  • 19
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值