|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2019-3-30 16:03 编辑 / M: f. Z+ K' O! j7 y0 z: j
0 |& G9 q4 L0 i% Z
$ `+ c) |9 F8 y, H/ K. I. z3 O+ E8 O$ r/ U6 x8 A7 `
学习了小梅哥的TFT显示屏驱动设计后,想着在此基础上通过TFT屏显示一张图片,有了这个想法就开始动工了。首先想到是利用FPGA内部ROM存储图片数据,然后通过控制读取数据地址将图片数据传给TFT驱动模块,从而将每个图片数据显示在对应的像素点上。整个设计的框图如下:
: F+ a% M" E' Q. \, c 3 M# ?1 V3 l3 @ r' q
主要是在小梅哥TFT驱动设计基础上增加了图片数据发送控制模块Imgdata_send,该模块包括存储图片数据的rom,和一些简单的逻辑控制。具体的rom IP核的建立我这里就不说了,不懂的可以参看小梅哥的相关内容的视频,我这里主要讲如何将图片转换成mif文件。这里有两种方法,可以作为参考,主要用到如下软件:
. _/ E" K3 `; {$ t![]()
8 Z& V0 x) I; L, n9 j步骤1:利用Img2Lcd将图片转化为BMP格式的(当然图片本身为BMP格式就不需要转了,直接进入步骤2); , r' Z- Z% [7 W
步骤2:利用BMP2Mif可将图片转化为mif文件。 7 ^/ G; p" l! g; Y% ?; o
具体实现如下:
+ y* h7 Z% E- C8 I6 ?9 A步骤1:先打开Img2Lcd打开一张图片,选择输出格式为BMP格式,输出灰度选择24位真彩色(由于BMP2Mif软件只能载入24位或8位的,所以这里就没有直接选16位的真彩色),最大宽度和高度根据图片实际的大小进行选择的,由于内部rom能存储的数据量有限,我选择了一张像素为160*120的图片如果想显示大的图片,如480*272图片,用这种方法就不能实现(看到这里有人想,如果想显示大点的图片那应该怎么解决,后面我会有其他方法来实现TFT屏保显示)。 . g7 z- _) |2 a& s1 J7 V l" f
; }6 u3 o9 c* U: K* w" `( j8 [步骤2:打开BMP2Mif软件,加载刚转换输出的24位BMP格式图片,选择输出图像格式和文件类型,点击一键转换便将图片转换为了mif文件了,可以将mif文件名更改下以区别不同图片mif文件。 / n7 e! m9 H& R5 }2 z
" Z4 M, |9 D5 h8 R" R
可以用Notepad++将转化的mif文件打开看看,截取部分图如下:
( r' ~8 K' g, w6 I% |5 w2 K 9 Q/ ^& ~+ \) S' L Q
rom IP核设置完成后就是数据发送控制模块Imgdata_send中控制逻辑的编写,主要是让图片显示在屏幕指定的地方,这就需要根据TFT_CTRL模块的TFT行和场扫描计数器输出信号来控制rom的数据地址,从而控制TFT_CTRL的待显示数据data_in。具体代码如下:
5 |& Q& w: x2 p! K) Z# w/ c# L, }! ]3 c4 n8 q6 r
4 G" g: f( X" e
1 {5 A2 ?; j) ]: u% L! v
# @; k |& L- ~+ e; i接下来就是仿真验证,利用已有的TFT_CTRL模块的hcount、vcount、tft_de作为Imgdata_send模块的输出进行仿真验证,代码如下: ( u7 w, g; ?, Y' o. Z" B
: P8 A2 k j+ Z8 G9 f: ~
# d B9 g8 q+ y
8 A* V8 T( e0 R$ k7 n' E0 B. Z6 r
' g1 u; h* K. j; Z$ I9 L) U
3 D% E) c1 L5 c5 v2 S
2 f+ Y% }, h0 S0 |. C
, @1 O' Z" f6 Y6 i# X+ f* M仿真验证的波形图如下:
& P5 w# r& b- u" a- m* I $ |/ T4 M3 ]+ V/ }1 a
0 O6 k# x& v: I3 y: T0 L1 c, B , @+ ?1 e% Z/ \! T& A+ q
- y; A1 |3 m! A' u
6 x. V; H. O6 s3 Z- X从仿真结果可以看出,图片数据是在我们指定的区域输出的。该模块仿真验证正确后,进行顶层电路文件的设计。顶层文件编写如下:
) ~- S* p. A5 |5 m, N) y& O d- f: w
3 z# Y* ?' ~0 t0 ?5 j4 v& e% ~. }" Y9 T
3 y! U/ a* i. Q, `4 ?4 U
0 D. ?6 A* {/ q' @1 Q& `
) k9 j* }, j1 i6 C9 D+ @1 t2 N% ^9 q* y( T- ], o
![]()
) o- c, O' u+ Q) h$ B, k: s( Z R; O
$ r" m3 G) n* A8 e4 f
生成的顶层电路图如下:
: X- Y' D9 x7 @/ ?1 I' p 1 o% u4 C7 N2 L0 l
接下来就是仿真验证,仿真验证程序如下: 4 Q3 S( U3 D; T/ z& i2 u
, ^8 N. ?) [ w- @& b, n( d
0 C4 f# h3 _* W) x2 }* i" _
6 x1 w) ]; J& j$ _2 { 6 P8 |8 F1 w3 ~7 S9 I r, O8 a
1 g0 U L1 t3 D0 u- [
" v# m" e6 ?# e- }仿真波形如下: : A) G1 V9 Q2 u& n
; b/ _+ W) ^8 f* n. w' [ T- s, N) o; U0 H
) Q! d- {- F+ k% V/ r% K
0 {$ V6 h' q/ p' h4 j- D6 A* h" ], Z7 |8 P% | [
从波形可以看出,图片数据在指定区域显示。接下来就是板级验证,引脚分配参照芯航线FPGA学习套件引脚分配表进行分配,然后布局布线,板级程序下载最后实现的效果图如下: ( M# _- ]$ U, Y4 h; |) Z8 }* f
1 [2 f! y* v9 K2 r& w( i我们设置的是显示在屏幕的左上角,与预期效果是一致的,想要改变图片的位置,可以更改Imgdata_send模块的28、29行代码: 6 G- H( S1 B$ X. F; [% Q
) _% f7 R% G9 T5 X) m3 X& ~- c
将上面的(0、0)更改为其他的数,图片位置就会改变,如果想让图片在屏幕上自动的移动,可以自己设置一种路径让img_hbegin、img_vbegin的值按你的路径变化就可实现图片的自动移动,读者可以自己改进学习。
) v; K/ C/ B4 r. S0 h% w
( G+ n3 [4 T1 g# x
8 Z/ X, n& |8 M* j8 ]' g; F- T |
|