首页
社区
课程
招聘
[原创]转向fpga开发的点滴体会
发表于: 2015-2-6 12:02 8188

[原创]转向fpga开发的点滴体会

2015-2-6 12:02
8188
今天无意间在硬盘的一个角落发现了我几年前的一段文字,那时候我刚完成了一个FPGA项目,写的一段心得,读后颇为感慨,虽然比较肤浅,但的确说出了我那时候的实感。

文档修改时间为2011年6月7日,现在发在这里与大家分享:

转向fpga开发的点滴体会

一个加密算法,一个视频解码器,既可以使用软件实现,也可以通过硬件(fpga)来实现,虽然它们实现的功能相同,但是它们的工作方式却大相径庭。

软件只能在计算机系统中运行,需要一定的软硬件支撑,比如必须有cpu和ram,软件本质上就是命令序列,指挥计算机系统按照我们的意图工作。

Fpga只是一个可编程器件,它可以被定制成不同功能的数字系统,当然也可以被定制成cpu。

Fpga的开发过程就是数字逻辑电路系统设计的过程,不过一般不是用画原理图的方式罢了,HDL语言只是描述数字逻辑电路的一中语言,用HDL写的代码需要综合、布局、布线,按照FPGA的要求,综合成电路,然后配置fpga芯片工作。

其实数字逻辑电路是两门学科,分别是数字逻辑和数字电路,数字逻辑的设计可以看成使用理想逻辑器件,如与非门、D触发器进行系统设计,但是该数字系统要发挥作用,最终要落实到电路,所以我们在进行数字系统开发时,除了要考虑逻辑特性外,电路特性也必须考虑,否则我们的系统将不太可能正常工作。

数字系统开发需要考虑触发器的建立时间、保持时间、输出时间等,比如一个D触发器,它的要求建立时间要大于3ns,保持时间要大于0.6ns,而它的输出时间是1ns,那么在时钟到来时,输入的数据必须已经稳定3ns以上,而且从时钟到来后的0.6ns,输入数据不能变化,只有满足以上两个条件,输入数据在该时钟才会被D触发器锁存,而且需要经过1ns后该数据才在D触发器的输出端稳定。

数字系统开发需要考虑触发器的亚稳态的问题,处于亚稳态的触发器,其输出电平既不是代表逻辑1的高电平,也不是代表逻辑0的低电平,如果将该触发器的输出作为一个组合逻辑的输入,必将导致该组合电路的输出不可预知(逻辑功能混乱),所以亚稳态是我们在开发中要避免的。

其实只要使用同源时钟,亚稳态的问题是很容易避免的,只要两级触发器之间的延时加上前及触发器的输出时间再加后及触发器的保持时间不要大于时钟周期即可,这可以通过加大时钟周期、限制触发器之间的组合电路的延时可以实现。

但是对于非同源时钟来说,亚稳态问题就变得非常棘手,因为控制触发器锁存数据的时钟和读取触发器输出数据不是用一个时钟,它们也没有固定的相位差,我们无法保证触发器的输出才任何时候都是可读的。

其实对应不同时钟的同步,已经有了不少现成的方法,如伴随信号加高速采样就是其中的一种,时钟一在需要同步的信号稳定后给出一个伴随信号valid,并保持若干个时钟周期后,先将valid信号撤除,然后再改变那个同步数据,这样,只要读方时钟周期足够短,完全可能可靠读取那个同步数据。当然同步的方法很多,不同时钟间通过握手信号可靠传递数据Afifo\异步双口ram都是经常采用的同步方式。

软件开发人员转向fpga开发常犯的错误:
1)将fpga开发和软件开发等同起来,认为hdl代码也是一行、一行顺序执行的
其实fpga开发是说白了是数字系统设计,所有硬件模块在上电时是同时工作的,每一个时钟都是同时到底所有的模块,也可以这样理解,所有电路模块都是并行执行的,当然不太准确,其实我们在写hdl代码时,应该明白知己是在进行数字系统建模,每行代码都代表一个数字电路的工作特性的描述。
2)将fpga开发等同于数字逻辑设计,仅仅考虑系统的逻辑的正确性,而不考虑系统的电路特性
显然,这样的设计通过前仿真没有任何问题,但是下载到片子上运行,应该不会有好结果。

3)不合理使用资源
一般fpga内部都集成了可编程逻辑块、可编程开关、可编程输入输出、dram、bram等,其中可编程逻辑块是实现各种逻辑功能的重要资源,可以组成各种逻辑功能单元,其数量直接关系到芯片的价格和组成系统的能力,如果我们需要保存一大块数据,如果使用可编程逻辑块组成的寄存器,那就显得太奢侈了,我们完全可以将其保存咋bram中。

软件开发人员转向fpga开发的不足:
软件开发人员的逻辑设计能力毋庸置疑,但是器先天不足是硬件知识,fpga开发应该属于硬件开发的最底层了,软件开发人员往往不懂电路,比如对ttl门、oc门、cmos、输入阻抗、输出阻抗、上拉电阻等没有概念,当然这些都是可以弥补的,将大学电路课程拿出来再温习一下应该可以了。

软件应用开发人员和fpga开发人员的门槛:
软件运行要计算机系统支撑,软件开发人员至少应该掌握软件设计语言和操作系统,比如,c程序员应该了解自己开发的程序在目标系统中是如何运行的,必须知道那些内存是程序装入时就分配好的,那些内存是在堆栈上临时分配的,那些内存是程序员动态申请的,应该何时释放,多线程、多进程开发应该特别注意变量的同步。特定系统程序员必须知道操作系统给我们提供了什么服务,如文件系统服务、网络服务、界面服务等等。

Fpga开发人员首先应该对数字逻辑电路要掌握透彻,应该能够熟练使用一两个eda开发环境,对工作中一些常用的协议应该掌握越多越好,如i2c协议、SPI协议等,为了和其它计算机系统通讯,一些常用总线,如usb、pci、amba应该了解多一点。

还有,不管是做硬件还是做软件,实践无疑是最重要的,只有在实践中遇到并解决的问题多了,我们的计算也就提高了。

结束语:
其实对一个开发人员来说,选择软件应用开发还是硬件fpga开发,最主要一点是你不能讨厌它,当然如果对它有浓厚的兴趣就更好了。
我做软件十多年,其实我对硬件开发是从来不讨厌的,只是没有机会而已,我的目标其实是想做一个玩技术的人,虽然常常也被技术玩,呵呵。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 178
活跃值: (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你发错位置了,你应该发在21ic或者ednchina上面。这是软件安全社区
2015-2-7 11:38
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我觉得高安全,懂点硬件应该没有坏处,它们也会有一点交集的。

虽然我只做了一年的fpga开发,但是觉得收获颇多,呵呵

我对安全技术挺感兴趣的,可惜没有这方面的工作机会。
2015-2-7 14:22
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
也学过fpga,但是没做过啥项目。但是我个人认为,今后应当是通用计算大行其道的世界,FPGA作为辅助计算。
2015-2-7 15:11
0
雪    币: 123
活跃值: (144)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我就是从FPGA转出来的   以前一直找不到FPGA开发的工作
2015-2-13 10:06
0
游客
登录 | 注册 方可回帖
返回
//