实现74X138和用74X138和74X139构成5-32线译码器

VerilogHDL程序设计与仿真作业2:

——实现74X138和用74X138和74X139构成5-32线译码器

一、实验目的

  • 实现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、仿真

  • 波形
    在这里插入图片描述
    在这里插入图片描述

  • 监视器

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值