FPGA驱动SPI屏幕(附完整工程)

本文介绍了如何在FPGA上使用SPI接口驱动ST7789V屏幕,包括SPI模式、屏幕初始化过程,以及显示数据的步骤。FPGA实现分为SPI主机模块、初始化模块和屏幕刷新模块。文章还提到了关键的初始化命令和显示数据的处理,并展示了上板测试的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 简介

相信大家都玩过屏幕,在FPGA上使用最多的就是VGA/HDMI接口的显示器了,这两种显示器的优点就不用说了,缺点就是体积比较大,而且价格比较贵,对于追求便携/价格低的我来说,SPI接口的屏幕才是我的首要选择,而且一般是可以带触摸的哦。

后面图像处理相关的代码都会基于此屏幕哦!

二. SPI屏幕驱动(驱动芯片ST7789V)

1. SPI模式

SPI时序就不介绍了,很最重且必须要掌握的协议。要想驱动屏幕,最关系的肯定是使用那种模式来驱动了,答案就在这里,数据在SCL时钟的上升沿被采样,数据在SCL时钟的下降沿切换(空闲的时候对SCL的电平不作要求),对应的模式为0和3

请添加图片描述

2. 初始化

摸清楚SPI的模式之后,就可以开始初始化屏幕了,最简单高效的方法当然是参考C语言的现实。

可以看出,初始化的过程就是依次发送命令和数据即可。那么如何辨别命令和数据呢?

请添加图片描述

通过下图可以清楚的知道,是通过DC信号线的电平来区别的(低电平表示当前发送的数据为命令)。

请添加图片描述

弄懂了上述问题之后,就可以按照C语言实现依葫芦画瓢,依次将命令和数据发送出去即可。另外有两点需要注意的是:

  1. 两条命令不能连续发送,中间需要停顿数个时钟周期;而数据则不需要。
  2. 命令到数据,或者数据到命令,是不能连续,中间需要停顿数个时钟周期。

请添加图片描述

另外这三个命令需要注意一下0x36,0x2A,0x2B,它们分别是设置显示的方向(还有就是数据是RGB还是BGR)、列地址和行地址。0x36设计到的东西比较多,需要详细了解的可以自行去翻阅数据手册。

经过上面的初始化,如果成功了,屏幕上显示出杂乱无章的图案。

3. 显示数据

C语言的实现如下,设置要显示X,Y的范围,也就是矩形的左上角和右下角的值,然后发送要显示的数据即可。非常简单。

请添加图片描述

三. FPGA实现

有了C语言作为参考,FPGA端的实现那还不是小菜一碟,总共只需要分为如下的三个模块:

  1. SPI主机模块: 用来和屏幕进行数据交互
  2. 屏幕初始化模块: 将初始化数据依次通过SPI主机模块发送给模块
  3. 屏幕刷新模块: 将显示数据依次通过SPI主机模块发送给模块

模块框图如下,有点小哈(⭐)

请添加图片描述

SPI主机模块和初始化模块非常简单,就不作说明啦!重点来说说刷新模块。


刷新模块不会像单片机中那样,调用的时候才会进行刷新,而且在初始化完成之后,就一直在对整个屏幕进行刷新了,

1. 模块状态跳转

模块由如下四个在状态组成,在发送前11个数据的时候,需要进入打啊奥延时状态,原因是这11个数据中既有命令也有数据(此数据,懂?), 后面则一直在DATA态,它只包括显示数据,所以不需要延时。最后一个显示数据发送完成后,就进入帧同步状态,表示一帧数据发送完成。

请添加图片描述

请添加图片描述

2. 图像显示数据

很easy!发送完前面的命令和数据后,剩下的全部都是显示数据了,都丢在default里面就可以了。这里暂时写死了(后面会将显示的数据修改为模块输入的数据)。

请添加图片描述

3. 模块端口

端口信号如下,着重关注用户接口的三个信号即可,非常easy!

请添加图片描述

四. 模块封装

spi模块top模块的接口如下,很明显不够完美,无法知道当前显示的像素坐标,而且图像数据一般为16bit的,而这个模块的输入为8bit的数据,另外在替换VGA接口的屏幕时候,也不能简单高效的替换下来,所以需要经过一次封装,将其与外部进行交互的端口信号封装为VGA接口的信号(近似)。

请添加图片描述

封装后的模块端口信号如下,其内部实现类似于VGA驱动。

请添加图片描述

五. 上板测试

测试代码如下,显示四个方块,是不是感觉so easy!。

请添加图片描述

测试图片如下,显示效果完美!!!!

请添加图片描述

关注 FPGA之旅 回复 FPGA驱动SPI屏幕 即可获取完整工程文件

FPGA 驱动 ST7789 屏幕涉及到硬件描述语言 (HDL) 的编写以及对屏幕控制协议的理解。ST7789 是一种常见的 TFT LCD 显示屏控制器,通常用于小尺寸彩色显示屏。以下是 FPGA 驱动 ST7789 的基本步骤: ### 1. **了解 ST7789 控制协议** - **SPI 接口**:ST7789 使用 SPI(串行外设接口)进行通信。你需要通过 FPGA 实现 SPI 主控端的功能,发送命令和数据到 ST7789。 - **命令与数据模式切换**:ST7789 有一个专用的数据/命令选择信号线(DC),当 DC=0 时,表示传输的是命令;当 DC=1 时,表示传输的是显示数据。 ### 2. **初始化序列** - 在开始显示之前,需要按照特定的顺序向 ST7789 发送一系列初始化指令。这包括设置显示方向、色彩格式、亮度等参数。具体的初始化序列可以在 ST7789 的 datasheet 中找到。 ### 3. **图像缓冲区设计** - 由于 FPGA 没有内置的大容量存储器,因此你可以使用外部 SRAM 或 DDR 存储器作为图像帧缓冲区。你还需要设计一个模块负责将内存中的像素值通过 SPI 接口逐行扫描并送到 ST7789 上显示出来。 ### 4. **定时刷新机制** - 对于静态图片展示而言,只需要一次性写入全部画面信息即可;但对于动态视频流,则需定期更新整个或部分区域内的内容。此时可以采用双缓存技术提高渲染效率,并确保画面流畅无撕裂现象发生。 #### 示例代码片段(Verilog HDL) ```verilog // 简单示例:发送一条命令给 ST7789 module spi_master ( input wire clk, output reg sclk, output reg mosi, output reg dc, // 数据/命令选择线 output reg cs_n, // 片选信号 ); always @(posedge clk) begin if (!cs_n) begin // 设置为命令模式 (DC = 0) dc <= 0; // 发送命令字节 for(int i = 7; i >= 0; i--) begin mosi <= command[i]; sclk <= ~sclk; #delay_time; sclk <= ~sclk; end // 切换回空闲状态 cs_n <= 1'b1; end else begin // 默认保持高电平 sclk <= 1'b1; end end endmodule ``` 这是非常基础的例子,在实际项目中还需考虑更多细节如错误处理、性能优化等问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值