格雷码:从原理到实战,解决硬件设计中的临界跳变难题

发布时间:2026/8/8 6:54:14

格雷码:从原理到实战,解决硬件设计中的临界跳变难题
1. 项目概述从“模糊”到“精确”的编码艺术在数字电路、通信协议甚至是旋转编码器的设计中我们常常会遇到一个看似简单却暗藏玄机的问题如何让相邻的两个数字在二进制表示上只相差一位想象一下一个机械的旋转编码器从位置“3”转到位置“4”如果使用普通的二进制码0011 - 0100三个比特位同时翻转。在高速或存在微小机械抖动的瞬间传感器可能误读为0010、0110或0001导致位置信息瞬间跳变引发系统紊乱。这就是格雷码Gray Code要解决的核心痛点。它并非为了数学运算的便利而是为了物理世界中的“可靠性”而生。我最初接触格雷码是在一个高精度伺服电机的反馈系统调试中当时因为普通二进制编码的瞬间多比特翻转问题导致定位偶尔出现“飞车”现象排查了整整一周才锁定是编码问题自此对格雷码的“稳健”特性印象深刻。简单说格雷码是一种循环、单步的二进制编码系统。它的核心规律就两点相邻性和循环性。相邻性保证了任意两个相邻的整数其格雷码表示只有一位二进制数不同循环性则意味着最大数和最小数例如0和15在4位编码中的格雷码也满足相邻性形成一个闭环。这个特性让它完美规避了传统二进制码在顺序变化时可能产生的“模糊区间”特别适用于模拟-数字转换、位置传感和异步FIFO的地址指针等场景。无论你是嵌入式工程师、FPGA开发者还是算法竞赛的爱好者理解格雷码的生成与转换规律都是一项提升系统鲁棒性的基本功。接下来我将拆解其背后的数学之美、多种生成与转换方法并分享在实际工程中应用和调试的干货经验。2. 格雷码的核心规律与数学本质要玩转格雷码不能只停留在“相邻变一位”的表象必须深入其数学构造的骨髓。理解了它的生成逻辑无论是手算、编程还是硬件实现都能游刃有余。2.1 递归构造法最直观的生成规律格雷码的构造有一种非常优雅的递归方法这揭示了其自相似的分形结构。构造步骤1位格雷码这是基础。只有两个码0 和 1。G(1) [0, 1]n位格雷码假设我们已经有了(n-1)位的格雷码序列G(n-1)。第一步镜像反射。将G(n-1)的序列完全复制一份并反转镜像顺序接在原序列的后面。此时我们得到了一个长度为2^n的序列但其最高位第n位尚未确定。第二步前缀补位。对于前半部分原G(n-1)序列在每个码字的前面最高位添加一个0。对于后半部分镜像后的序列在每个码字的前面添加一个1。这样得到的序列就是n位的格雷码G(n)。以生成2位格雷码为例已知G(1) [0, 1]复制并镜像[0, 1, 1, 0]前半部分加0[00, 01]后半部分加1[11, 10]合并G(2) [00, 01, 11, 10]以生成3位格雷码为例基于G(2) [00, 01, 11, 10]复制并镜像[00, 01, 11, 10, 10, 11, 01, 00]前半部分加0[000, 001, 011, 010]后半部分加1[110, 111, 101, 100]合并G(3) [000, 001, 011, 010, 110, 111, 101, 100]注意这个递归过程清晰地展示了为什么格雷码具有循环性。序列的首元素全0和尾元素1后接镜像序列的最后一个即1后接G(n-1)的首元素它们仅在最高位不同满足了相邻性。2.2 异或运算法二进制与格雷码转换的钥匙递归法揭示了结构但在实际计算和硬件实现中我们更常用一种基于异或XOR的快速转换方法。这是格雷码最核心、最实用的数学表达。定义设一个n位的二进制数为B b_{n-1} b_{n-2} ... b_1 b_0其中b_{n-1}是最高有效位 MSB。 其对应的n位格雷码G g_{n-1} g_{n-2} ... g_1 g_0。二进制转格雷码的公式最高位保持不变g_{n-1} b_{n-1}其余每一位等于当前二进制位与其高一位的二进制位进行异或运算g_i b_i XOR b_{i1} 其中i 0, 1, ..., n-2示例将二进制1101(13) 转换为格雷码二进制 B:1 1 0 1(索引从高位到低位: b31, b21, b10, b01)计算格雷码 G:g3 b3 1g2 b2 XOR b3 1 XOR 1 0g1 b1 XOR b2 0 XOR 1 1g0 b0 XOR b1 1 XOR 0 1得到格雷码1 0 1 1格雷码转二进制的公式逆运算这是工程中从传感器读取格雷码后必须转换回可运算的二进制值的过程。最高位同样保持不变b_{n-1} g_{n-1}其余每一位等于当前格雷码位与已计算出的高一位的二进制位进行异或运算b_i g_i XOR b_{i1} 其中i n-2, n-3, ..., 0示例将格雷码1011转换回二进制格雷码 G:1 0 1 1(g31, g20, g11, g01)计算二进制 B:b3 g3 1b2 g2 XOR b3 0 XOR 1 1b1 g1 XOR b2 1 XOR 1 0b0 g0 XOR b1 1 XOR 0 1得到二进制1 1 0 1(13)实操心得异或转换法是硬件描述语言如Verilog/VHDL实现的绝对首选。它的逻辑极其简洁只需一排异或门链即可实现传播延迟小占用资源少。在FPGA里一个n位的转换器就是n-1个异或门。记住口诀“二进制转格雷保留最高位其余位与左邻异或格雷转二进制保留最高位其余位与已算出的左邻值异或。”3. 格雷码的软件实现与算法解析理解了数学原理我们在软件中实现格雷码的生成与转换就易如反掌。这里提供几种不同场景下的实现方法并分析其优劣。3.1 直接计算法基于异或公式这是最直接、最高效的方法时间复杂度 O(n)空间复杂度 O(1)如果只是计算单个值。Python 实现def binary_to_gray(n: int) - int: 将整数n视为二进制转换为其格雷码的整数值。 return n ^ (n 1) def gray_to_binary(g: int) - int: 将格雷码整数值g转换回对应的二进制整数。 mask g while mask: mask 1 g ^ mask return g # 示例 bin_num 13 # 二进制 1101 gray_code binary_to_gray(bin_num) # 结果: 1011 (十进制11) print(fBinary {bin_num} ({bin(bin_num)}) - Gray {gray_code} ({bin(gray_code)})) restored_bin gray_to_binary(gray_code) # 结果: 1101 (十进制13) print(fGray {gray_code} - Binary {restored_bin})C语言实现位操作unsigned int binaryToGray(unsigned int num) { return num ^ (num 1); } unsigned int grayToBinary(unsigned int gray) { unsigned int binary gray; while (gray 1) { binary ^ gray; } return binary; }解释与注意事项binary_to_gray函数极其精妙n ^ (n 1)完美对应了g_i b_i XOR b_{i1}。右移一位相当于获取了所有“高一位”的值异或操作一次性完成所有位的计算。gray_to_binary的循环方法可能不那么直观但它模拟了从高位到低位的递推异或过程。每次循环将掩码右移并与当前结果异或最终还原出所有二进制位。边界情况确保你的整数类型有足够的位数来表示n位格雷码。对于n位编码输入的二进制数或格雷码值应小于2^n。3.2 序列生成法生成所有n位格雷码有时我们需要整个格雷码序列例如用于测试或某些算法初始化。基于递归反射法的实现def generate_gray_codes_recursive(n): 递归生成n位所有格雷码的字符串列表。 if n 0: return [] if n 1: return [0, 1] lower_codes generate_gray_codes_recursive(n - 1) # 前半部分前缀加0后半部分反转前缀加1 return [0 code for code in lower_codes] [1 code for code in reversed(lower_codes)] # 示例生成3位格雷码 codes generate_gray_codes_recursive(3) print(codes) # [000, 001, 011, 010, 110, 111, 101, 100]基于迭代的位操作实现更高效def generate_gray_codes_iterative(n): 迭代生成n位所有格雷码的整数值列表。 total 1 n # 2^n gray_codes [] for i in range(total): gray_codes.append(i ^ (i 1)) # 直接利用公式 return gray_codes # 示例 codes_int generate_gray_codes_iterative(3) print([bin(code)[2:].zfill(3) for code in codes_int]) # 格式化为3位二进制字符串两种方法的对比特性递归法迭代位操作法输出格式字符串列表直观整数列表便于计算原理体现清晰体现反射构造规律直接应用异或公式性能有函数调用和列表连接开销n较大时稍慢直接循环计算效率高适用场景需要理解过程或生成字符串形式时需要数值序列进行后续运算时实操心得在算法竞赛或需要快速生成序列时迭代位操作法是首选一行核心代码i ^ (i 1)就能搞定简洁高效。而在教学或需要向他人演示格雷码的构造过程时递归法则更具表现力。另外注意递归深度Python默认递归深度约1000生成位数很高的格雷码如n15时迭代法更安全。4. 格雷码在硬件设计中的关键应用与实现格雷码的真正威力在硬件和底层系统中发挥得淋漓尽致。其“单比特变化”的特性是解决许多异步和亚稳态问题的银弹。4.1 异步FIFO的地址指针这是格雷码最经典、几乎不可或缺的应用场景。FIFO先入先出队列常用于两个不同时钟域写时钟和读时钟之间的数据缓冲。读写指针需要跨时钟域进行比较以判断空满状态。问题所在如果使用二进制计数器作为指针当指针值从0111(7) 变为1000(8) 时四位全部翻转。在跨时钟域同步的瞬间读侧时钟抓取的指针值可能是0111到1000变化过程中的任何一个非法值如1111,0000导致空满标志计算错误引发数据丢失或重复读取。格雷码解决方案使用格雷码计数器作为读写指针。因为相邻格雷码只有一位变化即使在跨时钟域同步的瞬间被捕获到一个中间状态这个状态也只能是前一个有效值或后一个有效值而不会是一个相差甚远的非法值。指针从0100(格雷码) 变为1100(格雷码)只有最高位变化。读时钟域同步时可能抓到0100或1100这两个值在判断空满时误差最多为1这在FIFO设计中是可接受的通过预留安全余量解决绝不会导致灾难性错误。Verilog实现示例格雷码计数器module gray_counter #( parameter WIDTH 4 )( input wire clk, input wire rst_n, input wire en, // 计数使能 output reg [WIDTH-1:0] gray_out ); reg [WIDTH-1:0] bin_count; // 内部的二进制计数器 always (posedge clk or negedge rst_n) begin if (!rst_n) begin bin_count {WIDTH{1b0}}; end else if (en) begin bin_count bin_count 1b1; end end // 二进制转格雷码组合逻辑 always (*) begin gray_out (bin_count 1) ^ bin_count; end endmodule4.2 旋转编码器与位置传感器机械或光学的旋转编码器如绝对值编码器直接输出格雷码。这是因为码盘上的同心环道每一环代表一个比特位在制作时相邻扇区只改变一个环道的透光/反光状态这样即使安装有微小偏差或在临界位置读出的码值也只会有一个比特的模糊对应到角度上就是最小的分辨误差而不会出现大的跳变。处理流程传感器读取硬件直接输出格雷码G。格雷码转二进制在微控制器MCU或FPGA中使用查表法或逻辑运算将G转换为二进制值B。对于位数不高的编码器如12位以内查表法将格雷码作为数组索引存储对应的二进制值速度极快。角度计算角度 B * (360° / 2^n)。注意事项必须确保传感器上电或初始化时读取的格雷码是有效的。有时在临界位置由于振动或噪声可能读到一个非法的格雷码即不在循环序列中的码。好的做法是在转换前或转换后增加一个校验检查转换后的二进制值是否在合理范围内0 到2^n-1或者检查相邻两次读数的变化量是否超过1考虑到转速上限。我曾在无人机云台编码器调试中因未做此校验导致上电时偶尔角度归零异常后来在初始化流程中增加了“连续读取三次稳定值”的步骤才解决。4.3 状态机编码在有限状态机FSM设计中状态编码方式影响逻辑复杂度和抗干扰能力。使用格雷码对状态进行编码可以确保在大多数情况下尤其是顺序状态转移每次状态变化只有一位翻转。这能减少组合逻辑的毛刺降低功耗并提高状态寄存器在受到噪声干扰时的稳健性。当然这适用于状态转移主要是顺序的情况。如果是随机跳转的状态机格雷码的优势就不明显了。5. 进阶话题与常见问题排查掌握了基础我们再看一些深入的应用和那些容易踩坑的地方。5.1 任意进制格雷码我们讨论的通常是二进制格雷码。但格雷码的思想可以推广到任意进制称为“n进制格雷码”或“反射码”。例如十进制格雷码每个位置是0-9相邻数也只有一位数字不同且该数字变化为1或-1。其生成规律同样有反射构造法。这在一些特殊的数据编码和测试中有所应用但远不如二进制格雷码普及。5.2 格雷码与汉明距离汉明距离是指两个等长字符串之间对应位置不同字符的个数。格雷码的“相邻性”意味着连续整数的格雷码表示之间的汉明距离恒为1。而普通二进制码这个距离可以是1到n之间的任意值。这个“距离为1”的特性是其在纠错编码、遗传算法等领域偶尔被提及的原因因为它代表了最小的变化步长。5.3 常见问题与调试技巧实录在实际工程中与格雷码相关的问题往往隐蔽且棘手。下面是一个排查清单问题现象可能原因排查思路与解决方案旋转编码器读数偶尔跳变巨大如从10跳到2501. 格雷码转二进制逻辑错误。2. 传感器在临界位置因抖动读到非法格雷码。3. 信号线受到噪声干扰导致多位比特同时跳变。1.验证转换函数用已知的格雷码-二进制对照表测试你的转换代码或硬件逻辑。2.增加软件去抖在临界位置读数变化时进行多次采样如3-5次取稳定值或引入微小延时。3.检查硬件检查编码器供电是否稳定信号线是否远离电源等噪声源是否已做上拉/下拉。异步FIFO依然出现数据丢失1. 指针虽然用了格雷码但同步寄存器级数不够通常需要至少2级DFF同步。2. FIFO深度设置不合理安全余量不足。3. 读写时钟频率比过于极端导致指针同步始终滞后。1.检查同步链确保跨时钟域的信号格雷码指针经过了至少两级触发器同步。2.分析空满逻辑空满标志的产生是否考虑了格雷码同步后的“模糊性”通常需要将同步后的指针再打一拍再进行判断或者使用“保守”判断法写满条件更严读空条件更严。3.仿真验证使用EDA工具进行跨时钟域仿真观察指针同步过程中的值。生成的格雷码序列不连续或不对1. 递归或迭代算法的边界条件处理错误。2. 位操作时移位或掩码操作顺序错误。3. 对于有符号整数的处理不当。1.单元测试从小位宽n1,2,3开始测试手动核对输出序列是否与标准序列一致。2.打印中间变量在算法中打印每一步的中间结果与手工计算对比。3.注意符号位在处理有符号数时右移可能是算术右移补符号位这会影响异或结果。明确使用无符号类型或逻辑右移操作符如C的在某些语言中。FPGA中格雷码计数器资源消耗大直接将格雷码值用于比较或运算导致综合工具无法优化生成了复杂的比较器。最佳实践格雷码计数器模块只输出格雷码指针。空满比较逻辑应在二进制域进行。即将同步后的格雷码指针再转换回二进制这会在本地时钟域内完成然后用二进制值进行大小比较。虽然多了一次转换但二进制比较器远比格雷码比较器简单整体资源更优。一个真实的调试案例在一次通信板卡开发中FPGA通过SPI读取外部ADC芯片ADC的配置寄存器地址是格雷码编码的。我按照二进制习惯去写地址导致配置始终失败。排查了半天逻辑和时序最后才发现数据手册的地址栏有一个小注“Gray-coded”。将写地址的函数从addr改为addr ^ (addr 1)后一切正常。这个坑告诉我阅读数据手册时对每一个字段的编码方式都要打起十二分精神。格雷码的魅力在于它将一个深刻的可靠性问题用如此简洁优雅的数学和逻辑方式解决了。从抽象的递归构造到具体的异或门电路再到跨时钟域同步和传感器接口它贯穿了理论、算法与硬件的各个层面。下次当你设计一个需要稳健变化的地方时不妨想一想这里是否可以用格雷码来避免那些恼人的“毛刺”和“跳变”

相关新闻

Java常见算法

Java常见算法

2026/8/8 6:54:14

一.查找算法1.基本查找/顺序查找核心:从0索引开始挨个往后查找public static void main(String[] args) {//基本查找///原理:从0索引开始以此查找int[] arr {131,127,147,81,103,23,7,79};int number 82;System.out.println(basicSearch(arr, number));}public static boolea…

PageForth:本地AI新闻阅读器部署与隐私优先的网页摘要实践

PageForth:本地AI新闻阅读器部署与隐私优先的网页摘要实践

2026/8/8 6:54:14

这次我们来看一个本地AI新闻阅读器项目:PageForth。这是一个完全在设备上运行的AI工具,核心功能是抓取任意网页内容,然后利用本地大模型进行智能摘要和总结,让你在不依赖云端API、不泄露浏览历史的前提下,快速获取文章…

华为MetaERP Oracle EBS(R12)与 Oracle Fusion 的 SLA(Subledger Accounting,子分类账会计)本质上是一个事件驱动的会计引擎:子模块(AR/AP

华为MetaERP Oracle EBS(R12)与 Oracle Fusion 的 SLA(Subledger Accounting,子分类账会计)本质上是一个事件驱动的会计引擎:子模块(AR/AP

2026/8/8 6:54:14

Oracle EBS(R12)与 Oracle Fusion 的 SLA(Subledger Accounting,子分类账会计)本质上是一个事件驱动的会计引擎:子模块(AR/AP/FA/INV/PO/PJ/CST)只记录业务数据,当业务操…

YOLOv5 detect.py源码深度解析|全网逐行复现推理全链路、多源输入自适应适配、助力安防监控实时检测、工业视觉项目高效落地

YOLOv5 detect.py源码深度解析|全网逐行复现推理全链路、多源输入自适应适配、助力安防监控实时检测、工业视觉项目高效落地

2026/8/8 9:14:29

目录 一、前言:读懂detect.py对工业落地的核心价值 二、detect.py整体架构与全链路推理机制 2.1 整体五大核心模块架构 2.2 完整推理时序核心逻辑 三、detect.py逐模块逐行深度源码解析 3.1 全局依赖导入与工程路径配置解析 3.2 核心推理run()函数全逻辑深度拆解 3.3 …

Java保姆级教程:从零基础到接单赚钱的完整学习路径与实战指南

Java保姆级教程:从零基础到接单赚钱的完整学习路径与实战指南

2026/8/8 9:14:28

这次我们来看一套号称“从零基础到接单赚钱”的Java保姆级教程。对于想入行Java开发的新手来说,最关心的不是概念有多深奥,而是这套教程能不能真的带你跑通环境、写出代码、理解核心,最终具备接单或找工作的能力。本文会基于这套教程的常见内…

基于超局部模型与ESO的PMSM无模型预测电流控制详解

基于超局部模型与ESO的PMSM无模型预测电流控制详解

2026/8/8 9:14:28

大家好,我是专注于工业控制与电机驱动领域的技术博主。在实际的永磁同步电机(PMSM)高性能控制项目中,你是否遇到过这样的困境:传统的模型预测控制(MPC)高度依赖精确的电机数学模型,一…

基于Ollama与Markdown构建本地AI工作台:从知识管理到智能编码

基于Ollama与Markdown构建本地AI工作台:从知识管理到智能编码

2026/8/8 9:14:28

1. 从“工具”到“伙伴”:为什么我们需要一个懂你的本地AI工作台? 如果你和我一样,每天的工作流都离不开浏览器、代码编辑器、文档和一堆即时通讯工具,那你一定经历过这种场景:为了查一个API用法,在十几个浏…

水下声呐技术全解析:从回声测距原理到DIY实践指南

水下声呐技术全解析:从回声测距原理到DIY实践指南

2026/8/8 9:14:28

1. 项目概述:从“听”到“看”,水下声呐的入门指南 想象一下,你站在一片浑浊的湖边,想看看水底有什么。光线在水里衰减得很快,几米之外就一片模糊,更别提几十上百米的深海了。这时候,你的眼睛就…

测试报告自动化生成与可视化技术实践

测试报告自动化生成与可视化技术实践

2026/8/8 9:04:28

1. 测试报告自动化生成与可视化实战解析在软件研发和运维过程中,测试报告是质量保障的关键交付物。传统手工编写测试报告的方式存在效率低下、格式不统一、数据易出错等问题。我在金融和电商行业的测试实践中发现,采用自动化生成可视化呈现的方案&#x…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/6 19:19:00

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/8 5:17:40

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/5 8:19:55

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

昇腾AI代理实现多号通话自动化

昇腾AI代理实现多号通话自动化

2026/8/8 0:03:20

基于昇腾(Ascend)硬件与AtomGit AI社区的开源生态,结合AI Agent技术,可以实现一个模拟“通话重复使用机号复制”功能的安卓手机应用原型。其核心是利用AI Agent进行意图理解、任务编排和自动化操作,模拟或管理多号码的…

2026年Graph+AI Agents最新创新思路

2026年Graph+AI Agents最新创新思路

2026/8/8 0:03:20

本次围绕GraphAI Agents这个方向筛选了15篇高质量论文,都是近年来具有较高引用价值或方法创新的研究工作,其中部分来自IJCAI、AAAI、ICRA。 对于论文er来说,这些论文方法结构清晰、可复现性较强,在多个任务上都有可延展的空间。如…

Wand-Enhancer 指南:5分钟解锁Wand专业版功能,永久移除2小时限制

Wand-Enhancer 指南:5分钟解锁Wand专业版功能,永久移除2小时限制

2026/8/8 0:03:20

Wand-Enhancer 指南:5分钟解锁Wand专业版功能,永久移除2小时限制 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为Wan…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/7 8:02:42

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…