0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教你如何轻松玩转FPGA开发

Q4MP_gh_c472c21 来源:cg 2018-12-29 10:29 次阅读

很多人在刚接触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的好像要少些。

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,本人大学学的是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的延时以及时序等要求包括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_eventtime - reference_event > limit,则会报告skew timeviolations。$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

先描述下逻辑:FPGA实现一个逻辑,每按下一个按钮(逻辑做了消抖),出现10个200ns的脉冲,然后通过示波器抓输出波形,示波器出发条件,设置自动触发(上升沿)或者条件触发<1ms都试过。

问题出现:每次按下按钮,不是每次都能在示波器看到脉冲波形,大概按下10次会有1-2次示波器抓不到波形!

首先怀疑是做的逻辑问题,这个楼主一贯的风格,先怀疑自己,验证自己没有问题了再怀疑相关,而不是想当然说自己这个没问题那个没问题,我觉得这点很重要,就是怀疑精神,我发现设计工程师都想把自己推的一干二净,说自己的没有问题,我觉得出现问题任何地方都是值得怀疑的,先去检查自己,不是说自己没问题就没有问题的,如果后来证明是自己的问题,这不相当于自己打自己的脸吗!

总结一点:要有怀疑精神,所有相关的都是值得怀疑的。

好了,回归正题,然后我用chipesope抓到是输出逻辑有波形,但是示波器上看不到,出现这种情况大家会怎么做?

输出逻辑没有问题后,初步判定是不是IO的驱动能力,因为外面直接用示波器测量的,是不是没有负载,所有输出不正常,基于这点将输出的逻辑再接入到FPGA某一输入管脚,然后又写着一段程序,检测输入是不是有信号过来,然后做了计数之类,结果发现,当示波器没有波形的时候,输入的信号也有,计数也正常。出现这种情况大家会怎么做?

是不是同一芯片的问题,然后我把这个输出的管脚飞线到另外一个芯片,当示波器没有波形的时候,另外一个芯片输入的信号也有!

基于以上测试,我大胆预测是示波器的问题,也不能说是示波器的问题吧,估计是没有这种的应用场景。

然后有试了另外一家的芯片,写上同样的逻辑,测试结果一样。

做了这么多试验,也证明了,就是示波器没有这样的场景。用的示波器是泰克的2032等,试了他的两款表,都是如此,不是黑他的表,据估计,所有的表也都如此。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21309

    浏览量

    593128
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66740

原文标题:FPGA该如何学习?听这位FPGAer如何渡劫

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    轻松玩转AVR C语言 资料很好

    轻松玩转AVR资料很好
    发表于 07-26 22:44

    韩老师教你轻松用示波器

    韩老师教你轻松用示波器
    发表于 04-06 11:14

    教你轻松上手51单片机

    1、7天入门,教你轻松上手51单片机https://www.moore8.com/series/51dpj?2csdn2、嵌入式系统开发攻略丨完整 全面 细致 实操 汇总https
    发表于 07-13 08:10

    如何轻松玩转adc?

    如何轻松玩转adc?
    发表于 01-21 06:28

    零死角轻松玩转stm32下载

    《零死角轻松玩转 STM32》 系列教程由初级篇、 中级篇、 高级篇、 系统篇、 四个部分组成,根据野火 STM32 开发板旧版教程升级而来,且经过重新深入编 写,重新排版,更适合初学者
    发表于 04-28 14:23 0次下载

    轻松玩转STM32Cube资料包下载(上)

    轻松玩转STM32Cube资料包下载(上)
    发表于 09-28 09:39 0次下载

    轻松玩转STM32Cube资料包下载(2)

    轻松玩转STM32Cube资料包下载(2)
    发表于 09-28 09:41 0次下载

    轻松玩转STM32Cube资料包下载(下)

    轻松玩转STM32Cube资料包下载(下)
    发表于 09-28 09:46 0次下载

    轻松玩转AVR单片机C语言》1.pfd

    轻松玩转AVR单片机C语言》1.pfd
    发表于 09-30 16:47 0次下载

    轻松玩转AVR单片机C语言》2.pfd

    轻松玩转AVR单片机C语言》2.pfd
    发表于 09-30 16:49 0次下载

    轻松玩转AVR单片机C语言》3.pfd

    轻松玩转AVR单片机C语言》3.pfd
    发表于 09-30 16:51 0次下载

    轻松玩转AVR单片机C语言》4.pfd

    轻松玩转AVR单片机C语言》4.pfd
    发表于 09-30 16:53 0次下载

    轻松玩转AVR单片机C语言》5.pfd

    轻松玩转AVR单片机C语言》5.pfd
    发表于 09-30 16:54 0次下载

    通过一个案例教你玩转MCU代码生成工具(基于STM32)

    通过一个案例教你玩转MCU代码生成工具(基于STM32)
    发表于 11-18 17:36 12次下载
    通过一个案例<b class='flag-5'>教你</b><b class='flag-5'>玩转</b>MCU代码生成工具(基于STM32)

    USB学习书籍之《圈圈教你玩转USB》

    USB学习书籍之《圈圈教你玩转USB》
    发表于 01-26 16:45 0次下载