Tang Nano 9k FPGA扩展板设计与应用指南
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位DAC(RGB各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 <= 4'b1110; // 扫描第一行 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 : 1'b1; assign tft_cs = (display_sel == 1) ? spi_cs : 1'b1; assign seg7_en = (display_sel == 2) ? 1'b0 : 1'b1; // 数码管使能4. 硬件调试经验与避坑指南
4.1 HDMI电容引发的血案
在测试键盘功能时,我发现底部两行按键无法正常响应。经过示波器排查,发现是Tang Nano 9k板上HDMI接口的滤波电容导致GPIO响应速度过慢(上升时间约1ms)。最终解决方案是——直接移除这些电容!
操作警示:移除SMD电容需要精湛的焊接技术,建议使用以下步骤:
- 使用热风枪(300°C)均匀加热电容两端
- 用镊子轻轻夹取电容
- 清理焊盘残留焊锡
- 用酒精清洁处理区域
4.2 VGA同步信号电平问题
最初我误以为VGA同步信号可以接受1.8V电平,实际测试发现显示器只能间歇性识别信号。通过示波器测量发现:
- 标准VGA要求同步信号>2.4V(TTL高电平)
- 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设计时务必留足测试点和调试接口,这对后期排错会有巨大帮助。
