找回密码
 注册
关于网站域名变更的通知
查看: 503|回复: 1
打印 上一主题 下一主题

转——第十五章 串口发送图片数据到SRAM在TFT屏上显示

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-28 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Zedd 于 2019-3-28 11:33 编辑
7 b% V; e! n# |/ ?9 i, X# E/ M; R1 p# U( ~1 z& T
十五、串口发送图片数据到SRAM在TFT屏上显示

" Q9 e, V  L8 Y4 a0 J5 @+ Y! V  I" g
之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够。小梅哥给了个方案,利用串口将图片数据传给SRAM,传完后在从SRAM中读取图片数据进行显示。有了梅哥的提示后就开始动工了,首先是设计SRAM的控制程序。
$ g7 z$ u- e) T4 u4 JSRAM(静态随机访问存储器)是一种半导体存储器。“静态”一词表明只要有电源供电,数据就会保存,而不会“动态”改变。 - n4 r( ?! r: i5 [$ {7 ?( ]! d2 f# j
本实验平台是基于小梅哥出品的芯航线FPGA开发平台,该平台的SRAM芯片采用的是ISSI的IS61LV25616,它是一个256K*16位字长的高速率静态随机存取存储器。   b- a0 ]' q* _# q8 J: k
通过查阅手册得知,除了地址总线和数据总线外,该芯片还包含五个控制信号(手册上的符号与这个有差别,手册是符号上一横线代表低电平有效)。
$ z9 ~! @. \3 M) F6 L
  • ce_n(芯片使能或芯片选择):禁止或使能芯片。
  • we_n(写使能):禁止或使能写操作。
  • oe_n(输出使能):禁止或使能输出。
  • lb_n(低字节使能):禁止或使能数据总线的低字节。
  • ub_n(高字节使能):禁止或使能数据总线的高字节。# }6 _( W7 t2 \

* K) m' _" X1 i0 {+ w" ^
所有这些信号都是低电平有效,后缀_n用于强调这一特性。功能表如表1所示:信号ce_n用于存储器扩展,信号we_n和oe_n用于写操作和读操作,lb_n和ub_n用于字节配置。 , g% t3 B( Z1 c

2 g; r/ ^; X: f3 y+ b; i, |
表1 SRAM控制信号的真值表

( G8 }- z1 ?% ]+ A3 o6 B0 q5 S. s$ K8 T. c3 P5 p" H7 B3 b
接下来分析SRAM的读写时序图,两种类型的读操作时序如图1(a)和图1(b)所示
7 _3 m2 C# F8 y/ b( [1 B. F' A9 Z& c: C9 {! h7 G- S4 x

0 H. i. o6 K9 r8 M
(a)地址控制的读周期时序图(ce_n=0,we_n=1,oe_n=0)

& n0 y4 ]0 J& x2 L" j
7 b' u4 C! g9 j8 U3 T! t+ ~
(b)oe_n控制的读周期时序图

) a0 e  }4 {2 i  n: l: |
(c)部分时序参数的介绍
图1 读操作的时序图和部分参数
本实验数据用的是16位,所以lb_n和ub_n控制位我们一直给低电平即可。关于ce_n控制位在复位后一直给低电平即可。 - D- l6 q: |. U" m, j' @* W
芯片手册上关于写操作时序有四种类型,这里就简单介绍其中一种,其他的类似,写操作时序如图2所示:
0 F( A  O7 p' ?" C' d1 J0 p% N' B8 k5 y& O

* a, d% S! d: C: X5 K) \0 P7 W
(a)写操作时序图
) O$ @# n2 X6 u* i" C
(b)部分时序参数的介绍
图2 读操作的时序图和部分参数
根据上面的读操作和写操作时序,结合小梅哥的芯航线开发平台,取读写周期为20ns,这样可以直接采用平台已有的50Mhz的时钟,根据上面的时间限制,在读操作时,可以在使能读操作后,采用在时钟上升沿时改变地址,这样在下个时钟上升沿到来时就可以读取该地址的数据,也就是数据相对与给的地址是有一个时钟周期的延时。在写操作时,同样也是在时钟的上升沿给地址和待写入的数据,这样可以满足参数的时间要求。 : U3 }; x9 x* j5 {2 e
SRAM控制器的设计如下:
: Y& F0 Q6 g3 P% V5 `* Q: N! H: V

- S7 ]& K2 U& j- t* S& E* u; {9 \* {; c  B! u: U+ W) P& v

( t" s- W2 u6 P5 g3 `6 }! a1 g: b3 ^3 V% x8 c
SRAM的数据线是输出输入数据共用的,要将其设计成三态门形式,具体如代码84行所示。接下就是编写tb文件来验证驱动程序,代码如下:
- J) C" u. [0 s1 v; ~: |) N
2 [1 f3 ~" ]; Z5 |7 o! h
2 `+ n% s7 |9 o

- i( M/ O! u$ Y& l7 `$ a
: ]1 l2 O- ?9 Z仿真结果如下:
1 h' A6 ]4 {0 R9 W  o8 m7 h1 b3 n. b2 G, `9 K' S7 ~

2 y5 n, G9 ]2 W; Q; j写操作控制信号放大后波形如下: 4 H1 v. L9 o1 ]; {1 |
, ], Q4 a$ @/ k% H; f0 g

* s" m/ Q" P- i3 Q' a; A  e% ]6 x读操作控制信号放大后波形如下:
; F! }% a5 w9 W9 A5 x: t& ]. S; ]+ A' |
( o7 X" h( Z- P, n+ v* K5 Q
这里需要说明一下,就是读操作读出的数据没有值,主要是没有真正的接SRAM,还没想到怎么去验证读数据,但是仿真结果可以看出,读写时序与按预期设计的一致。如果想进一步进行板级验证,也是可以的,这就需要使用SignalTap II Logic Analyzer工具对写入的数据和读取的数据进行抓取和比较,从而判断控制驱动设计的对错,具体的操作后面会提到。关于SRAM的控制驱动就说这么多,其他的可以参考芯片手册做更进一步的设计,本人经验不足,还望前辈们批评指正。
8 H( l1 ?+ A6 `& ~* |4 m3 s接下来还是进入今天的主题,就是通过串口的传图片数据到SRAM,然后通过读取SRAM的图片数据在tft上显示完整的图片,主要是解决上次通过读rom数据显示图片不能显示整个tft屏的问题。主要的设计框图如下: ( Z7 D4 j6 q/ ]8 M

: Y3 D$ p4 {# O& F+ @
" B0 j7 L1 c6 m* w  @( g# d- }: _5 c& O
框图中除了UART2SRAM模块是没有设计的,其余模块都已经进行了设计和验证,串口接收模块和tft屏的驱动参考的小梅哥教程里的。UART2SRAM模块主要有两个功能一个是将串口接收来的8位的数据每两个合成一个16位的数据传给writedata,还有一个是向SARM里写入数据和读取数据。数据的合成首先对串口接收模块的输出数据进行一个计数,然后通过计数器的数将每两个8位合成一个16位的数据,也就是个数为偶数时进行一次合成。具体代码如下:
4 l( d1 Y) J+ b
! N8 h4 Z6 R1 E
; U# e9 U9 n5 S" s( r

; D6 d% O8 U! N) M  M2 U' ~) C; B$ Y  C5 U+ j' S) u- o
这个代码根据串口接收模块的不同稍有差别,主要是是看你设计的串口接收模块接收完成标志位,输出数据的时序关系,大概有两种不同的时序,如下图所示: & L; i* h9 ]' q- S# ~
" R" [- k% E! P* `; X5 R9 H' P
本实验串口接收模块的时序是右边的图,如果是左边的时序图,上述代码需要做相应的修改,主要是产生合成数据标志位有所变化,此时标志位就直接为data8bit,不用延时一时钟周期,具体时序如下图所示:
. j+ H+ G4 [  Z7 O4 t" h5 T+ J

) f) r  E) @$ I' V9 n* @- J两种不同的时序稍有差别,总的思路是一样的,具体实现可根据实际的情况而定。
4 C. D+ ~; x4 U2 U7 S8 U接下来就是向SARM写入数据和读取数据,本实验是先将合成的16位的数据写入SRAM,然后再通过读取SRAM数据进行图片的显示。写入数据主要是写控制位ce_n和地址的控制,本实验没有加入按键等外部的控制,写控制就直接从接收串口数据开始,图片数据接收完成截止。具体代码如下: & ~7 A; w2 d% \8 S

9 p7 _# W; P- C! K* Z  D
; \( _! Z) w/ L3 o/ u- F2 y
* i8 x6 ]/ x9 J1 g  [0 @

4 y" T& ]$ `4 M* @/ v
+ c. E+ v! t$ R: r5 r  @写入数据地址在每次合成数据时加1。为了保证写入的数据是从地址0开始的,在复位状态下将初始地址设为最大18'h3ffff,这样在第一次有效16位的数据时,地址正好是从0开始。具体代码如下:
- t5 A, _& h9 s) R3 e4 y" U
7 `( U/ C' K5 ]8 R1 e: r* ^

# \! s- L9 @2 H0 s& V. Z. c上面判断data_cnt[0]==0是判断计数器奇偶的。 . a" |0 n4 m5 W# d4 s! n
数据的读取,和rom读取数据类似了,这里只多了一个读取控制,本实验将该控制信号在数据写完后就将其变成有效,便可进行数据的读取,数据读取的地址主要是依据tft驱动模块的行扫描和场扫描计数器来计算的。具体代码如下:   m3 a# l' |8 @% f' l( }3 a: F
8 f" O  ]; I/ Y' R, ]2 e( U
9 I+ r& f5 c# Q; M

& c! A4 n7 U( i2 P

# }/ [3 m5 t; `3 F! g8 i" k
游客,如果您要查看本帖隐藏内容请回复
/ |" D: i$ d3 o' m

' T, H8 B- I( Y& X+ a+ T) e+ l1 {8 I% L* t% w! \5 a8 @, e) Q

: d. \' {7 y1 s$ V1 i$ y! B
  n! Q8 g- S- @7 R: T% K: d. i$ @! b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-29 03:26 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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