体三维显示器-FPGA控制部分
世界Create
此部分代码在:
https://github.com/dtysky/3D_Displayer_Controller/tree/master/VHDL_PLANB
体三维显示器为真三维显示的一种,即可以在真是的空间内显示一个三维的图像,图像占据一个真实的三维空间,不需要借助任何辅助视觉器件,我采用的方案是二维LED点阵的旋转,LED点阵为自行设计,最后是FPGA的控制部分。
名为PLANB,顾名思义,这其实是一个妥协的方案,原本方案是USB(cy68013)+DDR2,本来也实现的差不多了,但一开始忽略的某个问题直接延续到了最后,嘛,usb那块的教程以前写过了:
http://dtysky.github.io/tag/68013.html
至于DDR2控制器的编写教程和仿真,有时间再说吧。
1.LED阵列控制
LED阵列控制需要配合LED阵列的电路设计,也就是buffer到trigger的模型,同时还要考虑到由于电路板不完美造成的噪声等等。
1.扫描流程:
配合LED阵列电路的设计,刷新需要按照以下流程进行:
2.状态机:
根据扫描流程和整体方案设计状态机,由于没有什么特别的需求,所以只设计以下几种状态:
rst:复位
free:IDLE状态,初始化或者复位后的状态
work:工作状态
初始化时进行复位,复位结束跳转free状态,在free状态时如果接收到begin信号则跳转到work状态,开始工作。
3.扫描注意事项:
扫描时,由于电路设计不完美所以可能会出现串扰现象,也就是当某一行有效时可能会让其他行同时有效,行和列之间也可能会出现这样的现象,为了避免这样的情况发生,需要采取一些软件上的措施,我采用的方案是在每一次进行列变换前先对前一行进行消隐,由于行有效是在某个信号上升沿的时候送出(trigger的时钟信号),所以在正常显示时下保证此信号为高电平,在切换时或者消隐时在进行一下High->Low->High的变换,构造一个上升沿,经测验,该方案有着很大的效果,噪声大大减小。
LED控制部分的代码在这里:
https://github.com/dtysky/3D_Displayer_Controller/blob/master/VHDL_PLANB/LED/LED.vhd
2.图像解码
图像解码,也就是对三维切片编码后的每一帧压缩图像进行解码,由上一篇文章:
体三维显示器-Matlab的三维切片
可知,每一帧图像存的实际上是发亮点的坐标值,这就需要一个解码单元来这样的数据进行解码,转换成可以LED可以显示的位图。
1.解码流程:
解码基本流程如下:
2.状态机:
整体流程可以分为以下状态:
read_next:读下一个坐标点,转入judge状态
judge:判断当前点坐标是否与上一个坐标的纵坐标相等,如果是转入set状态,否则转入do_write状态
do_write:将上一行写入fifo,同时跳转到clear状态
set:将当前行的x置1
clear:对当前行,当前x坐标前的所有点写0
如此,便可以完成解码。
代码在这里:
https://github.com/dtysky/3D_Displayer_Controller/blob/master/VHDL_PLANB/DECODER/DECODER.vhd
3.整体
整体,即把解码单元和扫描单元连接起来,这里采用的是双缓存模式,也就是说:
实例化fifoA和fifoB两个fifo,当A填充完成后开始扫描,A在提供扫描数据时B填充数据,B扫面时A填充,这样可以保证总是有数据输出,这其实是一个宏观上的流水线:
然后,整个控制部分就完成了。