OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7723|回复: 2

【小梅哥FPGA进阶教程】串口发送图片数据到SRAM在TFT屏上显示

[复制链接]

58

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-12-14
在线时间
44 小时
发表于 2017-3-7 10:55:14 | 显示全部楼层 |阅读模式
本帖最后由 芯航线跑堂 于 2017-3-7 16:37 编辑

十五、串口发送图片数据到SRAM在TFT屏上显示


之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够。小梅哥给了个方案,利用串口将图片数据传给SRAM,传完后在从SRAM中读取图片数据进行显示。有了梅哥的提示后就开始动工了,首先是设计SRAM的控制程序。
SRAM(静态随机访问存储器)是一种半导体存储器。“静态”一词表明只要有电源供电,数据就会保存,而不会“动态”改变。
本实验平台是基于小梅哥出品的芯航线FPGA开发平台,该平台的SRAM芯片采用的是ISSI的IS61LV25616,它是一个256K*16位字长的高速率静态随机存取存储器。
通过查阅手册得知,除了地址总线和数据总线外,该芯片还包含五个控制信号(手册上的符号与这个有差别,手册是符号上一横线代表低电平有效)。
  • ce_n(芯片使能或芯片选择):禁止或使能芯片。
  • we_n(写使能):禁止或使能写操作。
  • oe_n(输出使能):禁止或使能输出。
  • lb_n(低字节使能):禁止或使能数据总线的低字节。
  • ub_n(高字节使能):禁止或使能数据总线的高字节。

所有这些信号都是低电平有效,后缀_n用于强调这一特性。功能表如表1所示:信号ce_n用于存储器扩展,信号we_n和oe_n用于写操作和读操作,lb_n和ub_n用于字节配置。

表1 SRAM控制信号的真值表
图片1.jpg 图片2.jpg

接下来分析SRAM的读写时序图,两种类型的读操作时序如图1(a)和图1(b)所示

图片3.jpg
(a)地址控制的读周期时序图(ce_n=0,we_n=1,oe_n=0)

图片4.jpg
(b)oe_n控制的读周期时序图
(c)部分时序参数的介绍
图1 读操作的时序图和部分参数
本实验数据用的是16位,所以lb_n和ub_n控制位我们一直给低电平即可。关于ce_n控制位在复位后一直给低电平即可。
芯片手册上关于写操作时序有四种类型,这里就简单介绍其中一种,其他的类似,写操作时序如图2所示:

(a)写操作时序图
(b)部分时序参数的介绍
图2 读操作的时序图和部分参数
根据上面的读操作和写操作时序,结合小梅哥的芯航线开发平台,取读写周期为20ns,这样可以直接采用平台已有的50Mhz的时钟,根据上面的时间限制,在读操作时,可以在使能读操作后,采用在时钟上升沿时改变地址,这样在下个时钟上升沿到来时就可以读取该地址的数据,也就是数据相对与给的地址是有一个时钟周期的延时。在写操作时,同样也是在时钟的上升沿给地址和待写入的数据,这样可以满足参数的时间要求。
SRAM控制器的设计如下:
图片8-1.jpg 图片8-2.jpg 图片8-3.jpg 图片8-4.jpg 图片8-5.jpg



SRAM的数据线是输出输入数据共用的,要将其设计成三态门形式,具体如代码84行所示。接下就是编写tb文件来验证驱动程序,代码如下:
图片9.jpg 图片9-2.jpg 图片9-3.jpg 图片9-4.jpg 图片9-5.jpg



仿真结果如下:

图片10.jpg
写操作控制信号放大后波形如下:

图片11.jpg
读操作控制信号放大后波形如下:

图片12.jpg
这里需要说明一下,就是读操作读出的数据没有值,主要是没有真正的接SRAM,还没想到怎么去验证读数据,但是仿真结果可以看出,读写时序与按预期设计的一致。如果想进一步进行板级验证,也是可以的,这就需要使用SignalTap II Logic Analyzer工具对写入的数据和读取的数据进行抓取和比较,从而判断控制驱动设计的对错,具体的操作后面会提到。关于SRAM的控制驱动就说这么多,其他的可以参考芯片手册做更进一步的设计,本人经验不足,还望前辈们批评指正。
接下来还是进入今天的主题,就是通过串口的传图片数据到SRAM,然后通过读取SRAM的图片数据在tft上显示完整的图片,主要是解决上次通过读rom数据显示图片不能显示整个tft屏的问题。主要的设计框图如下:

图片13.jpg
框图中除了UART2SRAM模块是没有设计的,其余模块都已经进行了设计和验证,串口接收模块和tft屏的驱动参考的小梅哥教程里的。UART2SRAM模块主要有两个功能一个是将串口接收来的8位的数据每两个合成一个16位的数据传给writedata,还有一个是向SARM里写入数据和读取数据。数据的合成首先对串口接收模块的输出数据进行一个计数,然后通过计数器的数将每两个8位合成一个16位的数据,也就是个数为偶数时进行一次合成。具体代码如下:
图片14-1.jpg 图片14-2.jpg 图片14-3.jpg



这个代码根据串口接收模块的不同稍有差别,主要是是看你设计的串口接收模块接收完成标志位,输出数据的时序关系,大概有两种不同的时序,如下图所示:
图片15.jpg
本实验串口接收模块的时序是右边的图,如果是左边的时序图,上述代码需要做相应的修改,主要是产生合成数据标志位有所变化,此时标志位就直接为data8bit,不用延时一时钟周期,具体时序如下图所示:
图片16.jpg
两种不同的时序稍有差别,总的思路是一样的,具体实现可根据实际的情况而定。
接下来就是向SARM写入数据和读取数据,本实验是先将合成的16位的数据写入SRAM,然后再通过读取SRAM数据进行图片的显示。写入数据主要是写控制位ce_n和地址的控制,本实验没有加入按键等外部的控制,写控制就直接从接收串口数据开始,图片数据接收完成截止。具体代码如下:

图片17-1.jpg 图片17-2.jpg



写入数据地址在每次合成数据时加1。为了保证写入的数据是从地址0开始的,在复位状态下将初始地址设为最大18'h3ffff,这样在第一次有效16位的数据时,地址正好是从0开始。具体代码如下:

图片18.jpg
上面判断data_cnt[0]==0是判断计数器奇偶的。
数据的读取,和rom读取数据类似了,这里只多了一个读取控制,本实验将该控制信号在数据写完后就将其变成有效,便可进行数据的读取,数据读取的地址主要是依据tft驱动模块的行扫描和场扫描计数器来计算的。具体代码如下:

图片19.jpg

如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506
小梅哥
芯航线电子工作室
关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:http://yun.baidu.com/share/home? ... are#category/type=0
赠送芯航线AC6102型开发板配套资料预览版下载链接:链接:http://pan.baidu.com/s/1slW2Ojj 密码:9fn3
赠送SOPC公开课链接和FPGA进阶视频教程。链接:http://pan.baidu.com/s/1bEzaFW 密码:rsyh


第十五章_串口发送图片到SRAM在TFT屏幕上显示.pdf

1.83 MB, 下载次数: 261

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-12-14
在线时间
44 小时
 楼主| 发表于 2017-3-7 11:17:39 | 显示全部楼层
这样就完成了UART2SRAM模块的设计,整个设计的代码如下:
图片20-1.jpg 图片20-2.jpg 图片20-3.jpg 图片20-4.jpg 图片20-5.jpg 图片20-6.jpg 图片20-7.jpg 图片20-8.jpg



编写tb文件进行仿真验证,这里要借用之前的tft驱动模块提供vcount、hcount和tft_de信号,具体代码如下:
图片21-1.jpg 图片21-2.jpg 图片21-3.jpg 图片21-4.jpg 图片21-5.jpg



仿真结果如下:

图片22.jpg
可以看到数据的合成和写SRAM数据和地址与设计的是相符的。由于要看到读数据的地址,需要的时间较长,在编写tb时,将最大串口接收数据量改小进行仿真得到读取SRAM数据部分的仿真波形如下:

图片23.jpg
从上面的波形可以看出数据读取的地址波形与预期一致,我们还发现其地址改变的位置与屏的驱动时钟的上升沿并没有对齐,这个好像没有影响,看tft屏的驱动时序图发现屏的显示好像是下降沿对应的像素点数据,这样我们的设计也是符合这个的。或者为了与tft时钟上升沿同步,可以将tft时钟延迟相应的时钟周期。
各模块设计完成,接下来是顶层文件的设计,设计如下:

图片24-1.jpg 图片24-2.jpg 图片24-3.jpg 图片24-4.jpg 图片24-5.jpg 图片24-6.jpg 图片24-7.jpg



以下为仿真顶层模块的设计
图片25-1.jpg 图片25-2.jpg 图片25-3.jpg 图片25-4.jpg 图片25-5.jpg



由于按照实际的数据量来仿真需要的时间太长,为了缩短时间,将数据量更改为小一点的值,主要是更改上面代码的第30行。
仿真波形如下:

图片26.jpg
以上图片是串口传数据,然后将数据写入SRAM的波形,与预期设计效果一致。
有关读数据的仿真由于仿真过程没有实际SRAM读出的数据,只能看读地址的波形和地址的变化。这个地方没有想到好的仿真方法。

图片27.jpg
板级验证,引脚分配按照梅哥发的文档引脚一一对应分配好即可,分配表如下:

图片28.jpg

下载后进行板级验证,在此之前我们先配置一个SignalTap II Logic Analyzer的文件,这样可以方便我们验证SRAM写入和读取数据的对错,以及一张图片数据是否写完。具体的关于这个配置,小梅哥的视频上有讲,我的配置如下图所示:

图片29.jpg

创建好,保存后重新编译,下载,然后再打开SignalTap II Logic Analyzer,让其一直处于循环的抓捕状态。以下是刚复位后的状态,此时开发板的led0也处于灭的状态。

图片30.jpg
打开串口软件,我使用的是友善串口调试助手,这个因人而异,有的串口软件不好用可以换其他的,总有一款适合你,以下是我用的串口软件:

图片31.jpg

串口设置与我们设计的串口接收模块的设置保持一致,程序里波特率设置的位115200,图片数据输入是将图片数据复制在下面红色空中的,最开始是想着直接发送数据文件的,后来发现文件好像默认是把一位16进制数当成了两个字节,例如一字节的0xFF,在文件里就成了2个字节,如下图所示,实际261120字节大小的数据,放入文本文档中就变成了522240字节大小

图片32.jpg

这样将我们要发送的数据量变成了原有的两倍导致错误。我是直接复制数据粘贴在红框中发送的,反应有点慢,不影响最后的结果。在数据传输过程中我们可以在SignalTap II Logic Analyzer工具中看到写入和读取SRAM数据的过程,我截取了写数据和读数据过程中的两幅图如下:

图片33.jpg

图片34.jpg
板级验证结果如下:

图片35.jpg

在串口数据传输完成后LED0变亮,与设计的完全一致。
上述图片数据是首先在网上找的与tft屏大小一样的图片,然后利用软件Img2Lcd,和rom存储图片数据显示在tft屏的操作差不多,将图片转换成 .c的数据文件,该数据文件中数据是0x开头的,但是有的串口不能识别0x和逗号,我们可以利用Notepad++ 软件进行简单的处理,就是用Notepad++ 软件将数据文件打开,然后利用全部替换功能将0x和逗号之类的无用的字符去掉,这样剩下的都是有效的数据,然后复制粘贴到串口软件即可。
如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:472607506
小梅哥
芯航线电子工作室
关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:http://yun.baidu.com/share/home? ... are#category/type=0
赠送芯航线AC6102型开发板配套资料预览版下载链接:链接:http://pan.baidu.com/s/1slW2Ojj 密码:9fn3
赠送SOPC公开课链接和FPGA进阶视频教程。链接:http://pan.baidu.com/s/1bEzaFW 密码:rsyh

回复 支持 反对

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2017-5-16 13:05:01 | 显示全部楼层
兄台   问下 FPGA代码 用VHDL还是verilog 好呢   , 哪个写起来方便一点
求指导!!!兄弟
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 00:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表