|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2019-3-28 11:33 编辑
. I6 k+ a6 u8 g- K, e3 A9 C( t; o/ q- q5 H4 o$ y- `$ a
十五、串口发送图片数据到SRAM在TFT屏上显示 : r) o y# O4 z- p& I' r6 @$ _
3 K; E' u9 g+ S$ G7 P
之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够。小梅哥给了个方案,利用串口将图片数据传给SRAM,传完后在从SRAM中读取图片数据进行显示。有了梅哥的提示后就开始动工了,首先是设计SRAM的控制程序。
4 i6 \1 T+ r. t. {SRAM(静态随机访问存储器)是一种半导体存储器。“静态”一词表明只要有电源供电,数据就会保存,而不会“动态”改变。 + b! I' e* i- j7 U2 \
本实验平台是基于小梅哥出品的芯航线FPGA开发平台,该平台的SRAM芯片采用的是ISSI的IS61LV25616,它是一个256K*16位字长的高速率静态随机存取存储器。 & `& S. H# C. Q2 e. `! h( E
通过查阅手册得知,除了地址总线和数据总线外,该芯片还包含五个控制信号(手册上的符号与这个有差别,手册是符号上一横线代表低电平有效)。 - _6 a a' ?- d6 g: P
- ce_n(芯片使能或芯片选择):禁止或使能芯片。
- we_n(写使能):禁止或使能写操作。
- oe_n(输出使能):禁止或使能输出。
- lb_n(低字节使能):禁止或使能数据总线的低字节。
- ub_n(高字节使能):禁止或使能数据总线的高字节。! S% T7 S+ r1 n( u- K+ ?; E. [+ S
6 n- P6 k( P6 H" F9 t- A3 Y 所有这些信号都是低电平有效,后缀_n用于强调这一特性。功能表如表1所示:信号ce_n用于存储器扩展,信号we_n和oe_n用于写操作和读操作,lb_n和ub_n用于字节配置。 # p5 A Y% H5 d( K! G) P: f
$ ?/ H) ~$ q2 s: _9 h
表1 SRAM控制信号的真值表 ![]() ![]()
+ V0 _9 o I& t t
5 U6 v$ s. A% o: K& \5 G. B接下来分析SRAM的读写时序图,两种类型的读操作时序如图1(a)和图1(b)所示 3 ]4 o* [' Y* V0 k2 T& z- |7 g
7 ?+ [! b& J4 P+ O* n $ y6 k4 D: d R3 T( I" L
(a)地址控制的读周期时序图(ce_n=0,we_n=1,oe_n=0) 5 n( p4 Q. H8 n: `" M$ t/ q/ d
6 r( l8 i( m2 e) R* c4 S(b)oe_n控制的读周期时序图
0 W1 u, {' R% k; S" i) U7 Y! ^6 A(c)部分时序参数的介绍 图1 读操作的时序图和部分参数 本实验数据用的是16位,所以lb_n和ub_n控制位我们一直给低电平即可。关于ce_n控制位在复位后一直给低电平即可。
& K: k: @ R+ [' ]) q; W4 b芯片手册上关于写操作时序有四种类型,这里就简单介绍其中一种,其他的类似,写操作时序如图2所示:
* I" {6 P5 v e* ~
, A5 l4 O G! p& }
2 f& ]' ~' |$ h(a)写操作时序图
5 J$ _ q: @) ^, _, ~(b)部分时序参数的介绍 图2 读操作的时序图和部分参数 根据上面的读操作和写操作时序,结合小梅哥的芯航线开发平台,取读写周期为20ns,这样可以直接采用平台已有的50Mhz的时钟,根据上面的时间限制,在读操作时,可以在使能读操作后,采用在时钟上升沿时改变地址,这样在下个时钟上升沿到来时就可以读取该地址的数据,也就是数据相对与给的地址是有一个时钟周期的延时。在写操作时,同样也是在时钟的上升沿给地址和待写入的数据,这样可以满足参数的时间要求。
$ q/ }8 u' g4 x# f* A% H) p# _SRAM控制器的设计如下: : {! s$ p- |( ]5 o
![]() ![]() ![]() ![]() * h1 D, f9 v0 S' i! q- \
& R9 J& J$ K8 l. `- Y) c! h
) o# z# x; U3 u. q- ]6 q0 q
% ^* N# x% {9 I5 TSRAM的数据线是输出输入数据共用的,要将其设计成三态门形式,具体如代码84行所示。接下就是编写tb文件来验证驱动程序,代码如下:
: U! J* P" K" V8 ^![]() ![]() ![]() ![]() - r ~, m! b" K9 @/ R3 W! j0 x, I
( L; V) o5 x. s" Q8 e2 ]2 a; T! q6 j% R+ O. }# i- S$ l
8 T$ v: l$ p/ w
仿真结果如下: - j+ u# w' G! B9 [
) r0 a+ {* Z# `# b' y3 q 1 b" a( W, B0 `" ~0 L, c) `& t# h
写操作控制信号放大后波形如下:
, Y0 w6 G1 s9 _) i$ E) b
% i7 A/ G7 u5 `. [/ _
) ?3 x/ K) f" H读操作控制信号放大后波形如下: 0 K1 m& Z, B% A3 X
- H+ {: R, z# S, v/ P" y 2 r; C4 @- ~0 C- s
这里需要说明一下,就是读操作读出的数据没有值,主要是没有真正的接SRAM,还没想到怎么去验证读数据,但是仿真结果可以看出,读写时序与按预期设计的一致。如果想进一步进行板级验证,也是可以的,这就需要使用SignalTap II Logic Analyzer工具对写入的数据和读取的数据进行抓取和比较,从而判断控制驱动设计的对错,具体的操作后面会提到。关于SRAM的控制驱动就说这么多,其他的可以参考芯片手册做更进一步的设计,本人经验不足,还望前辈们批评指正。 1 g: o. g, g4 m+ x
接下来还是进入今天的主题,就是通过串口的传图片数据到SRAM,然后通过读取SRAM的图片数据在tft上显示完整的图片,主要是解决上次通过读rom数据显示图片不能显示整个tft屏的问题。主要的设计框图如下: ) E2 U {) [! x' l
5 t- |2 n, d* q 7 [7 S* o# C5 f; T# y
框图中除了UART2SRAM模块是没有设计的,其余模块都已经进行了设计和验证,串口接收模块和tft屏的驱动参考的小梅哥教程里的。UART2SRAM模块主要有两个功能一个是将串口接收来的8位的数据每两个合成一个16位的数据传给writedata,还有一个是向SARM里写入数据和读取数据。数据的合成首先对串口接收模块的输出数据进行一个计数,然后通过计数器的数将每两个8位合成一个16位的数据,也就是个数为偶数时进行一次合成。具体代码如下:
& ]0 E9 J& i. k8 X![]() ![]()
9 \/ p; u' v; c" v0 V! m" ~, U
' i' C+ s& b1 A% M# @
! b: p! w# w( z, k
7 s$ `' V& Z8 A6 Y这个代码根据串口接收模块的不同稍有差别,主要是是看你设计的串口接收模块接收完成标志位,输出数据的时序关系,大概有两种不同的时序,如下图所示:
+ m6 Q: Q9 S1 |9 d& e2 q
0 P. l) y* Z! T' B, \( m本实验串口接收模块的时序是右边的图,如果是左边的时序图,上述代码需要做相应的修改,主要是产生合成数据标志位有所变化,此时标志位就直接为data8bit,不用延时一时钟周期,具体时序如下图所示:
2 [& h' E& J$ f# l' y: C7 E- I6 o 4 b4 o9 F- j) Y% h) r
两种不同的时序稍有差别,总的思路是一样的,具体实现可根据实际的情况而定。 4 y; p, D9 y# u4 g
接下来就是向SARM写入数据和读取数据,本实验是先将合成的16位的数据写入SRAM,然后再通过读取SRAM数据进行图片的显示。写入数据主要是写控制位ce_n和地址的控制,本实验没有加入按键等外部的控制,写控制就直接从接收串口数据开始,图片数据接收完成截止。具体代码如下: ! f0 X1 ^% Y5 s, O
& }9 L3 ?3 c% V; x g7 \0 b![]() / p& |- n% F" A8 }3 h% T+ n0 c6 i
; G' M g# _1 j! U( ^( p
/ Z; s, I8 K! M1 i" k' f0 }
& F( ]$ A: F1 c写入数据地址在每次合成数据时加1。为了保证写入的数据是从地址0开始的,在复位状态下将初始地址设为最大18'h3ffff,这样在第一次有效16位的数据时,地址正好是从0开始。具体代码如下: 6 f" D3 a* b! C$ S5 L& R
* [+ l+ u" T. b/ ?/ I
- ]& s/ q8 Y4 _! q! d c上面判断data_cnt[0]==0是判断计数器奇偶的。
3 Q. H- m0 b9 s a9 A( c! W. k数据的读取,和rom读取数据类似了,这里只多了一个读取控制,本实验将该控制信号在数据写完后就将其变成有效,便可进行数据的读取,数据读取的地址主要是依据tft驱动模块的行扫描和场扫描计数器来计算的。具体代码如下: ( @- M; u: K5 {1 a1 n4 h
3 {6 [. {3 t4 j+ n' p
5 L% L5 g( r: A9 E6 e
3 @3 F! f& A- d+ [* H
% H. M5 R' ^' g% R9 c
9 ~3 O) S$ ^) S( Q' f, o
7 E7 T% k* i2 `9 f' b/ F3 `
: p' L. F- U0 M7 e' `" p/ o1 w# A 0 I. |, p6 W& A( b
* v, d: u# K t% _; s1 c6 n
|
|