fpga经验总结(精华)

合集下载

FPGA经验之谈汇总

FPGA经验之谈汇总

FPGA经验之谈汇总FPGA设计要点之一:时钟树对于FPGA来说,要尽可能避免异步设计,尽可能采用同步设计。

同步设计的第一个关键,也是关键中的关键,就是时钟树。

一个糟糕的时钟树,对FPGA设计来说,是一场无法弥补的灾难,是一个没有打好地基的大楼,崩溃是必然的。

具体一些的设计细则:1)尽可能采用单一时钟;2)如果有多个时钟域,一定要仔细划分,千万小心;3)跨时钟域的信号一定要做同步处理。

对于控制信号,可以采用双采样;对于数据信号,可以采用异步fifo。

需要注意的是,异步fifo 不是万能的,一个异步fifo也只能解决一定范围内的频差问题。

4)尽可能将FPGA内部的PLL、DLL利用起来,这会给你的设计带来大量的好处。

5)对于特殊的IO接口,需要仔细计算Tsu、Tco、Th,并利用PLL、DLL、DDIO、管脚可设置的delay等多种工具来实现。

简单对管脚进行Tsu、Tco、Th的约束往往是不行的。

FPGA设计要点之二:FSM关于上期的时钟树,可能说的不是很确切。

这里的时钟树实际上泛指时钟方案,主要是时钟域和PLL等的规划,一般情况下不牵扯到走线时延的详细计算(一般都走全局时钟网络和局部时钟网络,时延固定),和ASIC中的时钟树不一样。

对于ASIC,就必须对时钟网络的设计、布线、时延计算进行仔细的分析计算才行。

FSM:有限状态机。

这个可以说时逻辑设计的基础。

几乎稍微大一点的逻辑设计,几乎都能看得到FSM。

FSM分为moore型和merly型,moore型的状态迁移和变量无关,merly型则有关。

实际使用中大部分都采用merly型。

FSM通常有2种写法:单进程、双进程。

初学者往往喜欢单进程写法,格式如下:always @( posedge clk or posedge rst )beginif ( rst == 1'b1 )FSM_status <= ......;elsecase ( FSM_status )......;endcaseend简单的说,单进程FSM就是把所有的同步、异步处理都放入一个always中。

FPGA学习总结

FPGA学习总结

FPGA学习总结FPGA(现场可编程门阵列)是一种数字电路开发和实现的工具,它提供了一种灵活的方式来设计和实现各种数字电路。

在我的FPGA学习过程中,我经历了以下几个方面的学习和实践:1.FPGA基础知识:在学习FPGA之前,我首先了解了FPGA的基本概念和原理。

我学习了FPGA的架构、时序和时钟设计、数字电路设计和综合等方面的知识。

这些基础知识为我深入学习和实践FPGA打下了坚实的基础。

2. FPGA开发工具的使用:我使用了常见的FPGA开发工具,如Vivado和Quartus。

这些工具提供了一种直观而强大的方式来设计和实现FPGA。

我学习了如何创建项目、添加模块、定义信号、综合和布局布线等操作。

通过不断的实践和尝试,我逐渐掌握了这些工具的使用。

3. Verilog和VHDL的学习:Verilog和VHDL是FPGA开发中常用的硬件描述语言。

通过学习这两种语言,我能够使用它们来描述和设计各种数字电路。

我掌握了如何使用这些语言来描述寄存器、组合逻辑、状态机等部件,并能够将它们综合成FPGA可实现的电路。

4.FPGA的应用实践:在学习了FPGA的基础知识和工具使用之后,我开始进行一些实际的应用实践。

我使用FPGA设计和实现了一些简单的电路,如计数器、加法器、乘法器等。

通过实践,我加深了对FPGA的理解,并增强了自己的设计和调试能力。

5.FPGA高级特性的学习:除了基础知识和工具使用外,我还学习了一些FPGA的高级特性,如时序分析、时钟域划分、并行数据传输和高速串行数据传输等。

这些特性在设计和实现一些高性能和复杂的电路时非常重要,我通过学习和实践,学会了如何正确地使用这些特性。

总结起来,FPGA学习是一个既有理论基础又注重实践和应用的过程。

通过学习FPGA,我更好地理解了数字电路的原理和设计,增强了自己的工程能力。

我学会了使用FPGA开发工具,掌握了Verilog和VHDL等硬件描述语言,实践了FPGA的设计和实现,并学习了一些高级特性。

学习FPGA的心得

学习FPGA的心得

学习FPGA的心得一:设计规范:1,文件名必须体现模块的功能2,时钟信号clk和低电平有效的信号(低电平有效*_n) 3,parameter和`define 进行宏定义和定义参数是,名字要大写4,信号,端口,模块,例话(代码最好小写)5,一般字符的命名长度不应超过32个6模块调用实体名的设定 mux4 u_mux4_1(....)7,位宽【x:0】8,begin和end,case和endcase。

的对齐问题9,原理图输入时,当有文本输入和原理图输入时,原理图作为顶层文件,最好采用页面水平分层结构10,阻塞(=)和非阻塞(>=)的问题阻塞计算完立刻赋值,而非阻塞计算后不立刻赋值,而是一起赋值,组合逻辑(阻塞赋值),时序逻辑(非阻塞),既有时序又有组合是使用(非阻塞)11,敏感信号列表(影响模块的输出和状态)12,复位和初始化13,输出设为reg14.verilog中reg与integer的区别首先,integer和 reg与w i r e最大的差別是,integer本身是个32位元的有号数,含正负。

其次,integer消耗的资源也比多。

二:分频器(]frequency divider)Module div_10(clk_50,f_10,rst_n);Input clk_50;Input rst_n;Output f_10;Reg [2:0] cnt;Reg f_10;Always @(posedge clk or negedge rst_n) If(!rstn)Cnt<=3’b0;F_10<=0;ElseBeginIf(cnt==3’b100)beginCnt<=0;F_10<=~f_10;endElseBeginCnt<=cnt+3’b1;endEndEndmodule三:计数器(counter)Module counter(clk,rst_n,s,q,en,d,co); Input clk;Input rst_n;Input en;Input [3:0] d;Output [3:0] q;Output co;Reg co;Reg [3:0] q;Always @(posedge clk or negedge rstn) If(!rst_n)beginq =0;endElseBeginIf(s)Beginq=d;EndElseIf(en)Beginq=q+4’b1;If(q==4’b1111) BeginCo=1;EndElseBeginCo=0;endendelseBeginQ=q;EndEndEndmodule四:D触发器(D_Trigger)Module D_Trigger(clk,rst_n,q,qn,s,d); Input clk,rst_n,s,d;Output q,qn;Reg q,qn;Always @(posedge clk)_If({rst_n,s}==2’b01)beginQ=1’b0;Qn=1’b1;endElseIf({rst_n,s}==2’b10)beginQ=1’b1;Qn=1’b0;endElseIf({rst_n,s}==2’b11)beginQ=d;Qn=~d;EndEndmodule五:三态门( triple gate)Module tri(din,dout,en);Input din,en;Output dout;Assign dout=en?din:’bz; Endmodule六:编码器(encoder)Module 8_3encoder(din,dout);Input [7:0] din;Output [2:0] dout;Reg [2:0] dout;Always @(din)BeginCase(din)8’b0000 0001: dout=3’b000; 8’b0000 0010: dout=3’b001;8’b0000 0100: dout=3’b010; 8’b0000 1000: dout=3’b011; 8’b0001 0000: dout=3’b100;8’b0010 0000: dout=3’b101;8’b0100 0000: dout=3’b110;8’b1000 0001: dout=3’b111;Defult: dout=3’dzzz;EndcaseendEndmodule优先编码器(priority encoder)Module coder_42(in,out);Input [3:0] in;Output [1;0] out;Always @(in)BeginCase(in)4’b1000:out=2’b00;4’bx100:out=2’b01;4’bxx10:out=2’b10;4’bxxx1:out=2’b11;Default:out=2’bx;EndcaseEndendmodule七:译码器(.decoder )A1,A2,A3为三个输入信号,s1,s2‘,s3’为3个使能输入,Y1’Y1‘,Y2’,Y3’,Y4’,Y5’,Y6’,Y7’为8个输出信号;Module 8_3decoder(a,gs1,gs2,gs3,y);Input [2:0] a;Input gs1,gs2,gs3;Out [7:0] y;Reg [7:0] y;Always @(a or gs1 or gs2 or gs3)BeginIf(gs1==1)Y=8’b1111 1111;Else if(gs2===0)Y=8’b1111 1111;Else if(gs3==0)Y =8’b1111 1111;ElseCase(a)3’b000: Y=8’b1111 1110;3’b001: Y=8’b1111 1101;3’b010: Y=8’b1111 1011;3’b011: Y=8’b1111 0111;3’b100: Y=8’b1110 1111;3’b101: Y=8’b1101 1111;3’b110: Y=8’b1011 1111;3’b111: Y=8’b0111 1111;Default: Y=8’b1111 1111;EndcaseEndEndmmodule八,移位寄存器(shift register) 4位异步清零的并入串出移位寄存器Module reg_bc(clk,clr,din,dout); Input clk,clr;Input [7;0] din;Output dout;Reg dout;;Reg [3:0] q;Reg [1:0] cnt;Always @(posedge clk )BeginCnt<=cnt+1;If(clr)BeginQ<=4’b0000;EndElseBeginif(cnt>0)BeginQ[3:1]<=q[2:0];EndElse if(cnt==2’b00)beginQ<=din;endDout<=q[3];EndEndEndmmodule九:数据选择器(multiplexer)Module mux4_1(d1,d2,d3,d4,g,a,y);Input g;Input d0,d1,d2,d3;Input [1:0] a;Output y;Reg y;Always @(a or d0 or d1 or d2 or d3 or g ) BeginIf(g==0)Y=1’b0;;ElseCase(a)2’b00: y=d0;2’b01: y=d1;2’b10: y=d2;2’b11: y=d3;Default: y=1’b0;EndcaseEndEndmodule十.串行加法器(serial adder)Module add_4(a,b,c,ci,co);Input [3:0] a,b;Input ci;Output [3:0] c;Output co;Assign{co,c}=a+b+ci;Endmodule十一.简单运算单元(ALU)11种简单运算逻辑单元,通过选择端来选择运算功能的ALU。

10年FPGA开发经验的工程师肺腑之言

10年FPGA开发经验的工程师肺腑之言

10年FPGA开发经验的工程师肺腑之言从大学时代第一次接触FPGA至今已有10多年的时间。

至今记得当初第一次在EDA实验平台上完成数字秒表,抢答器,密码锁等实验时,那个兴奋劲。

当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus II原理图环境下用74系列逻辑器件搭建起来的。

后来读研究生,工作陆陆续续也用过Quartus II,Foundation,ISE,Libero,并且学习了verilogHDL语言,学习的过程中也慢慢体会到verilog的妙用,原来一小段语言就能完成复杂的原理图设计,而且语言的移植性可操作性比原理图设计强很多。

在学习一门技术之前我们往往从它的编程语言入手,比如学习单片机时,我们往往从汇编或者C语言入门。

所以不少开始接触FPGA的开发人员,往往是从VHDL或者Verilog开始入手学习的。

但我个人认为,若能先结合《数字电路基础》系统学习各种74系列逻辑电路,深刻理解逻辑功能,对于学习HDL 语言大有裨益,往往会起到事半功倍的效果。

当然,任何编程语言的学习都不是一朝一夕的事,经验技巧的积累都是在点滴中完成,FPGA设计也无例外。

下面就以我的切身体会,谈谈FPGA设计的经验技巧。

1)看代码,建模型只有在脑海中建立了一个个逻辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写Verilog和写C整体思路是不一样的,才能理解顺序执行语言和并行执行语言的设计方法上的差异。

在看到一段简单程序的时候应该想到是什么样的功能电路。

例如:上面这段代码实现的功能就是一个带使能端的2选1数据选择器,如下图所示。

再例如:上面这段always实现的是带同步清零端的串并转换移位寄存器,位宽为width,下图为8位电路模型当你具备了一定的识代码能力之后,你会发现原来Verilog不是那么的枯燥,只不过是一个个电路模型的拼搭而已。

2)组合逻辑中的if...else...与case对于多输入端的组合逻辑来说,如果不需要考虑优先级应该尽量采用case语句来描述,这样综合出来的电路并行度要大一些,如果采用if...else...结构,综合出来的电路都是串行的,增大了信号时延路径。

FPGA学习心得体会

FPGA学习心得体会

篇一:fpga学习心得大报告《fpga技术基础》学习报告--课程内容学习心得姓名:学号:年级专业:指导教师:瞿麟 201010401128 自动化101薛小军摘要从开始学fpga到现在粗略算来的话,已经有3个多月了,就目前而言,我并不确定自己算不算高手们所说的入门了,fpga学习总结。

但是不管现在的水平如何,现在就总结一下自己学习它的感受或一些认识吧。

关键词fpga de2板 quartusii软件 verilog语言引言fpga是什么?fpga现状?怎样学习fpga?fpga是现场可编程门阵列的简称,fpga的应用领域最初为通信领域,但目前,随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天、医疗、通讯、网络通讯、安防、广播、汽车电子、工业、消费类市场、测量测试等多个热门领域。

并随着工艺的进步和技术的发展,向更多、更广泛的应用领域扩展。

越来越多的设计也开始以asic转向fpga, fpga正以各种电子产品的形式进入了我们日常生活的各个角落。

正文(1)掌握fpga的编程语言在学习一门技术之前我们往往从它的编程语言开始,如同学习单片机一样,我们从c语言开始入门,当掌握了c语言之后,开发单片机应用程序也就不是什么难事了。

学习fpga也是如此,fpga的编程语言有两种:vhdl和verilog,这两种语言都适合用于fpga的编程。

(2)fpga实验尤为重要除了学习编程语言以外,更重要的是实践,将自己设计的程序能够在真正的fpga里运行起来,这时我们需要选一块板子进行实验,我们选择使用de2板才进行试验。

初识de2开发板de2的资源de2的资源非常丰富,包括1. 核心的fpga芯片-cyclone ii 2c35 f672c6,从名称可以看出,它包含有35千个le,在altera的芯片系列中,不算最多,但也绝对够用。

altera下载控制芯片- epcs16以及usb-blaste对jtag的支持。

fpga岗位工作总结

fpga岗位工作总结

fpga岗位工作总结
FPGA岗位工作总结。

FPGA(Field-Programmable Gate Array)是一种灵活可编程的集成电路,具有
广泛的应用领域,包括数字信号处理、通信、图像处理等。

FPGA工程师在这个领
域扮演着重要的角色,他们负责设计、开发和测试FPGA芯片,以满足各种应用
的需求。

作为一名FPGA工程师,我在过去的工作中积累了丰富的经验和技能。

首先,
我熟练掌握了FPGA设计工具,包括Vivado、Quartus等,能够利用这些工具进行
逻辑设计、综合、布局布线和仿真。

在项目中,我能够根据需求选择合适的FPGA
芯片,并进行设计和验证,确保其性能和可靠性。

其次,我具备良好的Verilog和VHDL编程能力,能够编写高效、可靠的
FPGA代码。

在项目中,我经常与团队成员合作,共同完成FPGA设计和验证工作。

我注重团队合作,能够有效沟通和协调,确保项目进展顺利。

此外,我对FPGA应用领域有深入的了解,能够根据不同的应用需求进行FPGA系统设计和优化。

在数字信号处理领域,我设计了高性能的FPGA算法加速器;在通信领域,我设计了高可靠性的FPGA通信系统。

这些项目经验使我对FPGA应用有更深入的理解,能够为客户提供更好的解决方案。

总的来说,作为一名FPGA工程师,我具备扎实的专业知识和丰富的项目经验,能够胜任FPGA设计和开发工作。

我将继续不断学习和提升自己,为FPGA应用
领域的发展贡献自己的力量。

学习FPGA的几点心得五篇

学习FPGA的几点心得五篇

学习FPGA的几点心得五篇第一篇:学习FPGA的几点心得1、首先要明白的是软件设计和逻辑设计的不同,并理解什么是硬件意识。

软件代码的执行是一个顺序的过程,编绎以后的机器码放在存储器里,等着CPU一条一条的取指并执行;因此软件设计中经常会带有顺序处理的思维。

而逻辑设计则不同,我们设计的是数字电路,它是由很多很多的与非门及D触发器构成的,上电之后所有与非门和D触发器都同时工作,不会因为A触发器的代码描述在B触发器之前A触发器就是先工作,事实上,RTL级代码的代码先后顺序在综合成网表文件后这种顺序就消失了,取代的是基本逻辑电路之间的互联关系描述;因此逻辑设计需要的是一种并发的思维,我们也需要用并发的思维去考虑电路的设计。

当然,我们设计的电路功能一般都有先后顺序的关系,如果这种顺序不能通过代码的先后顺序来实现,那么要怎么完成这一功能呢?在逻辑设计中,我们所说的先后顺序都是基于时间轴来实现:它的承载体就是时序逻辑,也就是那些触发器。

2、其次就是要熟悉基本电路的设计。

基本的电路不是很多,也就是D触发器、计数器、移位寄存器、状态机、多路选择器、译码器等几种,所有复杂的电路都可由这些基本的电路构成。

高手水平高的体现并不是他能写出一些很奇特的电路,相反,水平高是体现在他们总能将复杂的电路用这些很朴素的基本电路去描述。

甚至,你会发现他们的代码基本上是由if...else、case这些语句构成的,朴素的让你觉得奇怪。

初学者在入门的时候,对于基本电路的设计应该固定化、标准化,每种电路该用什么样的代码描述,应该要固定、统一,尽量少一些花哨的东西。

说来这里我举个例子。

以前有几个朋友因为仿真有问题请我帮忙找问题。

他们的代码写的很乱,出现了很多种稀奇古怪的电路,一看头都大了,只好建议他们按照标准的电路重新写下代码。

结果过了半天,他们就和我说问题不见了。

所以,高手们喜欢用简单的代码是有道理的,电路的标准化和规范化可以减少许多稀奇古怪的问题,问题少了他们也就能在别人加班的时候回家多睡回觉,呵呵。

FPGA设计的重要规范和经验精华

FPGA设计的重要规范和经验精华

从大学时代第一次接触FPGA至今已有10多年的时间。

至今记得当初第一次在EDA实验平台上完成数字秒表,抢答器,密码锁等实验时,那个兴奋劲。

当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus II原理图环境下用74系列逻辑器件搭建起来的。

后来读研究生,工作陆陆续续也用过Quartus II,Foundation,ISE,Libero,并且学习了verilogHDL语言,学习的过程中也慢慢体会到verilog的妙用,原来一小段语言就能完成复杂的原理图设计,而且语言的移植性可操作性比原理图设计强很多。

工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。

逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。

在逻辑方面,我觉得比较重要的规范有这些:1.设计必须文档化。

要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。

这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。

2.代码规范。

如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重新例化就行了,从而使得代码更加易于重用。

b.信号命名要规范化。

1)信号名一律小写,参数用大写。

2)对于低电平有效的信号结尾要用_n标记,如rst_n。

3)端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后方便很多。

4)一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个entity。

FPGA学习总结

FPGA学习总结

首先,先说一下自己的在学习中所发现自己的不足之处:
1. 不会总结。

2. 记录警告,分析原因
3. 记录经典代码,算法,以及要注意的细节,重点知识
4.了解FPGA内部逻辑及其工作原理
5.下载不了,这是一个新手经常遇到的问题。

一般来说,大多数人会去检查下载电路的原理图,如果发现和正确的原理图没有区别就没办法了,开始怀疑芯片是不是坏了,焊接是不是有问题,是不是哪里有干扰啊等等。

而有的细心一些的人,就会仔细的看看下载的原理,信号的时序,用示波器看看板上信号的时序,一步一步的找原因。

如果没有找到,就会仔细检查FPGA的电路,从电源设计,到去耦电容摆放等等方面去动手查找原因。

如果觉得那里有问题,就动手改一看看,测一侧有没有改变,而不是坐着想哪里出问题。

可能最后就是芯片坏了,或者没有焊接好,但是后者确在这个过程中学到了很多东西,至少对f pga下载的原理了解的十分清楚。

6.如果电路工作不正常,那么99%的原因是和设计有关的,是可以找到确定的原因的,而不是偶然的,即使是噪声或者干扰。

学FPGA感想(五篇材料)

学FPGA感想(五篇材料)

学FPGA感想(五篇材料)第一篇:学FPGA感想回想起自己学FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所得,希望对初学者有所帮助。

废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段:①、VHDL和Verilog语言的学习,熟悉VHDL和Verilog语言的各种语法。

②、FPGA的学习,熟悉QuartusII软件的各种功能,各种逻辑算法设计,接口模块(RS232,LCD,VGA,SPI,I2c,AD,DA等)的设计,时序分析,硬件优化等,大家可以先从简单的做起,复杂的电路一定要把芯片资料读懂,上面的时序分析一定要看明白,然后才能设计正确驱动。

③、NiosII的学习,熟悉NiosII的开发流程,熟悉开发软件(SOPC,NiosII IDE),了解NiosII的基本结构,编写NiosII C语言程序,调试板子各模块功能。

NiosII软件调试要很费时间,大家要耐的住厌烦,如果对软件不熟悉会出现很多问题,自己遇到问题和解决问题的过程,也就是大家进步的过程,大家可以把NiosII内嵌的各种功能调试一遍,最后再移植C8051、uCOSII操作系统和uCLinux操作系统,估计你已经很熟悉了NiosII了。

先来说说第一个阶段,现在主要的硬件描述语言有VHDL,Verilog两种,现在Verilog用的人越来越多,因为容易上手(与C语言语法比较类似),也更灵活,现在的IC设计基本都用Verilog。

但是VHDL也有自己的优点,VHDL语言设计的程序很长,因为他本身语言比较严谨,在欧美一些国家还是比较喜欢VHDL语言。

所以我希望大家对两种语言应该都比较熟悉。

我们的开发板上都尽量把这两种语言进行完善。

其中关于VHDL语言和Verilog HDL语言资料书很多,如果还没有入门的话,可以买一本相对通俗易懂和简单的书来看,书籍我们在这就不推荐了,因为市面上关于这两种语言的书很多。

fpga学习心得

fpga学习心得

FPGA学习心得学习fpga一个多月以来,完全从零开始学习,感觉自己学到的东西真不少,虽然还不是很熟练,不过也对fpga有了很好的了解。

以前一直没有想过要来总结些什么,是感觉自己对于fpga根本就像是一无所知一样,虽然天天在学,不过确实没有一个总体观念,学的东西太混乱也没有一个总体的框架。

到了今天终于觉得自己的学习已经小有成就了,虽然还是没有能够独立设计的自信。

在最初学习的时候最主要就是对于fpga结构的一个基本认识和对硬件描述语言verilog HDL语言的学习。

之所以选择学习fpga是因为在这一学期找工作中发现,现在很多公司都需要会一点fpga方面的知识,在笔试的时候也会偶尔遇到一些用HDL语言编程的试题。

现在很多硬件工程师已经不再是单纯的用传统的方法进行电路的设计,至少现在很多招聘的岗位当中不再是单纯的电路的设计了,很多都涉及到嵌入式和HDL语言。

Fpga现在正在以异常的速度发展,在08年全球金融危机的时候大多数行业都呈现在下滑的趋势,而fpga的厂商如xilinx和altera等公司的收入却呈现出增长的态势。

在我看来fpga必将是将来硬件工程师不可缺少的一项本领,这也就是我学习fpga的原因之一。

一、硬件描述语言:对于硬件描述语言(HDL)语言我选择的是和C语言类似的verilog HDL语言,虽然VHDL语言在很多方面优于verilog HDL语言,但是作为初学,还是先学习一个简单一点的语言,尽量先将所需要学习的东西过一遍,将来等时间允许的时候再去学习VHDL语言,在网上有看到现在出来了一个叫system verilog的语言,据说融合了verilog 和VHDL语言各自的优点,可能将来会成为行业统一的语言吧。

verilog HDL现阶段主要接触的就是对组合逻辑电路和时序电路的描述了。

所接触的程序中以always @ (*)模块居多,几乎是所见过模块的核心部分了,其实在学习这个语言上面也没有花太多的时间,因为有对C语言的学习,所以就先入为主了。

FPGA经验总结(精华)

FPGA经验总结(精华)

FPGA/CPLD数字电路设计经验分享摘要:在数字电路的设计中,时序设计是一个系统性能的主要标志,在高层次设计方法中,对时序控制的抽象度也相应提高,因此在设计中较难把握,但在理解RTL电路时序模型的基础上,采用合理的设计方法在设计复杂数字系统是行之有效的,通过许多设计实例证明采用这种方式可以使电路的后仿真通过率大大提高,并且系统的工作频率可以达到一个较高水平。

关键词:FPGA 数字电路时序时延路径建立时间保持时间1 数字电路设计中的几个基本概念:1.1 建立时间和保持时间:建立时间(setup time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被打入触发器;保持时间(hold time)是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被打入触发器。

如图1 。

数据稳定传输必须满足建立和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为零。

PLD/FPGA开发软件可以自动计算两个相关输入的建立和保持时间(如图2)图1 建立时间和保持时间关系图注:在考虑建立保持时间时,应该考虑时钟树向后偏斜的情况,在考虑建立时间时应该考虑时钟树向前偏斜的情况。

在进行后仿真时,最大延迟用来检查建立时间,最小延时用来检查保持时间。

建立时间的约束和时钟周期有关,当系统在高频时钟下无法工作时,降低时钟频率就可以使系统完成工作。

保持时间是一个和时钟周期无关的参数,如果设计不合理,使得布局布线工具无法布出高质量的时钟树,那么无论如何调整时钟频率也无法达到要求,只有对所设计系统作较大改动才有可能正常工作,导致设计效率大大降低。

因此合理的设计系统的时序是提高设计质量的关键。

在可编程器件中,时钟树的偏斜几乎可以不考虑,因此保持时间通常都是满足的。

1.2 FPGA中的竞争和冒险现象信号在FPGA器件内部通过连线和逻辑单元时,都有一定的延时。

FPGA个人学习总结1

FPGA个人学习总结1

FPGA个人学习总结11.综合方面1)经综合后:普通的数据单端输入都会加一个ibuf缓冲器;数据单端输出有个obuf缓存器;时钟输入口会加bufgp缓冲器;对于4选1的mux,if结构和case结构都只需要一个slice,由muxf5控制两个lut下图为8选一case结构,muxf6控制两个muxf5,以两个slices实现8选1,用if结构实现的结构也是一样的注意一点:使用viewtechnologyschematic,来查看最底层的实现形式,即fpga 中的lut、muxf5等使用但有的综合后rtlschematic相同,technoligyschematic不同,而有的又相反(如onebit相加,加括号前后例子),那么我们应该以哪种为最优呢?如下图:图上下分别为加括号前和加括号后rtl:只有根据实际需要来选择,如信号的先后顺序等等2.lut的名字后_数字,那个数字代表什么意思?luta_b:a代表所有输入数据位宽,即输入数据的个数,切勿将位宽理解为“每个输入端口的数据宽度(因每个输入端口是单bit输入);b代表lut被初始化的状态3.比较器位宽大小对综合结构的影响当比较的位宽高于一定位数时,综合会采用进位链结构,如下图:4.在调用dcm核时,clkfx_out为输出引脚,并且locked_out必须勾上,否则波形无法输出,具体步骤参考本文件夹下“dcm核设置”5.如何判断pcb板上的复位芯片是低复位还是高复位?将复位芯片的输出连接至led等,若正常工作后是亮(前提是led另一端是接地),表示正常工作是高,说明之前是低,即为低复位,不亮则为高复位6.两种不同下载接口的比较<具体还可参考项23>1每个fpga都有两组下载接口jtag和spi;○2jtag 中tms为模式选择,tck为时钟,tdi和tdo分别为输入输出数据;○3spi中ss(有的为stb)为片选信号,sck为时钟信号,另外两根为数据信号;○4通过jtag下载程序到fpga:编程管脚跳针要拔掉,掉电后程序也会丢失,即下次上○电工作后需要重新下载程序5通过spi 下载程序到fpga:先将编程引脚prog 接地,○spi接口断开与fpga通信,而与flash通信,程序下载到外挂flash中,然后将prog跳针拔掉,flash中程序下载到fpga中6外部flash 不单是一个裸存储器,○它还有spi接口,图中的spi接口就是从flash的spi接口中引出来的引脚7spi接口是串行同步通信,串口uart 是串行异步通信○7.关于示波器当配置芯片相应寄存器后,观察输出的波形频率时,若出现频率跳动,可以检查示波器上的采样电平是否在波形的中间位置8.关于复位信号与寄存器声明寄存器在声明时最好给个初始值,即加载时的值,例如:reg[1:0]a=2’b00或直接写0;复位信号不要列在敏感列表中,直接使用if (rst),使rst成为控制信号9.如何看出接口读取数据所用的时钟沿上图可以看出,时钟的下降沿对准数据中心,说明该芯片的此接口是用时钟的下降沿来读取数据的上图可以看出,时钟的上升沿对准数据中心,说明该芯片的此接口是用时钟的上升沿来读取数据的故:如果芯片ab之间有走线延迟的话,那么我们在芯片a要用相反的时钟沿送出数据,经过走线延迟后,芯片b对应接口读取数据的时钟沿正好对准到达芯片b的数据的保持时间,即使最大延迟半个周期,也正好对准数据的中心10.fpga内部寄存器都是高复位,综合时综合工具会自动为复位信号反相,若外部芯片为低复位,则可在fpga设计时,先将复位信号反相,然后使用if (rst)11.当控制信号高于slice的供应时,可将控制信号转化为数据信号,例如:if(a)q<=b;q<=(a&b)|(!a&q);elseq<=q;12.毛刺问题概念:由于延迟的作用,多个信号到达终点的时间有先有后,形成了竞争,由竞争产生的错误输出就是毛刺产生条件:在同一时刻有多个信号输入发生改变出现时间:由于冒险多出现在信号发生电平跳变的时刻,即在输出信号的建立时间内会产生毛刺,而在保持时间内不会出现,13.调用ram在建立ram的ip核时,关于是否选择输出寄存器,根据需要!选择一个寄存器,数据则在采到地址后,延迟一个时钟周期,才会输出14.综合后的寄存器fd为普通的寄存器;fdr为带复位端的寄存器;fdre为带复位端和使能端得寄存器15.寄存器地址注重参数化设计可以先用define定义相关寄存器的地址参数,然后在运用中使用该参数,如下:`definereset_addr4b1101;always@(posedgeclk32mornegedgerst)beginif(!rst)beginspi_en<=8b0010_0000;ctl[7:1]<=7b1111_101;reset<=8b1101_0000;endelseif(wr_reg==2b01)case(addr)`spi_en_addr:spi_en[7:0]<=data[7:0];`reset_addr:reset[7:0]<=data[7:0];……….则当给寄存器的赋值是某一固定值时,为只读寄存器16.综合问题将一输入端口赋值给一个寄存器,再将该寄存器赋值给一个wire型输出端口,则在综合后,输入不会赋值给输出,注意上面的输入输出指的是整个工程的输入输出解决办法:给输入添加一个ibuf,或者给输出添加一个obuf有时不必延迟一个时钟周期,而直接将输入赋值给输出17.时序约束问题1寄存器到寄存器:过周期约束来设置,一般为实际时钟频率的110%;○2输入管脚到寄存器:通过offsetin来设置,一般为半个时钟周期;○由于上游芯片的数据输出和该fpga的数据输入使用的是同一个时钟,故如果上游芯片的数据输出采用下降沿,那么fpga的offsetin就需采用上升沿;上游芯片的输出到fpga寄存器之间的延迟可能不到半个周期;3寄存器到输出管脚:参考○2○18.系统同步接口和源同步接口的区别1系统同步接口:上游芯片发送数据的时钟和fpga接收数据的时钟均为系统时钟,或者○fpga发送数据的时钟和下游芯片接收数据的时钟均为系统时钟;2源同步接口:上游芯片发送数据给fpga的同时,也发送接收时钟给fpga,或者fpga○发送数据给下游芯片的同时,也发送接收时钟给下游芯片。

FPGA,学习心得体会

FPGA,学习心得体会

篇一:fpga学习心得大报告《fpga技术基础》学习报告--课程内容学习心得姓名:学号:年级专业:指导教师:瞿麟 201010401128 自动化101薛小军摘要从开始学fpga到现在粗略算来的话,已经有3个多月了,就目前而言,我并不确定自己算不算高手们所说的入门了,fpga学习总结。

但是不管现在的水平如何,现在就总结一下自己学习它的感受或一些认识吧。

关键词fpga de2板 quartusii软件 verilog语言引言fpga是什么?fpga现状?怎样学习fpga?fpga是现场可编程门阵列的简称,fpga的应用领域最初为通信领域,但目前,随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天、医疗、通讯、网络通讯、安防、广播、汽车电子、工业、消费类市场、测量测试等多个热门领域。

并随着工艺的进步和技术的发展,向更多、更广泛的应用领域扩展。

越来越多的设计也开始以asic转向fpga, fpga正以各种电子产品的形式进入了我们日常生活的各个角落。

正文(1)掌握fpga的编程语言在学习一门技术之前我们往往从它的编程语言开始,如同学习单片机一样,我们从c语言开始入门,当掌握了c语言之后,开发单片机应用程序也就不是什么难事了。

学习fpga也是如此,fpga的编程语言有两种:vhdl和verilog,这两种语言都适合用于fpga的编程。

(2)fpga实验尤为重要除了学习编程语言以外,更重要的是实践,将自己设计的程序能够在真正的fpga里运行起来,这时我们需要选一块板子进行实验,我们选择使用de2板才进行试验。

初识de2开发板de2的资源de2的资源非常丰富,包括1. 核心的fpga芯片-cyclone ii 2c35 f672c6,从名称可以看出,它包含有35千个le,在altera的芯片系列中,不算最多,但也绝对够用。

altera下载控制芯片- epcs16以及usb-blaste对jtag的支持。

fpga课程设计心得体会

fpga课程设计心得体会

fpga课程设计心得体会首先,我要说这门FPGA课程对我来说是一次非常有益的学习经历。

通过这门课程,我深入了解了FPGA的原理和应用,同时锻炼了我的实践能力和问题解决能力。

下面是我对这门课程的一些心得体会。

1. 了解FPGA的基本原理在这门课程中,我们首先学习了FPGA的基本原理。

我了解到FPGA是一种可编程逻辑设备,可以根据设计者的需求进行编程和配置,实现各种不同的功能。

这种可编程性使得FPGA在很多领域都有广泛的应用,例如数字信号处理、通信系统等。

通过学习FPGA的基本原理,我对其内部结构和工作原理有了更深入的认识。

2. 掌握FPGA设计流程在学习FPGA课程的过程中,我不仅学到了FPGA的基本原理,还学到了FPGA的设计流程。

这包括了设计规范、电路分析、RTL设计、仿真和验证等步骤。

掌握了FPGA设计流程后,我能够按照一定的规范和步骤进行FPGA的设计,确保设计的正确性和可靠性。

3. 实践能力的提升在这门课程中,我们进行了大量的实践操作,通过实验来巩固理论知识,并且提升了自己的实践能力。

我记得有一次实验任务是设计一个简单的计数器电路,并在FPGA上进行验证。

虽然是一个简单的任务,但是我在实践过程中遇到了一些问题,例如时序约束和逻辑冲突等。

通过不断的尝试和调试,最终我成功地完成了任务,并且对FPGA 的实践应用有了更深刻的理解。

4. 解决问题的能力在FPGA课程设计过程中,我遇到了各种各样的问题,有时是设计上的问题,有时是硬件资源的限制,有时是时序约束无法满足等。

但是通过这些问题的解决,我培养了分析和解决问题的能力。

有时,我需要查阅相关的资料和文献,有时,我需要与同学和老师进行讨论和交流。

这些经历让我对问题的解决能力有了很大的提升。

总结起来,通过学习FPGA课程,我不仅学到了FPGA的基本原理和设计流程,还提升了我的实践能力和解决问题的能力。

这门课程为我今后的学习和工作奠定了良好的基础。

我相信,在将来的实践中,我会更加熟练地应用FPGA进行设计和开发,为实际工程问题提供解决方案。

fpga心得体会

fpga心得体会

fpga心得体会
做了5年的FPGA了,做完一FPGA项目后的心得体会。

手中经过的项目也不在少数,就在此刻又一个FPGA项目宣告结题,好多感受趁着现在还新鲜着写出来和大家一起分享不对之处希望得到大家的指正另外1234并没有绝对顺序都是有感而发随性而写。

1.要和人配合以我们做硬件的工程师为例测试的时候一般都需要软件的配合一个对硬件来说无比复杂的工作可能在软件工程师看来就是几行简单的代码所以要和人配合:多听听别人的意见这样必然可以产生新的know-how从而加快测试和开发的速度退一步讲至少没有坏处。

2.测试还是要别人来做开发者看待自己的产品有如看待自己,大多是没有勇气去发现缺点的。

一是源自自尊心,二是为了避免额外的工作。

所以就算有问题如果不严重就藏着掖着但是这对项目来说是不行的,所以测试verification,一定要旁人来做。

3.多点时间思考。

出现问题后不要急着修改,要思考推测可能的原因,想清楚后把这些可能的原因都用debug pin或者chipscope引出来。

4.注意复用已有的debug pin很多时候在测试过程中产生了大堆测试信号但是时间一长就忘了复用。

实际上,当一个问题产生的时候通过反复观察已有的debug pin或许足以发现问题根源而无需再引出新的Pin,并浪费时间去综合和PAB。

FPGA学习总结

FPGA学习总结

FPGA学习总结FPGA学习总结FPGA全称为Field-Programmable Gate Array,即现场可编程门阵列。

FPGA作为数字电路设计领域的重要组成部分,已经广泛应用于计算机、通信、汽车等各个领域。

作为一个FPGA初学者,经过几个月的学习和实践,我感受到了FPGA学习的重要性和挑战性。

在这里,我想总结一下我在FPGA学习中的经验和体会。

1.学习FPGA需要具备的基础知识FPGA作为数字电路设计的一种工具,其涉及的知识领域非常广泛。

对于初学者来说,需要掌握一定的电子技术和计算机科学知识。

具体来说,需要掌握数字电路的基础知识、硬件描述语言(HDL)的基本语法和应用、计算机组成原理等。

2.学习FPGA的方法2.1.理论学习FPGA的学习需要理论和实践相结合。

在理论学习方面,需要认真学习数字电路的基础知识,比如布尔代数、逻辑门、时序电路等内容。

此外,了解硬件描述语言的语法和应用,比如Verilog和VHDL 等。

2.2.实践操作在实践方面,可以通过一些开源的FPGA开发板进行实验。

通过实验,可以了解FPGA的基本原理和设计方法,掌握数字电路设计的技巧。

同时,通过实验可以加深对HDL语言的理解和掌握。

2.3.项目实践项目实践也是学习FPGA的一种好方法。

在实践中,需要尝试完成一些简单的项目设计,如LED灯闪烁、数码管显示、流水灯等。

这些项目虽然简单,但对于初学者来说却是很大的挑战。

通过项目实践,可以加深对FPGA的理解和掌握,并且培养实际操作能力。

3.学习FPGA需要注意的问题3.1.理论与实践相结合FPGA的学习需要理论和实践相结合,不能只看理论而忽略实践,也不能只做实践而忽略理论。

3.2.选择适合的开发板初学者在选择开发板时应该根据自己的学习需要和经济实力选择适合自己的开发板。

同时也需要了解不同开发板的优缺点和适用场景,选择适合自己的开发板。

3.3.认真备课在开始FPGA的学习之前,需要认真备课,将学习内容和方法分解为具体的步骤。

fpga,学习心得体会

fpga,学习心得体会

fpga,学习心得体会篇一:FPGa学习心得大报告《FPGa技术基础》学习报告--课程内容学习心得姓名:学号:年级专业:指导教师:瞿麟20XX10401128自动化101薛小军摘要从开始学FPGa到现在粗略算来的话,已经有3个多月了,就目前而言,我并不确定自己算不算高手们所说的入门了,FPGa学习总结。

但是不管现在的水平如何,现在就总结一下自己学习它的感受或一些认识吧。

关键词FPGadE2板Quartusii软件Verilog语言引言FPGa是什么?FPGa现状?怎样学习FPGa?FPGa是现场可编程门阵列的简称,FPGa的应用领域最初为通信领域,但目前,随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天、医疗、通讯、网络通讯、安防、广播、汽车电子、工业、消费类市场、测量测试等多个热门领域。

并随着工艺的进步和技术的发展,向更多、更广泛的应用领域扩展。

越来越多的设计也开始以aSic 转向FPGa,FPGa正以各种电子产品的形式进入了我们日常生活的各个角落。

正文(1)掌握FPGa的编程语言在学习一门技术之前我们往往从它的编程语言开始,如同学习单片机一样,我们从c语言开始入门,当掌握了c语言之后,开发单片机应用程序也就不是什么难事了。

学习FPGa也是如此,FPGa的编程语言有两种:VHdL和Verilog,这两种语言都适合用于FPGa的编程。

(2)FPGa实验尤为重要除了学习编程语言以外,更重要的是实践,将自己设计的程序能够在真正的FPGa里运行起来,这时我们需要选一块板子进行实验,我们选择使用dE2板才进行试验。

初识dE2开发板dE2的资源dE2的资源非常丰富,包括1.核心的FPGa芯片-cycloneii2c35F672c6,从名称可以看出,它包含有35千个LE,在altera的芯片系列中,不算最多,但也绝对够用。

altera下载控制芯片-EPcS16以及USB-Blaste对Jtag的支持。

fpgadds设计心得

fpgadds设计心得

fpgadds设计心得在进行FPGA设计时,以下是一些重要的心得和技巧:1. 确定设计目标:在开始设计之前,明确你的设计目标是非常重要的。

这包括确定设计的功能、性能要求、资源限制等。

这将有助于你在设计过程中保持专注,并确保最终的设计符合预期。

2. 使用高级综合工具:使用高级综合工具可以大大简化设计流程,并提高设计效率。

这些工具可以将高级语言(如C或C++)转换为硬件描述语言(如VHDL或Verilog),从而使设计过程更加直观和快速。

3. 优化资源利用:FPGA资源是有限的,因此在设计中要尽量优化资源的利用。

这包括减少逻辑门的数量、合理分配存储器资源、使用片上DSP块等。

可以通过合理的代码编写和优化技巧来实现资源的最佳利用。

4. 进行时序分析:时序分析是确保设计在FPGA上正确运行的重要步骤。

通过时序分析,可以确定关键路径、时钟频率等关键信息,从而优化设计的性能和稳定性。

5. 进行仿真和验证:在将设计加载到FPGA之前,进行仿真和验证是非常重要的。

通过仿真可以验证设计的功能和正确性,而验证可以确保设计在FPGA上的正确运行。

这可以通过使用仿真工具和硬件调试器来实现。

6. 进行时钟域划分:在设计中,时钟域划分是非常重要的。

合理的时钟域划分可以避免时序问题和时钟冲突,从而确保设计的正确性和稳定性。

要确保时钟域之间的数据传输和同步是正确的,并使用适当的时钟同步技术。

7. 进行功耗优化:功耗优化是现代FPGA设计中的重要考虑因素之一。

通过使用低功耗设计技术,如时钟门控、动态电压调节等,可以减少设计的功耗,并延长电池寿命。

8. 进行布局布线:在将设计加载到FPGA之前,进行布局布线是必要的。

良好的布局布线可以减少时序问题和信号干扰,并提高设计的性能和稳定性。

要确保时钟线路的正确布线、信号线的长度匹配等。

总之,FPGA设计是一个复杂的过程,需要综合考虑多个因素。

通过遵循上述心得和技巧,可以提高设计效率,减少错误,并实现高性能的FPGA设计。

《FPGA开发实训》教学总结[5篇]

《FPGA开发实训》教学总结[5篇]

《FPGA开发实训》教学总结[5篇]第一篇:《FPGA开发实训》教学总结《FPGA开发实训》教学总结一、课程基本信息课程名称:FPGA开发实训课程类别:实践教学课学分:2 学时:32 授课教师:二、课程的教学节点第一部分:软件基础(8学时)1、quartus II软件的安装和使用,掌握程序编译综合下载2、modelsim和quartus II自带波形仿真软件的使用,实现验证设计是否正确3、signaltap使用,用于开发板在线调试,定位查找错误第二部分:设计基础(4学时)1、计数器设计2、ROM的IP核使用:掌握ROM IP核的配置过程及初始化方法,学会用MATLAB产生mif文件来初始化ROM。

第三部分:项目训练(20学时)1、基于FPGA的分频器设计掌握1Hz信号频率信号的产生、指示灯显示按,完成FPGA设计项目的制作,包括定方案、设计电路、仿真、下载到FPGA开发板、调试。

2、基于FPGA的PWM控制器的设计与实现掌握PWM 技术原理、按键控制及消抖实现,完成FPGA设计项目的制作,包括定方案、设计电路、仿真、下载到FPGA开发板、调试。

3、基于FPGA的多功能信号发生器的设计与实现掌握sin、cos三角函数运算、各波形逻辑设计、ROM的存储和控制、液晶和数码管显示,独立完成FPGA设计项目的制作,包括定方案、设计电路、仿真、下载到FPGA开发板、调试,并写出实践报告。

三、课程的改革方案1、传统FPGA实验,设计多停留在仿真模拟环节,该课程充分依托FPGA的Cyclone系列开发板,将FPGA设计的理论知识与实践结合,增加学生的实战调试经验。

2、设置有一定应用价值的实验项目,项目内容由深入浅,让学生自主完成,锻炼学生的自主学习能力,提高学生设计系统的能力,培养学生的工程意识。

3、考核依据学生的设计作品的基本功能和自主创新功能,并要求学生进行总结答辩和讨论,最终提交设计报告,提高学生的综合应用知识能力,激发其创新能力,提高总结表达能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FPGA/CPLD数字电路设计经验分享摘要:在数字电路的设计中,时序设计是一个系统性能的主要标志,在高层次设计方法中,对时序控制的抽象度也相应提高,因此在设计中较难把握,但在理解RTL电路时序模型的基础上,采用合理的设计方法在设计复杂数字系统是行之有效的,通过许多设计实例证明采用这种方式可以使电路的后仿真通过率大大提高,并且系统的工作频率可以达到一个较高水平。

关键词:FPGA数字电路时序时延路径建立时间保持时间1 数字电路设计中的几个基本概念:1.1 建立时间和保持时间:建立时间(setup time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被打入触发器;保持时间(hold time)是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,如果保持时间不够,数据同样不能被打入触发器。

如图1 。

数据稳定传输必须满足建立和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为零。

PLD/FPGA开发软件可以自动计算两个相关输入的建立和保持时间(如图2)图1 建立时间和保持时间关系图注:●在考虑建立保持时间时,应该考虑时钟树向后偏斜的情况,在考虑建立时间时应该考虑时钟树向前偏斜的情况。

在进行后仿真时,最大延迟用来检查建立时间,最小延时用来检查保持时间。

●建立时间的约束和时钟周期有关,当系统在高频时钟下无法工作时,降低时钟频率就可以使系统完成工作。

保持时间是一个和时钟周期无关的参数,如果设计不合理,使得布局布线工具无法布出高质量的时钟树,那么无论如何调整时钟频率也无法达到要求,只有对所设计系统作较大改动才有可能正常工作,导致设计效率大大降低。

因此合理的设计系统的时序是提高设计质量的关键。

在可编程器件中,时钟树的偏斜几乎可以不考虑,因此保持时间通常都是满足的。

1.2 FPGA中的竞争和冒险现象信号在FPGA器件内部通过连线和逻辑单元时,都有一定的延时。

延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。

信号的高低电平转换也需要一定的过渡时间。

由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为"毛刺"。

如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在"冒险"。

(与分立元件不同,由于PLD内部不存在寄生电容电感,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在PLD、FPGA设计中尤为突出)图2是一个逻辑冒险的例子,从图3的仿真波形可以看出,"A、B、C、D"四个输入信号经过布线延时以后,高低电平变换不是同时发生的,这导致输出信号"OUT"出现了毛刺。

(我们无法保证所有连线的长度一致,所以即使四个输入信号在输入端同时变化,但经过PLD内部的走线,到达或门的时间也是不一样的,毛刺必然产生)。

可以概括的讲,只要输入信号同时变化,(经过内部走线)组合逻辑必将产生毛刺。

将它们的输出直接连接到时钟输入端、清零或置位端口的设计方法是错误的,这可能会导致严重的后果。

所以我们必须检查设计中所有时钟、清零和置位等对毛刺敏感的输入端口,确保输入不会含有任何毛刺图2 存在逻辑冒险的电路示例图3 图2所示电路的仿真波形冒险往往会影响到逻辑电路的稳定性。

时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题。

如何处理毛刺我们可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。

例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。

毛刺并不是对所有的输入都有危害,例如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害,我们可以说D触发器的D输入端对毛刺不敏感。

根据这个特性,我们应当在系统中尽可能采用同步电路,这是因为同步电路信号的变化都发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间,就不会对系统造成危害。

(由于毛刺很短,多为几纳秒,基本上都不可能满足数据的建立和保持时间)去除毛刺的一种常见的方法是利用D触发器的D输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。

图4给出了这种方法的示范电路,图5是仿真波形。

图4 消除毛刺信号方法之二图5 图4所示电路的仿真波形如前所述,优秀的设计方案,如采用格雷码计数器,同步电路等,可以大大减少毛刺,但它并不能完全消除毛刺。

毛刺并不是对所有输入都有危害,例如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害。

因此我们可以说D触发器的D输入端对毛刺不敏感。

但对于D触发器的时钟端,置位端,清零端,则都是对毛刺敏感的输入端,任何一点毛刺就会使系统出错,但只要认真处理,我们可以把危害降到最低直至消除。

下面我们就对几种具体的信号进行探讨。

1.3 清除和置位信号在FPGA的设计中,全局的清零和置位信号必须经过全局的清零和置位管脚输入,因为他们也属于全局的资源,其扇出能力大,而且在FPGA内部是直接连接到所有的触发器的置位和清零端的,这样的做法会使芯片的工作可靠、性能稳定,而使用普通的IO脚则不能保证该性能。

在FPGA的设计中,除了从外部管脚引入的全局清除和置位信号外在FPGA内部逻辑的处理中也经常需要产生一些内部的清除或置位信号。

清除和置位信号要求象对待时钟那样小心地考虑它们,因为这些信号对毛刺也是非常敏感的。

在同步电路设计中,有时候可以用同步置位的办法来替代异步清0。

在用硬件描述语言的设计中可以用如下的方式来描述:异步清0的描述方法:process(rst,clk)beginif rst=’1’ thencount<=(others=>’0’);elsif clk’event and clk=’1’ thencount<=count+1;end if;end process;同步清0的描述方法:processbeginwait until clk’event and clk=’1’;if rst=’1’ thencount<=(others=>’0’);elsecount<=count+1;end if;end process;图6 异步清0、置位逻辑图图7 同步清0、置位关系图1.4 触发器和锁存器:我们知道,触发器是在时钟的沿进行数据的锁存的,而锁存器是用电平使能来锁存数据的。

所以触发器的Q输出端在每一个时钟沿都会被更新,而锁存器只能在使能电平有效器件才会被更新。

在FPGA设计中建议如果不是必须那么应该尽量使用触发器而不是锁存器。

那么在使用硬件描述语言进行电路设计的时候如何区分触发器和锁存器的描述方法哪?其实有不少人在使用的过程中可能并没有特意区分过,所以也忽略了二者在描述方法上的区别。

下面是用VHDL语言描述的触发器和锁存器以及综合器产生的电路逻辑图。

触发器的语言描述:processbeginwait until clk’event and clk=’1’;q<=d;end process;图触发器锁存器的语言描述:process(en,d)beginif en=’1’ thenq<=d;end if;end process;图所存器由上述对Latch的描述可见,其很容易于选择器的描述相混淆,用VHDL语言对选择器的描述方法如下:process(en,a,b)beginif en=’1’ thenq<=a;elseq<=b;end if;end process;2 FPGA/CPLD中的一些设计方法2.1 FPGA设计中的同步设计异步设计不是总能满足(它们所馈送的触发器的)建立和保持时间的要求。

因此,异步输入常常会把错误的数据锁存到触发器,或者使触发器进入亚稳定的状态,在该状态下,触发器的输出不能识别为l或0。

如果没有正确地处理,亚稳性会导致严重的系统可靠性问题。

另外,在FPGA的内部资源里最重要的一部分就是其时钟资源(全局时钟网络),它一般是经过FPGA的特定全局时钟管脚进入FPGA内部,后经过全局时钟BUF适配到全局时钟网络的,这样的时钟网络可以保证相同的时钟沿到达芯片内部每一个触发器的延迟时间差异是可以忽略不计的。

在FPGA中上述的全局时钟网络被称为时钟树,无论是专业的第三方工具还是器件厂商提供的布局布线器在延时参数提取、分析的时候都是依据全局时钟网络作为计算的基准的。

如果一个设计没有使用时钟树提供的时钟,那么这些设计工具有的会拒绝做延时分析有的延时数据将是不可靠的。

在我们日常的设计中很多情形下会用到需要分频的情形,好多人的做法是先用高频时钟计数,然后使用计数器的某一位输出作为工作时钟进行其他的逻辑设计。

其实这样的方法是不规范的。

比如下面的描述方法:processbeginwait until clk’event and clk=’1’;if fck=’1’ thencount<=(others=>’0’);elsecount<=count+1;end if;end process;processbeginwait until count(2)’event and count(2)=’1’ ;shift_reg<=data;end process;在上述的第一个process电路描述中,首先计数器的输出结果(count(2))相对于全局时钟clk已经产生了一定的延时(延时的大小取决于计数器的位数和所选择使用的器件工艺);而在第二个process中使用计数器的bit2作为时钟,那么shift_reg相对于全局clk的延时将变得不好控制。

布局布线器最终给出的时间分析也是不可靠的。

这样产生的结果波形仿真如下图所示:正确的做法可以将第二个process这样来写。

processbeginwait until clk’event and clk=’1’ ;if count(2 downto 0)=”000” thenshift_reg<=data;end if;end process;或者分成两步来写:process(count)beginif count(2 downto 0)=”000” thenen<=’1’;elseen<=’0’;end if;end process;processbeginwait until clk’event and clk=’1’ ;if en=’1’ thenshift_reg<=data;end if;end process;这样做是相当于产生了一个8分频的使能信号,在使能信号有效的时候将data数据采样到shift_reg寄存器中。

相关文档
最新文档