国产FPGA现在真是遍地开花,带头的大哥有紫光同创,安路科技的FPGA,目前已经被大厂批量使用;中小规模的还有高云、智多晶、京微、复旦微;但还有一个易灵思,主打中低端FPGA,以小封装+低功耗出名,着实很有意思,其开发流程也“奇怪”的很。
我不得不说,易灵思确实真的很奇怪。
他走的不是Altera Xilinx的路线,开发流程可谓是另辟蹊径,像是在配置单片机,但又是在进行逻辑开发;
他走的也不是寻常路,主打小封装+低功耗,0.65mm的BGA面积是同类产品的1/4,工业相机类产品酷爱,典型的有海康的热成像相机;
至于市场,由于其硬核MIPI LVDS DDR,应该更适合视频细分领域的开发,以小唯美,并不需要做到多大的规模,但也能发光(40nm Trion系列最大120K,16nm 钛金系列最高180K)。
用过他的工具链的都知道,这哥们使用方法简直有点颠覆了我们的认知,也丝毫看不到抄袭A/X的痕迹,一开始入门很难,玩6了后又快,确实骨骼清奇。FAE号称:“没有他们的支持搞不定”,确实,走没有人走过的路,让别人没路可走。
但是易灵思也有他特点,比如体积小,DDR MIPI硬核,更美丽的价格,以及更直接的支持。据说某LED厂商,T20F256 的用量非常大。
有关国产FPGA工具链的对比分析,我在后续的文章中再总结下。那么本篇,我主要想介绍一下易灵思奇怪的开发方式,确实有点意思。
这里以LVDS屏幕的驱动为例,介绍一下易灵思FPGA的开发流程。如下是群创的1024*600的显示屏,我们需要产生如下LVDS LCD的时序,RGB为8bit,4通道LVDS数据,每个通道为7bit串行化的传输,时钟在40–67MHz之间:
易灵思采用的是自家的Efnity Sofware,安装好后如下,这logo确实很奇怪:
那么,接下来是具体的工程创建及开发流程:
1)首先,File→Create Project,创建工程,选择对应的器件
2)接着加入已有的代码(99.9%的人都是移植,不会在国产上初学吧)
3)然后,打开Interface,配置时钟、引脚、PLL,以及锁相环等
a.Create Blokc创建IO,包括clk、lcd_pwm控制信号
这如果是GPIO,选择输入或者输出;如果是clk,则还得哪一类时钟,如下所示:
这里我们定义pll_clkin,硬件上已经连接倒PLL_CLKIN引脚,不可当作其他用途,如下:
b.然后配置引脚,对着原理图操作,这里会显示Reaource,如下所示:
c.接着设置PLL,在PLL处Create Block,创建tx_pll如下。这里需要选择PLL_BR0,对应clk输入的引脚,硬件固定是GPIOR_138。
d.打开Automated Clock Calculaton,配置时钟输入为24MHz,输出慢时钟48MHz,快时钟=慢时钟*3.5=168MHz(lvds=7bit),并且快时钟需要90度phase,以及txpll_locked,GUI配置如下:
e.最后,配置LVDS IO,如下所示,其中要住于LVDS Resource的选择,以及Serializaton Width=7,并且选择tx_fastclk的名字,软件会自动根据改Name进行wire:
这里的LVDS TX或者CLK,与硬件原理图中的分配必须一致,如下:
f.最后,Generate Efnity约束文件,如果有错误此时会报出,比如没有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屏幕,太不容易了,万事开头难,如下:
最后总结一下,易灵思FPGA 开发过程的奇怪之处:
1)所有IO都需要Created Block的方式去产生,然后再给IO分配引脚
2)PLL采用配置的方式,不需要例化,最后在代码顶层直接输入PLL后的时钟及lock信号
3)LVDS采用配置的方式,也不需要例化,在产生的template.v中可见,只需要输出7bit并行信号即可,串行化以外部硬核的方式实现。
4)诸如此类的,DDR MIPI等,也是同样的操作方式,这样RTL Coding都不需要例化
5)但也有一个问题,我们无法debug硬核后端的信号,也没有给我产生仿真模型(比如LVDS),给调试还是带来了一些麻烦。
没有回复内容