数字芯片——时钟与复位

news2024/10/6 8:30:17

关于此次章节我想要探讨的问题是门控时钟的处理(Clock Gating Methodology)和时钟复位策略。在低功耗设计中,门控时钟是结构最简洁,最容易实现的电路结构。如上期所讲的,一个控制信号和时钟逻辑与在一起输出的信号作用在其他时序逻辑域,均受该控制信号的控制。如此,当电路空闲的时候,拉低该控制信号,即可降低该部分时序逻辑域的动态功耗。这里会引入一个问题,当门控信号按照一定频率跳转,或者出现glish 时,(AND 逻辑门是不能屏蔽glish ),该glish 会被传递到时钟端,对于时序逻辑电路 这是一个致命的缺陷。从netlist(后仿网表) 仿真会造成时序违例(setup/hold timing violation),假若这样的时序违例不被修改,在实际的电路中这样的一个glish 会导致数字芯片出现异常跳转(不符合设计需求),会导致相应的功能失效。从结果分析就是如此。

如下图1所示:
在这里插入图片描述

基于锁存器的时钟门控方式在设计中增加了一个电平敏感锁存器,以保持使能信号从时钟的有效边沿一直保持到时钟的非有效边沿。

如图2所示:
在这里插入图片描述
由于锁存器能捕捉使能信号的状态,并将其保持到完整的时钟脉冲产生为止,因此使能信号只需在时钟上升沿附近保持稳定即可。采用这种技术后,每次只需改变使能端的信号关闭和开启,从而确保电路的输出不会出现任何毛刺或尖峰。在使用此技术时,应特别注意时钟的占空比和生成使能信号逻辑的延迟,因为使能信号必须在半个时钟周期内产生。如果生成使能信号的逻辑特别复杂,或者时钟的占空比严重不平衡,这种情况可能会导致问题产生。然而,与其它时钟门控方法产生的问题相比,控制占空比和逻辑延迟在电路设计中是可接受的。

为了确保在生产制造过程中达到高故障覆盖率,必须确保时钟门控电路在采用扫描方法学时是完全可控和可观察的。可以加入一个控制信号,该信号使得设计中的所有触发器都能够被时钟驱动,无论使能信号的值是什么,这样做能让扫描链正常地传送信息。这样设计的目的是在进行测试时,通过这个控制信号暂时解除时钟门控,使得扫描测试能够全面触及并验证每个触发器的状态,从而提高对潜在故障的检测能力。此控制信号可以在进入锁存器之前与使能信号进行逻辑或运算,并且可以连接到两种类型的信号之一:一种是贯穿整个扫描测试过程都被置为激活状态的测试模式使能信号;另一种则是在仅在扫描移位期间才被置为激活状态的扫描使能信号。这样的设计允许在不改变正常操作逻辑的前提下,灵活地在测试模式下控制时钟门控行为,确保扫描测试的高效执行与全面的故障覆盖率。

大多数专用集成电路(ASIC)供应商确实会将这种“时钟门控单元”作为其标准库cell的一部分来提供。这意味着设计人员可以方便地利用这些预定义的cell进行设计,以实现高效的时钟管理,同时确保与供应商工艺的兼容性和设计的可靠性。通过直接使用这些标准库中的clock gate cell,工程师能够简化设计流程,减少设计错误,并加速产品的开发周期。

有效的功耗管理可以通过针对特信号使用门控技术来实现。类似于时钟门控的概念,信号门控减少了无时钟控制信号的切换次数。一个最常见的例子就是解码器的使能信号。解码器输入端的一个开关切换将会引起大量门电路的翻转。通过启用或选择信号来控制这一点,可以阻止它们开关活动的传播,这样做会使逻辑稍微复杂。

如图3所示:
在这里插入图片描述
简而言之,信号门控策略,比如利用解码器的使能信号,能够有效减少非时钟信号的无谓切换,以此降低功耗。虽然这可能需要更复杂的控制逻辑,但它能在保持系统功能完整的同时,显著提升能源效率。接下来多嘴说一句数据重排在数字电路中的运用。

数据路径重新排序以减少开关传播是指在数字电路设计中通过调整数据通路中各组件或模块的布局顺序,来优化信号的转换和传播,进而减少能量消耗和延迟的一种方法。这一技术的核心思想是通过分析和改变数据流经不同逻辑门或寄存器的顺序,最小化不必要的信号切换和传播效应。

具体实施时,数字电路设计师可能会考虑以下几点:

  1. 关键路径分析:识别设计中的关键路径,即决定整个系统性能上限的最长信号延迟路径。通过重排,尝试缩短这些路径或减少关键路径上的开关活动。
  2. 信号相关性:分析数据之间的依赖关系,尽量将频繁交互或有数据相关性的模块靠近布置,以减少长距离信号传输造成的延迟和功耗。
  3. 平衡负载:在重排过程中,力求均衡分配到各条总线或资源上的负载,避免局部过载导致的额外能耗。
  4. 利用寄存器重定时:通过插入或调整寄存器的位置,控制信号的流动和时序,减少不必要的数据转发和中间结果的保存,从而降低动态功耗。

通过上述方法,数据路径的重新排序不仅能够减少信号在通路中的传播延迟,还能够显著降低由于信号频繁切换引起的功耗,对于高性能、低功耗的集成电路设计尤为重要。

多个数据通路组件,例如解码器或比较运算器,以及存在“毛刺”现象的逻辑电路,都可能显著增加功率消耗。这些“毛刺”由信号的延迟到达或偏斜造成,它们会穿过其他数据通路元件和逻辑,直到到达寄存器为止。在这个传播过程中,随着信号在逻辑电平间的转换,会消耗更多的功率。为了减少这种无效的功率损耗,设计者需要重写硬件描述语言(HDL)代码,并尽可能缩短传播路径。

如图4所示:
在这里插入图片描述
4展示了优先级复用器的两种实现方式,其中 “毛刺”发生和“稳定”状态 的排列顺序有所不同。通过优化这些实现方式,选择一个更合理的信号排列顺序,可以有效减少毛刺传播,从而降低功耗。理想情况下,设计者会倾向于采用“稳定”条件下的实现方式,因为它能更有效地抑制毛刺信号的产生与传播,保持信号的干净与稳定,最终达到节能的目的。

对于相关复位的话题在前面的内容中有提及,感兴趣可以往前面的内容再次看看。

复位的主要目的是迫使片上系统(SoC)进入一个已知的状态以确保稳定运行。这样可以避免SoC上电后处于随机状态而导致系统挂起。一旦SoC构建完成,是否需要施加复位主要由系统需求、SoC的应用场景以及SoC的设计本身决定。一个良好的设计准则是,无论系统是否明确要求,都应对SoC中的每一个触发器提供复位信号。但在某些情况下,对于高速应用中使用的流水线触发器(移位寄存器触发器),为了实现更高性能的设计,可能会从某些触发器中省略复位信号。

设计时可以选择使用异步复位、同步复位或两者结合的方式。使用同步或异步复位各有其明显的优势和劣势,且在实际设计中任一方法都能得到有效应用。设计者必须采用最适合其设计的方法。

同步复位

同步复位基于这样一个前提:复位信号仅在时钟的有效边沿影响或重置触发器的状态。在某些仿真器中,根据逻辑方程,逻辑可能会阻止复位信号到达触发器。但这仅是一个仿真问题,并非真实的硬件问题。

如图5所示:
在这里插入图片描述

同步复位存在的一个问题是,综合工具很难将复位信号与任何其他数据信号区分开来。综合工具可能无意中将复位信号当作普通数据信号处理,从而生成不符合预期的电路结构。为了避免这种情况,设计者需要明确指示综合工具如何处理复位信号,或者在HDL代码中采用特定的编码风格来区分复位逻辑,确保复位信号得到正确的合成。

如图6所示:
在这里插入图片描述

例如,如果讨论的是图6中未提及的具体电路结构,应当是指某种特定的、优化过的或正确处理复位信号的电路布局。正确指导综合工具生成期望的电路图是解决这一问题的关键,这可能涉及到使用复位专用的引脚属性标注、专门的复位控制模块或者遵循特定的编码约定,以确保复位逻辑的意图在综合和布局布线阶段不被误解。

5所示的电路在功能上与图6所示的实现完全一致,唯一的不同在于复位与门被放置在了多路复用器(MUX)的外部。现在,考虑在门级仿真开始时会发生什么情况。通过保持“rst_n”为低电平(即复位信号有效),可以强制MUX两个通道的输入均为0。但是,如果“load”信号处于未知状态(X)且MUX的仿真模型较差,那么触发器的状态将保持未知(X),而不是被复位至0。需要注意的是,这个问题仅在仿真过程中存在。真实的电路会正常工作,将触发器成功复位至0

综合工具常常会提供编译器指令,这些指令告诉综合工具某个特定信号是同步复位(或置位)信号。综合工具随后会尽可能地将这个复位信号“pull”至触发器,以防止初始化问题的发生。通过这种方式优化复位信号的路由,确保复位功能在实际电路及仿真环境中都能正确执行。在实际的数字电路设计中,有一个很重要的流程需要设计者去清除的就是CDC问题了(vcspyglass 等),用工具去检查自己电路设计的合理性。

建议从项目一开始就将这些指令添加到RTL代码中,以避免在项目后期重新进行设计综合,这样做可以防止因遗忘或推迟设置而导致的时间成本和潜在的设计风险。在项目初期明确指定哪些信号为同步复位或置位信号,可以帮助综合工具从一开始就正确处理这些信号,确保后续的仿真和硬件实现都能顺利进行,同时也便于进行设计审查和维护。这样能够提前发现并解决问题,提高设计的可靠性和开发效率。

同步复位设计的优势与劣势:

  1. 同步复位通常确保电路100%处于同步状态。这意味着所有的状态变化,包括复位过程,都在时钟边沿控制之下,有助于维持时序的确定性和一致性。
  2. 同步复位逻辑通常综合出更小的触发器,特别是当复位信号与生成触发器输入逻辑相结合时。这样可以减少所需硬件资源,优化芯片面积和功耗。
  3. 同步复位确保复位仅在时钟的有效边沿发生。时钟起到了滤波器的作用,可以消除微小的复位毛刺,防止这些毛刺引起不希望的电路状态变化。
  4. 在某些设计中,复位信号需要由一系列内部条件生成。对于这类设计,推荐使用同步复位,因为它能够在时钟之间过滤掉逻辑方程中的毛刺,从而避免因内部逻辑瞬态错误引发的不必要复位,增加了系统的稳定性和可靠性。

并非所有ASIC库都包含内置同步复位功能的触发器。因为同步复位实质上等同于触发器的另一个数据输入,所以复位逻辑可以很自然地在触发器外部进行综合生成。这意味着不必依赖库中自带同步复位的特定触发器类型,设计者完全可以在触发器外部构造所需的复位控制逻辑,从而实现同步复位功能,这也增加设计复杂度和逻辑面积。

  1. 同步复位可能需要脉冲扩展器:为了确保复位脉冲宽度足够宽,以便在时钟的有效边沿期间复位信号保持有效,同步复位设计中可能需要使用脉冲扩展器。这一点在多时钟域设计中尤为重要。可以通过添加一个小计数器来保证复位脉冲至少持续一定数量的时钟周期。
  2. 组合逻辑产生的复位潜在问题:如果片上系统(SoC)中的复位信号由组合逻辑生成,或者复位信号需要穿过多级局部组合逻辑,那么在仿真过程中,根据复位信号的生成方式或应用到功能块的方式,复位信号可能会被未知值(X)所掩盖。问题的关键不在于复位类型的本身,而是复位信号是否能容易地通过外部引脚进行控制。
  3. 同步复位固有的时钟依赖性:同步复位的本质要求在复位电路时必须有工作时钟。这在某些情况下可能成为问题,特别是当使用门控时钟来节省功耗时,复位被声明的同时时钟也会被禁用。仅在异步复位的情况下,这种情况才能得到解决,因为在时钟恢复前复位信号就可以被撤销。

ASIC(专用集成电路)或FPGA(现场可编程门阵列)中,如果存在内部三态总线,那么在复位条件时对时钟的需求就显得尤为重要。为了防止芯片上电时内部三态总线上出现总线竞争,芯片应该具备上电异步复位功能,正如图7中所示那样。

如图7所示:
在这里插入图片描述
上电异步复位的重要性在于:

  1. 防止总线冲突:上电瞬间,如果没有明确的状态控制,连接在同一总线上的多个器件可能同时尝试驱动总线,导致不可预测的行为甚至损坏,因为总线冲突。异步复位确保所有连接到总线的器件在允许任何器件驱动总线前,都处于已知状态(通常是高阻抗态或固定输出电平)。
  2. 确保干净的初始化:异步复位由电源电压达到足够水平触发,确保在电源接通后尽快启动初始化序列,无需等待时钟信号稳定。这对于内部总线尤其重要,因为在初始上电阶段保持数据完整性是至关重要的。
  3. 复位后的同步:异步复位将所有设备置于安全状态后,芯片内部的同步逻辑便可以接管。这通常涉及同步复位机制,进一步将内部状态机和逻辑与系统时钟同步,确保从复位状态平稳过渡到工作状态。

那么我们谈谈寄存器异步复位的优劣:
在这里插入图片描述

  1. 使用异步复位的最大优势在于,只要供应商库中提供了支持异步复位的触发器,就能确保数据通路的纯净性。对于那些数据通路时序已经非常紧张的设计来说,无法承受因插入用于处理同步复位的额外逻辑门以及由此带来的网络延迟。采用异步复位,设计者可以确保复位信号不会被添加到数据通路中,从而不影响原有时序。
  2. 支持异步复位最明显的优点是,无论是否有时钟存在,电路都可以被复位。综合工具倾向于自动推断异步复位,而无需设计者手动添加任何综合属性,这简化了设计流程并减少了潜在的人为错误。

异步复位的缺点包括:

  1. 对于DFT(设计可测性)而言,如果异步复位不由I/O引脚直接驱动,则在进行DFT扫描和测试时,必须禁用来自复位驱动器的复位网络。这意味着需要额外的控制机制来确保测试的完整性。
  2. 异步复位最大的问题在于它的提出和撤销都是非同步的。复位信号的提出一般不会有问题,但撤销时却可能引发问题。如果异步复位在触发器的有效时钟边沿附近被释放,触发器的输出可能会进入亚稳态,从而导致SoC的复位状态丢失。
  3. 根据复位信号的来源,异步复位还可能面临由板上或系统级复位线路上的噪声或毛刺引起的误复位问题。通常需要设计去毛刺滤波器来消除毛刺对复位电路的影响。若此类问题在系统中较为严重,可能会促使设计者考虑采用同步复位作为解决方案。
  4. 无论采用同步还是异步复位,复位信号树的时序都必须经过精心安排,确保复位释放能在一拍时钟周期内完成。复位信号树的时序分析应在布局之后进行,以确保满足这一时序要求。为解决这一问题,一种方法是采用分布式复位同步器触发器,这样可以减轻时序约束并增强系统的鲁棒性。

异步复位移除问题:

在系统中移除异步复位可能导致芯片进入亚稳态或未知状态,因此需避免复位过程中的这一问题。在解除复位时必须格外小心,确保在复位释放时芯片不会进入亚稳态。使用同步复位时,复位的前沿和后沿都应远离时钟的活动边沿。

如图8所示:
在这里插入图片描述
如图8所示,当异步复位信号与时钟信号不同步地解除时,存在两个潜在问题:

  1. 违反复位恢复时间。复位恢复时间指的是复位信号解除到时钟信号再次变高之间的时间间隔。如果未能满足这一恢复时间要求,可能会导致寄存器数据输出的信号完整性问题或亚稳态问题。
  2. 不同时钟周期下,不同序列元件的复位移除。当复位解除与上升时钟边沿不同步时,复位信号和/或时钟信号的传播延迟微小差异,可能导致某些寄存器或触发器在其他寄存器之前提前退出复位状态,从而引起同步问题和数据不一致性。

解决异步复位移除问题的方法是使用复位同步器(Reset Synchronizer)。这是在使用异步复位的电路中保证正确移除复位的最常用技术。如果不使用复位同步器,即使在仿真过程中复位能够正常工作,异步复位在最终系统中的效用也将变得毫无意义。

简而言之,复位同步器是实现异步复位信号与系统时钟域同步的关键,它解决了异步信号引入的不确定性问题,提高了电路的稳定性和可靠性,是设计中不可或缺的一环,尤其是在复杂的多时钟域系统设计中。

作为一个异步复位源,复位信号毛刺的规避尤为重要,因为其毛刺引起的电路错误很严重,如何规避复位源的毛刺?

  1. 异步复位易受到毛刺的影响,这意味着任何宽度达到触发器最小复位脉冲宽度的输入信号都会导致触发器复位。如果复位线路遭受毛刺干扰,这将是一个实际问题。设计中可能没有非常高频率的采样时钟来检测复位信号上的微小毛刺。在数字电路设计中提出了一种可以滤除毛刺的方法。该方案需要一个数字延迟来滤除微小的毛刺。 复位输入引脚也应该是一个施密特触发电路的引脚,以辅助毛刺滤波。图9展示了复位毛刺滤波电路及其时序图。
  2. 为了增加延迟,一些供应商提供了可手工实例化的延迟宏。如果没有可用的延迟宏,设计者可以在优化后手动将延迟插入到综合设计中。第二种方法是在模块中实例化一个慢速缓冲器,然后多次实例化该模块以获得所需的延迟。基于此概念可以发展出多种变化形式。
  3. 由于这种方法使用了延迟线,其缺点之一是延迟会随温度、电压和工艺的变化而变化。必须谨慎确保在所有PVT(工艺、电压、温度)角上,延迟都能满足设计要求。

如图9所示:

在这里插入图片描述

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

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

相关文章

redis设计与实现(四)服务器中的数据库

服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态server.h结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。 在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少…

产品人生(12):从“产品生命周期管理”看如何做“职业规划”

产品生命周期管理是产品人常接触的一个概念,它是一种全面管理产品从概念构想、设计开发、生产制造、市场推广、销售使用,直至最终退役的全生命周期过程的方法论和一系列业务流程。下面我们来简单介绍下产品生命周期管理: 概念阶段&#xff1a…

C++ | Leetcode C++题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:void addPath(vector<int> &vec, TreeNode *node) {int count 0;while (node ! nullptr) {count;vec.emplace_back(node->val);node node->right;}reverse(vec.end() - count, vec.end());}vect…

【全开源】多平台租房系统源码(Fastadmin+ThinkPHP+Uniapp)

&#x1f3e0;多平台租房系统&#xff1a;一站式租房新体验&#x1f50d; &#x1f310;一、引言&#xff1a;租房市场的变革 在快节奏的现代生活中&#xff0c;租房已成为许多人解决居住问题的首选。然而&#xff0c;传统的租房方式往往繁琐且效率低下。随着互联网的飞速发展…

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载)

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载) iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia/&a…

全方位·多层次·智能化,漫途水库大坝安全监测方案

党的十九届五中全会提出&#xff0c;到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 加快推进小型水库除险加固。加快构建气象卫星和测雨雷达、雨量站、水文站组成…

GIS之arcgis系列10:arcpy实现批量掩膜提取

按掩膜提取 (Spatial Analyst) 提取掩膜所定义区域内的相应栅格像元。 OutRas ExtractByMask(InRas1, InMsk1, "INSIDE") 使用情况 输入栅格中的其他属性&#xff08;若有的话&#xff09;将按照原样添加到输出栅格属性表。 根据所记录的属性&#xff0c;某些属性…

Golang | Leetcode Golang题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; func reverse(a []int) {for i, n : 0, len(a); i < n/2; i {a[i], a[n-1-i] a[n-1-i], a[i]} }func postorderTraversal(root *TreeNode) (res []int) {addPath : func(node *TreeNode) {resSize : len(res)for ; node ! nil; node n…

STM32—U8g2图形库练习

一、新建CubeMX工程 1.照例将RCC配置为外部高速晶振&#xff08;精度更高&#xff09;——HSE&#xff1b;将SYS的Debug设置成Serial Wire&#xff08;否则可能导致芯片自锁)&#xff1b; 2.配置I2C2作为OLED的通讯方式。 3.TIM1配置&#xff1a;U8g2图形库需要us级延迟推动&…

uniapp地图选择位置

直接上代码 通过一个点击事件调用官方api即可调用 点击调用成功后显示如下 然后选择自己所需要的位置即可

Mssql数据注入

1.查询用户创建的数据表 select id,name from sysobjects where xtypeu ; 2.查询用户创建数据表的具体列名 select * from syscolumns where id 上一步获取的id值; 3.查询具体内容 select id,字段名 from 数据表名&#xff1b; 4.数据库名 db_name() 5.用户登录名 su…

使用Ollama简单部署本地Qwen2

Ollama 是一个开源的、本地运行的 AI 聊天模型&#xff0c;允许在自己的设备上运行 LLM&#xff0c;无需依赖云服务。它支持多种 LLM。目前Ollama library已经支持Qwen2&#xff0c;可以直接使用。 首先安装ollama&#xff0c; 访问官网 下载 ollama 对应版本 Download Ollama…

数字时代网络安全即服务的兴起

在日益数字化的世界里&#xff0c;威胁形势不断演变&#xff0c;网络攻击变得越来越复杂和频繁。当组织努力保护敏感数据并保持运营完整性时&#xff0c;传统的网络安全措施往往不够。 这为更具动态性和可扩展性的解决方案铺平了道路&#xff1a;网络安全即服务 (CSaaS)。网络…

Vitis HLS 学习笔记--矢量数据类型

目录 1. 简介 2. 用法详解 2.1 存储器布局 2.2 示例展示 2.3 综合报告 3. 总结 1. 简介 在 Vitis HLS 中&#xff0c;矢量数据类型是一种特殊的数据类型&#xff0c;它允许你一次处理多个数据元素&#xff0c;就像一排并排的盒子&#xff0c;每个盒子里都装着一个数据元…

大模型基础——从零实现一个Transformer(3)

大模型基础——从零实现一个Transformer(1)-CSDN博客 一、前言 之前两篇文章已经讲了Transformer的Embedding,Tokenizer,Attention,Position Encoding, 本文我们继续了解Transformer中剩下的其他组件. 二、归一化 2.1 Layer Normalization layerNorm是针对序列数据提出的一种…

基于STM32移植U8g2图形库——OLED显示(HAL库)

文章目录 一、U8g2简介1、特点2、U8g2的使用步骤 二、I2C相关介绍1、I2C的基本原理2、I2C的时序协议 三、OLED屏的工作原理四、汉字点阵显示原理五、建立STM32CubeMX工程六、U8g2移植1、U8g2源码2、移植过程 七、代码编写1、参考博主实现的U82G的demo例程&#xff08;1&#xf…

VMware Workerstation开启虚拟机后,产生乱码名称日志文件

问题情况 如下图所示&#xff0c;我的虚拟机版本是16.1.2版本&#xff0c;每次在启动虚拟机之后&#xff0c;D盘目录下都会产生一个如图下所示的乱码名称文件。同时&#xff0c;虚拟机文件目录也是杂乱不堪&#xff0c;没有按照一台虚拟机对应一个文件夹的形式存在。 问题处理…

笔记 | 软件工程06-1:软件设计-软件设计基础

1 软件设计概述 1.1 为什么要软件设计 1.2 何为软件设计 何为软件系统的解决方案&#xff1f; 软件设计关注与软件需求的实现问题软件设计是需求分析和软件实现间的桥梁 1.3 软件设计的质量要求 1.4 软件设计的过程 1.4.1 软件体系结构设计 1.4.2 用户界面设计 1.4.3 软件详细…

最短路径Dijkstra算法详解

目录 最短距离问题 最短路径问题 进阶--标尺增多 升级方法 例题应用 最短距离问题 Dijkstra算法的策略&#xff1a; 设置集合S存放已被访问的顶点&#xff0c;然后执行n次下面的两个步骤&#xff08;n为顶点个数&#xff09;&#xff1a; &#xff08;1&#xff09;每次…

go-zero整合Excelize并实现Excel导入导出

go-zero整合Excelize并实现Excel导入导出 本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 本教程主要实现go-zero框架整合Excelize&#xff0c;并暴露接口实现Excel模板下载、Excel导入、Excel导出。 go-zero微服务入门教程&#xff1a;https://blo…