FPGA实战:从真值表到硬件验证的译码器与编码器设计
1. 从理论到硬件为什么译码器和编码器是FPGA入门的绝佳起点如果你刚开始接触FPGA可能会被一堆术语吓到Verilog、综合、约束、时序分析……听起来就头大。我刚开始学的时候也是这种感觉总觉得FPGA开发门槛很高。但后来我发现从一些最基础、最经典的数字电路模块入手是快速建立信心和手感的最佳路径。而译码器和编码器就是这条路上的两块完美的“敲门砖”。为什么是它们首先它们的逻辑非常直观。译码器说白了就是把一个“编码”翻译成对应的“信号”。比如一个3-8译码器输入3位二进制数从000到111对应的8个输出中只有一个会亮起。这就像你家的地址门牌号邮递员看到“3栋201”就知道要把信送到唯一的那一户。编码器则反过来它把多个输入信号中“有效”的那一个编码成一个更短的二进制数输出。这就像在会议室里好几个人同时举手主持人需要快速识别出“优先级最高”的那位并叫出他的名字编码。其次这两个模块麻雀虽小五脏俱全。设计它们你需要完整地走一遍FPGA开发的标准流程从理解功能需求到画出真值表、推导布尔表达式再用硬件描述语言比如Verilog实现接着在软件里仿真验证逻辑对不对最后生成比特流文件下载到真实的开发板上看着LED灯随着你的拨码开关亮灭。这个过程正是所有FPGA项目开发的缩影。通过这个小小的实战你能把书本上抽象的理论变成指尖下看得见、摸得着的硬件行为这种成就感是单纯看教程无法比拟的。我经常跟刚入门的朋友说别急着去搞复杂的图像处理或通信协议。先把像译码器、编码器这样的小模块吃透把开发工具链用熟。当你成功地在板子上点亮的第一个LED不是靠例程而是完全由自己从零设计出来的时候你对“硬件编程”的理解会瞬间上一个台阶。接下来我们就手把手走一遍这个完整的过程。2. 理论基石亲手推导真值表与逻辑表达式很多教程会直接把真值表和表达式扔给你但我强烈建议你一定要自己动手画一遍、推一遍。这个过程是理解数字电路设计精髓的关键它能帮你建立“问题描述”到“硬件电路”的思维桥梁。2.1 3-8译码器理解“唯一热码”输出我们先来看3-8译码器。它的功能定义很简单有3个输入假设叫A, B, C可以组成8种不同的二进制组合000到111。对应地它有8个输出通常叫Y0到Y7。它的核心规则是对于任何一种输入组合8个输出中有且仅有一个输出为逻辑‘1’高电平其余全部为‘0’低电平。哪个输出为1呢就是下标等于输入二进制数值的那个。举个例子如果输入ABC 011二进制那么对应的十进制数是3所以输出Y3 1其他Y0, Y1, Y2, Y4, Y5, Y6, Y7全部为0。这个输出模式在数字电路里有个专门的名字叫“唯一热码”。现在我们一起来画真值表。拿张纸或者打开记事本列出所有8种输入情况A (MSB)BC (LSB)Y7Y6Y5Y4Y3Y2Y1Y00000000000100100000010010000001000110000100010000010000101001000001100100000011110000000注意这里我习惯把A作为最高位MSBC作为最低位LSB这样输入ABC000对应十进制0输出Y0有效比较符合直觉。你也可以按自己的习惯定义只要逻辑一致就行。真值表画完逻辑表达式就呼之欲出了。观察每一行你会发现每个输出为1的条件恰恰对应输入变量的一个最小项。什么是最小项就是所有输入变量原变量或反变量的“与”组合。例如Y0为1的条件是A0且B0且C0那么Y0 ~A ~B ~C~表示取反表示与。同理Y1 ~A ~B CY2 ~A B ~CY3 ~A B CY4 A ~B ~CY5 A ~B CY6 A B ~CY7 A B C看是不是非常简单译码器的逻辑本质上就是一系列最小项生成器。这个推导过程虽然基础但它奠定了你理解更复杂组合逻辑的基础。2.2 4-2编码器从“理想”到“现实”的思考编码器是译码器的逆过程。我们设计一个4-2编码器它有4个输入D0, D1, D2, D32个输出X, Y。理想情况下我们假设同一时刻只有一个输入为1。它的功能是将这个“为1”的输入的下标编码成2位二进制数输出。比如D11其他为0那么输入代表数字1二进制是01所以输出XY 01。我们来画这个“理想版”的真值表D3D2D1D0XY000100001001010010100011从真值表可以直接写出表达式X D2 D3Y D1 D3表示或。看起来比译码器还简单对吧但这里就是新手容易踩的第一个坑现实世界往往不“理想”。如果同时有两个或更多输入为1怎么办如果所有输入都为0又怎么办按照上面的表达式D0011D0和D1同时为1时X0 Y1输出是01这会被误认为是只有D1有效。而D0000时输出是00这和只有D0有效时的输出一模一样这显然是不可接受的。所以我们需要设计一个更健壮的优先编码器。我们引入两个改进第一增加一个有效指示输出V当没有任何输入有效全0时V0否则V1。第二给输入设定优先级通常下标大的优先级高即D3 D2 D1 D0。当多个输入有效时只编码优先级最高的那个。这样真值表就变成了D3D2D1D0XYV说明0000XX0无效输入输出无关X0001001仅D0有效001X011D1有效无论D0为何01XX101D2有效无论D1,D0为何1XXX111D3有效无论其他为何根据这个真值表我们可以推导出优先编码器的表达式这里需要一点卡诺图化简的技巧但我们可以直接观察X D3 D2只要D3或D2为1X就是1Y D3 (~D2 D1)D3为1时Y是1如果D3为0但D2也为0且D1为1Y也是1V D0 D1 D2 D3只要有任何一个输入为1V就是1这个“从理想设计到考虑实际缺陷并改进”的过程是硬件设计中最有价值的思维训练。它让你提前思考边界条件和异常处理而不是等到板子跑飞了再回头查问题。3. Verilog实现把思想转化为代码理论搞清楚了接下来就是用Verilog HDL这把“刻刀”把我们的电路设计“雕刻”到FPGA的逻辑资源里。Verilog写起来有点像写软件但心里要时刻记住你是在描述硬件结构每一行代码最终都会变成真实的门电路和连线。3.1 译码器的两种写法门级与行为级对于3-8译码器最直接的写法就是根据我们推导出的逻辑表达式用门级原语来描述。这种写法非常直观和真值表一一对应。module decoder_3to8_gate ( input wire [2:0] in, // 3位输入in[2]是MSB output reg [7:0] out // 8位输出 ); // 使用 assign 语句和位操作直接对应最小项表达式 assign out[0] ~in[2] ~in[1] ~in[0]; assign out[1] ~in[2] ~in[1] in[0]; assign out[2] ~in[2] in[1] ~in[0]; assign out[3] ~in[2] in[1] in[0]; assign out[4] in[2] ~in[1] ~in[0]; assign out[5] in[2] ~in[1] in[0]; assign out[6] in[2] in[1] ~in[0]; assign out[7] in[2] in[1] in[0]; endmodule这种写法在综合后会生成8个3输入与门结构清晰。但如果你觉得这样写有点冗长Verilog提供了更简洁的行为级描述方式比如用case语句module decoder_3to8_behavioral ( input wire [2:0] in, output reg [7:0] out ); always (*) begin out 8b0000_0000; // 默认所有输出为0 case (in) 3b000: out[0] 1b1; 3b001: out[1] 1b1; 3b010: out[2] 1b1; 3b011: out[3] 1b1; 3b100: out[4] 1b1; 3b101: out[5] 1b1; 3b110: out[6] 1b1; 3b111: out[7] 1b1; default: out 8b0000_0000; // 良好习惯避免锁存器 endcase end endmodule甚至还有更“炫技”的写法利用左移操作assign out (1 in);这一行代码就实现了全部功能它的意思是生成一个二进制数只有第in位是1。例如in313的结果就是8b0000_1000即out[3]1。综合工具会自动把它优化成对应的逻辑电路。我建议初学者先从门级或case语句写起这样对硬件映射的理解更深刻等熟练了再追求代码的简洁性。3.2 编码器的实现与优先级处理对于基础的4-2编码器实现同样简单module encoder_4to2_simple ( input wire [3:0] d, output wire [1:0] y ); assign y[1] d[3] | d[2]; // 对应X assign y[0] d[3] | d[1]; // 对应Y endmodule但正如我们之前分析的这个模块有缺陷。我们来实现功能完整的优先编码器module priority_encoder_4to2 ( input wire [3:0] d, output wire [1:0] y, output wire valid ); // 输出编码逻辑 assign y[1] d[3] | d[2]; // 高位D3或D2有效则为1 assign y[0] d[3] | (~d[2] d[1]); // 低位D3有效或者(D2无效且D1有效)则为1 // 有效指示位任何输入为1则valid为1 assign valid |d; // 这是“归约或”操作符等价于 d[0]|d[1]|d[2]|d[3] endmodule这里用到了一个Verilog的简便写法|d。这是“归约或”运算符它会将向量d的所有位进行或运算结果是一个单比特值。用在这里判断输入是否全0非常简洁。写代码时有个细节要注意我们用的是assign连续赋值语句它描述的是组合逻辑意味着输出会实时跟随输入变化没有时钟延迟。这就是译码器和编码器属于组合逻辑电路的原因。在always (*)块里写组合逻辑时一定要记得给所有输出变量在所有的条件分支下都赋值否则综合工具可能会推断出你不想要的锁存器这是常见的错误来源。4. Vivado仿真在烧录前验证你的逻辑代码写完了千万别急着往板子上烧硬件调试可比软件麻烦多了一个逻辑错误可能让你对着不亮的LED发呆半天。仿真就是我们在电脑上搭建的虚拟实验室可以安全、快速、全面地测试设计。4.1 编写测试平台Testbench测试平台本质上也是一个Verilog模块但它不需要综合成硬件。它的任务是给你设计的模块称为“待测设计”或DUT提供激励信号输入并收集和观察其响应输出。对于我们的译码器一个基础的测试平台可以这样写timescale 1ns / 1ps // 定义时间单位/精度 module tb_decoder_3to8(); // 1. 声明连接线 reg [2:0] tb_in; // 测试平台的输入连接到DUT的输入用reg类型 wire [7:0] tb_out; // 测试平台的输出连接到DUT的输出用wire类型 // 2. 实例化待测设计 decoder_3to8_gate uut ( .in(tb_in), .out(tb_out) ); // 3. 生成测试激励 initial begin // 初始化输入 tb_in 3b000; // 每隔10个时间单位改变一次输入遍历所有8种情况 #10 tb_in 3b001; #10 tb_in 3b010; #10 tb_in 3b011; #10 tb_in 3b100; #10 tb_in 3b101; #10 tb_in 3b110; #10 tb_in 3b111; #10 $finish; // 仿真结束 end // 4. 可选监控输出到控制台 initial begin $monitor(Time%t, in%b, out%b, $time, tb_in, tb_out); end endmodule这个测试平台做了几件事定义了连接DUT的信号实例化了我们的译码器模块然后用一个initial块生成了一系列输入变化从000到111每个状态持续10ns。$monitor语句会在每次信号变化时在Vivado的Tcl控制台打印出时间和信号值非常方便。4.2 运行仿真与查看波形在Vivado中将测试平台设置为“仿真顶层”然后运行行为仿真。你会看到弹出的仿真波形窗口。把tb_in和tb_out信号拖到波形视图里然后重新运行。你应该能看到随着tb_in从0递增到7tb_out对应的位会依次变成高电平。比如tb_in3二进制011时tb_out的第三位下标3应该是高其他位是低。看波形时要重点检查输出变化是否紧跟输入变化组合逻辑应该没有延迟在理想仿真中。输出模式是否符合预期是不是严格的“唯一热码”有没有出现毛刺在输入变化的瞬间由于门电路路径延迟不同输出可能会产生短暂的、非预期的跳变这叫“毛刺”。在波形上放大看切换瞬间有时能看到。对于译码器毛刺是正常的但在某些敏感电路中可能需要处理。对于优先编码器的测试平台则需要设计更全面的测试用例覆盖各种边界情况initial begin // 测试无效输入 tb_d 4b0000; #20; // 测试单输入有效 tb_d 4b0001; #20; // 期望 y00, v1 tb_d 4b0010; #20; // 期望 y01, v1 tb_d 4b0100; #20; // 期望 y10, v1 tb_d 4b1000; #20; // 期望 y11, v1 // 测试多输入有效优先级 tb_d 4b0011; #20; // D1和D0有效D1优先级高期望 y01, v1 tb_d 4b0110; #20; // D2和D1有效D2优先级高期望 y10, v1 tb_d 4b1100; #20; // D3和D2有效D3优先级高期望 y11, v1 tb_d 4b1111; #20; // 全有效D3优先级最高期望 y11, v1 #20 $finish; end通过这种 exhaustive穷举或 targeted针对性的测试你就能在软件层面高度确信你的设计是正确的大大降低硬件调试的风险。5. 硬件验证让代码在开发板上“活”过来仿真通过只是成功了99%。最后1%也是最激动人心的一步就是把设计加载到真实的FPGA开发板上用物理的开关和LED来交互。这一步会让你真切感受到你写的代码确实变成了一片“硅芯片”上的电路。5.1 引脚约束连接虚拟与物理世界FPGA芯片有几十甚至几百个引脚每个引脚都可以配置成输入、输出或者其他功能。我们的Verilog代码里的输入输出端口如in,out还是虚拟的我们需要告诉Vivado把这些端口分配到芯片的哪个物理引脚上以及这些引脚的电平标准是什么。这个信息写在XDC约束文件里。比如我用的是一块常见的Basys 3开发板上面有4个拨码开关SW0-SW3和8个LED灯LD0-LD7。我想用SW0, SW1, SW2作为译码器的3位输入用LD0-LD7作为8位输出。那么XDC文件里就需要这样写## 时钟引脚如果需要的话 # set_property PACKAGE_PIN W5 [get_ports clk] # set_property IOSTANDARD LVCMOS33 [get_ports clk] ## 拨码开关 - 译码器输入 set_property PACKAGE_PIN V17 [get_ports {in[0]}] # SW0 set_property IOSTANDARD LVCMOS33 [get_ports {in[0]}] set_property PACKAGE_PIN V16 [get_ports {in[1]}] # SW1 set_property IOSTANDARD LVCMOS33 [get_ports {in[1]}] set_property PACKAGE_PIN W16 [get_ports {in[2]}] # SW2 set_property IOSTANDARD LVCMOS33 [get_ports {in[2]}] ## 译码器输出 - LED灯 set_property PACKAGE_PIN U16 [get_ports {out[0]}] # LD0 set_property IOSTANDARD LVCMOS33 [get_ports {out[0]}] set_property PACKAGE_PIN E19 [get_ports {out[1]}] # LD1 set_property IOSTANDARD LVCMOS33 [get_ports {out[1]}] ... # 依次绑定 out[2] 到 out[7]这里有几个坑我踩过你一定要注意引脚编号和电平标准PACKAGE_PIN后面的字母数字如V17是芯片的物理引脚号这需要查你所用开发板的原理图或用户手册。绝对不能猜IOSTANDARD通常是LVCMOS33表示3.3V低压CMOS电平。网表名称get_ports后面的名字必须和你的Verilog顶层模块的端口名完全一致大小写敏感。如果你的输出是8位向量out就用{out[0]}来指定位或者用out[0]也可以。未用引脚最好在XDC文件开头或结尾设置一下未使用引脚的状态比如set_property BITSTREAM.CONFIG.UNUSEDPIN Pullnone [current_design]避免悬空引脚引起意外电流。5.2 综合、实现与生成比特流添加好约束文件后在Vivado里点击“Generate Bitstream”。Vivado会自动执行一系列步骤综合将你的Verilog代码翻译成由FPGA基本逻辑单元查找表LUT、触发器FF等组成的网表。实现包含布局将网表中的元件放到芯片的具体位置和布线用芯片内部的连线资源连接这些元件。生成比特流生成一个包含所有配置信息的.bit文件这个文件就是FPGA的“可执行程序”。在这个过程中一定要留意“Messages”窗口的警告和错误。常见的错误包括引脚分配冲突、逻辑资源不够、时序不满足等。对于我们这个简单设计资源肯定够主要检查引脚分配是否正确。5.3 下载与调试用USB线连接开发板在Vivado中打开硬件管理器检测到设备后将生成的.bit文件下载进去。瞬间你的设计就“烧录”到了FPGA的SRAM中注意掉电会丢失如需固化需要另外配置。现在你可以拨动SW0、SW1、SW2了。当你拨出二进制000全下拨时应该只有LD0亮起。拨出001仅SW0上拨时只有LD1亮起……依次类推直到111全上拨时只有LD7亮起。如果完全符合恭喜你你的第一个FPGA设计从理论到硬件全程通关如果LED的亮灭顺序不对首先回去检查XDC约束文件是不是SW0,1,2的顺序和代码里in[0], in[1], in[2]的对应关系搞反了或者LED的引脚绑定顺序错了硬件调试就是这样大部分问题都出在连接和配置上。6. 思维拓展从模块到系统成功实现译码器和编码器后你可以尝试把它们组合起来或者进行变形这能让你更好地理解它们在数字系统中的作用。组合实验你可以设计一个“编码-译码”环路。用4个开关作为优先编码器的输入编码输出的2位二进制数再连接到另一个2-4译码器的输入注意2-4译码器需要你自己设计然后用4个LED显示译码输出。你会发现由于优先编码器的存在当你按下多个开关时只有优先级最高的那个开关能通过这个环路点亮对应的LED。这个小小的系统已经体现了数据通路和仲裁的基本思想。应用联想地址译码在单片机或CPU系统中译码器常用于将地址总线的高位翻译成片选信号用来选中不同的内存芯片或外设。比如一块内存芯片可能占用地址范围0x4000-0x4FFF当地址总线出现这个范围内的高位地址时译码器输出一个有效的片选信号给这块内存芯片。键盘编码计算机键盘就是一个巨大的编码器矩阵。当你按下某个键键盘控制器会检测到该键所在行和列的交点接通然后将其编码成一个特定的扫描码如ASCII码发送给主机。七段数码管显示驱动数码管显示数字0-9就需要一个BCD码到七段码的译码器。输入是4位BCD码0000到1001输出是7个段a,b,c,d,e,f,g的亮灭控制信号。你可以尝试设计这个译码器它会比3-8译码器稍微复杂一点因为输出不是简单的唯一热码。走完这一整个流程你收获的绝不仅仅是两个小模块。你掌握了FPGA开发的标准范式理论分析 - HDL建模 - 功能仿真 - 引脚约束 - 综合实现 - 板级验证。你也亲身体会了硬件描述语言与软件编程的思维差异以及仿真在硬件设计中的重要性。下次当你面对更复杂的FPGA项目时这套方法论和实战经验就是你的底气。硬件设计的世界大门已经从这两块小小的基石为你打开了。

相关新闻

如何真正拥有你的数字音乐?Unlock Music五大创新突破解析

如何真正拥有你的数字音乐?Unlock Music五大创新突破解析

如何真正拥有你的数字音乐?Unlock Music五大创新突破解析 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: ht…

2026/7/6 1:13:31 阅读更多 →
Windows11系统下Multisim14.3安装全攻略:解决管理员权限/杀毒拦截/汉化失败三大痛点

Windows11系统下Multisim14.3安装全攻略:解决管理员权限/杀毒拦截/汉化失败三大痛点

Windows 11 环境下 Multisim 14.3 深度部署与疑难杂症实战指南 最近在几个硬件设计项目里,又用回了经典的 Multisim 14.3。说实话,在 Windows 11 这个新平台上部署它,确实遇到了一些在老系统上不曾有过的“惊喜”。从管理员权限的层层设卡&am…

2026/7/6 1:16:44 阅读更多 →
深入解析MOE架构:大模型中的混合专家网络如何提升效率

深入解析MOE架构:大模型中的混合专家网络如何提升效率

1. 从“全科医生”到“专科会诊”:MOE架构的核心理念 想象一下,你生病了,是去看一个什么病都懂一点的全科医生,还是直接去挂一个专治你这个病的专家号?答案显而易见。大模型的世界里,也面临着同样的选择。传…

2026/7/5 18:41:31 阅读更多 →

最新新闻

Excel COUNT系列函数:数据质量诊断与业务逻辑翻译指南

Excel COUNT系列函数:数据质量诊断与业务逻辑翻译指南

1. 项目概述:Excel中COUNT系列函数不是“数数”那么简单,而是数据质量的守门员 在Excel里写个COUNT(A1:A100),看起来只是统计非空单元格个数——但如果你真这么想,说明你还没摸到Excel数据处理的门槛。我带过二十多个企业数据分析…

2026/7/6 10:28:04 阅读更多 →
Plone 4教职员目录系统:组织级身份服务中间件实践

Plone 4教职员目录系统:组织级身份服务中间件实践

1. 项目概述:一个被低估的组织级信息基础设施重建 Plone 4 时代的 Faculty/Staff Directory(教职员工名录)绝不是简单做个“通讯录页面”——它是一套嵌入在高校数字生态毛细血管里的身份服务中间件。我2012年接手某州立大学文理学院的这个项…

2026/7/6 10:26:00 阅读更多 →
Excel乘法的三层逻辑:从单元格相乘到矩阵运算

Excel乘法的三层逻辑:从单元格相乘到矩阵运算

1. 为什么“乘法”是Excel里最被低估却最该优先掌握的核心能力 很多人刚学Excel时,第一反应是学求和、排序、筛选——这没错,但真正拉开效率差距的,往往不是你会不会用数据透视表,而是你能不能在3秒内把一整列价格打85折、把12个月…

2026/7/6 10:26:00 阅读更多 →
Hermes+Kimi K2.6构建高可用智能体生产流水线

Hermes+Kimi K2.6构建高可用智能体生产流水线

1. 项目概述:这不是一个“搭个API就能跑”的玩具,而是一套可量产、能扛压的智能体生产流水线“万字保姆级教程:HermesKimi K2.6 打造7x24h Agent军团”——光看标题,你可能以为这是又一篇调用大模型API的入门笔记。但实际操作过的…

2026/7/6 10:23:56 阅读更多 →
STM32F407ZG与MC6470 IMU的硬件协同设计与姿态解算

STM32F407ZG与MC6470 IMU的硬件协同设计与姿态解算

1. MC6470与STM32F407ZG的硬件协同设计MC6470作为一款6自由度惯性测量单元(IMU),其核心价值在于集成了三轴加速度计和三轴陀螺仪于单芯片中。在实际项目中,这款IMU的加速度计量程可达16g,陀螺仪范围达2000dps,且内置数字运动处理器…

2026/7/6 10:23:56 阅读更多 →
家政服务全流程实战项目:客户预约+师傅接单+评价反馈+后台数据看板

家政服务全流程实战项目:客户预约+师傅接单+评价反馈+后台数据看板

本文还有配套的精品资源,点击获取 简介:一个开箱即用的家政服务管理系统,完整跑通从客户下单到服务闭环的业务链路。客户侧支持服务浏览、在线预约、订单查询、服务后打分评价;师傅端可登录个人中心,实时接收新订单…

2026/7/6 10:17:48 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻