
1. 景嘉微校招数字电路笔试到底在考什么先说说我为什么想聊这个话题。前段时间有个学弟跑来问我说他投了景嘉微的数字电路工程师岗位笔试通知刚下来问我有没有什么经验可以分享。我当时就问他你知道景嘉微是做什么的吗他支支吾吾说好像是做显卡的。这个回答对了一半但远远不够。景嘉微是国内少数几家在GPU领域有实际产品落地的公司主要做图形显控和通用计算相关的芯片与模块。这意味着他们的数字电路岗位天然带着很强的工程落地属性不是纯理论推导那种。你如果拿对付学校期末考的那套去应付他们的笔试大概率会翻车。数字电路工程师这个岗位在景嘉微的校招体系里属于硬件方向的核心技术岗。笔试环节通常会覆盖几个大块数字逻辑基础、时序分析、Verilog/HDL语言基础、FPGA相关概念、以及一些简单的电路设计题。题目难度不会到让你手撕一个CPU的程度但基础不扎实的人会在细节上丢很多分。我写这篇东西的目的很直接把景嘉微这类芯片公司数字电路校招笔试的常见考点、出题逻辑、以及我自己和身边人踩过的坑系统地梳理一遍。不管你是准备景嘉微的笔试还是准备其他芯片原厂或FPGA相关岗位的笔试这篇内容都能直接拿来当复习框架用。适合电子工程、微电子、集成电路、计算机等相关专业的应届生也适合工作一两年想跳槽到芯片公司的朋友参考。2. 数字逻辑基础笔试的第一道门槛2.1 数制转换与编码送分题还是送命题数制转换这东西看起来是送分题但每年都有人在这里翻车。十进制转二进制、十六进制转二进制、BCD码和格雷码的转换这些是必考的基础。景嘉微的笔试卷子里这类题目通常出现在前几道选择题里分值不高但数量不少。我个人的经验是格雷码相关的题目最容易出错。格雷码的特点是相邻两个数只有一位发生变化这个特性在跨时钟域传输和旋转编码器里用得很多。笔试里常见的考法是给你一个二进制数让你写出对应的格雷码或者反过来。转换规则很简单二进制转格雷码最高位不变然后相邻两位异或格雷码转二进制最高位不变然后每一位是前一位二进制结果和当前格雷码位的异或。听起来绕但你拿几个数手算几遍就记住了。注意笔试里如果遇到格雷码转二进制的题目千万不要用“相邻位异或”的逆向思维去硬推直接用“最高位保留逐位异或”的方法从高位往低位算不容易出错。BCD码的考点通常集中在8421码和余3码的区别上。8421码就是正常的二进制表示0到9余3码是在8421码基础上加3。考试可能会让你把一串十进制数转成余3码或者判断某个编码是不是合法的BCD码。这里有个小技巧合法的8421 BCD码每个四位组的值不会超过9也就是不会出现1010到1111这六种情况。看到这六种直接判定非法。2.2 逻辑门与布尔代数化简才是真功夫逻辑门的基础知识比如与门、或门、非门、与非门、或非门、异或门的真值表和逻辑符号这些是必须闭着眼睛都能写出来的。但笔试不会只考你认符号真正拉开差距的是布尔代数化简和卡诺图。卡诺图化简是数字电路笔试的经典题型。给你一个四变量或五变量的逻辑函数让你用卡诺图化简成最简与或式。四变量卡诺图是16个格子五变量是32个格子。我见过有人在考场上画五变量卡诺图画错的格子顺序搞混了后面全错。卡诺图的格子排列必须按照格雷码顺序也就是00、01、11、10不是00、01、10、11。这个顺序搞错化简结果一定不对。化简的时候圈“1”还是圈“0”取决于你要得到与或式还是或与式。圈“1”得到与或式圈“0”得到或与式。圈的时候要尽量大每个圈包含2的幂次个格子圈可以重叠但每个圈必须包含至少一个没有被其他圈覆盖的格子。这些规则说起来简单但实际操作时很多人会漏掉可以合并的项或者圈了不该圈的格子。我自己的习惯是先在卡诺图上把所有“1”的位置标出来然后从最大的圈开始找比如先找8个格子的圈再找4个再找2个最后找单独的1。这样不容易漏。另外不要忘记“无关项”也就是用X表示的格子。无关项可以当作1也可以当作0目的是让你的圈更大、项更少。很多人一看到X就懵了其实X是你的朋友用好了能大幅化简。2.3 组合逻辑电路从加法器到译码器组合逻辑电路的考点非常集中加法器、比较器、编码器、译码器、数据选择器。这些器件的逻辑功能和典型应用是必考的。半加器和全加器的区别这个是最基础的。半加器不考虑进位输入全加器考虑。全加器的和是三个输入的异或进位是三个输入两两相与再或。笔试里可能会让你用两个半加器和一个或门搭一个全加器或者让你写出全加器的Verilog代码。这个必须熟练到肌肉记忆。译码器和编码器的考点通常集中在74系列芯片的功能上。比如74138是3-8译码器74148是8-3优先编码器。考试可能会给你一个74138的电路图让你分析输出逻辑。这里的关键是记住74138的输出是低电平有效而且有两个使能端一个高有效一个低有效。很多人只记得输出低有效忘了使能端的极性导致分析错误。数据选择器也就是MUX是另一个高频考点。74151是8选1数据选择器它的逻辑功能是用三个选择端控制八个数据输入中的一个输出。笔试里常见的考法是用MUX实现逻辑函数。原理很简单把逻辑函数的输入变量接到MUX的选择端把函数值接到数据输入端。比如三变量逻辑函数用8选1 MUX实现选择端接三个变量数据端接对应的函数值。这个方法的本质是把真值表直接映射到MUX的输入上。实操心得用MUX实现逻辑函数时如果变量数比MUX的选择端多可以把多余的变量接到数据端通过逻辑门处理后再输入MUX。这种“降维”思路在笔试里经常出现提前练几道就不慌了。3. 时序逻辑笔试的分水岭3.1 触发器与锁存器一字之差天壤之别触发器和锁存器的区别是数字电路笔试里最经典的送命题。很多人知道触发器是边沿触发锁存器是电平触发但一到具体电路分析就糊涂。锁存器是电平敏感的使能信号有效时输出跟随输入变化使能信号无效时输出保持。触发器是边沿敏感的只有在时钟边沿到来的瞬间输出才更新为输入的值。这个区别在时序分析里非常关键。锁存器容易产生毛刺和时序问题所以在同步电路设计中通常推荐使用触发器而不是锁存器。笔试里常见的考法是给你一个由锁存器构成的电路让你分析输出波形。这时候你要注意锁存器的输出在使能期间是透明的输入变输出就变。如果输入有毛刺输出也会有毛刺。而触发器只在时钟边沿采样毛刺只要不在边沿附近就没事。D触发器、JK触发器、T触发器之间的转换也是考点。D触发器是最常用的JK触发器功能最全T触发器是JK触发器的一种特殊接法。考试可能会让你用D触发器实现JK触发器的功能或者用JK触发器实现T触发器。转换的方法有两种公式法和激励表法。公式法就是推导出转换后的激励方程激励表法就是列出目标触发器的状态转移表然后反推激励输入。两种方法都要会考场上哪个快用哪个。3.2 时序分析建立时间和保持时间建立时间和保持时间是时序逻辑的核心概念也是景嘉微这类芯片公司笔试的必考内容。建立时间是指在时钟边沿到来之前数据必须保持稳定的最小时间。保持时间是指在时钟边沿到来之后数据必须继续保持稳定的最小时间。这两个参数决定了电路能跑多高的时钟频率。笔试里常见的计算题是给你触发器的建立时间、保持时间、时钟到输出的延迟、组合逻辑的延迟让你计算电路的最高工作频率。公式是最小时钟周期 触发器时钟到输出延迟 组合逻辑最大延迟 触发器建立时间。最高频率就是最小时钟周期的倒数。这个公式看起来简单但有几个坑。第一组合逻辑的延迟要取最大值不是平均值。第二如果时钟有偏斜还要考虑时钟偏斜的影响。第三保持时间的检查是另一个公式触发器时钟到输出延迟 组合逻辑最小延迟 触发器保持时间。如果这个条件不满足电路会出现保持时间违例数据可能被错误采样。我见过很多人在笔试里只算建立时间忘了保持时间。题目如果问“电路能否正常工作”你必须两个条件都检查。只满足建立时间不满足保持时间电路照样会出错。注意时钟偏斜对建立时间和保持时间的影响是相反的。正偏斜有利于建立时间不利于保持时间负偏斜有利于保持时间不利于建立时间。笔试里如果给了时钟偏斜参数一定要把它代入公式。3.3 状态机设计从状态图到Verilog实现状态机是时序逻辑里综合性最强的考点。笔试里通常会给你一个场景描述让你画出状态转移图然后写出状态转移表和输出方程最后用Verilog实现。状态机分为Moore型和Mealy型。Moore型的输出只与当前状态有关Mealy型的输出与当前状态和输入都有关。两者的区别在状态转移图上表现为Moore型的输出写在状态圈里Mealy型的输出写在转移箭头上。笔试里如果要求你设计一个序列检测器比如检测“1011”序列用Moore型和Mealy型实现的状态数可能不同。Mealy型通常比Moore型少一个状态因为输出可以提前一个周期产生。状态化简是另一个考点。如果两个状态在所有输入下的输出相同且转移到的次态也相同那么这两个状态是等价的可以合并。状态化简的目的是减少触发器的数量降低电路面积。笔试里可能会给你一个状态表让你化简。化简的方法有隐含表法和分区法分区法更直观一些。Verilog实现状态机我推荐用三段式写法第一段用时序逻辑描述状态寄存器的更新第二段用组合逻辑描述次态的计算第三段用组合逻辑或时序逻辑描述输出。三段式写法的好处是逻辑清晰综合出来的电路也比较规范。一段式写法虽然代码短但容易出错不推荐在笔试里用。// 三段式状态机示例检测序列1011 module seq_detector( input clk, input rst_n, input din, output reg detected ); // 状态编码 localparam IDLE 3b000; localparam S1 3b001; localparam S2 3b010; localparam S3 3b011; localparam S4 3b100; reg [2:0] cur_state, nxt_state; // 第一段状态寄存器更新 always (posedge clk or negedge rst_n) begin if (!rst_n) cur_state IDLE; else cur_state nxt_state; end // 第二段次态组合逻辑 always (*) begin case (cur_state) IDLE: nxt_state din ? S1 : IDLE; S1: nxt_state din ? S1 : S2; S2: nxt_state din ? S3 : IDLE; S3: nxt_state din ? S4 : S2; S4: nxt_state din ? S1 : S2; default: nxt_state IDLE; endcase end // 第三段输出逻辑 always (posedge clk or negedge rst_n) begin if (!rst_n) detected 1b0; else if (cur_state S4 din 1b1) detected 1b1; else detected 1b0; end endmodule这段代码是Moore型状态机的写法输出在时钟边沿更新。如果改成Mealy型输出可以写成组合逻辑检测到序列时立即输出不需要等下一个时钟沿。笔试里如果对输出时序有要求一定要看清楚题目说的是“检测到序列后立即输出”还是“下一个时钟周期输出”。4. Verilog与FPGA校招笔试的加分项4.1 Verilog语法陷阱阻塞赋值与非阻塞赋值Verilog的阻塞赋值和非阻塞赋值是笔试里最容易出错的地方。阻塞赋值用“”非阻塞赋值用“”。在时序逻辑里必须用非阻塞赋值在组合逻辑里用阻塞赋值。这个规则看起来简单但考试里经常出一些模棱两可的代码让你判断输出。阻塞赋值是顺序执行的后面的语句会等待前面的语句执行完。非阻塞赋值是并行执行的所有语句在时钟边沿同时计算然后在时间步结束时统一更新。如果在时序逻辑里用了阻塞赋值可能会产生竞争冒险仿真结果和综合结果不一致。我见过一道笔试题给了一段用阻塞赋值的时序逻辑代码问仿真输出是什么。很多人按顺序执行去算结果算错了。因为阻塞赋值在时序逻辑里虽然仿真时看起来是顺序执行的但综合出来的电路可能和你想的不一样。正确的做法是看到时序逻辑里的阻塞赋值直接判定为“不推荐写法”然后按非阻塞赋值的逻辑去分析。实操心得笔试里如果让你写代码时序逻辑一律用非阻塞赋值组合逻辑一律用阻塞赋值。如果让你改错看到时序逻辑里的阻塞赋值改成非阻塞赋值就对了。这个规则能帮你拿下不少分。4.2 跨时钟域处理笔试里的高阶考点跨时钟域处理是FPGA和数字IC设计里的经典问题景嘉微的笔试里也出现过。跨时钟域的核心问题是亚稳态。当一个信号从一个时钟域传到另一个时钟域时如果两个时钟没有固定的相位关系采样时可能采到信号跳变的中间状态导致亚稳态。解决亚稳态的常用方法是两级触发器同步。第一级触发器采样异步信号第二级触发器再采样第一级的输出。两级触发器之间不需要组合逻辑这样即使第一级出现亚稳态第二级采样时信号已经稳定了。两级触发器的平均无故障时间可以计算公式涉及触发器的亚稳态分辨时间常数和时钟频率。笔试里如果考计算通常会给你这些参数让你算MTBF。对于多比特信号的跨时钟域不能简单用两级触发器因为多比特信号可能同时变化采样时可能采到错误的组合。常用的方法是使用异步FIFO或者握手协议。异步FIFO用格雷码指针来避免多比特同时变化的问题握手协议则通过请求和应答信号来确保数据稳定传输。笔试里如果考跨时钟域通常会让你画出同步电路的框图或者分析某个跨时钟域电路是否存在问题。记住几个关键点单比特信号用两级触发器多比特信号用异步FIFO或握手格雷码用于跨时钟域的计数器。4.3 FPGA基础概念从查找表到时钟资源FPGA相关的概念在景嘉微的笔试里也会涉及毕竟他们的产品线和FPGA有交集。FPGA的基本结构包括可编程逻辑块、可编程互连、可编程IO。可编程逻辑块的核心是查找表通常是4输入或6输入的LUT。LUT本质上是一个小型的SRAM用来实现组合逻辑函数。笔试里可能会问一个4输入LUT能实现多少个逻辑函数答案是2的16次方因为4输入有16种输入组合每种组合对应一个输出位所以有2的16次方种可能的真值表。这个数字很大但实际设计中只会用到其中一部分。FPGA的时钟资源也是考点。FPGA内部有专用的时钟网络包括全局时钟、区域时钟和IO时钟。全局时钟可以驱动整个芯片偏斜小但功耗高。区域时钟驱动一个区域偏斜稍大但功耗低。IO时钟用于IO接口。笔试里可能会问为什么FPGA设计里推荐使用全局时钟答案是全局时钟的偏斜小能保证时序收敛。Block RAM和分布式RAM的区别也是常见考点。Block RAM是FPGA内部的专用存储块容量大但数量有限。分布式RAM是用LUT实现的容量小但灵活。笔试里如果问你什么时候用Block RAM什么时候用分布式RAM答案是大容量存储用Block RAM小容量或需要异步读写的用分布式RAM。5. 笔试实战策略与避坑指南5.1 时间分配先拿稳分再啃硬骨头景嘉微的笔试通常是线上进行时间一般在90到120分钟。题量不小有选择题、填空题、简答题和设计题。我的建议是选择题和填空题控制在40分钟内做完简答题30分钟设计题留40分钟最后10分钟检查。选择题里遇到不确定的先标记不要纠结。数字电路的选择题有时候考得很细比如某个74系列芯片的引脚功能你如果没记住想再久也想不出来。不如先跳过把能拿的分先拿到。填空题通常考基本概念比如“触发器的建立时间是指什么”这种题只要复习过就能写出来不要空着。设计题是拉分的关键。通常是一道组合逻辑设计加一道时序逻辑设计。组合逻辑设计可能是用MUX或译码器实现逻辑函数时序逻辑设计可能是状态机或计数器。设计题一定要写清楚思路即使最后代码没写完思路对了也能拿步骤分。注意线上笔试通常有摄像头监考不要切屏不要查资料。一旦被判定作弊成绩直接作废还会影响后续投递。老老实实复习比什么都强。5.2 常见陷阱这些坑我替你踩过了第一个坑混淆“逻辑电平”和“逻辑值”。笔试里经常出现“高电平有效”和“低电平有效”的描述很多人一看到“有效”就以为是1其实低电平有效时有效状态是0。比如74138译码器的输出是低电平有效输出为0时表示该输出被选中。第二个坑忽略“无关项”。卡诺图化简时无关项用X表示可以当作1也可以当作0。很多人看到X就跳过结果化简出来的表达式不是最简的。记住无关项是你的朋友用好了能少好几个项。第三个坑时序逻辑里忘记复位。Verilog代码里如果有时序逻辑一定要有复位信号。笔试里如果让你写代码没有复位的时序逻辑会被扣分。复位分同步复位和异步复位异步复位用“posedge clk or negedge rst_n”同步复位只用“posedge clk”。两种写法都要会。第四个坑状态机状态编码用二进制还是独热码。二进制编码用的触发器少但组合逻辑复杂独热码用的触发器多但组合逻辑简单而且不容易出现毛刺。笔试里如果问你选哪种答案是状态少的时候用二进制状态多的时候用独热码。FPGA里因为触发器资源丰富独热码更常用。5.3 复习路线从零到笔试通过如果你现在距离笔试还有两周我建议这样安排第一周把数字逻辑基础过一遍重点是卡诺图化简、触发器、时序分析。第二周做真题和模拟题重点练状态机设计和Verilog代码。具体来说第一天的任务是数制转换和逻辑门第二天是布尔代数和卡诺图第三天是组合逻辑电路第四天是触发器和锁存器第五天是时序分析第六天是状态机第七天是Verilog语法。第二周开始做套题每天一套做完对答案把错题整理出来第二天再复习一遍。复习资料方面学校的数字电路教材就够了重点是课后习题。Verilog方面网上有很多开源的练习题比如HDLBits上面的题目和笔试难度接近适合练手。FPGA基础概念可以看Xilinx或Altera的官方文档不用看太深了解基本结构就行。实操心得笔试前一天不要熬夜刷题把之前整理的错题看一遍早点睡觉。笔试当天提前半小时调试设备确保摄像头和麦克风正常。做题时先易后难遇到卡住的题先跳过最后再回来想。6. 从笔试到面试你还需要准备什么笔试通过之后通常一到两周内会收到面试通知。景嘉微的面试一般有两到三轮技术面会问项目经历和基础知识HR面会问职业规划和薪资期望。技术面里面试官可能会让你画一个状态机或者分析一个时序电路。这时候你要把笔试里学到的东西用上但更重要的是展示你的思考过程。不要一上来就写答案先说说你的思路比如“我先分析这个电路的时钟域然后看建立时间和保持时间是否满足”。面试官更看重你的分析能力而不是你背了多少知识点。项目经历方面如果你做过FPGA相关的项目比如图像处理、通信接口、信号发生器一定要好好准备。面试官会问你项目的架构、你负责的部分、遇到的困难和解决方法。如果你没做过FPGA项目可以说说课程设计或者竞赛经历重点是展示你的动手能力和解决问题的能力。最后说一句景嘉微作为国内GPU领域的公司对数字电路工程师的要求还是比较高的。笔试只是第一关后面的面试才是真正的考验。但只要你把基础打牢把常见的考点都复习到位通过笔试并不难。我见过很多非科班的同学认真复习两周就过了。关键是你愿不愿意花时间把那些看似简单但容易出错的知识点真正搞懂。这个内容后续还可以这样扩展如果你对FPGA实现具体算法感兴趣可以看看图像边缘检测、串口通信、频率测量这些方向这些都是笔试和面试里经常出现的项目场景。把笔试题和实际项目结合起来理解你会发现很多知识点是相通的。