1. 项目概述为Tang Nano 9k FPGA打造多功能扩展板作为一名长期混迹硬件开发圈的老手我最近完成了一个特别实用的项目——为Sipeed Tang Nano 9k FPGA开发板设计了一款全功能扩展板。这个扩展板的灵感来源于NAND Land的The Go Board等传统FPGA评估板但针对Tang Nano 9k的特殊接口进行了深度优化。Tang Nano 9k本身虽然提供了丰富的GPIO引脚但原生只有2个按键和6个LED对于复杂的硬件验证和项目开发来说远远不够。我的扩展板完美解决了这个问题它集成了16位拨码开关及对应LED状态指示5向导航按键独立功能按键8位数码管显示VGA视频输出接口16键矩阵键盘接口128x64单色和320x240彩色LCD屏接口这个扩展板特别适合以下几类开发者FPGA初学者通过丰富的输入输出设备快速验证逻辑设计嵌入式系统开发者构建完整的人机交互界面原型电子爱好者无需额外布线就能实现复杂的硬件交互项目2. 硬件架构设计解析2.1 核心设计理念与挑战在设计之初我主要考虑了三个关键因素电压兼容性Tang Nano 9k的GPIO分为1.8V和3.3V两组不能直接混用。扩展板需要妥善处理电平转换问题。引脚复用有限的FPGA引脚需要驱动多种外设必须设计合理的复用方案。模块化扩展不同项目需要的外设组合不同扩展板应该支持灵活配置。针对这些挑战我的解决方案是将1.8V引脚专用于VGA输出RGB222格式同步信号使用74LVC245芯片实现1.8V到3.3V的电平转换通过物理开关和软件配置实现外设复用采用模块化连接器设计各功能模块可独立插拔2.2 关键电路设计细节2.2.1 VGA输出电路VGA接口是本项目最复杂的部分之一。Tang Nano 9k的1.8V GPIO正好适合驱动VGA的RGB信号0-0.7V范围我采用了经典的R-2R电阻网络实现6位DACRGB各2位。// VGA时序生成核心代码片段 parameter H_DISPLAY 686; parameter V_DISPLAY 480; reg [9:0] h_count; reg [9:0] v_count; always (posedge clk_27m) begin if (h_count H_TOTAL-1) begin h_count 0; if (v_count V_TOTAL-1) v_count 0; else v_count v_count 1; end else begin h_count h_count 1; end end assign h_sync (h_count H_SYNC) ? 0 : 1; assign v_sync (v_count V_SYNC) ? 0 : 1;重要提示VGA同步信号需要标准的TTL电平0-3.3V直接使用1.8V GPIO驱动会导致同步不稳定。我最终通过2N2222晶体管搭建了简单的电平转换电路解决了这个问题。2.2.2 矩阵键盘扫描电路16键矩阵键盘采用4x4扫描设计行线通过FPGA输出扫描信号列线作为输入检测按键状态。这里有一个关键技巧在切换扫描行后需要添加约1μs的延迟再读取列值以消除按键接触电阻导致的RC延迟影响。// 键盘扫描状态机 reg [1:0] scan_state; reg [3:0] row_select; always (posedge clk_1k) begin case(scan_state) 0: begin row_select 4b1110; // 扫描第一行 scan_state 1; end 1: begin #1; // 关键延迟 key_data[3:0] col_input; scan_state 2; end // 其他行扫描状态... endcase end3. 外设接口实现详解3.1 数码管显示驱动8位数码管采用动态扫描方式驱动仅使用9个FPGA引脚8段1位选。我特别添加了74HC138 3-8译码器来扩展位选信号这样比直接使用FPGA引脚节省了3个IO资源。数码管亮度控制技巧扫描频率建议设置在100-200Hz之间避免肉眼可见闪烁每个位点亮时间约1-2ms可通过PWM调节整体亮度在驱动代码中添加消隐处理防止段码切换时的鬼影现象3.2 双LCD屏接口设计扩展板同时支持两种SPI LCD屏128x64单色OLED屏SH1106驱动320x240彩色TFT屏ILI9341驱动创新性地采用引脚复用方案共用SPI CLK/MOSI信号线使用独立的CS片选信号通过物理开关切断数码管供电避免显示干扰// LCD屏选择逻辑 assign oled_cs (display_sel 0) ? spi_cs : 1b1; assign tft_cs (display_sel 1) ? spi_cs : 1b1; assign seg7_en (display_sel 2) ? 1b0 : 1b1; // 数码管使能4. 硬件调试经验与避坑指南4.1 HDMI电容引发的血案在测试键盘功能时我发现底部两行按键无法正常响应。经过示波器排查发现是Tang Nano 9k板上HDMI接口的滤波电容导致GPIO响应速度过慢上升时间约1ms。最终解决方案是——直接移除这些电容操作警示移除SMD电容需要精湛的焊接技术建议使用以下步骤使用热风枪300°C均匀加热电容两端用镊子轻轻夹取电容清理焊盘残留焊锡用酒精清洁处理区域4.2 VGA同步信号电平问题最初我误以为VGA同步信号可以接受1.8V电平实际测试发现显示器只能间歇性识别信号。通过示波器测量发现标准VGA要求同步信号2.4VTTL高电平1.8V信号处于不确定状态解决方案添加NPN晶体管电平转换电路4.3 电源管理要点扩展板上有多个耗电部件必须注意总电流不超过Tang Nano 9k的500mA供电限制当同时使用LCD屏和数码管时建议外接5V电源各模块电源最好添加独立开关控制5. 项目进阶应用方向这套扩展板已经成功应用于我的多个教学和原型开发项目以下是一些典型应用场景5.1 简易示波器实现使用ADC读取模拟信号通过VGA输出波形显示按键控制时基和幅度数码管显示测量参数5.2 复古游戏机矩阵键盘作为游戏手柄VGA输出游戏画面数码管显示分数FPGA实现游戏逻辑5.3 工业控制面板模拟拨码开关设置参数LED显示状态按键作为控制输入LCD屏展示运行数据在实际使用中我发现这套扩展板最实用的特点是它的模块化设计。比如在做频谱分析项目时我可以同时连接VGA显示器输出频谱图用数码管显示中心频率用LCD屏展示峰值信息而键盘则用于参数调整——所有功能都能并行工作互不干扰。对于想要复现这个项目的朋友我的建议是先从核心功能开始比如先实现VGA输出和基本按键输入再逐步添加其他外设模块。PCB设计时务必留足测试点和调试接口这对后期排错会有巨大帮助。