一、产品概述
1、该灯源数据协议采用单线归零码的通讯方式。一个像素点需要24bit数据才能正常工作 (该灯板共有8x8 64个像素点);
2、复位时间需要至少280us;
3、传输数据每经过一个像素点便会被锁存24bit数据,因此数据会逐级减少。
二、码型以及24bit数据设计


复位码:意思是把前面的数据清空,才能继续输送新的数据。如果不清空上一次存入的数据,下次的数据没办法进入。


三、系统设计
1、系统框架图(整体):

在控制模块中设计不同数据的输入(提供64个RGB像素数据,给到ws2812)
在驱动模块中设计码型以及输入数据的拼接及输出(实现单总线协议)
在顶层模块仅进行逻辑连线。

在驱动模块中,主要考虑的是64个24bit数据的传输。(像素为8*8的照片)
由手册可知,每24bit数据传输间隔中我们需要至少280us的复位,复位结束才能传输下一个24bit数据,因此我们可以设计一个状态机实现数据传输与复位的状态切换。
同时我们可以设计一个ready使能信号,将该信号传输给控制模块,该信号拉高后代表驱动模块处于空闲状态,可以进入复位状态。
同时我们可以在控制模块设计一个data_vld信号,将该信号输入驱动模块,该信号拉高驱动模块应该立即进入复位状态,并在复位结束后即刻准备接受数据。
再由手册的分析可知,在该模块我们至少需要四个计数器,分别为:
(1)24bit数据计数器,计数从控制模块传来的数据量。
(2)64个像素点计数器,该灯板共有8×8,64个像素点,每个像素点均需要24bit数据。
(3)一个bit持续时间计数器,由于该光源1码和0码要求时间可以不同,因此我们需要取一个能同时满足0码和1码的值作为一个bit的传输时间。本设计一个bit所需传输时间设置为1200ns(既能满足0码(220ns-380ns的高电平时间以及580ns-1us的低电平时间)也能满足1码高低电平时间(均为580ns-1us))。
(4)复位时间计数器,至少为280us,本设计为400us。
注意,由于该光源数据格式为GRB,因此我们还需要在驱动模块对传入的RGB数据重新进行拼接。
此模块状态机如下:
其中,pix_data_vld为像素数据有效信号,表示只要数据有效就进入复位状态;end_rst_cnt为复位计数器结束信号,表示只要复位结束了就又开始传输数据;end_num_cnt为64个像素点计数结束信号。
2.2数据控制模块
在该模块仅为所需数据的存储以及如何传入驱动模块。在调用ROM时需要设计MIF文件初始化ROM。
为了存储我们设计好的数据,在该模块调用了一个ROM IP核。
同时在该模块设计了X,Y两个计数器,计数最大值均为8。将X,Y作为光源像素点的坐标从而确定ROM中所要取得的数据。
由于mif文件是一行一行保存数据,因此在显示每一帧像素时需要参考该公式:cnt_x +cnt_y+cnt_offset,cnt_offset为每一帧的偏移量,计数从0-23。
四、程序:
功能代码:(静态显示)
顶层模块:
控制模块:
驱动模块:
这里需要注意是:fifo_er_data并接数据时,前两个顺序调换了一下是因为,传过来的是GRB,而我们要显示RGB。
测试代码:
波形分析,动态显示;结果,暂时没放。