易灵思FPGA,天生适合MIPI/LVDS等相关应用,加上硬核DDR3控制器,简直就是完美。
T35F324开发板支持LVDS LCD显示与HDMI显示,具体框图如下。这里,我将就花一定的篇幅,讲讲Trion系列FPGA T35的LVDS TX Hard IP如何使用,并且实战驱动我设计的1024*600的7寸 LVDS屏幕。
1.硬件介绍
如下图所示,为1024*600 LVDS LCD接口,这里直接与FPGA的LVDS IO对接驱动,其中相关Bank使用了3.3V电平。由于我在LCD驱动板侧已经处理好了所有的电源驱动,因此用户接口驱动,只需要给PWM与LVDS数据即可。
其中LVDS为1对差分时钟,4对差分数据线,查阅LCD手册(群创),相关的驱动协议如下所示(8bit DE模式,其中时钟采用了3:4占空比)
另外,1024*600的驱动时序,如下所示。这里时钟范围为 40.8~67.2MHz,并且时序与VGA Timing完全一样。我曾在我的书《FPGA设计技巧与案例开发详解》中,我详细的介绍过如何驱动VGA显示器,这里在LVDS之前的RGB时序,是完全一样的。
所以我们的整体的Pipeline应该是这样的:lcd_driver <–> lcd_display –> LVDS Interface
2.Trion FPGA LVDS原理
打开Efinity软件,点击Help-Document,在Interface Designer中找到LVDS Interface,查询Trion系列FPGA的LVDS Interface,如下图所示:
可见LVDS是硬核心,并且支持800MHz LVDS速率,兼容2:1 ~ 8:1,并且FPGA片上已经集成了100R终端电阻,如下所示:
另外,如果LVDS bank用于GPIO,要求必须相邻2对unassigned LVDS pins,否则软件会报错
接着,以LVDS TX为例,我们打开相关的小节,可见文档给出的框图:
这里,由PLL产生fastclk与slowclk,供给Serializer,随后进行串行数据的输出。以n=7为例,help给出了如下时序图,即按照3:4,输出7bit的数据。
另外,需要注意的是在Using the Trion LVDS Block中,可见fastclk0与slowclk的关系。首先fastclk就是serial clock, slowclk就是parallel cock;其次,在Trion系列FPGA中,fastclk=slowclk*n/2,那么当n=7时,fastclk=3.5*slowclk。
3.LVDS TX设计流程
分析完Trion FPGA的LVDS TX特性,我们有米可炊,直接上刀,如下:
1)首先,File→Create Project,创建工程,选择对应的器件
2)接着加入已有的代码(99.9%的人都是移植,不会在国产上初学吧)
3)然后,打开Interface,配置时钟、引脚、PLL,以及锁相环等
a.Create Block创建IO,包括clk、lcd_pwm控制信号
这如果是GPIO,选择输入或者输出;如果是clk,则还得哪一类时钟,如下所示:
这里我们定义pll_clkin,硬件上已经连接到PLL_CLKIN引脚,不可当作其他用途,如下:
b.然后配置引脚,对着原理图操作,这里会显示Resource,如下所示:
c.接着设置PLL,在PLL处Create Block,创建tx_pll如下。这里需要选择PLL_BR0,对应clk输入的引脚,硬件固定是GPIOR_138。
d.打开Automated Clock Calculation,配置时钟输入为24MHz,输出慢时钟48MHz,快时钟=慢时钟*3.5=168MHz(lvds=7bit),并且快时钟需要90度phase,以及txpll_locked,GUI配置如下(与前面分析一致):
e.最后,配置LVDS IO,如下所示,其中要注意LVDS Resource的选择,以及Serialization Width=7,并且选择tx_fastclk的名字,软件会自动根据该Name进行wire:
这里的LVDS TX或者CLK,与硬件原理图中的分配必须一致,如下:
f.最后,Generate Efinity约束文件,如果有错误此时会报出,比如没有90°,或者倍率不对,IO分配不对等。这一步完成后生成了工程的约束文件,包括顶层空壳等。
生成的文件,可在Result中的Interface查看,如下,其中特别关注sdc与template.v
4)LCD_LVDS_Test_1024600.v顶层代码的修改
上一步中,软件帮我们生成了顶层的template.v,如下所示:
可见PLL的输出时钟,直接作为我们逻辑的输入时钟使用;另外,LVDS我们只需要输处配置好的7bit串行化的时钟与数据,此外我们并不需要例化PLL、LVDS IP等。这个初次见面,真的就非常奇特了。
a.于是乎,我们顶层的接口就变成了这样。这里像素时钟自然是慢时钟,clk和fast时钟不需要用我们注释掉即可:
b.正常例化rgb lcd驱动代码,如下:
c.将rgb及de数据送给lvds port,这里就有点坑了,一开始没有研究时序,如下:
这里7bit并转串传输时,先发送的是lsb,然后才是msb,因此rgb驱动的代码还需要转一下,操作如下(最初的时候想当然以为是msb,浪费了好多宝贵的时间):
5)最后,在dashboard中双击图标,进行一系列的编译、综合、布局布线,并最终生成目标bit文件。
关于设计占用的资源,可以在左侧的Result中查看,如下所示,占用了一个PLL,5个LVDS:
6)上板验证,打开Programmer,选择bit文件,下载到FPGA后,终于点亮了LVDS屏幕,万事开头难就,如下:
4.Trion FPGA LVDS总结
最终总结一下,易灵思Trion FPGA的LVDS TX IP相关注意事项:
1)首先fastclk = n/2 * slowclk;
2)其次一定要记得fastclk 有90deg的相位
3)再者串行数据是先发LSB,再发MSB的。
4)最后LVDS TX Hard IP配置好后,直接在代码顶层使用,无需再例化。
初次使用,不可捉摸;再见时,爱不释手。。。
夜深人静,今天就先到这里;
没有回复内容