用 Haskell 在 FPGA 上解 Advent of Code:Clash 硬件设计手记
来源:midirus.com — 2026-08
📋 概述
作者用 Clash——一个把 Haskell 编译成可综合 HDL(如 Verilog)的函数式硬件描述语言——在真实 FPGA 芯片上解出了 Advent of Code 第四天的题目。他先介绍 Clash 的类型级核心:KnownNat 表达静态位宽、定长 Vec、BitVector 与 BCD 等定宽类型,并解释为何 Haskell 标准库的列表不适合综合。随后他实现了一个基于 Mealy 机的字节流求解器,借助隐藏的时钟/复位/使能约束与 Signal 抽象来建模寄存器传输级(RTL)电路。他还演示了如何在 ghci 里用 sample 模拟信号、用「busy」相位打破递归来支持任意步数的计算,最终在真实硬件上输出答案。
🔑 核心要点
- Clash 把 Haskell 编译成可综合 HDL,用类型级系统保证位宽匹配。
- KnownNat 与定长 Vec 在编译期就确定精确的线宽。
- 用 Mealy 机建模字节流求解器,靠隐藏时钟/复位/使能约束实现 RTL。
- 递归函数无法综合,改用 busy 相位把任意步数计算拆成逐拍执行。
- 可在 ghci 用 sample 直接模拟信号验证设计。
💡 金句
递归的优雅在这里走不通——硬件必须把每一步都摆到时钟上,这就是 RTL 的纪律。
👍 0
👎 0
← 返回 Lobsters 首页