# FPGA-based SSD1306 OLED Display Controller
基于 FPGA 与 SPI 的 0.96 寸 OLED 显示控制器设计与 Verilog 实现
博客来源: https://blog.csdn.net/weixin_/article/details/
项目概述
本项目实现了基于 FPGA 的 SSD1306 驱动芯片控制方案,用于驱动 128x64 分辨率的 0.96 寸 OLED 显示屏。通过 Verilog 硬件描述语言实现 SPI 通信协议,直接控制 OLED 的每一个像素点。
技术特性
- 分辨率: 128x64 像素(8 页 × 128 列)
- 接口: 4 线 SPI(SCLK, MOSI/SDIN, DC, CS)
- 刷新率: 可达 60Hz 以上
- SPI 时钟: 约 1MHz(系统时钟 50MHz 时分频)
项目结构
├── spi_controller.v # SPI 通信控制器模块 ├── ssd1306_init.v # SSD1306 初始化序列模块 ├── frame_buffer.v # 帧缓冲管理器(1024 字节显存) ├── oled_display_top.v # 顶层模块,整合所有子模块 ├── oled_display_tb.v # 测试平台(Testbench) └── README.md # 项目说明文档
模块说明
1. spi_controller.v - SPI 通信控制器
实现 SPI 同步串行通信协议:
- 状态机控制:IDLE → SEND_CMD → SEND_DATA
- 8 位数据移位寄存器
- 可配置的时钟分频
- 正确的片选(CS)和数据/命令(DC)控制
2. ssd1306_init.v - 初始化序列模块
包含 SSD1306 上电必需的初始化命令序列:
- 关闭/开启显示控制
- 时钟分频设置(0xD5)
- 复用率设置(0xA8)
- 电荷泵启用(0x8D)
- 内存地址模式配置(0x20)
- 对比度、预充电、VCOMH 等参数优化
3. frame_buffer.v - 帧缓冲管理器
管理 1024 字节显存(8 页 × 128 列):
- 支持单像素写入操作
- 坐标到地址的转换函数
- 清屏功能
- 双缓冲机制支持(可选)
4. oled_display_top.v - 顶层模块
整合所有子模块的完整显示控制器:
- 自动初始化流程
- 像素写入接口
- 全屏刷新控制
- SPI 时序生成
- 状态机协调各模块工作
5. oled_display_tb.v - 测试平台
完整的仿真测试环境:
- 50MHz 时钟生成
- 初始化验证
- 绘制测试:水平线、垂直线、矩形、棋盘格
- SPI 事务监控
- 波形输出支持
使用方法
仿真验证
使用 ModelSim、Vivado Simulator 或 Icarus Verilog 进行仿真:
# 使用 Icarus Verilog 编译和仿真 iverilog -o oled_sim oled_display_top.v spi_controller.v ssd1306_init.v frame_buffer.v oled_display_tb.v vvp oled_sim
综合与实现
在 Xilinx Vivado 或 Intel Quartus 中:
- 创建新项目
- 添加所有
.v源文件 - 分配引脚约束(根据实际 FPGA 开发板)
- 综合、实现、生成比特流
- 下载到 FPGA
引脚分配示例(需要根据实际板卡调整)
# OLED SPI 接口约束示例(Xilinx XDC 格式) set_property PACKAGE_PIN
[get_ports {OLED_SCLK}] set_property PACKAGE_PIN
[get_ports {OLED_SDIN}] set_property PACKAGE_PIN
[get_ports {OLED_DC}] set_property PACKAGE_PIN
[get_ports {OLED_CS}] set_property PACKAGE_PIN
[get_ports {OLED_RES}]
关键参数调优
根据实际显示效果可调整以下参数:
| 参数 | 命令 | 推荐值 | 说明 |
|---|---|---|---|
| 对比度 | 0x81 | 0xCF | 值越大越亮,功耗越高 |
| 预充电周期 | 0xD9 | 0xF1 | 影响像素点亮/灭过渡时间 |
| VCOMH 级别 | 0xDB | 0x40 | 影响视角和对比度 |
| SPI 时钟 | 分频系数 | 24-50 | 50MHz 系统时钟下建议 1MHz SPI |
性能优化技巧
- 部分刷新: 只更新变化的显存区域
- 数据压缩: 对连续相同数据使用重复传输
- 流水线操作: 传输当前帧时准备下一帧数据
- 双缓冲机制: 避免画面撕裂
- 脏矩形技术: 仅更新变化部分
常见问题排查
显示花屏
- 检查初始化序列是否完整
- 确认 SPI 时序符合规格书
- 测量电源电压(3.3V±5%)
显示闪烁
- 增加显存双缓冲
- 确保刷新率≥30Hz
- 避免同时读写显存
显示偏移
- 检查起始行设置(0x40 命令)
- 确认显示偏移参数(0xD3 命令)
- 验证显存地址计算逻辑
应用示例
绘制单个像素
wr_en <= 1'b1; pixel_x <= 7'd64; // X 坐标 0-127 pixel_y <= 6'd32; // Y 坐标 0-63 pixel_val <= 1'b1; // 1=点亮,0=熄灭 draw_mode <= 1'b1; // 1=设置像素,0=清除像素
清屏操作
clear_screen <= 1'b1; #20; clear_screen <= 1'b0; wait(clear_done);
触发全屏刷新
display_update <= 1'b1; #20; display_update <= 1'b0; wait(!updating);
参考资料
- SSD1306 Datasheet: Solomon Systech 官方文档
- 原始博客:https://blog.csdn.net/weixin_/article/details/
许可证
本项目代码基于原博客内容实现,仅供学习参考使用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/270056.html