2026年FPGA校招笔试Verilog代码题,为什么「用状态机实现I2C主机读写EEPROM」比「写一个UART」更容易拉开分差?

开放9 回答 148 浏览

最近刷2026届FPGA校招笔试题,发现很多公司大题从UART换成了I2C主机控制器,要求写状态机+三态门+时钟拉伸处理。UART大家课程设计都做过,但I2C的START/STOP时序、ACK采样窗口、SCL频率切换在笔试纸上很容易写崩。想问下这类题评分标准到底看什么?是状态划分完整性,还是对总线时序细节的处理?

分享:

9 个回答

  • 后端新手

    说个比较实在的观察:I2C这道题的分差,多半不在「状态机写得漂不漂亮」,而在「你有没有真正在脑子里跑过一遍波形」。UART的帧结构是单向的、固定的,起始位、8位数据、停止位,写起来就是移位加计数,阅卷老师扫一眼就知道你会不会。I2C不一样,它是双向握手协议,START之后要发地址、等ACK、再发数据、再等ACK,每一步的SDA方向都在切换,而且SCL低电平期间才能改SDA这条规则,很多人纸上画波形时根本没意识到。评分常见的三个点:状态机有没有覆盖START、地址、ACK、数据、STOP全流程;有没有SCL低电平改SDA的时序意识;时钟拉伸和总线仲裁提没提。第三点哪怕只写一句注释都能加分,因为它说明你知道I2C不是主机一个人说了算。建议别光看题,找个仿真器手写一遍主机RTL,把EEPROM模型接上去跑波形,写崩一次比看十遍书管用。你现在是准备笔试阶段,还是已经进到要手撕代码的面试环节了?

  • 数字电路萌新007

    我是在校生视角说吧。UART和I2C在笔试里最大的区别,是UART你写错了顶多丢几位数据,I2C你写错了整条总线都动不了。阅卷老师看UART主要看你波特率计数对不对、帧结构清不清楚;看I2C他其实在找一个东西——你有没有真正把时序图翻来覆去画过。START是在SCL高时把SDA拉低,STOP反过来,这两个动作很多人纸上直接写成两个状态就完事,但真正写RTL时你会发现START和第一个地址位之间还夹着SCL拉低、SDA准备这些细节。ACK采样窗口也一样,第9个SCL高电平期间采样SDA,错过就误判。所以准备的时候别只背状态机,拿张纸把START到STOP的波形一格一格画出来,再对着波形写状态转移,比抄模板有效得多。你目前是打算先从主机写起,还是连从机模型一起搭?

  • 嵌入式初学者

    我做过几年FPGA,也帮组里看过校招卷子,说点工程侧的感受。这道题拉开分差的根子,不在于状态机画得漂不漂亮,而在于I2C本身是个带反馈、带方向切换、还可能被外部拉住的协议,UART没有这些。UART是单向广播,主机发完就完事,状态机基本就是「空闲—起始—数据位—停止」一条直线;I2C每一步都要等对方回应,SDA方向在地址阶段和数据阶段还不一样,主机发完地址得切成输入去采ACK,采完再切回输出发数据。这个方向切换在纸上写很容易漏,一漏波形就全错。

    再往深一层,评分其实分三个层次。第一层是流程覆盖,START、地址、ACK、数据、ACK、STOP有没有走全,状态划分合不合理,这是及格线。第二层是时序意识,SCL低电平期间才能改SDA这条规则有没有体现在代码里,很多人状态机写得挺顺,但改SDA的动作放在SCL高电平,仿真波形一看就穿帮。第三层是边界认知,时钟拉伸和总线仲裁提没提。哪怕你实现不了,写一句注释说明「从机可能拉低SCL,主机需检测并等待」都会加分,因为这证明你知道I2C不是主机一个人说了算。

    准备路径上我建议别停在纸上。找个仿真器,手写一遍主机RTL,挂一个EEPROM行为模型,把写一字节、读一字节的波形跑出来。写崩是常态,崩在哪你就记住哪。三态门那块也别忽略,SDA是双向的,inout端口配合输出使能怎么写、仿真里怎么给从机模型驱动,这些在笔试纸上写错也是扣分点。工具链用iverilog或者Vivado自带仿真都行,重点是你能看着波形说出每个时钟沿SDA该是什么值。你手头有能跑仿真的环境吗,还是只在纸上练?

  • 码电路的张同学

    换个角度提醒一下风险。很多同学觉得I2C难在状态多,其实真正的坑是「你以为自己会了」。课程设计里跑通过UART的人,往往对时序有种错觉,觉得协议无非是数节拍。但I2C的时钟拉伸是个隐藏变量:从机没准备好会把SCL拉低,主机如果只会按固定计数走,波形就乱了。笔试里哪怕不要求实现,你写个状态「WAIT_SCL_HIGH」或者一句注释,分数就不一样。另一个容易翻车的是把START和地址当成一个状态写,结果SDA切换时机对不上。我的建议是准备时给自己加个约束:不许用现成模板,从零写一遍主机收发,仿真里故意让从机延迟拉低SCL,看你的状态机卡不卡死。能扛住这个测试,笔试那道题基本稳了。

  • 电子技术新人

    UART是自说自话,I2C得等对方回话。笔试里前者拼细心,后者拼你有没有真在波形上踩过坑——ACK采样、方向切换、低电平改SDA,随便漏一个整段就废了。你画过完整时序图吗?

  • FPGA萌新

    UART是单向流,写错顶多丢数据;I2C是双向握手,写错整条总线都不动。评分其实就盯三件事:流程全不全、改SDA有没有卡在SCL低电平、有没有提时钟拉伸。你仿真跑过一版主机RTL吗?

  • Verilog学习中

    其实拉开分差的不是I2C本身难多少,而是它逼你把「协议是活的」这件事写进代码里。UART那边你数节拍就行,发送方说了算;I2C每一拍都在等对方表态,ACK不来你就得停在那。所以准备的时候我建议换个练法:别急着画大状态机,先把一次完整传输拆成「谁在驱动SDA」的时间线。地址阶段主机输出,第9个SCL高电平前必须把SDA放掉切成输入,采完ACK再切回输出——这条切换线画不对,后面全白搭。纸上写的时候可以给自己加个规矩:每个状态旁边标一句「此刻SDA谁在管、SCL是高还是低」,标不出来说明你还没想清楚。至于时钟拉伸和仲裁,笔试通常不要求你真实现,但状态机里留个WAIT_SCL_HIGH或者写一行注释,阅卷的人一眼就知道你见过真实总线。你手头有EEPROM的模型能接上仿真吗?

  • 逻辑设计小白

    说个容易被忽略的点:这道题的区分度,一半在代码,一半在「你踩过哪些坑」的叙述上。校招笔试卷面就那么大,阅卷老师不可能逐行读你的RTL,他扫的是几个关键信号——START是不是在SCL高时拉低SDA、STOP是不是反过来、ACK采样窗口有没有落在第9个高电平中间、地址和数据阶段方向切换有没有体现。这些点只要错一个,整段时序就废了,所以他很容易通过「有没有错」快速分层。

    但真正把人和人分开的,往往是那些「不要求实现却写了一句」的地方。比如时钟拉伸:从机没准备好会把SCL拉低,你主机如果只会按固定计数走,波形立刻就乱。哪怕你只在状态机里加一个等SCL真正变高的状态,或者注释里写一句「此处需检测SCL被从机拉低」,分数就不一样。再比如总线仲裁,笔试一般不考实现,但提一句「多主机场景下需监听SDA与自身输出是否一致」,说明你知道I2C不是主机一个人说了算。

    还有个风险要提醒:很多人课设跑通过UART,就以为自己「会时序」,结果在I2C上翻车。UART没有反馈、没有方向切换、没有外部拉低,它的顺利会给你一种错觉。所以准备这类题,别抄模板,从零写一遍主机收发,仿真里故意让从机延迟拉低SCL,看你的状态机卡不卡死。能扛住这个测试,笔试卷面上那点细节基本不会漏。

    顺带说个替代做法:如果你时间紧,不一定要写完整读写,先把「写一个字节到EEPROM」这一条路径打通,START、设备地址、ACK、寄存器地址、ACK、数据、ACK、STOP 走全,比贪多写一半强。你现在是卡在状态划分,还是卡在方向切换的时机上?

  • Data新手

    先说结论:这道题的评分分两层,一层是「你有没有把流程写全」,另一层是「你是不是只在纸上画过状态机、没真正跑过波形」。第一层好理解,START、从机地址、ACK、数据、ACK、STOP 走全,状态划分别把 START 和地址挤在一个状态里,这是及格线。第二层才是拉分的,因为它暴露的是你有没有被总线坑过。

    举个具体的:SCL 低电平期间才能改 SDA。很多人状态机写得挺顺,但把输出寄存器的更新放在时钟上升沿,一仿真波形就发现 SDA 在 SCL 高电平中间变了,从机直接认成 START 或 STOP。这不是逻辑错,是时序意识缺失。阅卷老师扫一眼你的赋值条件,基本就能判断。

    再补一个容易被忽略的风险:别把 I2C 当成「会动就行」的题。如果你只写了主机、没接从机模型仿真,你根本不知道自己的 ACK 采样窗口是不是落在第 9 个 SCL 高电平中间。建议准备时做一件事——找一个 EEPROM 或通用从机模型,故意让从机在第 9 拍前把 SCL 拉低,看你的状态机是死等还是能进 WAIT_SCL_HIGH 再出来。能扛住这一下,笔试那题基本就稳了。

    至于时钟拉伸和总线仲裁,笔试通常不要求实现,但你在注释或状态机里留一句「此处需检测 SCL 被从机拉低」「多主机时需比对 SDA 与自身输出」,是低成本高回报的加分动作。

    你手头现在有能跑的仿真环境吗,还是只打算纸上练?

登录后可在本页底部提交回答

提问者

芯片初学者查看主页
浏览「其他」

描述场景与已尝试方案,更容易获得有效解答

相关问题

同分类

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位