Quartus II实战:基于状态机的8位LED流水灯设计与时序分析
1. 从零开始为什么选择状态机来做流水灯大家好我是老张一个在FPGA和嵌入式领域摸爬滚打了十多年的工程师。今天想和大家聊聊一个非常经典但又常常让新手感到困惑的入门项目用状态机实现8位LED流水灯。你可能在网上看过很多流水灯的代码有的用移位寄存器有的用计数器看起来很简单。那我为什么还要费劲用状态机来实现呢这里面的门道恰恰是新手从“能跑通代码”到“理解数字逻辑设计”的关键一步。我刚开始学FPGA的时候也觉得流水灯嘛不就是让灯挨个亮起来用个循环或者移位不就行了但实际做项目尤其是产品级的开发你会发现事情没那么简单。比如你的流水灯需要响应外部按键来改变模式吗需要在某个灯亮到一半的时候暂停吗需要根据不同的条件跳转到不同的亮灯序列吗一旦需求稍微复杂一点你之前写的那个简单循环或者移位逻辑就会变成一堆难以维护的“面条代码”各种if-else嵌套自己过两周都看不懂。这时候状态机的优势就体现出来了。你可以把状态机想象成一个有“记忆”和“明确状态”的智能开关。它知道自己当前处在“点亮第一个灯”、“点亮第二个灯”还是“全部熄灭”的状态。它根据时钟的节拍比如每100ms和当前的状态决定下一个时刻要切换到哪个状态并输出对应的控制信号比如哪个LED该亮。这种设计思路清晰、结构严谨非常适合描述这种有顺序、有步骤的控制流程。用状态机写的代码就像一份清晰的说明书谁来看都能明白整个系统的工作流程。所以今天我们不仅仅是为了让灯流水起来更是要通过这个项目掌握状态机这个FPGA和数字电路设计中无比强大的工具。我会手把手带你用Quartus II和Verilog从理论分析、代码编写、仿真验证到时序分析完整地走一遍。2. 实战前的准备理解核心原理与计算在打开Quartus II写第一行代码之前我们必须把几个关键的计算和概念搞清楚这能避免后面调试时一头雾水。咱们这个项目的核心目标很明确让8个LED灯以100毫秒为间隔一个一个地依次点亮等全亮后再全部熄灭然后重新开始循环。2.1 时钟周期一切计时的基准我们的FPGA开发板通常都会有一个外部晶振提供主时钟。最常见的是50MHz。这个数字是什么意思呢Hz是频率单位表示每秒振荡的次数。50MHz就是每秒振荡5千万次50,000,000次。那么振荡一次的时间也就是一个时钟周期是多少呢计算公式是周期 T 1 / 频率 f。 所以对于50MHz的时钟T 1 / (50 * 10^6) 20 * 10^(-9) 秒 20纳秒。 这意味着我们的FPGA内部逻辑每过20纳秒就会根据时钟上升沿或下降沿来更新一次状态。这是我们所有计时的基础单位。2.2 从100ms到计数器值把时间翻译成FPGA能懂的语言FPGA不懂什么是“100毫秒”它只认识“多少个时钟周期”。所以我们需要把100ms这个时间要求翻译成FPGA能理解的“计数次数”。100ms 0.1秒。既然一个时钟周期是20纳秒20e-9秒那么0.1秒里包含的时钟周期数就是N 时间 / 时钟周期 0.1秒 / (20 * 10^(-9) 秒) 5,000,000。 没错就是500万个时钟周期。我们的计数器需要从0开始数数到4,999,999因为从0开始计数然后在第500万个时钟上升沿到来时表示100ms时间到该进行下一步动作了比如切换到下一个状态。在代码里我们通常会定义一个参数TIME_100MS把它设为5_000_000Verilog中可以用下划线增加可读性。2.3 LED状态编码用二进制控制硬件我们的输出是控制8个LED灯。在硬件电路上通常LED阴极接地阳极通过一个限流电阻接到FPGA的引脚上。当FPGA引脚输出高电平‘1’时LED两端没有电压差灯灭当输出低电平‘0’时电流导通灯亮。这是一种“低电平有效”的接法非常普遍。所以我们要用8位二进制数一个8位的寄存器或线网来控制LED。每一位对应一个LEDled[7]对应 LED7最左边或最右边根据你的板子定义led[0]对应 LED0输出8‘b1111_1110即8‘hFE表示只有led[0]输出0即只有第一个灯亮。输出8‘b1111_1100即8‘hFC表示led[1:0]输出00即第一、二个灯亮。以此类推直到8‘b0000_0000即8‘h00表示所有灯都亮。全部熄灭的状态就是8‘b1111_11118‘hFF。你看用状态机来描述“亮到第几个灯了”其输出就是这些预先定义好的8位数值非常直观。3. 状态机设计画出清晰的“思维导图”理解了时间和输出编码我们就可以开始设计状态机了。这是整个项目的“大脑”。我强烈建议大家在写代码前先在纸上或者绘图工具上画出状态转移图这能极大提升设计效率和正确率。3.1 定义状态对于我们的流水灯状态其实就是流水灯进行到的“阶段”。一个最直接的设计是IDLE空闲状态系统复位后的状态所有LED熄灭等待开始。通常我们一上电或者按下复位键就进入这个状态。S0点亮第1个LED的状态。S1点亮第1、2个LED的状态。S2点亮第1、2、3个LED的状态。S3点亮前4个LED的状态。S4点亮前5个LED的状态。S5点亮前6个LED的状态。S6点亮前7个LED的状态。S7点亮全部8个LED的状态。S_ALL_ON一个特殊状态保持全部点亮一段时间比如100ms然后进入熄灭流程。但根据我们的需求依次点亮后全部熄灭再循环也可以简化在S7状态保持100ms后直接跳转到一个“全部熄灭”的状态。S_ALL_OFF全部熄灭的状态并在此状态保持100ms然后跳转回S0开始新一轮循环。这样我们就有10个状态。你可以用参数parameter或宏定义来给这些状态赋值。为了综合工具优化通常推荐使用“独热码”One-Hot编码即每个状态用一个独立的比特位表示。对于10个状态需要10位宽。比如parameter IDLE 10‘b0000_0000_01; parameter S0 10‘b0000_0000_10; parameter S1 10‘b0000_0001_00; // ... 以此类推 parameter S_ALL_OFF 10‘b10_0000_0000;独热码的优点是状态译码简单在FPGA中利用丰富的触发器资源运行速度通常更快。对于小型设计也可以用二进制编码但独热码是更专业的做法。3.2 状态转移逻辑状态机有两个核心部分下一个状态逻辑和输出逻辑。转移条件很简单在任何一个状态比如S0当这个状态持续的时间达到100ms就跳转到下一个状态S1。如何判断100ms到了这就是我们前面计算的计数器大显身手的时候了。我们需要一组计数器吗其实不需要。我们可以只用一个全局计数器delay_cnt在每个状态下独立计数。具体规则是当进入一个新状态如S0时delay_cnt清零。在每个时钟上升沿如果当前状态是S0delay_cnt就加1。当delay_cnt数到TIME_100MS - 1即4,999,999时说明已经在S0状态保持了100ms下一个时钟上升沿状态机就应该跳转到S1。跳转到S1的瞬间delay_cnt再次被清零然后开始为S1状态计时。你看只需要一个计数器配合状态机就能为每个状态精准计时。状态转移图就是一个简单的链条IDLE - S0 - S1 - S2 - ... - S7 - S_ALL_OFF - S0循环。每个箭头上标注的条件都是“延时100ms到达”。3.3 输出逻辑输出逻辑是组合逻辑只依赖于当前状态Current State。这是一个摩尔型状态机Moore Machine的特点输出仅与状态有关。always (*) begin case (curr_st) IDLE: led 8‘hFF; // 全灭 S0: led 8‘hFE; // 1111 1110 S1: led 8‘hFC; // 1111 1100 S2: led 8‘hF8; // 1111 1000 S3: led 8‘hF0; // 1111 0000 S4: led 8‘hE0; // 1110 0000 S5: led 8‘hC0; // 1100 0000 S6: led 8‘h80; // 1000 0000 S7: led 8‘h00; // 0000 0000 全亮 S_ALL_OFF: led 8‘hFF; // 全灭 default: led 8‘hFF; // 默认情况安全设计 endcase end这段代码非常清晰每个状态对应一个固定的LED输出模式。4. 手把手代码编写在Quartus II中实现理论准备就绪我们打开Quartus II开始动手。我用的版本是Quartus Prime Lite 21.1但各版本基础操作大同小异。4.1 创建工程与文件首先新建一个工程选择好你的FPGA器件型号比如Cyclone IV EP4CE6E22C8。然后创建一个新的Verilog HDL文件命名为led_flow_fsm.v。4.2 编写Verilog代码下面是我根据上面设计思路写出的完整代码并加上了详细的注释。你可以直接复制过去但建议自己敲一遍加深理解。module led_flow_fsm ( input wire clk, // 50MHz时钟输入 input wire rst_n, // 低电平有效的复位信号 output reg [7:0] led // 8位LED输出低电平点亮 ); // 参数定义 localparam CLK_FREQ 50_000_000; // 时钟频率50MHz localparam TIME_100MS CLK_FREQ / 10; // 100ms对应的时钟周期数5_000_000 // 状态定义独热码编码共10个状态 localparam S_WIDTH 10; localparam IDLE 10‘b0000_0000_01; localparam S0 10‘b0000_0000_10; localparam S1 10‘b0000_0001_00; localparam S2 10‘b0000_0010_00; localparam S3 10‘b0000_0100_00; localparam S4 10‘b0000_1000_00; localparam S5 10‘b0001_0000_00; localparam S6 10‘b0010_0000_00; localparam S7 10‘b0100_0000_00; localparam S_ALL_OFF 10‘b1000_0000_00; // 内部寄存器声明 reg [S_WIDTH-1:0] curr_st, next_st; // 当前状态下一状态 reg [31:0] delay_cnt; // 延时计数器32位足够计数5e6 // 状态机时序逻辑部分 // 负责在时钟边沿更新当前状态 always (posedge clk or negedge rst_n) begin if (!rst_n) begin curr_st IDLE; // 复位时进入空闲状态 end else begin curr_st next_st; // 否则更新为下一状态 end end // 状态机组合逻辑部分下一状态逻辑 // 根据当前状态和计数器决定下一个状态是什么 always (*) begin next_st curr_st; // 默认保持当前状态避免产生锁存器 case (curr_st) IDLE: begin next_st S0; // 上电复位后自动开始流水 end S0: begin if (delay_cnt TIME_100MS - 1) next_st S1; end S1: begin if (delay_cnt TIME_100MS - 1) next_st S2; end S2: begin if (delay_cnt TIME_100MS - 1) next_st S3; end S3: begin if (delay_cnt TIME_100MS - 1) next_st S4; end S4: begin if (delay_cnt TIME_100MS - 1) next_st S5; end S5: begin if (delay_cnt TIME_100MS - 1) next_st S6; end S6: begin if (delay_cnt TIME_100MS - 1) next_st S7; end S7: begin if (delay_cnt TIME_100MS - 1) next_st S_ALL_OFF; // 全亮后进入全灭状态 end S_ALL_OFF: begin if (delay_cnt TIME_100MS - 1) next_st S0; // 全灭100ms后重新开始 end default: begin next_st IDLE; // 异常情况回到初始状态 end endcase end // 延时计数器逻辑 // 在每个状态下独立计数状态改变时清零 always (posedge clk or negedge rst_n) begin if (!rst_n) begin delay_cnt 0; end else begin if (curr_st ! next_st) begin // 状态即将发生变化时 delay_cnt 0; // 计数器清零 end else if (delay_cnt TIME_100MS - 1) begin // 计数已满 delay_cnt 0; // 清零为下一个状态准备虽然下一拍状态会变 end else begin delay_cnt delay_cnt 1‘b1; // 正常计数 end end end // 输出逻辑组合逻辑 // 根据当前状态直接赋值LED输出 always (*) begin case (curr_st) IDLE: led 8‘hFF; S0: led 8‘hFE; S1: led 8‘hFC; S2: led 8‘hF8; S3: led 8‘hF0; S4: led 8‘hE0; S5: led 8‘hC0; S6: led 8‘h80; S7: led 8‘h00; S_ALL_OFF: led 8‘hFF; default: led 8‘hFF; endcase end endmodule代码要点解析参数化设计CLK_FREQ和TIME_100MS使用了参数这样如果换用不同频率的晶振比如25MHz只需要修改一个地方代码复用性高。三段式状态机这是最推荐、最清晰的状态机写法。第一段用时序逻辑同步状态第二段用组合逻辑计算下一状态第三段用组合逻辑产生输出。结构清晰易于综合和调试。计数器清零时机注意我写的计数器清零逻辑if (curr_st ! next_st)。这是在当前状态和计算出的下一状态不同时清零。这意味着在状态跳变的那一个时钟周期计数器已经归零开始为新状态计时。这是一种非常严谨的写法。默认情况case语句中务必加上default分支这是一个良好的代码习惯能避免综合出意外的锁存器提高电路可靠性。4.3 引脚分配与编译代码写完后我们需要告诉Quartus II哪个物理引脚对应我们的clk、rst_n和led[7:0]。这需要通过分配引脚来实现。点击菜单Assignments - Pin Planner。在Pin Planner窗口中你会看到所有的输入输出端口。在Location列为每个端口输入你开发板原理图上对应的引脚号。例如clk可能连接到全局时钟引脚如PIN_23。rst_n可能连接到一个按键如PIN_24。led[0]到led[7]分别连接到8个LED对应的引脚如PIN_41,PIN_42...等。分配完成后保存。回到主界面点击Processing - Start Compilation进行全编译。如果没有错误你会看到编译成功的提示并生成一个.sof文件用于下载。5. 仿真验证用ModelSim确保逻辑正确代码编译通过不代表逻辑一定正确。我们必须通过仿真来验证行为是否符合预期。Quartus II通常自带或可以关联ModelSim。5.1 编写测试平台Testbench我们创建一个新的Verilog文件作为测试平台命名为tb_led_flow_fsm.v。它不参与综合只用于仿真。timescale 1ns/1ns // 定义时间单位/精度 module tb_led_flow_fsm(); // 定义激励信号 reg clk; reg rst_n; wire [7:0] led; // 实例化被测试模块 led_flow_fsm u_led_flow_fsm ( .clk (clk), .rst_n (rst_n), .led (led) ); // 生成50MHz时钟周期20ns initial clk 0; always #10 clk ~clk; // 每10ns翻转一次周期20ns // 施加激励 initial begin // 初始化 rst_n 0; #100; // 保持复位100ns rst_n 1; // 释放复位 // 让仿真运行足够长的时间观察多个循环 #500_000_000; // 仿真运行500ms足以看到几个完整周期 $stop; // 停止仿真 end // 可选将信号变化记录到波形文件 initial begin $dumpfile(wave.vcd); // 生成波形文件名为wave.vcd $dumpvars(0, tb_led_flow_fsm); // 记录本模块所有信号 end endmodule5.2 运行仿真并分析波形在Quartus II中设置好仿真工具为ModelSim然后运行RTL仿真。你会看到波形窗口。复位阶段最开始rst_n0你应该看到curr_st是IDLEled输出为FF全灭。释放复位rst_n拉高后状态应立即从IDLE跳转到S0同时led输出变为FE第一个灯亮。观察计数与跳转在S0状态观察delay_cnt从0开始每20ns一个时钟周期加1。当它增加到4_999_999注意看十六进制或十进制显示时下一个时钟上升沿状态跳转到S1同时led输出变为FC前两个灯亮delay_cnt瞬间清零并重新开始计数。遍历所有状态依次观察状态是否按S0 - S1 - ... - S7 - S_ALL_OFF - S0的顺序循环跳转每个状态是否稳定保持100ms在波形上大约是5,000,000个时钟周期宽度的“块”LED输出是否同步变化。检查循环观察从S_ALL_OFF跳回S0的过程确保循环正常。如果波形完全符合预期那么恭喜你你的状态机逻辑设计是正确的这一步至关重要能节省大量板上调试的时间。6. 时序分析你的设计真的能在硬件上跑稳吗这是很多新手会忽略但实际项目中极其重要的一步。编译报告里的“Timing Analysis”部分告诉你设计是否满足时序要求。简单说就是你的逻辑电路从寄存器到寄存器的传输延迟必须小于一个时钟周期20ns否则就会产生“时序违例”导致电路在实际芯片上工作不稳定。6.1 查看时序报告编译完成后点击Processing - Compilation Report。在报告里找到Timing Analyzer-Slow 1200mV 85C Model-Fmax Summary。这里会显示你的设计能稳定运行的最大时钟频率Fmax。如果这个值大于你实际的时钟频率50MHz说明时序收敛设计是可靠的。如果小于50MHz比如只显示30MHz那就意味着你的设计在50MHz下可能会出错。6.2 如何优化时序对于我们这个简单的流水灯时序通常都能轻松满足。但了解优化方法对以后做复杂项目有帮助。如果遇到时序违例可以尝试流水线设计将大的组合逻辑拆分成多个时钟周期完成。寄存器打拍对关键路径的信号插入一级寄存器虽然增加了一个时钟周期的延迟但改善了时序。优化状态编码这就是为什么我们使用独热码它通常比二进制编码有更简单的译码逻辑可能带来更好的时序。减少扇出一个信号驱动太多负载比如复位信号rst_n驱动所有寄存器会导致延迟增大。可以通过插入缓冲器或复制寄存器来降低扇出。在我们的项目中主要延迟路径可能来自那个32位的大计数器delay_cnt的比较器判断是否等于TIME_100MS-1。Quartus的综合工具通常能很好地处理这种比较。你可以在时序报告中查看“Worst-Case Timing Paths”了解具体是哪条路径最慢。7. 上板调试与问题排查将编译生成的.sof文件下载到FPGA开发板后你可能会遇到一些问题。别慌这是学习的必经之路。问题一LED完全不亮或常亮。检查引脚分配这是最常见的问题。再三核对Pin Planner中的分配是否与开发板原理图完全一致。特别是LED是高电平有效还是低电平有效我们的代码假设是低电平有效如果你的板子是高电平有效就需要把输出取反led ~8‘hFE;。检查复位信号确认复位按键是按下为低电平还是松开为低电平。我们的代码是低电平复位rst_n0时复位。如果接反了系统可能一直处于复位状态。问题二流水灯速度过快或过慢。检查时钟频率确认代码中CLK_FREQ参数是否设置为实际晶振频率50_000_000。如果设错了TIME_100MS计算就不对。检查计数器位宽确保delay_cnt的位宽足够大能存下TIME_100MS的值。32位是足够的。问题三LED闪烁不规则或状态跳变混乱。检查时序约束如果时序报告有违例在高速时钟下可能出现亚稳态导致行为异常。确保时序已收敛。仿真比对回到ModelSim用更长的仿真时间仔细比对波形与实际上板现象。可以在代码中添加一些“调试输出”比如用剩余的IO口输出当前状态值用逻辑分析仪或另一个LED来观察这是硬件调试的常用手段。问题四综合警告。编译时可能会有一些警告比如“推断出锁存器”等。要仔细阅读警告信息。我们的三段式状态机写法通常能避免锁存器。如果出现检查always块中是否在所有条件下都对变量进行了赋值特别是组合逻辑的always (*)块。当你看到8个LED按照预想的节奏稳健地依次点亮、全亮、熄灭、再循环时那种成就感是无与伦比的。这不仅仅是一个流水灯这是你构建的一个小型、精准的数字系统。通过这个项目你真正掌握了状态机的设计思想、Verilog的编码风格、Quartus II的开发流程、ModelSim的仿真验证以及时序分析的基本概念。这些技能是通往更复杂FPGA设计比如通信协议、图像处理、电机控制的基石。下次我们可以试试给这个状态机加上一个按键用来切换流水方向或者改变速度你会发现基于状态机的框架增加这些功能会变得非常容易和清晰。这就是状态机设计的魅力所在。

相关新闻

【实战】Conda镜像源优化:快速部署PyTorch开发环境

【实战】Conda镜像源优化:快速部署PyTorch开发环境

1. 为什么你的PyTorch安装总是卡在99%?从镜像源说起 不知道你有没有过这样的经历:好不容易下定决心,准备开始学习PyTorch,打开命令行,输入那串从官网复制来的安装命令,然后……就开始了漫长的等待。进度条…

2026/5/17 0:45:26 阅读更多 →
实测Ostrakon-VL-8B:零售场景专用模型,比通用大模型更懂店铺管理

实测Ostrakon-VL-8B:零售场景专用模型,比通用大模型更懂店铺管理

实测Ostrakon-VL-8B:零售场景专用模型,比通用大模型更懂店铺管理 最近我在测试一个专门为零售和餐饮场景设计的AI模型——Ostrakon-VL-8B。说实话,刚开始看到“零售专用”这个标签时,我有点怀疑:一个8B参数的模型&…

2026/5/17 12:07:19 阅读更多 →
Win10系统内存占用异常飙升?三步排查法快速定位问题根源

Win10系统内存占用异常飙升?三步排查法快速定位问题根源

1. 从“卡成皮皮虾”到“丝滑如初”:我的Win10内存飙升自救记 不知道你有没有过这样的经历:早上打开电脑,啥都还没干,就听见风扇呼呼地转,鼠标指针移动起来一顿一顿的,点开个文件夹都要等上好几秒。打开任务…

2026/5/17 12:07:17 阅读更多 →

最新新闻

CBCX外汇服务节奏顺手吗?清楚吗?

CBCX外汇服务节奏顺手吗?清楚吗?

如果围绕基础体验评估CBCX,用户通常更在意办理路径是否容易跟上,而不是热闹包装。这种偏简洁的表达,不会制造压力,反而更利于建立稳定印象。这些细节拼在一起,才构成CBCX外汇比较自然、也比较稳健的整体印象。从细节处…

2026/7/3 16:28:34 阅读更多 →
Spring Cloud OpenFeign负载均衡算法深度解析:源码、可扩展性与面试题

Spring Cloud OpenFeign负载均衡算法深度解析:源码、可扩展性与面试题

本文深入剖析Spring Cloud OpenFeign的负载均衡机制,从核心组件架构、RoundRobin/Random/Weighted等算法源码、ServiceInstanceListSupplier装饰器模式的可扩展性设计,到自定义负载均衡实战,最后附带10道高频面试题及答案剖析,助你…

2026/7/3 16:26:33 阅读更多 →
直流电机静音控制方案设计与实现

直流电机静音控制方案设计与实现

1. 项目概述:直流电机静音控制方案设计 在工业自动化和消费电子领域,直流电机的噪声问题一直是工程师面临的常见挑战。传统PWM控制方式虽然简单高效,但开关噪声和电磁干扰问题尤为突出。本项目采用东芝TB9051FTG电机驱动IC搭配德州仪器TM4C12…

2026/7/3 16:26:33 阅读更多 →
基于STM32单片机宠物自动喂食系统喂水控制系统 WIFI监控宠物喂养1(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)

基于STM32单片机宠物自动喂食系统喂水控制系统 WIFI监控宠物喂养1(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)

基于STM32单片机宠物自动喂食系统喂水控制系统 WIFI监控宠物喂养1(设计源文件万字报告讲解)(支持资料、图片参考_降重降ai) 版本0 :5个定时喂食喂食提醒自动/手动模式TFT液晶显示年,月,日,十,分…

2026/7/3 16:24:33 阅读更多 →
ICM-42688-P运动传感器与PIC18F4455在工业自动化中的应用

ICM-42688-P运动传感器与PIC18F4455在工业自动化中的应用

1. ICM-42688-P运动传感器的技术解析 ICM-42688-P是一款六轴运动传感器,集成了三轴陀螺仪和三轴加速度计。这款传感器在工业应用中表现出色,主要得益于以下几个关键技术特性: 1.1 高精度运动检测能力 ICM-42688-P的陀螺仪量程可达2000dps&a…

2026/7/3 16:24:33 阅读更多 →
STM32G031K8与KMX62 IMU在运动控制中的实践应用

STM32G031K8与KMX62 IMU在运动控制中的实践应用

1. 项目背景与核心价值在工业自动化、机器人技术和消费电子领域,稳定性和平衡控制一直是关键挑战。传统方案往往采用分立式传感器搭配复杂算法,不仅成本高企,调试周期也漫长。KMX62作为一款6自由度(6DOF)惯性测量单元(IMU),结合ST…

2026/7/3 16:22:33 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻