北邮数电实验作业参考 #利用74LS138实现全加器

各位好我是Toporanger  本人只会写代码 不会教人 毕竟自己的代码也是改来改去最终成功的 如果有不够精简的地方还请见谅 

我会先贴下代码 然后贴上管脚的绑定图  无论是拿来救急还是作为参考都希望帮助到你们

题目:

1. Verilog HDL设计一个3-8译码器74LS138,并用该译码器实现全加器。要求:调试通过,直接贴代码也可。

2. Verilog HDL设计一个七段显示译码器,该译码器输入为BCD码,输出驱动七段数码管。要求:将七段显示译码器封装为模块,然后在顶层模块调用该译码器驱动七段数码管,并在开发板上验证通过,直接贴代码也可。

顶层模块:

// 模块 hw_7: 根据输入按键控制LED灯的亮灭,并通过加法器和7段显示模块展示计算结果
module hw_7(
    input clk, rst,            // 输入信号:时钟(clk)和复位(rst)
    input key1, key2, key3, key4, // 输入按键,用于控制操作
    output reg si_led, ci_led, // 输出信号:单个LED指示灯(si_led, ci_led)用于显示加法器的结果
    output [8:0] seg_led,      // 7段显示的输出
    output reg [2:0] led       // LED灯组,通过按键控制亮灭
);

    wire siled; // 加法器的和输出信号
    wire ciled; // 加法器的进位输出信号

    // 时钟上升沿触发的always块
    always @(posedge clk) begin
        if (!rst) begin
            // 如果复位信号激活,则将所有LED设置为预定初始状态
            led[0] <= 1'b1; // 初始状态,所有LED灯亮
            led[1] <= 1'b1;
            led[2] <= 1'b1;
            si_led <= 1'b1; // 加法结果和进位结果LED初始化为亮
            ci_led <= 1'b1;
        end else begin
            // 根据按键状态更新LED灯
            led[2] <= key1; // key1控制led[2]
            led[1] <= key2; // key2控制led[1]
            led[0] <= key3; // key3控制led[0]
            si_led <= ~siled; // 反转加法器的和输出,用于控制si_led
            ci_led <= ~ciled; // 反转加法器的进位输出,用于控制ci_led
        end
    end

    // 加法器模块实例化
    adder_ m1(
        .a(led), // 将led作为加法器的输入
        .g1(1'b1), .g2(1'b0), .g3(1'b0), // 控制信号
        .si(siled), // 和输出连接到siled
        .ci(ciled)  // 进位输出连接到ciled
    );

    // 7段显示模块实例化
    segment m2(
        .bcd({key1, key2, key3, key4}), // 将按键状态作为输入
        .seg_led(seg_led) // 连接到7段显示的输出
    );
endmodule

74LS138译码器:

module sl138(
    input g1, g2, g3, // 地址选通端口,控制译码器是否激活
    input [2:0] a,    // 3位输入地址,决定哪一位输出应该被激活
    output reg [7:0] y // 8位输出,每一位对应一个输出线
);

    // 初始化输出为全高电平
    reg [7:0] y = 0; 

    // 监听选通端口和地址输入的变化
    always @(g1 or g2 or g3 or a) begin
        // 当选通条件满足时(g1高,g2和g3低)
        if (g1 && ~g2 && ~g3) begin
            case (a) // 根据输入地址a选择输出
                // 每种情况下激活对应的输出线,使其变为低电平
                7: y = 8'b01111111; // 激活第7位
                6: y = 8'b10111111; // 激活第6位
                5: y = 8'b11011111; // 激活第5位
                4: y = 8'b11101111; // 激活第4位
                3: y = 8'b11110111; // 激活第3位
                2: y = 8'b11111011; // 激活第2位
                1: y = 8'b11111101; // 激活第1位
                0: y = 8'b11111110; // 激活第0位
                // 如果地址不在0到7之间,则所有输出保持高电平
                default: y = 8'b11111111;
            endcase
        end else begin
            // 如果选通条件不满足,则所有输出保持高电平
            y = 8'b11111111;
        end
    end
endmodule

全加器:

// 模块 adder_: 通过调用3到8线译码器实现特定的加法逻辑
module adder_(
    input [2:0] a, // 输入a,假定同时代表了加法器的两个加数和一个进位输入
    input g1, g2, g3, // 译码器的控制输入
    output si, ci // 加法器的和(si)和进位(ci)输出
);
    wire [7:0] m; // 译码器的8位输出

    // 实例化3到8线译码器 sl138
    sl138 u1(
        .g1(g1),
        .g2(g2),
        .g3(g3),
        .a(a),
        .y(m) // 连接译码器的输出到m
    );

    // 根据译码器的输出计算加法器的和和进位
 
    assign si = ~m[1] | ~m[2] | ~m[4] | ~m[7]; // 和输出的逻辑表达式
    assign ci = ~m[3] | ~m[5] | ~m[6] | ~m[7]; // 进位输出的逻辑表达式
endmodule

 

                                                                   管脚图

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值