采用行为级建模,根据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
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