cxhy 发表于 2013-11-27 21:58:00

发个帖子监督我自己学习FPGA

      最近开始学习FPGA,看看论坛里面关于FPGA的资料也不多。所以,一来,想借论坛里面大家监督自己。二来也可以为论坛做点微不足道的贡献。总之,希望自己能坚持下去吧                        PS虽然楼主脸皮厚,但是还是希望各位高手轻喷啊

    废话少说,这几天的学习,使我对FPGA有了一个大致的了解,也成功的烧写了一个流水灯程序。使用的是verilog语言,感觉FPGA的主要特点是比较简练,而且偏硬件化。
整理一下:        FPGA内部是由大量的独立的逻辑单元和寄存器组成的,verilog语言的功能在于是各个逻辑单元组成一个结构化的单元电路。着重学习了verilog语法。veriog的语法是基于模块化的编程,而模块化的编程语言直接对应相应的硬件连接。格式如下:
module    test(a,b,c,d)
input a,b;
output c,d;

assign c = a|b;
assign d = a&b;

endmodule


其他的我想还是一点一点的记录的我的各种问题吧

bailangcn 发表于 2013-11-27 21:59:56

我想知道撸主什么学历,不是我看重学历,而是没好的学历 FPGA出来找不到工作啊

cxhy 发表于 2013-11-27 22:06:25

本帖最后由 cxhy 于 2013-11-27 22:09 编辑

bailangcn 发表于 2013-11-27 21:59
我想知道撸主什么学历,不是我看重学历,而是没好的学历 FPGA出来找不到工作啊 ...

还在上大三,普通的一本。请问有什么指教的么?

cxhy 发表于 2013-11-27 22:09:21

module led_timing(
    //--reset & clock--
    rst_n       ,                //active low, KEY 4
    clk         ,                //50MHz
    //--input signal--
    key_1         ,//active low
    //--output signal--
    led_1                    //active high
);

//------------------------------------------------------------------------------
//Interface
//------------------------------------------------------------------------------
//--reset & clock--
input         rst_n ;                //active low, KEY 4
input         clk   ;                //50MHz
//--input signal--
input         key_1 ;                //button, active low
//--output signal--
output          led_1 ;                //active high
//ouput ports
reg             led_1;

//interanl signala

//------------------------------------------------------------------------------
//Code
//------------------------------------------------------------------------------

//control the led_1
always @(posedge clk or negedge rst_n)
begin
    if (rst_n==1'b0) begin
      led_1 <= 1'h0;        //off
    end
    //when key is pushed
    else if(key_1==1'b0)begin
      led_1 <= 1'b1;        //on
    end
    //when key is not pushed
    else if(key_1==1'b1)begin
      led_1 <= 1'b0;        //off
    end
end

endmodule
先上一段代码,在编译的时候遇到一个问题。Error:Top-level design entity "led_timing"is undefined Err。进过百度后找到下面一段文字。

地址在这http://blog.csdn.net/wang27177199/article/details/7016884

Quartus II的常见错误分析

Error:Top-level design entity "XXX"is undefined Err

顶层实体没有定义!最好把你的工程名和实体名(module后面的名字)设为同一个即可,刚入门的时候,都有这样的经历。

菜单Assignments -> Settings...

打开后点击第一个General选项里,在Top-level entity标签指示下的编辑框里输入你的VHDL文本里的实体名字就OK了。例如:

entity mux2 is

port

(

a, b, en : in bit;

c : out bit

);

end mux2;

那么实体名字就是 mux2,你填这个进去就可以了。


Error (10110): Verilog HDL error at XXXXXX.v(19): variable"XXX" has mixed blocking and nonblocking Procedural Assignments --must be all blocking or all nonblocking assignments

在时序逻辑电路中,要使用非阻塞赋值<=。



Error: Can't compile duplicate declarationsof entity "LED" into library "work"

Error:Instance could be entity "LED" in file LED.bdf

Error:Instance could be entity "LED" in file LED.v

证实了错误原因就是重名文件做怪。

注意:同一个文件名只能代表一个模块,即 *.v文件和 *.bdf文件等不同扩展名的文件只能代表同一个模块,如果建立了其中一个改扩展名的文件就不能建立统一名称的其他扩展名的文件。


Error: Can't continue timing simulation because delay annotationinformation for design is missing

即要对工程进行时序仿真时未编译工程,导致报错

解决办法:ACTION:Successfully run the Timing Analyzer or Fitterbefore running timing simulation.即时序仿真之前先编译工程。


Warning (10230): Verilog HDL assignment warning at lcd1602.v(211): truncated value with size 32 to match size of target (6)

因为没有指定位宽,所以系统提示默认为32位所以你将out <= out + 1 改为out <= out + 1'b1 就可以了。


Warning: Output pins are stuck at VCC or GND

这个的意思是您的这几个输出管脚直接接地了(意思是它们的值一直都是0)。当然如果这符合您的设计要求这种警告可以不管。

51EDA技术 发表于 2013-11-27 22:11:33

坛子里面 FPGA方面的资料也够多了吧。                                                                                                            

cxhy 发表于 2013-11-27 22:15:39

51EDA技术 发表于 2013-11-27 22:11
坛子里面 FPGA方面的资料也够多了吧。                                                                  ...

感觉就入门的方面毕竟少一点,不想STM32那么普遍罢了,写的比较好的我觉得就是McuPlayer大哥写的那个一周入门的了

Achilics 发表于 2013-11-27 22:23:19

fpga我也学了一点,感觉像单片机一样去学fpga并不是一个很好的选择,毕竟fpga还是应该从硬件的角度去思考才是它本身的优势

cxhy 发表于 2013-11-27 22:25:48

Achilics 发表于 2013-11-27 22:23
fpga我也学了一点,感觉像单片机一样去学fpga并不是一个很好的选择,毕竟fpga还是应该从硬件的角度去思考才 ...

能详细的说一说么?应该从那些角度着重硬件方面的学习?

Achilics 发表于 2013-11-27 22:27:45

cxhy 发表于 2013-11-27 22:25
能详细的说一说么?应该从那些角度着重硬件方面的学习?

我也初学fpga,并不能给你多少建议,你可以在分论坛看看,有很多大神的

guer 发表于 2013-11-28 08:33:34

初中毕业的我也在学习FPGA{:lol:}

Fourier00 发表于 2013-11-28 22:32:09

还是自己先搞个小项目学的快

书生 发表于 2013-11-29 14:34:08

我也是正在学FPGA...一起交流一起进步.......

cxhy 发表于 2013-11-29 17:06:17

再发一点近期学到的:
首先,initial函数一般用于仿真,不能用于形成电路。
第二,posedge 与negedge 分辨用于上升沿和下降沿触发条件。

cxhy 发表于 2013-11-29 22:39:58

always @(*)的使用
当编写敏感列表时变量很多,有时候会漏掉一个变量。
使用always @(*)可以包含所有输入变量进入敏感列表。
eg:
always @(*)
begin
    out1 = a ? (b+c) : (d+e);
    out2 = f ? (g+h) : (p+m);
end

cxhy 发表于 2013-11-30 11:16:11

gn连续赋值语句之中;另外,function定义中声明的所有局部变量寄存器都是静态的,即function中的局部寄存器在function的多个调用之间保持他们的值。



  任务(task)类似于一般编程语言中的Process(过程),它可以从描述的不同位置执行共同的代码。通常把需要共用的代码段定义为task,然后通过task调用来使用它。在task中还可以调用其他的task和function。

  task的定义

  task<任务名>;

    端口与类型说明;

    变量声明;

    语句1;

    。。。

    语句n;

  endtask

  在定义一个task时,必须注意以下几点:

  (1):任务定义结构不能出现在任何一个过程块内;

  (2):一个task可以没有输入/输出端口,当然也可以有;

  (3):一个task可以没有返回值,也可以通过输出端口或双向端口返回一个或多个值;

  (4):除任务参数外,task还能够引用说明任务的模块中定义的任何变量;

  task的调用:

  task调用语句给出传入任务的参数值和接收结果的变量值,

    <任务名>(端口1,端口2,... ,端口n);

  在调用task时,必须注意一下几点:

  (1):task调用是过程性语句,因此只能出现在always过程块和initial过程块中,调用task的输入与输出参数必须是寄存器类型的;

  (2):task调用语句中的列表必须与任务定义时的输入、输出和双向端口参数说明的顺序相匹配。

  (3):在调用task时,参数要按值传递,而不能按地址传递(和其他语言的不同);

  (4):在一个task中,可也直接访问上一级调用模块中的任何寄存器;

  (5):可以使用循环中断控制语句disable来中断任务执行,在task被中断后,程序流程将返回到调用task调用的地方继续向下执行。



  task和function的不同点:

  (1):function只能与主模块共用一个仿真时间单位,而task可以定义自己的仿真时间单位;

  (2):function不能调用任务,而task可以调用函数;

  (3):function至少需要一个输入变量,而task可以没有或者有很多个任意类型的变量;

  (4):function返回一个值,而task则不返回值;

蓝色风暴@FPGA 发表于 2013-11-30 11:26:26

顶楼主,加油      

cxhy 发表于 2013-11-30 22:09:04

蓝色风暴@FPGA 发表于 2013-11-30 11:26
顶楼主,加油

谢谢支持啊,我自制力有点差,所以希望大家监督我

cxhy 发表于 2013-12-1 12:35:25

阻塞和非阻塞
关于这个McuPlayer大哥在61楼说的很好了,我再补充一点自己小小的理解啊。
对于一个D触发器,我们用如下的方式实现:
module d_flip_flop(q3, d, clk);
output q3;
input d;
input clk;
reg q3, q2, q1;
always @(posedge clk) begin
q1 = d;
q2 = q1;
q3 = q2;
end
endmodule
RTL图如捕获.png

如果把上面的代码改为

module d_flip_flop(q3, d, clk);
output q3;
input d;
input clk;
reg q3, q2, q1;
always @(posedge clk) begin
q1 <= d;
q2 <=q1;
q3 <= q2;
end
endmodule

RTL图如捕获2.png


相信如果有什么不理解的,看了这两个例子也一定豁然开朗了吧。反正我有这样的感觉。

顺便再加一段:

module d_flip_flop (q3, d, clk);
output q3;
input d;
input clk;
reg q3, q2, q1;
always @(posedge clk) begin
q3 = q2;
q2 = q1;
q1 = d;
end
endmodule

这段代码的RTL电路见捕获3.png

cxhy 发表于 2013-12-1 12:36:41

纯理论的解释,很多书本都说的很好,我在这里只是贴出我感觉比较深刻的地方。拿本贴自学的,对不住了啊

cxhy 发表于 2013-12-6 14:24:51

上传一个数码管的例程,我自己加了注释。虽然很简单,但是使我第一次接触到的比较正规(汗颜了)的项目了,多钻研了几天。

cxhy 发表于 2013-12-6 14:26:44

在这个例子中,我觉得比较重要的是对于工程代码的综合,还有将几个模块做到一个项目里面。也有固定的格式和语法,再上传一个数码管例程,供大家参考一下

bad_fpga 发表于 2013-12-6 23:06:41

监督楼主工作!

xivisi 发表于 2013-12-7 08:12:13

目测不了了之

cxhy 发表于 2013-12-8 20:12:57

感谢各位对我的监督,近期我的确有点偷懒。另一方面,我不知道怎么把我看到的写出来。就像之前研究了一下那个数码管的代码。读的很仔细。看完之后感觉收获也有一点。但是让我说出来,总觉得不知道怎么写。最近开始整仿真,那种东西也是要亲自去实践,但是写出来又显得太零碎的东西。还有,自己真的有点懈怠了。再次感谢xivisi 和 bad_fpga的监督。话不多说。上传一份花积分从pudn上下载的FPGA例程一份。回报各位监督我的兄弟。

cxhy 发表于 2013-12-8 20:16:27

哎呀我去,忘了上传了

cxhy 发表于 2013-12-8 20:19:21

开始玩Modelsim 仿真,碰到一个真正的入门级资料,大家过过目,写的很浅显,但是很详细。看过这个再去看那些仿真书籍就感觉好多了。高手就略过这个文档吧

cxhy 发表于 2013-12-9 20:13:45

楼主要期末考试了,且缓缓吧。

pat1006 发表于 2013-12-9 21:03:45

真心想学的话就不需要人监督了,呵呵。

guozs1984 发表于 2013-12-10 22:33:45

入门开始学习。
我得先买个板子

dspsharc 发表于 2013-12-13 15:19:13

收1莫元,凑够300莫元,送人去了

CMika 发表于 2014-11-8 20:11:42

楼主现在什么水平了

NJ8888 发表于 2014-11-8 21:16:04

快一年前的贴杯挖了上来{:lol:}

Ryan 发表于 2014-11-8 21:55:45

什么开发板?

fs2011 发表于 2014-11-8 22:50:10

挖坟啦{:lol:}

CMika 发表于 2014-11-8 23:40:10

做个调查而已      看了楼主的帖子应该是学习fpga比较成功的   可惜样本太少

roc. 发表于 2014-11-8 23:45:38

怎么没见LZ回成果帖

jiwx2011 发表于 2014-11-8 23:57:24

想学,就好好的买块板子慢慢折腾

cxhy 发表于 2014-11-9 08:42:17

roc. 发表于 2014-11-8 23:45
怎么没见LZ回成果帖

还不是为了多水点莫元,都另外发帖子了,,,

cxhy 发表于 2014-11-9 08:44:08

CMika 发表于 2014-11-8 23:40
做个调查而已      看了楼主的帖子应该是学习fpga比较成功的   可惜样本太少 ...

我身边也有其他人学的好的,只是没有阿莫的账号而已。
页: [1]
查看完整版本: 发个帖子监督我自己学习FPGA