从 ASCII 到 ASIC:将 donut.c 移植到一小片硅片上

  • 2025 年 1 月 10 日:多年前想出donut.c后,作者一直想简化它,2023 年 10 月想出新方法,无需内存、正弦余弦、平方根、除法甚至乘法,仅用移位和加法就能渲染圆环,有更新的 C 版本
  • 硬件实现与制造:花了近一年时间将该想法付诸实际硬件实现,2024 年 9 月初向Tiny Tapeout 8提交 4 块设计,占 130nm 工艺芯片的 0.8%,由 SkyWater Technologies 制造,视频展示将在 VGA 显示器上渲染圆环,实际硅片并非圆环形状,可在这里查看芯片布局可视化。
  • 源文件与开发环境:TinyTapeout Verilog 项目在github 上,有 Verilator 测试平台生成视频,基于 OrangeCrab FPGA 开发,因使用 OrangeCrab 时钟,选择 1220x480 的奇怪 VGA 模式,在模拟 CRT 上效果好,LCD 显示器有别名伪影。
  • 用移位和加法渲染圆环:将圆环表示为有符号距离函数并“射线追踪”,利用 CORDIC 计算二维向量长度,找到射线与圆环交点,通过射线追踪找到表面法线计算光照,无需乘法,用 CORDIC 旋转向量找到表面法线,这是圆环的二维长度特性使该技术可行,无法类似地渲染球体。
  • 射线追踪圆环的 C 代码:有另一个仅用移位和加法的 donut.c(源文件),C 代码不紧凑但逻辑门更少,Bruno Levy 发现限制 CORDIC 迭代次数会使圆环呈面状渲染,在最终 ASIC 版本中使用 3 次 r₁迭代和 2 次 r₂迭代。
  • 复合旋转与无乘法:通过跟踪 8 个变量实现物体整体旋转,用旋转宏R(),但会随时间漂移,需在 A 和 B 完整循环时重新初始化,TinyTapeout 建议使用 50MHz 时钟,选择 48MHz,为使 CORDIC 迭代在一个周期内完成削减精度,射线追踪需迭代 8 次,水平偏移进行抖动以避免块状,视频输出通过Tiny VGA Pmod,采用 6 位内部颜色深度的有序抖动。
  • 避免最后一次乘法:挑战是沿指定距离步进 3D 单位向量进行射线追踪,因门区有限且不想跨多个时钟周期展开,选择近似乘法器找到最高位并返回移位后的单位向量作为步进方向。
  • 总结:从混淆 C 代码打印 ASCII 艺术到用位运算渲染 3D 图形,再到用微小硅片追踪电子束,该项目展示同一基本想法可重新想象和优化,从有趣编程难题到发现用最少计算资源渲染 3D 图形的优雅方法,限制 CORDIC 迭代产生的多边形外观是意外之喜,Tiny Tapeout 8 预计 2025 年 5 月交付芯片,还举办了首届 Tiny Tapeout Demoscene 竞赛,作者有参赛作品待评判结束后介绍。同时提到 HAKMEM 149 算法旋转点虽不损失大小但乘积会在李萨如曲线模式下损失大小,以及用 Bayer 矩阵进行有序抖动的原因。
阅读 7
0 条评论