各位好我是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
文章来源:https://www.toymoban.com/news/detail-855223.html
管脚图文章来源地址https://www.toymoban.com/news/detail-855223.html
到了这里,关于北邮数电实验作业参考 #利用74LS138实现全加器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!