nju实验三 加法器与ALU

news/2025/11/21 21:07:28/文章来源:https://www.cnblogs.com/mo686/p/19254491

实验三 加法器与ALU

加法器

一位全加器的设计相对简单,请读者根据电路图自行思考如果设计一个串行进位加法器电路。 串行加法器速度很慢,因为进位必须从最低位传至最高位。要想构建速度较快的加法器,就要利用附加逻辑,提前算出进位信息,这就是先行进位加法器的设计思想,先行进位加法有几种常用的算法,感兴趣的同学可以查找资料阅读。

1. 先行进位加法器设计

先行进位加法器(Carry Lookahead Adder, CLA)通过提前计算进位信号来提高加法速度。

1.1 先行进位原理

定义两个中间变量:
●生成信号(Gi):Gi = Ai & Bi
●传播信号(Pi):Pi = Ai ^ Bi
进位信号可以表示为:
Ci+1 = Gi | (Pi & Ci)展开后可以得到:

C1 = G0 | (P0 & C0)
C2 = G1 | (P1 & G0) | (P1 & P0 & C0)
C3 = G2 | (P2 & G1) | (P2 & P1 & G0) | (P2 & P1 & P0 & C0)
C4 = G3 | (P3 & G2) | (P3 & P2 & G1) | (P3 & P2 & P1 & G0) | (P3 & P2 & P1 & P0 & C0)

1.2 4位先行进位加法器实现

module carry_lookahead_adder_4bit(input [3:0] A, B,input Cin,output [3:0] Sum,output Cout
);wire [3:0] G, P;wire [4:0] C;// 计算生成和传播信号assign G = A & B;assign P = A ^ B;// 计算进位assign C[0] = Cin;assign C[1] = G[0] | (P[0] & C[0]);assign C[2] = G[1] | (P[1] & G[0]) | (P[1] & P[0] & C[0]);assign C[3] = G[2] | (P[2] & G[1]) | (P[2] & P[1] & G[0]) | (P[2] & P[1] & P[0] & C[0]);assign C[4] = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]) | (P[3] & P[2] & P[1] & P[0] & C[0]);// 计算和assign Sum = P ^ C[3:0];assign Cout = C[4];
endmodule

1.3 先行进位加法器特点

1.优点:
a.延迟与位数对数成正比(O(log n))
b.适合高速运算
c.可扩展性强(可构建多级先行进位)
2.缺点:
a.逻辑复杂度高
b.占用资源多
c.功耗较大

2. 其他高速加法器结构

2.1 超前进位加法器(CLA)扩展

对于更多位数的加法器,可以采用多级先行进位结构:
●组内先行进位
●组间先行进位

2.2 条件求和加法器(Conditional Sum Adder)

通过并行计算所有可能的进位情况,然后根据实际进位选择正确结果。

2.3 进位选择加法器(Carry Select Adder)

将加法器分成若干段,每段同时计算进位为0和1两种情况,然后根据实际进位选择正确结果。

3. 性能比较

加法器类型 延迟特性 资源消耗 适用场景
串行进位加法器 O(n) 低速、低功耗设计
先行进位加法器 O(log n) 高速运算
进位选择加法器 O(√n) 中等速度需求
条件求和加法器 O(log n) 很高 极高速运算

4. 多功能加减法加法器设计

4.1 设计概述

功能需求

●支持n位二进制数的加法和减法运算
●通过控制信号选择运算模式
●正确输出运算结果和状态标志:
○进位标志(Carry)
○溢出标志(Overflow)
○零标志(Zero)
○符号标志(Sign)

技术方案

●采用补码表示有符号数
●减法通过"加补码"实现
●使用先行进位(Carry Lookahead)优化性能

4.2 完整Verilog实现

module arithmetic_unit #(parameter WIDTH = 32
)(input [WIDTH-1:0] a,      // 操作数Ainput [WIDTH-1:0] b,      // 操作数Binput sub,                // 运算选择: 0=加法, 1=减法output [WIDTH-1:0] result,// 运算结果output carry,             // 进位标志(无符号数溢出)output overflow,          // 溢出标志(有符号数溢出)output zero,              // 零标志output sign               // 符号标志
);// 中间信号wire [WIDTH-1:0] b_operand;wire carry_in;wire [WIDTH:0] sum;  // 包含进位位的扩展和// 减法转换为补码加法assign b_operand = sub ? ~b : b;assign carry_in = sub ? 1'b1 : 1'b0;// 核心加法器assign sum = {1'b0, a} + {1'b0, b_operand} + {{WIDTH{1'b0}}, carry_in};// 结果和标志位assign result = sum[WIDTH-1:0];assign carry = sum[WIDTH];// 溢出检测: 有符号数溢出发生在:// 1. 正数+正数=负数// 2. 负数+负数=正数assign overflow = (a[WIDTH-1] == b_operand[WIDTH-1]) && (result[WIDTH-1] != a[WIDTH-1]);// 零标志assign zero = (result == {WIDTH{1'b0}});// 符号标志assign sign = result[WIDTH-1];endmodule

4.3 测试验证

module tb_arithmetic_unit;reg [31:0] a, b;reg sub;wire [31:0] result;wire carry, overflow, zero, sign;arithmetic_unit uut (.a(a),.b(b),.sub(sub),.result(result),.carry(carry),.overflow(overflow),.zero(zero),.sign(sign));initial begin// 测试加法sub = 0;a = 32'h0000_000F; b = 32'h0000_0001; #10; // 15+1=16a = 32'h7FFF_FFFF; b = 32'h0000_0001; #10; // MAX_INT+1 (溢出)// 测试减法sub = 1;a = 32'h0000_000F; b = 32'h0000_0001; #10; // 15-1=14a = 32'h8000_0000; b = 32'h0000_0001; #10; // MIN_INT-1 (溢出)// 测试特殊值a = 32'h0000_0000; b = 32'h0000_0000; #10; // 0+0=0a = 32'hFFFF_FFFF; b = 32'h0000_0001; sub=0; #10; // -1+1=0$finish;end
endmodule

5. 减法运算溢出判断的正确实现分析

5.1 方法一与方法二的关键区别

两种方法的核心差异在于如何处理进位输入(Cin):
1.方法一:
a.先对B进行按位取反(当Cin=1时)
b.然后在加法器中统一加Cin
2.方法二:
a.先对B进行按位取反并立即加上Cin
b.然后在加法器中直接相加

5.2 最小负数情况的特殊问题

对于n位有符号数:
●最小负数为 -2^(n-1)(如8位的-128,表示为 10000000)
●当B是最小负数时,-B 在数学上应该是 2^(n-1),但这超出了n位有符号数的表示范围

5.3 详细分析

方法一:

assign t_no_Cin = {n{ Cin }}^B;            // Cin=1时取反B
assign {Carry,Result} = A + t_no_Cin + Cin; // 统一加Cin
assign Overflow = (A[n-1] == t_no_Cin[n-1]) && (Result[n-1] != A[n-1]);

问题:
●当B是最小负数时,t_no_Cin = ~B = 011...11(正的最大值)
●加Cin会导致进位传播,可能影响溢出判断
●不能正确处理 A - (-2^(n-1)) 的情况(即 A + 2^(n-1))

方法二:

assign t_add_Cin = ({n{Cin}}^B) + Cin;     // 先取反并立即加Cin
assign {Carry, Result} = A + t_add_Cin;
assign Overflow = (A[n-1] == t_add_Cin[n-1]) && (Result[n-1] != A[n-1]);

优点:
●当B是最小负数时:
○{n{Cin}}^B = ~B = 011...11
○立即 + Cin 得到 100...00(即 -B 的正确补码表示)
●正确处理所有边界情况,包括 A - (-2^(n-1))

5.4 具体案例验证(以8位为例)

测试 A - B 其中 B = -128 (10000000):
1.方法一:
a.t_no_Cin = ~10000000 = 01111111
b.A + 01111111 + 1 = A + 10000000(数学上正确)
c.但溢出判断会比较 A[7] 和 01111111[7](总是不同),导致溢出检测失效
2.方法二:
a.t_add_Cin = ~10000000 + 1 = 01111111 + 1 = 10000000
b.A + 10000000(完全符合减法语义)
c.溢出判断比较 A[7] 和 10000000[7](能正确检测符号变化)

结论

方法二是正确的实现,因为它:
1.正确处理了减数为最小负数时的特殊情况
2.保持了补码运算的数学一致性
3.能准确检测所有溢出情况
方法一在常规情况下可以工作,但在边界条件(特别是B为最小负数时)会出现问题。在实际硬件设计中,必须使用方法二这种实现来确保所有情况下的正确性。

6. 四位补码加减法器

波形仿真

image

top.nxdc

top=topa (SW7, SW6, SW5, SW4)
b (SW3, SW2, SW1, SW0)
sub (SW8)segs  (SEG7A, SEG7B, SEG7C, SEG7D, SEG7E, SEG7F, SEG7G, DEC7P, SEG6A, SEG6B, SEG6C, SEG6D, SEG6E, SEG6F, SEG6G, DEC6P, SEG5A, SEG5B, SEG5C, SEG5D, SEG5E, SEG5F, SEG5G, DEC5P, SEG4A, SEG4B, SEG4C, SEG4D, SEG4E, SEG4F, SEG4G, DEC4P, SEG3A, SEG3B, SEG3C, SEG3D, SEG3E, SEG3F, SEG3G, DEC3P, SEG2A, SEG2B, SEG2C, SEG2D, SEG2E, SEG2F, SEG2G, DEC2P, SEG1A, SEG1B, SEG1C, SEG1D, SEG1E, SEG1F, SEG1G, DEC1P, SEG0A, SEG0B, SEG0C, SEG0D, SEG0E, SEG0F, SEG0G, DEC0P)

top.v

module top #(parameter WIDTH = 4
)(input [WIDTH-1:0] a,      // 操作数Ainput [WIDTH-1:0] b,      // 操作数Binput sub,                // 运算选择output [63:0] segs        // 6位数码管的段选信号(8位x6)
);// 算术运算单元wire [WIDTH-1:0] result;wire carry, overflow, zero, sign;arithmetic_unit #(WIDTH) u_arithmetic (.a(a),.b(b),.sub(sub),.result(result),.carry(carry),.overflow(overflow),.zero(zero),.sign(sign));// 各数码管段选信号生成wire [7:0] seg [0:7];// 第1-2位:操作数Aassign seg[0] = a[3] ? 8'b11111101 : 8'b11111111; // "-"或空wire [3:0] abs_a;assign abs_a = a[3] ? (a == 4'b1000 ? 4'h8 : // -8a == 4'b1001 ? 4'h7 : // -7a == 4'b1010 ? 4'h6 : // -6a == 4'b1011 ? 4'h5 : // -5a == 4'b1100 ? 4'h4 : // -4a == 4'b1101 ? 4'h3 : // -3a == 4'b1110 ? 4'h2 : // -2a == 4'b1111 ? 4'h1 : // -14'h0) : a;seg7_decoder u_seg0 (.bin(abs_a), .seg(seg[1]));// 第3位:运算符assign seg[2] = sub^b[3] ? 8'b11111101 : 8'b11111110; // "-"或"+"// 第4位:操作数B的绝对值wire [3:0] abs_b;assign abs_b = b[3] ? (b == 4'b1000 ? 4'h8 : // -8b == 4'b1001 ? 4'h7 : // -7b == 4'b1010 ? 4'h6 : // -6b == 4'b1011 ? 4'h5 : // -5b == 4'b1100 ? 4'h4 : // -4b == 4'b1101 ? 4'h3 : // -3b == 4'b1110 ? 4'h2 : // -2b == 4'b1111 ? 4'h1 : // -14'h0) : b;seg7_decoder u_seg2 (.bin(abs_b), .seg(seg[3]));// 第5-6位:等号"="assign seg[4] = 8'b11101101; // 显示g和c段assign seg[5] = 8'b11101101; // 显示g和c段// 第7位:符号位assign seg[6] = sign ? 8'b11111101 : 8'b11111111; // "-"或空// 第8位:结果绝对值wire [3:0] abs_result;assign abs_result = sign ? (result == 4'b1000 ? 4'h8 : // -8result == 4'b1001 ? 4'h7 : // -7result == 4'b1010 ? 4'h6 : // -6result == 4'b1011 ? 4'h5 : // -5result == 4'b1100 ? 4'h4 : // -4result == 4'b1101 ? 4'h3 : // -3result == 4'b1110 ? 4'h2 : // -2result == 4'b1111 ? 4'h1 : // -14'h0) : result;seg7_decoder u_seg5 (.bin(abs_result), .seg(seg[7]));// 合并所有段选信号assign segs = {seg[0], seg[1], seg[2], seg[3], seg[4], seg[5], seg[6], seg[7]};endmodule// 七段译码器模块
module seg7_decoder (input [3:0] bin,output reg [7:0] seg  // a-g + dp
);always @(*) begincase(bin)4'h0: seg = 8'b00000011; // 04'h1: seg = 8'b10011111; // 14'h2: seg = 8'b00100101; // 24'h3: seg = 8'b00001101; // 34'h4: seg = 8'b10011001; // 44'h5: seg = 8'b01001001; // 54'h6: seg = 8'b01000001; // 64'h7: seg = 8'b00011111; // 74'h8: seg = 8'b00000001; // 84'h9: seg = 8'b00001001; // 9default: seg = 8'b11111111; // 全灭endcaseend
endmodule// 算术运算单元(保持不变)
module arithmetic_unit #(parameter WIDTH = 4
)(input [WIDTH-1:0] a,input [WIDTH-1:0] b,input sub,output [WIDTH-1:0] result,output carry,output overflow,output zero,output sign
);// 中间信号wire [WIDTH-1:0] b_operand;wire carry_in;wire [WIDTH:0] sum;  // 包含进位位的扩展和// 减法转换为补码加法assign b_operand = sub ? ~b : b;assign carry_in = sub ? 1'b1 : 1'b0;// 核心加法器assign sum = {1'b0, a} + {1'b0, b_operand} + {{WIDTH{1'b0}}, carry_in};// 结果和标志位assign result = sum[WIDTH-1:0];assign carry = sum[WIDTH];// 溢出检测: 有符号数溢出发生在:// 1. 正数+正数=负数// 2. 负数+负数=正数assign overflow = (a[WIDTH-1] == b_operand[WIDTH-1]) && (result[WIDTH-1] != a[WIDTH-1]);// 零标志assign zero = (result == {WIDTH{1'b0}});// 符号标志assign sign = result[WIDTH-1];
endmodule

image

7.ALU

波形仿真

image

top.nxdc

top=topa (SW7, SW6, SW5, SW4)
b (SW3, SW2, SW1, SW0)
op (SW15, SW14, SW13)out (LD3, LD2, LD1, LD0)
segs (SEG3A, SEG3B, SEG3C, SEG3D, SEG3E, SEG3F, SEG3G, DEC3P, SEG2A, SEG2B, SEG2C, SEG2D, SEG2E, SEG2F, SEG2G, DEC2P, SEG1A, SEG1B, SEG1C, SEG1D, SEG1E, SEG1F, SEG1G, DEC1P, SEG0A, SEG0B, SEG0C, SEG0D, SEG0E, SEG0F, SEG0G, DEC0P)

top.v

module top #(parameter WIDTH = 4
)(input [WIDTH-1:0] a,      // 操作数Ainput [WIDTH-1:0] b,      // 操作数Binput [2:0] op,           // 操作码output reg [WIDTH-1:0] out, // 运算结果output zero,              // 零标志output carry,             // 进位标志output overflow,          // 溢出标志output [31:0] segs
);alu_4 #(WIDTH) u_alu(.a(a),.b(b),.op(op),.out(out),.zero(zero),.carry(carry),.overflow(overflow));// 各数码管段选信号生成wire [7:0] seg [0:3];seg7_decoder u_seg0 (.bin({{WIDTH-1{1'b0}}, out[3]}), .seg(seg[0]));seg7_decoder u_seg1 (.bin({{WIDTH-1{1'b0}}, out[2]}), .seg(seg[1]));seg7_decoder u_seg2 (.bin({{WIDTH-1{1'b0}}, out[1]}), .seg(seg[2]));seg7_decoder u_seg3 (.bin({{WIDTH-1{1'b0}}, out[0]}), .seg(seg[3]));assign segs = {seg[0], seg[1], seg[2], seg[3]};endmodulemodule alu_4 #(parameter WIDTH = 4
)(input [WIDTH-1:0] a,      // 操作数Ainput [WIDTH-1:0] b,      // 操作数Binput [2:0] op,           // 操作码output reg [WIDTH-1:0] out, // 运算结果output zero,              // 零标志output carry,             // 进位标志output overflow          // 溢出标志
);// 内部信号wire [WIDTH:0] add_result;  // 加法结果(带进位)wire [WIDTH:0] sub_result;  // 减法结果(带进位)wire [WIDTH-1:0] not_out, xor_out, and_out, or_out;wire signed_lt, unsigned_lt, eq;// 算术运算(统一处理带符号和无符号)assign add_result = {1'b0, a} + {1'b0, b};assign sub_result = {1'b0, a} + {1'b0, ~b} + 1;// 逻辑运算assign not_out = ~a;assign xor_out = a ^ b;assign and_out = a & b;assign or_out = a | b;// 比较运算assign eq = (a == b);assign unsigned_lt = sub_result[WIDTH];  // 无符号比较// 带符号比较逻辑wire same_sign = (a[WIDTH-1] == b[WIDTH-1]);wire overflow_sub = (a[WIDTH-1] != b[WIDTH-1]) && (sub_result[WIDTH-1] != a[WIDTH-1]);assign signed_lt = overflow_sub ? ~sub_result[WIDTH-1] : sub_result[WIDTH-1];// 主功能选择always @(*) begincase(op)3'b000: out = add_result[WIDTH-1:0];  // 加法3'b001: out = sub_result[WIDTH-1:0];  // 减法3'b010: out = not_out;3'b011: out = and_out;                // 与3'b100: out = or_out;                 // 或3'b101: out = xor_out;                // 异或3'b110: out = { {(WIDTH-1){1'b0}}, signed_lt };   // 带符号比较3'b111: out = { {(WIDTH-1){1'b0}}, eq }; // 判等default: out = {WIDTH{1'b0}};endcaseend// 标志位生成assign zero = (out == {WIDTH{1'b0}});assign carry = (op == 3'b000) ? add_result[WIDTH] : (op == 3'b001) ? ~sub_result[WIDTH] : 1'b0;assign overflow = (op == 3'b000) ? ((a[WIDTH-1] == b[WIDTH-1]) && (add_result[WIDTH-1] != a[WIDTH-1])) :(op == 3'b001) ? ((a[WIDTH-1] != b[WIDTH-1]) && (sub_result[WIDTH-1] != a[WIDTH-1])) : 1'b0;endmodule// 七段译码器模块
module seg7_decoder (input [3:0] bin,output reg [7:0] seg  // a-g + dp
);always @(*) begincase(bin)4'h0: seg = 8'b00000011; // 04'h1: seg = 8'b10011111; // 14'h2: seg = 8'b00100101; // 24'h3: seg = 8'b00001101; // 34'h4: seg = 8'b10011001; // 44'h5: seg = 8'b01001001; // 54'h6: seg = 8'b01000001; // 64'h7: seg = 8'b00011111; // 74'h8: seg = 8'b00000001; // 84'h9: seg = 8'b00001001; // 9default: seg = 8'b11111111; // 全灭endcaseend
endmodule

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/972544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息论(八):吉布斯不等式的证明

吉布斯不等式的证明,我们要证明: $ D_{\text{KL}}(P | Q) = \sum_x P(x) \log \frac{P(x)}{Q(x)} \geq 0 $ 等号成立当且仅当对于所有 $ x,P(x) = Q(x)$。 步骤 1:对数的一个关键性质,我们使用以下不等式: $ \ln …

题解:AT_agc028_e [AGC028E] High Elements

题意:给出一个序列,要求把这个序列分成两个序列,要求这两个序列的前缀极大值的个数相同,给出字典序最小的构造。 做法: 首先肯定是逐位确定,那么假设第一个序列目前有 \(a\) 个最大值,第二个序列有 \(b\)。注意…

pyppeteer: 得到当前运行中的浏览器

一,代码: import requests from requests.exceptions import HTTPError from pyppeteer.launcher import connectdef get_debugger_url():url = "http://localhost:9222/json/version"try:resp = requests…

AI救星!8个写毕业论文的实用AI工具大揭秘

2025年11月21日,作者临近毕业论文开题答辩却毫无头绪,听到同学推荐AI写论文工具后,试用了8个实用AI工具并分享经验。包括AI论文智作、QuillBot、巨鲸写作等,这些工具各有特点,如大多能30分钟生成5万字初稿,覆盖多…

数据血缘图在数据错误追溯中的应用指南

数据血缘图在数据错误追溯中的应用指南 当终端用户发现数据报告或仪表板中存在错误数据时,架构师可以利用数据血缘图进行系统化的“逆向工程”,快速定位故障的系统、转换过程和时间点。 1. 架构师追溯错误的三维定位…

Luogu P10778 BZOJ3569 DZY Loves Chinese II 题解 [ 紫 ] [ Xor Hashing ] [ 线性基 ] [ DFS 树 ]

DZY Loves Chinese II 一道喵喵哈希题。 对于连通性问题,可以考虑对原图建出 DFS 树,然后对于不同的边采取不同的处理方式。在本题中,如果需要把原图割开,那么至少需要存在一条树边,使得经过它的非树边全都被割开…

CSS基础语法 - 指南

CSS基础语法 - 指南2025-11-21 20:24 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

MineContext:我第一次感觉 AI 真正在“主动帮我管理生活”

MineContext 是一个会在后台记录与整理你日常电脑行为的开源工具。它的体验更像是一种新的信息整理方式:不需要额外输入,你的日常操作本身就是素材我现在一天基本离不开 AI 了。 不是那种“把提示词写得像炼丹”式的…

NCHU OOP-BLOG1-电梯调度-23207329-姚子康 - 翊尘

NCHU OOP-BLOG1-电梯调度程序 正文 1.前言 本次大作业分为三个阶段,每个阶段的最终Boss都是电梯调度程序及迭代,前面是几个关于类设计、正则表达式等等的小题,难度不是很大,但可以锻炼自己的类设计思维能力。 在写…

操作系统的基本概念

操作系统的基本概念1.1.1 操作系统的概念什么是操作系统?操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接…

「Temp」目录

目录吃吃吃\(\color{orange}{Eon\ 今天吃什么【脱产篇】(已完结)}\) \(\color{orange}{Eon\ 今天吃什么【大学篇】}\)Temp\(\color{magenta}{代码模板}\)Trick\(\color{magenta}{常见错误}\) \(\color{magenta}{智慧…

Linksys HTTPd缓冲区溢出远程代码执行漏洞深度解析

本文详细分析了CVE-2025-60690漏洞,该漏洞存在于Linksys E1200 v2路由器的HTTPd服务中,攻击者可通过特制HTTP请求实现远程代码执行,CVSS评分8.8分,属于高危漏洞。概述 CVE-2025-60690是一个存在于Linksys E1200 v2…

.NET+AI | MEAI | Function Calling 基础(3)

.NET+AI | MEAI | Function Calling 基础 一句话概括 Function Calling 是让大模型能够识别用户意图并返回结构化函数调用指令的能力,而不是模型主动调用函数。 为什么需要Function Calling? 大模型虽然强大,但它只能…

开发智联笔记项目时所遇问题(8)

问题:运行项目文件时报错:D:\Pycharm-workspace\pytorchdemo2\project\static>curl -o static/jsmind.js https://cdn.jsdelivr.net/npm/jsmind@0.4.6/js/jsmind.js % Total % Received % Xferd Average Spee…

高中学习机五大品牌终极横评:优缺点一览,找到最适合你的那一款!

进入高中,学习的难度、强度和节奏都发生了质的变化。面对海量的知识点、频繁的考试以及最终的升学压力,一款得力的学习机或许能成为你逆袭路上的“神助攻”。然而,市面上品牌繁多,功能各异,如何选择?今天,我们就…

NCHU-23207335-面向对象程序设计-BLOG-1

NCHU-23207335-面向对象程序设计-BLOG-1Java 实现电梯调度系统:基于单一职责原则的仿真设计 在日常场景中,电梯的高效运行依赖于合理的调度逻辑。本文将围绕一道经典的电梯调度编程题,从题目解析、类设计、核心逻辑…

开发智联笔记项目时所遇问题(4)

问题如图:从图片中的错误信息可以看出,问题出现在 index.html 第209行,错误是 TypeError: %s enable_sheets to see a function。这通常与 jsmind 的初始化或节点操作有关。 问题诊断与解决方案 1. 检查控制台完整错…

开发智联笔记项目时所遇问题(3)

问题:设置节点不自由 在脑图中显示 [object Object] 是因为节点数据结构不正确。jsMind 期望的节点数据结构与当前的数据格式不匹配。 解决方案 1. 修改创建脑图时的数据结构 在 index.html 中,修改 createMap() 函数…

20251121周五日记

20251121周五日记今日: 1.早上起床去学一新店买了几个面包去实验室,碰见亮子和飞一起分享。打两把炉石看了看何恺明新文章去吃午饭。 2.中午依旧减脂餐,吃完回实验室看看文章睡会觉。 3.下午天气很好,出去遛遛,发…

卡码网94: bellman_ford算法

卡码网94: bellman_ford算法算法思想 1.从边入手,对路径进行松弛操作 2.每次更新最短路径(松弛n-1)次 特:可有负权边,但是不能包含负权回路(可以判是否存在负权回路) https://kamacoder.com/problempage.php?…