发 帖  

FPGA技术的学习方法 已关注 关注问答 36 人已关注

2017年02月13日-2017年02月28日 分享到: 收藏 23

`


FPGA是当前很热门的技术。发展到现在,FPGA器件由早期的纯逻辑粘合发展到如今的可编程片上系统(SOC),FPGA应用的领域愈发广泛,开发难度和复杂度也越来越大。
有很多工程师都在探索FPGA技术。那么究竟如何才能高效学习好FPGA技术呢?
本期邀请到的FPGA专家梅雪松,将为大家解答FPGA有效学习方法。

专家观点:
学习FPGA技术,或者不仅局限于FPGA,学习任何一个新技术只要运用科学的学习方法,都将事半功倍。学习的过程为理解基础概念、结合实践应用、掌握方法融会贯通,最终达到独立开发的能力。本期将聚焦于解答基础技术问题、提供学习工具和方法。

本期互动提问范围:
1、FPGA设计流程,modelsim、Quartus/ISE
2、Verilog HDL语法结构,可综合与不可综合编程
3、组合逻辑和时序逻辑电路的设计
4、verilog代码编写规范
5、关于如何制定FPGA学习计划
6、关于选择学习资料方面

欢迎大家就FPGA方面以上领域遇到的问题来进行提问。
想学习更多FPGA知识的工程师们,也可以到发烧友培训学院查找“小梅哥”的相关教学课程。


` 750X375 1.jpg
已结束
  • 请问学习FPGA, 一定需要高学历吗?
    请问我是个普通二本,学习FPGA可以吗?
    是否FPGA一定要研究生,或者名牌大学
    展开∨
    我本人是普通二本学校毕业。个人观点,学习和使用fpga,谁都可以,放眼应用的话,由于FPGA偏向高端,就业面相对较窄,因此企业在人才选择上更偏向较高学历的人才。普通学校的学生要想学好FPGA并能够获得企业认可,往往需要付出更多的时间和精力。
  • 如何选择容易上手的FPGA开发板呢?
    请小梅哥推荐,如何有效学习和选择什么样的开发板?
    展开∨
    个人观点,开发板不等于学习板,你问的是容易上手的开发板,实际上应该是选择容易上手的学习板。开发板主要面向企业客户和高校项目,因此配置上一般较高,做工也很好,但是往往配套的资料并不十分详细,仅实现了功能的验证。而教学板则侧重教学内容的配套,如视频教程,文档教程,对于初学,最好是有step by step的教程,这样才能少走弯路。所以,如果是入门学习,建议选择配套资料好,有后期教学指导的板卡和团队,如果是有基础,希望进行项目开发,则建议选择大厂的品牌开发板。
  • 请问下FPGA工程师的核心竞争力
    请问下小梅哥,FPGA工程师在市场上的的核心竞争力是什么?
    展开∨
    这个问题,并不知道如何回答。如果说FPGA工程师自身的核心竞争力,那应该是独立完成项目的能力。能够自己编码,能够自己验证设计,调试设计,毕竟FPGA不像嵌入式那样,可以很方便的移植各种代码。如果说FPGA工程师薪资比其他高,应该是“物以稀为贵”吧。不过电子这个行业飞速发展,无论做嵌入式软件开发还是FPGA,个人认为,自身的核心竞争力应该是学以致用,能够主动学习,并将学到的内容转化为成果。
    个人感觉两个方面
    1. 解决bug的能力,或者说你的调试能力;
    2. 算法,fpga只是工具,但是会算法的工程师就不一样了!
  • 请问基于NI C rio的FPGA的优点是?
    你好,能否请教一个问题,基于NI C rio的FPGA的优点是?
    我之前一直用的ni的compact daq,最近因为新设备选型而稍稍了解了一点compact rio的东西,但是对fpga没什么了解。看了ni官网资料后,我知道基于labview和ni的硬件,开发fpga应用会比一般fpga开发要快,但不明白都是ni的平台,fpga比其他现成的采集卡加电脑的配置的优势。是定制后更快的响应更小的体积功耗和更低的单价么?谢谢。
    展开∨
    对于NI的这个方案,我本身接触的不多,不过根据业内的技术交流,发现90%以上的FPGA工程师都还是使用的传统的FPGA开发方式,即在厂家提供的软件中使用HDL语言进行开发。这才是主流,才能够更加灵活的设计各种项目,使用NI的解决方案,在某些适合的领域可能非常高效,但是推广到其他就不那么容易了。因此视个人实际使用领域而定
  • 常遇到无法综合或者没能按预期在开发板上正常工作
    在做FPGA设计时,常遇到无法综合或者没能按预期在开发板上正常工作,原因往往不明,一个是文件太多了。二是这些文件还可能是其他人写的,小梅哥遇到这样的问题是如何找到并解决这样的设计错误呢?
    展开∨
    实在抱歉,之前一直以为该问题回答了,可能由于某些原因,系统没有显示出来,我这里再简单回答下。
    如果团队做FPGA设计,那么肯定是明确分工,在一开始就设计好了模块间接口,然后每个模块单独的都是经过测试验证,能够实现功能,再集成到一起。所以你遇到这个问题的原因,是因为没有做好这两点,即合理划分模块和单独验证。关于使用其他人写的文件,如果是个合格的工程师,必然提供有testbench和接口文件,如果没有,那就不是合格的fpga开发者。
  • Verilog 中定义信号为什么要区分 wire 和 reg 两种类型呢?
    Verilog 中定义信号为什么要区分 wire 和 reg 两种类型呢?
    展开∨
    在FPGA中器件中,最基本的结构是布线资源和D触发器资源,这两类资源在数字电路中就是wire和reg的意思。Verilog在设计语法的时候,就按照这个思路来了。用户理解的时候,就理解为wire是信号间的连线,仅仅是连线。reg是带存储功能的信号。
    在FPGA中器件中,最基本的结构是布线资源和D触发器资源,这两类资源在数字电路中就是wire和reg的意思。Verilog在设计语法的时候,就按照这个思路来了。用户理解的时候,就理解为wire是信号间的连线,仅仅是连线。reg是带存储功能的信号。
  • 请问下如果想用FPGA搞通信领域方面的 该怎么制定学习计划,由浅入深的计划呢
    学了一段时间的FPGA,还是感觉有点迷茫,感觉学得有点杂,希望能给我一些宝贵的建议,谢谢。
    展开∨
    本人对通信领域的FPGA应用不是很了解,不过通信领域一般用的比较多的是数字信号处理,目前网上有相关教材讲解的还不错,建议跟着教材进行学习。
  • 各模块中用多个模块来做逻辑(不是接异步FIFO等),是不是会导致时序变差,系统不稳定?
    各模块中用多个模块来做逻辑(不是接异步FIFO等),是不是会导致时序变差,系统不稳定?
    展开∨
    只要同步于同一个全局时钟,是不会有大的影响的,能用使能时钟,就不要用门控时钟,以此减少跨时钟域数据传输的情况。
  • 请问梅哥对FPGA技术开源的展望与看法
    请问梅哥是否对Arty z7 和OpenFPGAduino这类开源创客型FPGA产品感兴趣,能不能对fpga的开源创客 的未来和对中国FPGA教育的影响说出您的看法。
    展开∨
    个人观点:FPGA做开源创客型产品并不具有很大优势。ARM Linux能做开源创客型产品是因为提供了一个非常成熟的开发平台,用户只需要会C语言或者其他高级编程语言,就能设计出想要的功能。而FPGA技术相对于软件编程来说,本身就复杂的多,实现相同的功能,FPGA的开发周期是嵌入式软件方式的5到10倍。所以,在没有更加高级的开发方式出现之前,个人暂不看好FPGA开源创客的前景
  • FPGA如何学习
    您好,我是一个在读研究生,本科的时候做过一些FPGA的小项目,毕业设计也与FPGA有关,现在想深入学习FPGA,该怎么样继续呢,没有人指导可以么?
    展开∨
    在教材教材足够系统细致的情况下,自学是没有问题的。如果有指导,能节约宝贵的时间,在关键的时候,能指出个人的一些误区,对学习效率和学习信心是有益处的。FPGA本身来说并非那么容易掌握。要想深入,首先证明你自己已经具备独立的开发能力了。不是改几行别人的代码,下载到板子上能出现象就说明已经掌握了。有个成语叫“水到渠成”。你目前不知如何深入,是因为你的基本功都不扎实,一旦真正的学会了,你就有一种想要使用FPGA实现自己心中各种所想的冲动。预知如何深入,还是得靠企业的具体实用性项目来历练。但是,能够深入企业进行历练的前提,还是基本功练的扎实
  • FPGA就业方向有哪些?能否对比分析就业前景?谢谢老师
    老师您好!我现在初学FPGA,请问您对FPGA就业方向有哪些理解?能否对比分析就业前景?因为FPGA相关的学习知识太多,确定了方向才能更好地专注于自己要学习的内容
    展开∨
    在教材教材足够系统细致的情况下,自学是没有问题的。如果有指导,能节约宝贵的时间,在关键的时候,能指出个人的一些误区,对学习效率和学习信心是有益处的。FPGA本身来说并非那么容易掌握。要想深入,首先证明你自己已经具备独立的开发能力了。不是改几行别人的代码,下载到板子上能出现象就说明已经掌握了。有个成语叫“水到渠成”。你目前不知如何深入,是因为你的基本功都不扎实,一旦真正的学会了,你就有一种想要使用FPGA实现自己心中各种所想的冲动。预知如何深入,还是得靠企业的具体实用性项目来历练。但是,能够深入企业进行历练的前提,还是基本功练的扎实
  • 如果已经有了CPLD基础,FPGA从哪里开始最好
    亲爱的专家:您们好!
    问题如题。如果已经玩了CPLD-EPX240T100这款开发板,那么再起步采用那类的FPGA更好。希望是Altera的系列,价位又比较合理为好。希望是,可以在上边试运行:TFTLCD带触摸屏的控制+外接RAM;可以实现简单图像采集处理成为色斑状图[简化特征图]进行识别处理;实现8~10位高速ADC,实现驱动TFTLCD作为手持示波器和检测频率计。
    如果您们觉得目标要求可以实现[时间没有限制],推荐1款开发板和对应的芯片,谢谢
    展开∨
    能够驱动TFTLCD,并实现识别的简单的识别处理,这个其实任意一款FPGA器件都可以,只分开发板厂家是否做了相应的接口,高速ADC的采样率如果低于100M,可以使用标准的2.54接口扩展,因此问题也不是很大。就是不知你需要的图像处理速度。可以参看我们的AC620开发板或者AC6102开发板,这两款都对TFTLCD有非常好的支持。
  • 现在fpga工程师在市场上需求量大吗?待遇好吗?
    我以前也是做fpga的,后来感觉周围人做arm嵌入式,或者做安卓java开发的人很多,而做fpga的很少,所以我感觉是不是做这个东西技术方向很窄,做下去没前途?
    展开∨
    FPGA本身应用领域就小的多,因此市场小,就业面窄是肯定的,但是这并不代表着FPGA的技术人员就过剩了,恰恰相反,虽然当前FPGA的就业面不如ARM嵌入式,但是真正高水平的FPGA开发人员仍旧是相当紧缺。在入门和高水平的开发人员之间,有很远的路要走。
  • 写了一段pid程序,发现波形振荡很厉害,找不到原因
    `timescale 1ns / 1ps

    module pid(
                                      clk,
                                      rst,
                                      start,
                                      setpoint,
                                      feedback,
                                      pid_out,
                                      Dir,
                                      finish
    );

    input clk;
    input rst;
    input start;

    input signed [15:0] setpoint;
    input signed [15:0] feedback;        
    reg        signed [15:0] error;
    reg        signed [15:0] error0;

    output reg finish;
    output reg signed [15:0] pid_out;
    output reg [1:0]  Dir;

    reg signed [15:0] pid_out_temp1;
    reg signed [15:0] pid_out_temp2;
    reg signed [15:0] pid_out_temp;

    //-----------------------------------------------------------------------------       
    reg start_1,start_2;
    always @(posedge clk )begin
       if(!rst) begin
                    start_1 <=0;
                    start_2 <=0;
            end
            else begin
                            start_1 <= start;
                            start_2 <= start_1;
            end
    end

    //控制参数
    parameter P=3;
    parameter D=1;


    reg [5:0] state;
    always @(posedge clk or negedge rst)
    begin
            if(!rst)
                    begin
                            state = 0;
                            pid_out =0;  
                            finish=0;
                    end
            else
                    begin
                            case(state)
                                    0:begin
                                            finish=0;
                                            if(start_1 && ~start_2)
                                                    state = state + 1'b1;
                                    end        
                                    1: begin
                                            error0=error;
                                            error=setpoint-feedback;
                                            state = state + 1'b1;
                                    end
                                    2: begin               
                                            pid_out_temp1=P*error;
                                            pid_out_temp2=D*(error-error0);
                                            state = state + 1'b1;
                                    end
                                    3:begin
                                            pid_out_temp=pid_out_temp1+pid_out_temp2;
                                            state = state + 1'b1;
                                    end
                                    4:begin
                                            if(pid_out_temp>2300)
                                                    pid_out_temp=2300;
                                            else if(pid_out_temp<-2300)
                                                    pid_out_temp=-2300;

                                            state = state + 1'b1;
                                    end
                                    5:begin
                                   
                                            if(pid_out_temp>0)begin
                                                    Dir=1;
                                                    pid_out=pid_out_temp;
                                            end
                                            else begin
                                                    Dir=2;
                                                    pid_out=pid_out_temp;
                                            end
                                           
                                            finish=1;
                                            state = state + 1'b1;
                                    end
                                   
                                    6:begin
                                   
                                            if(pid_out>0)begin
                                                    pid_out=pid_out>>>3;
                                            end
                                            else begin
                                                    pid_out={pid_out[15],(~pid_out[14:0]+1)>>>3};
                                            end
                                            state = state + 1'b1;
                                    end
                                   
                                    7:begin
                                            finish=0;
                                            state = 0;
                                    end
                                    default:;
                            endcase
                    end
    end

    endmodule
    展开∨
    就像我在讲课的时候的的那句话,没有仿真波形,没有testbench,不要来问问题。这是仿真验证都没有,难倒让其他人帮你写testbench么?
    • 不好意思,我写了techbench,只是忘记附上。麻烦小梅哥帮我看一下
      这段是verlog(源代码):
      `timescale 1ns / 1ps

      module pid(
                                        clk,
                                        rst,
                                        start,
                                        setpoint,
                                        feedback,
                                        pid_out,
                                        Dir,
                                        finish
      );

      input clk;
      input rst;
      input start;

      input signed [15:0] setpoint;
      input signed [15:0] feedback;        
      reg         signed [15:0] error;
      reg        signed [15:0] error0;

      output reg finish;
      output reg signed [15:0] pid_out;
      output reg [1:0]  Dir;

      reg signed [15:0] pid_out_temp1;
      reg signed [15:0] pid_out_temp2;
      reg signed [15:0] pid_out_temp;

      reg [5:0] state;

      //-----------------------------------------------------------------------------       
      reg start_1,start_2;
      always @(posedge clk or negedge rst)begin
         if(!rst) begin
                      start_1 &lt;=0;
                      start_2 &lt;=0;
              end
              else begin
                              start_1 &lt;= start;
                              start_2 &lt;= start_1;
              end
      end

      //控制参数
      parameter P=3;
      parameter D=1;


      always @(posedge clk or negedge rst)
      begin
              if(!rst)
                      begin
                              state = 0;
                              pid_out =0;  
                              finish=0;
                             
                      end
              else
                      begin
                              case(state)
                                      0:begin
                                              finish=0;
                                              if(start_1 &amp;&amp; ~start_2)
                                                      state= state + 1'b1;
                                      end  
                  
                  1:        begin
                                        error0=error;
                    error=setpoint-feedback;                               
                                        state = state + 1'b1;
                                        end
                                        
                                      2: begin               
                                              pid_out_temp1=P*error;
                                              pid_out_temp2=D*(error-error0);
                                              state = state + 1'b1;
                                      end
                                      3:begin
                                              pid_out_temp=pid_out_temp1+pid_out_temp2;
                                              state = state + 1'b1;
                                      end
                                      4:begin
                                              if(pid_out_temp&gt;2300)
                                                      pid_out_temp=2300;
                                              else if(pid_out_temp&lt;-2300)
                                                      pid_out_temp=-2300;

                                              state = state + 1'b1;
                                      end
                                      5:begin
                                     
                                              if(pid_out_temp&gt;0)begin
                                                      Dir=1;
                                                      pid_out=pid_out_temp;
                                              end
                                              else begin
                                                      Dir=2;
                                                      pid_out=pid_out_temp;
                                              end
                                              finish=1;
                                              state = state + 1'b1;
                                      end
                                     
                                      6:begin
                                        
                                              state = state + 1'b1;
                                      end
                                     
                                      7:begin
                                              finish=0;
                                              state = 0;
                                      end
                                      default:;
                              endcase       
                      end
                       p
      展开∨
    • 仿真脚本:
      `timescale 1ns / 1ps

      ////////////////////////////////////////////////////////////////////////////////
      // Company:
      // Engineer:
      //
      // Create Date:   23:32:57 02/22/2017
      // Design Name:   pid
      // Module Name:   D:/pratise/2-23/pid/pid_test.v
      // Project Name:  pid
      // Target Device:  
      // Tool versions:  
      // Description:
      //
      // Verilog Test Fixture created by ISE for module: pid
      //
      // Dependencies:
      //
      // Revision:
      // Revision 0.01 - File Created
      // Additional Comments:
      //
      ////////////////////////////////////////////////////////////////////////////////

      module pid_test;

              // Inputs
              reg clk;
              reg rst;
              reg start;
              reg [15:0] setpoint;
              reg [15:0] feedback;

              // Outputs
              wire [15:0] pid_out;
              wire [1:0] Dir;
              wire finish;

              // Instantiate the Unit Under Test (UUT)
              pid uut (
                      .clk(clk),
                      .rst(rst),
                      .start(start),
                      .setpoint(setpoint),
                      .feedback(feedback),
                      .pid_out(pid_out),
                      .Dir(Dir),
                      .finish(finish)
              );

      reg [11:0]i;
      initial clk = 1;
              always #10 clk=~clk;
             
              initial start = 1;
              always #100 start=~start;
             
              initial begin
                      rst = 0;
                      setpoint = 1000;
                      feedback = 0;
                     
                      #1000 rst = 1;
                     
                      for(i=0;i&lt;=2500;i=i+1)
                      #21 feedback=feedback+1;               
                 #20000 $stop;
              end
      endmodule
      展开∨
  • 入门的新手需要如何打基础
    ?????????????
    展开∨
    入门,最简单高效的方法就是跟着手把手的教程练习,在练习的过程中会遇到很多问题,解决这些问题的过程就是进步的过程。另外,掌握正确的学习方法非常重要。个人认为新手学习FPGA,必须重视以下几点:
    1、坚持,勤奋。必须坚持且投入足够的精力和时间。
    2、科学。跟着科学的学习和开发方式走,不要选错了参考。只有方向对,才能走得远,比如,常见的最大误区就是轻松仿真验证。
    3、敢于提问。当前网络技术这么发达,遇到问题就敢于提出自己的疑问,虚心接受别人的指正。高手往往都是很傲娇的,在回答你问题的时候,如果说的话不好听,也不要放在心上。
  • 我也想学
    展开∨
    一起学习,共同进步
  • 使用Microblaze有什么好处和坏处?
    本人是新手哈,刚刚接触FPGA不到两周,本身也不是电子专业的,在痛苦地学习了Verilog之后发现,咦~~~,有个叫microblaze的东西,在上面可以直接跑C程。那么通过它跑C程和直接用Verilog程序去实现同一个功能,两者各有什么优势和劣势呢?针对我现在做的一个机器人项目(就是处理一些传感器如雷达、摄像机、陀螺仪等等采集的信号,然后控制步进电机),哪一种更好呢?谢谢大神。
    展开∨
    MicroBlaze是处理器,能够执行C语言程序,Verilog是硬件逻辑。单独用两者之一都可能存在一定的局限性,两者协调使用,软硬结合,才能得到即灵活又高效的设计。你的项目,建议核心部分用Verilog硬件实现,系统的调度方面用MicroBlaze来做
  • FPGA如何快速入门
    有DSP基础但是不知道怎么才能快速入门FPGA,网上这么多资料和视频,不知道哪个才是对我这个初学者是最好的,老师求指导,用哪本书比较好
    展开∨
    学习靠一本书是很难学会的,语法书要有一本,先全部概览一遍,以知道究竟有哪些语法,能实现那样的功能,然后具体在设计的时候,可能还要回去再翻阅。网络上教学视频很多,水平参差不齐,建议你根据大家的评价来选择,毕竟网络这个公开的平台,谁都可以录几集视频教程放上来,至于水平如何,作者本身本身是否过硬,都是需要考虑的因素。所以,建议选一到两个网上评价一致都很好的跟着学习,其他的没有什么好评价的就直接略过吧。
  • 关于教材和工具的选择问题
    老师好,我希望了解到ISE或者Quartus的软件使用方面的教材。目前手中的这本书只是给出代码、testbench、仿真结果和一部分综合结果,但是对于如何在软件中进行实际操作没给出来。我自己只会一些ISE基本的综合和仿真的操作,希望能了解一些结合ISE软件的适合新手的书
    展开∨
    我们提供了有相关的教学视频,讲解如何编写testbench,如何操作仿真。详见http://t.elecfans***/456.html
  • 展开∨
12下一页

本期嘉宾

梅雪松

武汉芯路恒科技有限公司  资深FPGA讲师

+ 关注他 取消关注 已关注 683 人已关注

小梅哥,本名梅雪松,武汉芯路恒科技有限公司创始人,发烧友学院首批入驻讲师,聚丰众筹平台首个众筹项目发起人,电子发烧友论坛FPGA板块版主。

小梅哥主要进行FPGA、SOPC、SOC FPGA相关的视频课程讲解录制、文档教程编写、应用代码开发。热爱技术,以开发为乐趣,代表作有20讲《FPGA设计思想与验证方法》视频教程、60讲《2017年实地培训班实录》视频课程、70讲《小梅哥FPGA入门到实战特训》视频课程、17讲《小梅哥时序分析和时序约束实战》视频课程,编著有《FPGA自学笔记——设计与验证》、《SOC FPGA嵌入式设计和开发教程》两本出版书籍,并多次赴高校对师生进行FPGA、SOC FPGA技术的课程培训,其生动的

更多专家问答

热心回答者

关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表