发 帖  
FPGA技术的学习方法
2017-1-11 13:58:34  81192
分享
请问我是个普通二本,学习FPGA可以吗?
是否FPGA一定要研究生,或者名牌大学
2017-2-13 13:58:26 1 评论

举报

1 条评论
  • 小梅哥 2017-2-14 12:35

    我本人是普通二本学校毕业。个人观点,学习和使用fpga,谁都可以,放眼应用的话,由于FPGA偏向高端,就业面相对较窄,因此企业在人才选择上更偏向较高学历的人才。普通学校的学生要想学好FPGA并能够获得企业认可,往往需要付出更多的时间和精力。

请小梅哥推荐,如何有效学习和选择什么样的开发板?
2017-2-14 11:54:04 2 评论

举报

2 条评论
  • 小梅哥 2017-2-14 12:41

    个人观点,开发板不等于学习板,你问的是容易上手的开发板,实际上应该是选择容易上手的学习板。开发板主要面向企业客户和高校项目,因此配置上一般较高,做工也很好,但是往往配套的资料并不十分详细,仅实现了功能的验证。而教学板则侧重教学内容的配套,如视频教程,文档教程,对于初学,最好是有step by step的教程,这样才能少走弯路。所以,如果是入门学习,建议选择配套资料好,有后期教学指导的板卡和团队,如果是有基础,希望进行项目开发,则建议选择大厂的品牌开发板。

    ben111 回复 小梅哥: 2017-2-22 11:35

    谢谢 。小梅哥答复

请问下小梅哥,FPGA工程师在市场上的的核心竞争力是什么?
3 条评论
  • 小梅哥 2017-2-14 18:17

    这个问题,并不知道如何回答。如果说FPGA工程师自身的核心竞争力,那应该是独立完成项目的能力。能够自己编码,能够自己验证设计,调试设计,毕竟FPGA不像嵌入式那样,可以很方便的移植各种代码。如果说FPGA工程师薪资比其他高,应该是“物以稀为贵”吧。不过电子这个行业飞速发展,无论做嵌入式软件开发还是FPGA,个人认为,自身的核心竞争力应该是学以致用,能够主动学习,并将学到的内容转化为成果。

    elecfansLily 回复 小梅哥: 2017-2-14 19:18

    不错

  • reallmy 2017-2-18 10:45

    个人感觉两个方面
    1. 解决bug的能力,或者说你的调试能力;
    2. 算法,fpga只是工具,但是会算法的工程师就不一样了!

你好,能否请教一个问题,基于NI C rio的FPGA的优点是?
我之前一直用的ni的compact daq,最近因为新设备选型而稍稍了解了一点compact rio的东西,但是对fpga没什么了解。看了ni官网资料后,我知道基于labview和ni的硬件,开发fpga应用会比一般fpga开发要快,但不明白都是ni的平台,fpga比其他现成的采集卡加电脑的配置的优势。是定制后更快的响应更小的体积功耗和更低的单价么?谢谢。
2017-2-14 19:48:59 1 评论

举报

1 条评论
  • 小梅哥 2017-2-16 15:51

    对于NI的这个方案,我本身接触的不多,不过根据业内的技术交流,发现90%以上的FPGA工程师都还是使用的传统的FPGA开发方式,即在厂家提供的软件中使用HDL语言进行开发。这才是主流,才能够更加灵活的设计各种项目,使用NI的解决方案,在某些适合的领域可能非常高效,但是推广到其他就不那么容易了。因此视个人实际使用领域而定

在做FPGA设计时,常遇到无法综合或者没能按预期在开发板上正常工作,原因往往不明,一个是文件太多了。二是这些文件还可能是其他人写的,小梅哥遇到这样的问题是如何找到并解决这样的设计错误呢?
2017-2-15 14:25:07 1 评论

举报

1 条评论
  • 小梅哥 2017-2-23 19:45

    实在抱歉,之前一直以为该问题回答了,可能由于某些原因,系统没有显示出来,我这里再简单回答下。
    如果团队做FPGA设计,那么肯定是明确分工,在一开始就设计好了模块间接口,然后每个模块单独的都是经过测试验证,能够实现功能,再集成到一起。所以你遇到这个问题的原因,是因为没有做好这两点,即合理划分模块和单独验证。关于使用其他人写的文件,如果是个合格的工程师,必然提供有testbench和接口文件,如果没有,那就不是合格的fpga开发者。

Verilog 中定义信号为什么要区分 wire 和 reg 两种类型呢?
2017-2-17 10:50:17 2 评论

举报

2 条评论
  • 小梅哥 2017-2-21 11:29

    在FPGA中器件中,最基本的结构是布线资源和D触发器资源,这两类资源在数字电路中就是wire和reg的意思。Verilog在设计语法的时候,就按照这个思路来了。用户理解的时候,就理解为wire是信号间的连线,仅仅是连线。reg是带存储功能的信号。

  • 小梅哥 2017-2-21 11:30

    在FPGA中器件中,最基本的结构是布线资源和D触发器资源,这两类资源在数字电路中就是wire和reg的意思。Verilog在设计语法的时候,就按照这个思路来了。用户理解的时候,就理解为wire是信号间的连线,仅仅是连线。reg是带存储功能的信号。

学了一段时间的FPGA,还是感觉有点迷茫,感觉学得有点杂,希望能给我一些宝贵的建议,谢谢。
2017-2-17 11:41:56 1 评论

举报

1 条评论
  • 小梅哥 2017-2-21 18:03

    本人对通信领域的FPGA应用不是很了解,不过通信领域一般用的比较多的是数字信号处理,目前网上有相关教材讲解的还不错,建议跟着教材进行学习。

各模块中用多个模块来做逻辑(不是接异步FIFO等),是不是会导致时序变差,系统不稳定?
2017-2-17 11:42:34 1 评论

举报

1 条评论
  • 小梅哥 2017-2-21 18:05

    只要同步于同一个全局时钟,是不会有大的影响的,能用使能时钟,就不要用门控时钟,以此减少跨时钟域数据传输的情况。

请问梅哥是否对Arty z7 和OpenFPGAduino这类开源创客型FPGA产品感兴趣,能不能对fpga的开源创客 的未来和对中国FPGA教育的影响说出您的看法。
2017-2-17 13:17:38 1 评论

举报

1 条评论
  • 小梅哥 2017-2-21 18:09

    个人观点:FPGA做开源创客型产品并不具有很大优势。ARM Linux能做开源创客型产品是因为提供了一个非常成熟的开发平台,用户只需要会C语言或者其他高级编程语言,就能设计出想要的功能。而FPGA技术相对于软件编程来说,本身就复杂的多,实现相同的功能,FPGA的开发周期是嵌入式软件方式的5到10倍。所以,在没有更加高级的开发方式出现之前,个人暂不看好FPGA开源创客的前景

您好,我是一个在读研究生,本科的时候做过一些FPGA的小项目,毕业设计也与FPGA有关,现在想深入学习FPGA,该怎么样继续呢,没有人指导可以么?
2017-2-20 09:26:53 3 评论

举报

3 条评论
  • 小梅哥 2017-2-21 18:02

    在教材教材足够系统细致的情况下,自学是没有问题的。如果有指导,能节约宝贵的时间,在关键的时候,能指出个人的一些误区,对学习效率和学习信心是有益处的。FPGA本身来说并非那么容易掌握。要想深入,首先证明你自己已经具备独立的开发能力了。不是改几行别人的代码,下载到板子上能出现象就说明已经掌握了。有个成语叫“水到渠成”。你目前不知如何深入,是因为你的基本功都不扎实,一旦真正的学会了,你就有一种想要使用FPGA实现自己心中各种所想的冲动。预知如何深入,还是得靠企业的具体实用性项目来历练。但是,能够深入企业进行历练的前提,还是基本功练的扎实

    珍珍624 回复 小梅哥: 2017-2-21 20:56

    首先谢谢您的回复,我顺便还想问一句,基本功有哪些呢?以前学的都比较杂,所以想系统的和您了解一下,谢谢!

    Hy1924 回复 小梅哥: 2018-8-2 13:59

    请问小梅哥,何为教材足够系统细致,能否推荐一下

老师您好!我现在初学FPGA,请问您对FPGA就业方向有哪些理解?能否对比分析就业前景?因为FPGA相关的学习知识太多,确定了方向才能更好地专注于自己要学习的内容
1 条评论
  • 小梅哥 2017-2-23 19:45

    在教材教材足够系统细致的情况下,自学是没有问题的。如果有指导,能节约宝贵的时间,在关键的时候,能指出个人的一些误区,对学习效率和学习信心是有益处的。FPGA本身来说并非那么容易掌握。要想深入,首先证明你自己已经具备独立的开发能力了。不是改几行别人的代码,下载到板子上能出现象就说明已经掌握了。有个成语叫“水到渠成”。你目前不知如何深入,是因为你的基本功都不扎实,一旦真正的学会了,你就有一种想要使用FPGA实现自己心中各种所想的冲动。预知如何深入,还是得靠企业的具体实用性项目来历练。但是,能够深入企业进行历练的前提,还是基本功练的扎实

亲爱的专家:您们好!
问题如题。如果已经玩了CPLD-EPX240T100这款开发板,那么再起步采用那类的FPGA更好。希望是Altera的系列,价位又比较合理为好。希望是,可以在上边试运行:TFTLCD带触摸屏的控制+外接RAM;可以实现简单图像采集处理成为色斑状图[简化特征图]进行识别处理;实现8~10位高速ADC,实现驱动TFTLCD作为手持示波器和检测频率计。
如果您们觉得目标要求可以实现[时间没有限制],推荐1款开发板和对应的芯片,谢谢
2017-2-21 19:55:52 2 评论

举报

2 条评论
  • 小梅哥 2017-2-23 19:40

    能够驱动TFTLCD,并实现识别的简单的识别处理,这个其实任意一款FPGA器件都可以,只分开发板厂家是否做了相应的接口,高速ADC的采样率如果低于100M,可以使用标准的2.54接口扩展,因此问题也不是很大。就是不知你需要的图像处理速度。可以参看我们的AC620开发板或者AC6102开发板,这两款都对TFTLCD有非常好的支持。

    zhjb1 回复 小梅哥: 2017-3-1 06:59

    谢谢老师

我以前也是做fpga的,后来感觉周围人做arm嵌入式,或者做安卓java开发的人很多,而做fpga的很少,所以我感觉是不是做这个东西技术方向很窄,做下去没前途?
2017-2-22 14:56:56 1 评论

举报

1 条评论
  • 小梅哥 2017-2-23 19:36

    FPGA本身应用领域就小的多,因此市场小,就业面窄是肯定的,但是这并不代表着FPGA的技术人员就过剩了,恰恰相反,虽然当前FPGA的就业面不如ARM嵌入式,但是真正高水平的FPGA开发人员仍旧是相当紧缺。在入门和高水平的开发人员之间,有很远的路要走。

`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
3 条评论
  • 小梅哥 2017-2-23 19:32

    就像我在讲课的时候的的那句话,没有仿真波形,没有testbench,不要来问问题。这是仿真验证都没有,难倒让其他人帮你写testbench么?

    行者无疆2017 回复 小梅哥: 2017-2-23 20:51

    不好意思,我写了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

    行者无疆2017 回复 行者无疆2017: 2017-2-23 20:52

    仿真脚本:
    `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

?????????????
2017-2-23 18:34:45 1 评论

举报

1 条评论
  • 小梅哥 2017-2-23 19:30

    入门,最简单高效的方法就是跟着手把手的教程练习,在练习的过程中会遇到很多问题,解决这些问题的过程就是进步的过程。另外,掌握正确的学习方法非常重要。个人认为新手学习FPGA,必须重视以下几点:
    1、坚持,勤奋。必须坚持且投入足够的精力和时间。
    2、科学。跟着科学的学习和开发方式走,不要选错了参考。只有方向对,才能走得远,比如,常见的最大误区就是轻松仿真验证。
    3、敢于提问。当前网络技术这么发达,遇到问题就敢于提出自己的疑问,虚心接受别人的指正。高手往往都是很傲娇的,在回答你问题的时候,如果说的话不好听,也不要放在心上。

我也想学
1 条评论
本人是新手哈,刚刚接触FPGA不到两周,本身也不是电子专业的,在痛苦地学习了Verilog之后发现,咦~~~,有个叫microblaze的东西,在上面可以直接跑C程。那么通过它跑C程和直接用Verilog程序去实现同一个功能,两者各有什么优势和劣势呢?针对我现在做的一个机器人项目(就是处理一些传感器如雷达、摄像机、陀螺仪等等采集的信号,然后控制步进电机),哪一种更好呢?谢谢大神。
1 条评论
  • 小梅哥 2017-3-1 10:09

    MicroBlaze是处理器,能够执行C语言程序,Verilog是硬件逻辑。单独用两者之一都可能存在一定的局限性,两者协调使用,软硬结合,才能得到即灵活又高效的设计。你的项目,建议核心部分用Verilog硬件实现,系统的调度方面用MicroBlaze来做

有DSP基础但是不知道怎么才能快速入门FPGA,网上这么多资料和视频,不知道哪个才是对我这个初学者是最好的,老师求指导,用哪本书比较好
2017-2-26 14:43:06 1 评论

举报

1 条评论
  • 小梅哥 2017-3-1 10:12

    学习靠一本书是很难学会的,语法书要有一本,先全部概览一遍,以知道究竟有哪些语法,能实现那样的功能,然后具体在设计的时候,可能还要回去再翻阅。网络上教学视频很多,水平参差不齐,建议你根据大家的评价来选择,毕竟网络这个公开的平台,谁都可以录几集视频教程放上来,至于水平如何,作者本身本身是否过硬,都是需要考虑的因素。所以,建议选一到两个网上评价一致都很好的跟着学习,其他的没有什么好评价的就直接略过吧。

老师好,我希望了解到ISE或者Quartus的软件使用方面的教材。目前手中的这本书只是给出代码、testbench、仿真结果和一部分综合结果,但是对于如何在软件中进行实际操作没给出来。我自己只会一些ISE基本的综合和仿真的操作,希望能了解一些结合ISE软件的适合新手的书
2017-2-26 21:30:59 2 评论

举报

2 条评论

只有小组成员才能发言,加入小组>>

12下一页

12个成员聚集在这个小组

加入小组

创建小组步骤

关闭

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

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