凌晨两点。最后一版方案总算熬出头。屏幕一暗。黑玻璃里反出张脸,没精打采的。连眼底的乌青都糊成一片了。我顺手点开设置,切了壁纸,把通知权限关了一遍又开,折腾回原样。好像只要开关还亮着,我就还能攥着点主动权。直到上周收拾书架,指尖蹭到那本《Altera可编程逻辑器件的应用与设计》。封皮都磨毛了,边角还卷着。翻开一页,有句话直接砸过来:未编程的FPGA,只是一块沉默的硅片。
书里没绕弯子。CPLD和FPGA出厂那会儿,里头全是空的。没逻辑,也没固定功能。就跟刚拆封的硬盘似的,啥指令都没有。工程师拿硬件描述语言,把时钟、数据通路、中断处理一点点往里塞。接着综合、布局、布线。最后把代码烧进去。一通电,这块硅片就认死理,只管干活。说实话,这玩意儿听着挺极客,真上手了才知道什么叫“指哪打哪”。它不跟你扯淡。代码写进去,它就得照做。少一个时钟周期都不行。
看着看着,我忽然觉得,咱们折腾自己,跟折腾芯片简直一个德行。总怕选了条道,就把别的路堵死。总想着得保持“可编程”的架势,随时能换人设。于是今天试这个,明天推翻那个。在“我到底适合干啥”这道题上反复擦写。嘴上说着叫开放、叫留余地,骨子里其实是把自个儿搁在了永远跑不通的开发板上。我觉得吧,这事儿大概就是这么个意思:永远不锁定,其实等于永远在空转。
调试这东西,最耗人。每次重配,都得跟编译报错、时序违例、信号抖动死磕。书里扒拉DMA控制器和多路ADC采集系统的开发流程,一步踩空,步步皆错。数据从哪进?怎么暂存?时钟频率对没对上?差一丁点,整个系统直接卡死。过日子不也这样吗?天天喊着要灵活,却忘了灵活得有个底盘。接口不定死,时钟源不稳,再多的“可能”也就是满屏乱窜的杂波。我以前也总琢磨,能不能两边都兼顾?后来发现,未必行。资源就那么多,贪多嚼不烂,最后往往是个半成品。
以前我总把“锁定”当成终点,觉得定下身份、认准方向,这辈子就算封顶了。后来才咂摸出味儿来,那其实是起跑线。芯片非得把确定的逻辑烧进去,才算有了用武之地。它不用再纠结数据该往哪条线跑,时钟一响,把该送的数据甩出去就行。那种“不用再做选择题”的确定感,反倒让人喘口气,浑身轻松。可能有人会觉得,定死方向就没了后路?未必。你见过哪个跑通一次编译的芯片,会因为没留白就废了?它只管输出。
我也开始给生活做减法了。新机会砸过来,不再非得伸手去接;局面一变,也不急着找编译器重写代码。有些选择确实会留遗憾,有些路走上去就回不了头。但书里写得实在:设计不求完美,只求可用。手里资源就那么多,把最核心的功能跑顺,把该处理的数据理顺,剩下的,让时间去慢慢容错。毕竟人不是机器,容错率高点,反倒活得长久。
有时候,允许自己不再“可编程”,真不是认怂。是终于想通了:人这辈子,总得亲自跑完一次编译。那些报错、那些警告、那些反复调的时序,都是为了最后输出能稳当点。咱们没必要永远留白,也没必要随时待命切换。把代码敲进心里,把功能跑通,然后安安静静地干活。
屏幕又暗下去了。这回我没去碰设置。窗外的楼群还亮着,密密麻麻的窗格,像一块块正在执行指令的芯片。明天会不会又蹦出新需求,我心里没底。但至少现在,我认了:这个版本,已经编译完成了。