赞
踩
很多人在刚接触FPGA时都有着无从下手的体验,包括刚开始做FPGA开发时候的笔者亦如此。针对这种情况,新手要多做试验,多思考,然后试着写些小的程序,再在FPGA上验证功能,如果不是想要的就再调试,慢慢的就可以学习到一些实际的东西。FPGA终极目标不是理论,而是实现实践的路径,成为“书虫”肯定是不行的,所以建议大家多动动手。
做开发需要什么样的心态?个人性格我觉得这个是勉强不来的,有的人做销售,不需要什么技术和技巧,因为他从小就能说会道,周边的人都比较喜欢,和别人沟通,交际这方面比较擅长。如果是这样的人,就适合做销售和行政之类,和别人打交道的工作,如果你让这些人做技术,他坐不住,处处感觉别扭。
有的人做研究,我觉得同样也不需要太多的技术,因为他从小就沉默寡言,喜欢发呆思考问题,数理化总能不怎么学都能考试高分,但是如果家里来了亲戚,确害羞的不爱说话,也就是人们常说的木讷。这些人适合做技术。如果你让这些人做销售,单子估计一个也接不到。所以我觉得不管做什么,根绝自己的性格找到合适的工作,这样身心愉悦。实际上,开发工作也是一项较累人的工作。
回归正题,FPGA首先要了解硬件,大部分做FPGA不太关注硬件问题,都认为硬件不是FPGA的问题,这就大错特错了,硬件设计的好坏直接影响到FPGA工作的质量。
做FPGA需要注意调试各类驱动芯片,如果做通信的话,有各种通信芯片,主要包括PHY芯片,通信交换芯片,光纤驱动芯片等,各类芯片。另外还有各种通信接口。这些接口和芯片需要时间去调试和积累,这些不是在论坛上能完成的,这个过程是要在实验室来完成的。另外,定位FPGA的位置,FPGA要了解的大部分不是FPGA知识,而是硬件知识和软件知识,这是因为FPGA的位置,FPGA的硬件和软件的桥梁。
目前FPGA的发展方向分为接口统一化(类似于AXI系接口)、硬件语言软件化、系统化。以后FPGA开发难度会越来越下降,也是技术开发的方向。在几年前,硬件很吃香,现在几乎不需要硬件工程师,其实并不是不需要,而是硬件越来越标准化,一个行业越来越标准,说明开发的难度也随之降低。
FPGA代码其中一个最重要的步骤就是仿真。仿真简单的说,就是验证代码是否正确,其中就包含了很多仿真的东西,测试平台的搭建,库的建立等等。最让我们忽略的恐怕就是线延时了。
有时仿真正确,但是加载到FPGA里面就不正确了,这是为什么呢?忽略了一个问题,那就是线延时。接口从FPGA到接口芯片肯定铺铜线过去了,中间这段走线是有延时。所以在仿真时,测试平台要在库和顶层之间加上一定的延时,来保证我们代码的正确。
那么目前FPGA的主要生产厂商有哪些?有哪些区别?
1.Altera,开发平台是Quartus II
2.Xilinx 开发平台是ISE
3.Actel ,开发平台是Libero
4.Lattice
5.Atmel
其中Altera作为世界老牌可编程逻辑器件的厂家,是可编程逻辑器件的发明者,开发软件MAX+PLUSII和QuartusII。记得上学的时候用的用的就是altera的芯片,当时的工具也是MAX,现在感觉当时的软件很强大了,现在感觉比较弱智了,下载FPGA就是用串口,当时的时钟速率也就是25M左右,用的是试验箱,就是一个大箱子,里面有板子和说明,板子上还有8位数码管和跳线。
Xilinx是FPGA的发明者,拥有世界一半以上的市场,提供90%的高端65nmFPGA产品,开发软件为ISE,其产品主要用于军用和宇航。
毕业后就是xilinx的,altera的很少用,大家一定问为什么,我也毕业的时候也是这样问老大的,老大说altera的不好用,我也有点气不忿儿,现在看来确实是这样,总结几点:
1:xilinx的资源丰富,新手会说很杂不容易用,但是如果上手之后,里面的资源确实会为你处理带来方便,比如说BUFG,IODELAY,ODDR,OBUFT等等这些小的资源,还有一些IPcore,altera的好像要少些。
FAE水平高,比如我们坛主猴哥就是xilinx的。
2:xilinx逻辑量比较大,一些大容量的FPGA好像altera没有这么大的,比如V5,V6,V7,K7,这些altera是远远没有的。不过也带来了隐患,比如说散热
不过有一点xilinx好像没有altera的做得好,那就是高速查分线,xilinx叫GTP,GTX,GTH,现在好像也区别不大了
Altera和Xilinx主要生产一般用途FPGA,其主要产品采用RAM工艺。Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺。
FPGA 语言verilog 和VHDL
讲到FPGA语言就不得不讲verilog 和VHDL,本人大学学的是VHDL,工作就一直在用VHDL
我觉得veilog更接近底层,关键是更接近C,所以被FPGA工程师所喜欢。HDL特别是Verilog HDL得到在第一线工作的设计工程师的特别青睐,不仅因为HDL与C语言很相似,学习和掌握它并不困难,更重要的是它在复杂的SOC的设计上所显示的非凡性能和可扩展能力。在学习HDL语言时,笔者认为先学习VerilogHDL比较好:一是容易入门;二是接受Verilog HDL代码做后端芯片的集成电路厂家比较多,现成的硬核、固核和软核比较多。而在实现上,veilog更容易实现。
比如说要例化多个模块,我们就可以用for语句,并且这个是可综合的。在申明总线时,由于比较繁琐的语句的时候,稍不注意还会有书写错误。也许在veilog里面,只需要一个for语句就能搞定
begin : loop
integer i;
for(i = 0; i <= 7; i = i + 1)
begin
if(int_stat_clr[i] ==1)
int_stat[i] <= 0 ;
end
end // block: loop71
这就话的意思就是如果stat_clr寄存器某一位为1,那么相对应的stat下面的一位就为1,这样写是不是很简单。
wire 和reg的区别
reg相当于存储单元,wire相当于物理连线,但是新学FPGA的会问,存储单元是什么,其实说白了就是D触发器。通俗的解释就是,wire相当于物理连线,就当与铜丝,PCB板子的走线,reg相当于芯片。wire走线延时小,几乎可以忽略不计。reg一个时钟的延时,这样就够了。
赋值:
wire对应的是assign,always,reg对应的always或者initial。
例如:
assign a = b ;把b点和a点相连接
always @(b)
a =b ;
表示变化出发
always @(posedge clk)
a<=b ;
把b线经过一级D触发器给a,可以看出这时:
1、 wire型的变量综合出来一般是一根导线;
2、 reg变量在always块中有两种情况:
(1)、always后的敏感表中是b 形式的,也就是不带时钟边沿的,综合出来还是组合逻辑
(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)
FPGA用的所有的信号赋值都是wire 和 reg ,学会了这两个也就掌握了FPGA的基本。
I2C
众所周知,FPGA一般作为主控芯片,I2C也一般是做主设备。一般情况下,I2C做从设备是不好做的,特别是做大容量的从设备。I2C看起来简单,但是里面还有很多问题,如果我们只考虑简单的7为device address,8 bit register address,数据读写位也是简单的8bit的话,另外读写只是简单的I2C interface的话,还简单些。
如果要考虑大容量的,如16bit的设备地址,读的情形考虑到简单的接口外还要考虑有restart的情况,就不好做了,如果要考虑的再细一点,特别是做图像处理的话,读写EDID的时候有个搜索device设备的过程,这种情形恐怕做好的就不容易了。
如果是大厂商,像一些AT的ROM,Flash等公司,做的也是巨烂,我们用他们的芯片,用ARM访问也是会有一些问题,就是他们考虑的不太周全。像一些图像驱动的厂商,做的I2C相对来说还好些;通信设备的I2C写的也是很差,控制起来比较麻烦,像一些光纤收发器的厂商,也就是光模块的厂商,有的时候你用ARM等标准设备访问的时候,也会有一些问题。
所以如果要做个I2C的从设备的话,要考虑的周全一些,这样我们的芯片健壮性就会比较高。
FPGA的延时以及时序等要求
关于FPGA的延时以及时序等要求,基本上是skew,width,period,hold&set time。
检查时钟和控制信号在指定事件之间的时间间隔,包括:skew、width、period和nochange。
skew:$skew (reference_event, data_event, limit, notifier); 限制最大偏斜 $skew (posedge clk1, posedge clk2, 1, notifier); 当data_event time - reference_event > limit,则会报告skew time violations。$skew是基于事件(event-based)的,如果监测到一个reference_event,那么就开始评估脉宽,只要监测到一个data_event,就会生成相应的报告,直到监测到下一个reference_event,才重新开始新的监测。如果在监测到一个data_event之前,又监测到一个reference_event,那么就放弃本次评估,重新开始新的评估。
width:$width (controlled_reference_event, limit, threshold, notifier); 限制最小脉宽 $width (posedge in, 2, notifier); 这里data_event是隐含的,它等于reference_event的相反边缘,当width < limit时,就会报告width time violations。
period:$period (controlled_reference_event, limit, notifier); 限制最小周期 $period (negedge clk, 10, notifier); 这里data_event是隐含的,它等于reference_event的相同边缘,当period < limit时,就会报告period time violations。
nochange:$nochange (reference_event, data_event, start_edge_offset, end_edge_offset, notifier);当eading reference event time - start_edge_offset < data_event < trailing reference event time + end_edge_offset时,就会报告nochange time violations。例如:$nochange (posedge clk, data, 0 , 0); 当在clk高电平期间,data发生任何变化,就会报告nochange time violations。有时候,路径上的时序检查是在一定条件成立的前提下进行的,这就需要引入条件操作符:&&&。需要注意的是,当存在两个及以上的条件时,要求这些条件首先在specify块外部经过适当的组合逻辑产生一个新的控制信号,然后再引入到specify块内部使用。例如:and u1 (clr_and_set, clr, set); specify $setup (negedge data, posedge clk &&& clr_and_set, 3, notifier); endspecify。xilinx里面,我们看post %route里面有个tinming的报告,我们在这里面可以清楚的看到这些东西。
注:本文源于”21IC中国电子网“
长按关注FPGA设计论坛Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。