实现74X138和用74X138和74X139构成5-32线译码器
最编程
2024-01-09 12:49:56
...
VerilogHDL程序设计与仿真作业2:
——实现74X138和用74X138和74X139构成5-32线译码器
文章目录
- VerilogHDL程序设计与仿真作业2:
- ——实现74X138和用74X138和74X139构成5-32线译码器
- 一、实验目的
- 二、实现74X138的3-8线译码器功能
- 1、设计思路
- 2、实现代码
- 3、测试代码
- 4、仿真
- 三、实现1/2 74X139的功能——2-4线译码器
- 1、设计思路
- 2、实现代码
- 3、测试代码
- 4、仿真
- 四、实现用74X138和74X139构成5-32线译码器
- 1、设计思路
- 2、实现代码
- 3、测试代码
- 4、仿真
一、实验目的
- 实现74X138的3线8线译码器功能
- 实现用74X138和74X139构成5-32线译码器
二、实现74X138的3-8线译码器功能
1、设计思路
-
采用行为级建模,结合74HC138的真值表和引脚图设计。
-
74HC138逻辑符号与引脚图
-
74HC138的真值表
2、实现代码
//文件名称:_74HC138.v
//fuchaoxinHUST11102020
module _74HC138(A,E1_,E2_,E3,Y_);
input E1_,E2_,E3;
input [2:0] A;
output reg [7:0] Y_;
/*说明:
输入端:E1_=1 E2_=0 E3=0时才有有效输出
输出端:Y_为译码输出
*/
always @(*)
if (E1_==0&&E2_==0&&E3==1) begin
case(A[2:0])
3'b000: Y_[7:0]=8'b11111110;
3'b001: Y_[7:0]=8'b11111101;
3'b010: Y_[7:0]=8'b11111011;
3'b011: Y_[7:0]=8'b11110111;
3'b100: Y_[7:0]=8'b11101111;
3'b101: Y_[7:0]=8'b11011111;
3'b110: Y_[7:0]=8'b10111111;
3'b111: Y_[7:0]=8'b01111111;
endcase
end
else begin
Y_[7:0]=8'b11111111;
end
endmodule
3、测试代码
//文件名称:Test_74HC138.v
//fuchaoxinHUST11102020
`timescale 10ns/1ns
module Test_74HC138;
reg E1_,E2_,E3;
reg [2:0] A;
wire [7:0] Y_;
_74HC138 U0(A,E1_,E2_,E3,Y_);//实例化元件
initial
$monitor($time,":\t A=%b, E1_=%b, E2_=%b, E3=%b, Y_=%b \n", A, E1_, E2_, E3, Y_);
//监视器的显示内容
initial begin
//控制使输入无效
E1_=0;E2_=1;E3=1; A[2:0]=3'b011;
#5
E1_=1;E2_=0;E3=1; A[2:0]=3'b101;
#5
E1_=0;E2_=0;E3=0; A[2:0]=3'b110;
#5
//控制使输入有效
E1_=0;E2_=0;E3=1; A[2:0]=3'b011;
#5
E1_=0;E2_=0;E3=1; A[2:0]=3'b101;
#5
E1_=0;E2_=0;E3=1; A[2:0]=3'b110;
#5
$stop;//停止模拟仿真
end
endmodule
4、仿真
-
波形
-
监控器
三、实现1/2 74X139的功能——2-4线译码器
1、设计思路
-
采用行为级建模,结合74HC138的真值表和引脚图设计。
-
74HC139逻辑图和逻辑表达式
-
2-4线译码器
-
74HC139引脚图
2、实现代码
//文件名称:_74HC139.v
//fuchaoxinHUST11102020
//编写程序实现的是1/2 74HC139的功能(2-4线译码器)
module _74HC139(A,E_,Y_);
input E_;
input [1:0] A;
output reg [3:0] Y_;
/*说明:
输入端:E_=0时才有有效输出
输出端:Y_为译码输出
*/
always @(*)
if (E_==0) begin
case(A[1:0])
2'b00: Y_[3:0]=4'b1110;
2'b01: Y_[3:0]=4'b1101;
2'b10: Y_[3:0]=4'b1011;
2'b11: Y_[3:0]=4'b0111;
endcase
end
else begin
Y_[3:0]=4'b1111;
end
endmodule
3、测试代码
//文件名称:Test_74HC139.v
//fuchaoxinHUST11102020
`timescale 10ns/1ns
module Test_74HC139;
reg E_;
reg [1:0] A;
wire [3:0] Y_;
_74HC139 U0(A,E_,Y_);//实例化元件
initial
$monitor($time,":\t A=%b, E_=%b, Y_=%b \n", A, E_, Y_);
//监视器的显示内容
initial begin
//控制使输入无效
E_=1; A[1:0]=2'b01;
#5
E_=1; A[1:0]=2'b10;
#5
E_=1; A[1:0]=2'b11;
#5
//控制使输入有效
E_=0; A[1:0]=2'b01;
#5
E_=0; A[1:0]=2'b10;
#5
E_=0; A[1:0]=2'b11;
#5
$stop;//停止模拟仿真
end
endmodule
4、仿真
-
波形
-
监视器
四、实现用74X138和74X139构成5-32线译码器
1、设计思路
- 使用1/2 74HC139和四片74HC138综合行为级、结构级以及原理图设计电路。
- 输入B[4:3]得到的Y[3:0]决定了译码的大小范围,输出的Y信号作为第二级的使能信号,控制驱动这四个芯片分时工作,第二级电路则对输入B[2:0]译码,实现5-32译码器的功能,其中第二级每个芯片的 E 3 E_3 E3都接高电平 E 2 E_2 E2都接低电平。
- 原理图
2、实现代码
//文件名称:Decoder_5_32.v
//文件名称:_74HC139.v
//文件名称:_74HC138.v
//fuchaoxinHUST11102020
module _74HC139(A,E_,Y_);
input E_;
input [1:0] A;
output reg [3:0] Y_;
/*说明:
输入端:E_=0时才有有效输出
输出端:Y_为译码输出
*/
always @(*)
if (E_==0) begin
case(A[1:0])
2'b00: Y_[3:0]=4'b1110;
2'b01: Y_[3:0]=4'b1101;
2'b10: Y_[3:0]=4'b1011;
2'b11: Y_[3:0]=4'b0111;
endcase
end
else begin
Y_[3:0]=4'b1111;
end
endmodule
//1/2 74HC139
module _74HC138(A,E1_,E2_,E3,Y_);
input E1_,E2_,E3;
input [2:0] A;
output reg [7:0] Y_;
/*说明:
输入端:E1_=1 E2_=0 E3=0时才有有效输出
输出端:Y_为译码输出
*/
always @(*)
if (E1_==0&&E2_==0&&E3==1) begin
case(A[2:0])
3'b000: Y_[7:0]=8'b11111110;
3'b001: Y_[7:0]=8'b11111101;
3'b010: Y_[7:0]=8'b11111011;
3'b011: Y_[7:0]=8'b11110111;
3'b100: Y_[7:0]=8'b11101111;
3'b101: Y_[7:0]=8'b11011111;
3'b110: Y_[7:0]=8'b10111111;
3'b111: Y_[7:0]=8'b01111111;
endcase
end
else begin
Y_[7:0]=8'b11111111;
end
endmodule
//单片74HC138
module Decoder_5_32(B,E_,L_);
input E_;
input [4:0] B;
output [31:0] L_;
/*说明:
输入端:E使能信号,低电平有效;[5:0]B代表输入的五位二进制数,前三位输入第二级电路,后两级输入第一级电路;
输出端:[31:0] L_,低电平有效,代表译码后的数字。
*/
wire [2:0] A1; //1/2 74HC139的输入[1:0] A
wire [1:0] A2; //四片74HC138的输入[2:0] A
wire [3:0] Y_; //1/2 74HC139的输出 同时也是四片74HC138的使能信号E1
wire E2_,E3; //四片74HC138的使能信号
wire [7:0] L0_; //以下为四片74HC138各自的输出
wire [7:0] L1_;
wire [7:0] L2_;
wire [7:0] L3_;
assign E_ = 1'b0;
assign E2_ = 1'b0;
assign E3 = 1'b1;
//E_和E2_为低电平有效,赋值为0;E3为高电平有效,赋值为1;E1_为低电平有效,由第一级电路的输出Y_决定,其起选择哪一片芯片工作的作用。
genvar i;
for(i=2;i>=0;i=i-1) assign A1[i] = B[i];
for(i=4;i>=3;i=i-1) assign A2[i-3] = B[i];
//循环赋值,将[4:0] B的前三位赋值给[2:0] A1的前三位,后两位赋值给[1:0] A2的前两位。
_74HC139 U(A2,E_,Y_);
_74HC138 U0(A1,Y_[0],E2_,E3,L0_);
_74HC138 U1(A1,Y_[1],E2_,E3,L1_);
_74HC138 U2(A1,Y_[2],E2_,E3,L2_);
_74HC138 U3(A1,Y_[3],E2_,E3,L3_);
//先后执行两级电路
//每次输入后,第二级电路只有一片芯片正常工作,非正常工作的输出均为8'b11111111,符合输出要求。
assign L_ = {L3_[7:0], L2_[7:0], L1_[7:0], L0_[7:0]};
endmodule
3、测试代码
//文件名称:Test_Decoder_5_32.v
//fuchaoxinHUST20201110
`timescale 10ns/1ns
module Test_Decoder_5_32;
reg E_;
reg [4:0] B;
wire [31:0] L_;
Decoder_5_32 U(B,E_,L_);//实例化元件
initial
$monitor($time,":\t B=%b, E_=%b, L_=%b \n", B, E_, L_);
//监视器的显示内容
initial begin
//使能信号为1
E_=1;B=5'b00000;
#5
E_=1;B=5'b10001;
#5
//使能信号为0
E_=0;B=5'b00010;
#5
E_=0;B=5'b01011;
#5
E_=0;B=5'b10100;
#5
E_=0;B=5'b11101;
#5
$stop;//停止测试
end
endmodule
4、仿真
-
波形
-
监视器