Verilog——74X138仿真并用74X139和74X138构成5线-32线译码器
74X138的仿真
设计思路
采用行为级建模,根据74X138译码器的功能表编程即可。
代码实现
设计模块
//filename:74X138.v
module _74X138(A,E3,E2,E1,Y);
input [2:0] A;
input E2,E1,E3;
output reg [7:0] Y;
/*输入输出端口说明。
输入端口:E3,E2,E1为使能信号。
输出端口:Y为译码输出。
*/
always@(*) begin
if(E3==1&&E2==0&&E1==0) begin //使能端有效,芯片工作
case(A)
3'b000: Y=8'b0111_1111;
3'b001: Y=8'b1011_1111;
3'b010: Y=8'b1101_1111;
3'b011: Y=8'b1110_1111;
3'b100: Y=8'b1111_0111;
3'b101: Y=8'b1111_1011;
3'b110: Y=8'b1111_1101;
3'b111: Y=8'b1111_1110;
endcase
end
else Y=8'b1111_1111; //使能端为无效
end
endmodule
测试模块
//filename:tb_74X138
`timescale 10ns/1ns
module tb_74X138();
reg [2:0] A;
reg E3,E2,E1;
wire [7:0] Y;
_74X138 U1(A,E3,E2,E1,Y);//元件实例化
initial
$monitor($time,":\t A=%b,E3=%b,E2=%b,E1=%b",A,E3,E2,E1);//监视器监视。
initial begin
//控制信号无效。
E3=0;E2=0;E1=0;A=3'b000;
#5
E3=1;E2=1;E1=0;A=3'b000;
#5
//控制信号有效。
E3=1;E2=0;E1=0;A=3'b000;
#5
E3=1;E2=0;E1=0;A=3'b010;
#5
E3=1;E2=0;E1=0;A=3'b111;
#5
//停止仿真。
$stop;
end
endmodule
仿真
用74X139和74X138构成5线-32线译码器
设计思路
用74X139的四个输出端分别控制四片74X138的E1使能端,电路原理图如下:
准备工作:74X139的仿真
设计模块
//filename:_74X139.v
module _74X139(A,E,Y);
input [1:0] A;
input E;
output reg [3:0] Y;
/*输入输出端口说明。
输入端口:E为使能信号。A输入的待译码数字。
输出端口:Y为译码输出。
*/
always@(*)begin
if(E) Y=4'b1111;
else begin
case(A)
2'b00:Y=4'b0111;
2'b01:Y=4'b1011;
2'b10:Y=4'b1101;
2'b11:Y=4'b1110;
endcase
end
end
endmodule
测试模块
//filename:tb_74X139
`timescale 10ns/1ns
module tb_74X139();
reg [1:0] A;
reg E;
wire [3:0] Y;
/*输入输出端口说明。
输入端口:E3,E2,E1为使能信号。
输出端口:Y为译码输出。
*/
_74X139 U2(A,E,Y);//元件实例化。
initial
$monitor($time,":\tA=%b,E=%b,Y=%b",A,E,Y);//监视器监视。
initial begin
//控制信号无效。
E=1;A=2'b00;
#5
//控制信号有效。
E=0;A=2'b00;
#5
E=0;A=2'b11;
#5
$stop;
end
endmodule
5-32线译码器的代码实现
设计模块
//filename:decoder.v
module _74X138(A,E3,E2,E1,Y);
input [2:0] A;
input E2,E1,E3;
output reg [7:0] Y;
always@(*) begin
if(E3==1&&E2==0&&E1==0) begin
case(A)
3'b000: Y=8'b0111_1111;
3'b001: Y=8'b1011_1111;
3'b010: Y=8'b1101_1111;
3'b011: Y=8'b1110_1111;
3'b100: Y=8'b1111_0111;
3'b101: Y=8'b1111_1011;
3'b110: Y=8'b1111_1101;
3'b111: Y=8'b1111_1110;
endcase
end
else Y=8'b1111_1111;
end
endmodule
module _74X139(A,E,Y);
input [1:0] A;
input E;
output reg [3:0] Y;
always@(*)begin
if(E) Y=4'b1111;
else begin
case(A)
2'b00:Y=4'b0111;
2'b01:Y=4'b1011;
2'b10:Y=4'b1101;
2'b11:Y=4'b1110;
endcase
end
end
endmodule
module decoder(B,E,L);
input [4:0] B;
input E;
output [31:0] L;
/*输入输出端口说明。
输入端口:E为使能信号,B为输入的待译码五位二进制。
输出端口:Y为译码输出。
*/
wire [1:0] B1;
wire [2:0] B2;
wire [3:0] Y;
wire [7:0] L0;
wire [7:0] L1;
wire [7:0] L2;
wire [7:0] L3;
wire E2,E3;//中间变量。
genvar k;//循环变量。
for(k=4;k>=3;k=k-1) assign B1[k-3]=B[k];
for(k=2;k>=0;k=k-1) assign B2[k]=B[k];//中间变量赋值。
assign E2=1'b0;
assign E3=1'b1;
//元件实例化。
_74X139 U(B1,E,Y);
_74X138 U0(B2,E3,E2,Y[0],L0);
_74X138 U1(B2,E3,E2,Y[1],L1);
_74X138 U2(B2,E3,E2,Y[2],L2);
_74X138 U3(B2,E3,E2,Y[3],L3);
assign L={L3,L2,L1,L0};
endmodule
测试代码
//filename:tb_decoder
`timescale 10ns/1ns
module tb_decoder();
reg [4:0] B;
reg E;
wire [31:0] L;
decoder U4(B,E,L);//元件实例化。
initial
$monitor($time,":\tB=%b,E=%b,L=%b",B,E,L);//监视器监视。
initial begin
//控制信号无效。
E=1;B=5'b00001;
#5
//控制信号有效。
E=0;B=5'b00001;
#5
E=0;B=5'b11111;
#5
E=0;B=5'b00100;
#5
$stop;
end
endmodule
仿真