赞
踩
各位好我是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
管脚图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。