FPGA学习的一些误区
FPGA设计中常见的布局与布线误区

FPGA设计中常见的布局与布线误区在FPGA设计中,布局与布线是非常重要的步骤,它直接影响到设计的性能、功耗和可靠性。
然而,在实际设计过程中,很多工程师经常会遇到一些常见的布局与布线误区,这些误区会对设计产生负面影响。
下面我们来详细介绍几个在FPGA设计中常见的布局与布线误区。
首先是信号布线过长。
在FPGA设计中,信号的传输延迟是一个非常关键的因素,过长的信号布线会导致信号传输延迟过大,从而影响系统的性能。
因此,在进行布线时,应尽量减少信号的传输距离,合理规划布线路径,避免信号过长。
其次是布局与布线不合理造成的干扰。
在FPGA设计中,布局与布线不合理会导致信号之间的干扰,从而影响系统的稳定性和可靠性。
为了避免干扰问题,需要合理规划布局,将不同类型的信号分开布线,避免互相干扰。
另外一个常见的误区是忽视时序约束。
时序约束是FPGA设计中非常重要的一部分,它规定了不同信号之间的时序关系,保证系统能够在正确的时钟周期内正常工作。
如果忽视时序约束,会导致系统出现时序问题,从而影响系统的性能和稳定性。
因此,在设计过程中,一定要认真分析和设置时序约束,确保系统的正常运行。
此外,还有一个常见的误区是忽视功耗分析。
在FPGA设计中,功耗是一个非常重要的考虑因素,过高的功耗会导致系统发热严重,影响系统的稳定性和寿命。
因此,在进行布局与布线时,需要注意功耗分析,合理规划电源分配和信号传输路径,降低系统功耗,提高系统的稳定性。
综上所述,FPGA设计中常见的布局与布线误区包括信号布线过长、布局与布线不合理造成的干扰、忽视时序约束和功耗分析等问题。
为了避免这些误区,设计工程师应该注重布局与布线的规划与优化,认真分析和设置时序约束,及时进行功耗分析,保证系统的性能、稳定性和可靠性。
只有在设计过程中注重细节,才能确保FPGA设计的顺利实施和优良性能。
FPGA常见错误

Quartus警告分析 warning 超级实用1.Found clock-sensitive change during active clock edge at time <time> on register "<name>"原因:vector source file中时钟敏感信号(如:数据,允许端,清零,同步加载等)在时钟的边缘同时变化.而时钟敏感信号是不能在时钟边沿变化的.其后果为导致结果不正确.措施:编辑vector source file2.Verilog HDL assignment warning at <location> : truncated with size <number> to match size of target (<number>原因:在HDL设计中对目标的位数进行了设定,如:reg[4:0] a;而默认为32位, 将位数裁定到合适的大小措施:如果结果正确,无须加以修正,如果不想看到这个警告,可以改变设定的位数3.All reachable assignments to data_out(10) assign '0', register removed by optimization原因:经过综合器优化后,输出端口已经不起作用了4.Following 9 pins have nothing, GND, or VCC driving datain port -- changes to this connectivity may change fitting results原因:第9脚,空或接地或接上了电源措施:有时候定义了输出端口,但输出端直接赋‘0’,便会被接地,赋‘1’接电源. 如果你的设计中这些端口就是这样用的,那便可以不理会这些warning5.Found pins ing as undefined clocks and/or memory enables原因:是你作为时钟的PIN没有约束信息.可以对相应的PIN做一下设定就行了. 主要是指你的某些管脚在电路当中起到了时钟管脚的作用,比如flip-flop的clk 管脚,而此管脚没有时钟约束,因此QuartusII把“clk”作为未定义的时钟. 措施:如果clk不是时钟,可以加“not clock”的约束;如果是,可以在clock setting当中加入;在某些对时钟要求不很高的情况下,可以忽略此警告或在这里改:Assignments>Timinganalysissettings...>Individual clocks...>... 6.Timing characteristics of device EPM570T144C5 are preliminary原因:因为MAXII 是比較新的元件在 QuartusII 中的時序并不是正式版的,要等 Service Pack措施:只影响 Quartus 的 Waveform7.Warning: Clock latency analysis for PLL offsets is supported for the current device family, but is not enabled措施:将setting中的timing Requirements&Option-->More TimingSetting-->setting-->Enable Clock Latency中的on改成OFF8.Found clock high time violation at 14.8 ns on register"|counter|lpm_counter:count1_rtl_0|dffs[11]"原因:违反了steup/hold时间,应该是后仿真,看看波形设置是否和时钟沿符合steup/hold时间措施:在中间加个寄存器可能可以解决问题9.warning: circuit may not operate.detected 46 non-operational paths clocked by clock clk44 with clock skew larger than data delay原因:时钟抖动大于数据延时,当时钟很快,而if等类的层次过多就会出现这种问题,但这个问题多是在器件的最高频率中才会出现措施:setting-->timing Requirements&Options-->Default required fmax 改小一些,如改到50MHZ10. Design contains <number> input pin(s) that do not drive logic原因:输入引脚没有驱动逻辑(驱动其他引脚),所有的输入引脚需要有输入逻辑措施:如果这种情况是故意的,无须理会,如果非故意,输入逻辑驱动.11.Warning:Found clock high time violation at 8.9ns on node 'TEST3.CLK' 原因:FF中输入的PLS的保持时间过短措施:在FF中设置较高的时钟频率12.Warning: Found 10 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew原因:如果你用的 CPLD 只有一组全局时钟时,用全局时钟分频产生的另一个时钟在布线中当作信号处理,不能保证低的时钟歪斜(SKEW).会造成在这个时钟上工作的时序电路不可靠,甚至每次布线产生的问题都不一样.措施:如果用有两组以上全局时钟的 FPGA 芯片,可以把第二个全局时钟作为另一个时钟用,可以解决这个问题.13.Critical Warning: Timing requirements were not met. See Report window for details.原因:时序要求未满足,措施:双击Compilation Report-->Time Analyzer-->红色部分(如clock setup:'clk'等)-->左键单击list path,查看fmax的SLACK REPORT再根据提示解决,有可能是程序的算法问题14.Can't achieve minimum setup and hold requirement along path(s). See Report window for details.原因:时序分析发现一定数量的路径违背了最小的建立和保持时间,与时钟歪斜有关,一般是由于多时钟引起的措施:利用Compilation Report-->Time Analyzer-->红色部分(如clock hold:'clk'等),在slack中观察是hold time 为负值还是setup time 为负值, 然后在:Assignment-->AssignmentEditor-->To中增加时钟名(fromnode finder),Assignment Name中增加和多时钟有关的Multicycle 和Multicycle Hold选项,如hold time为负,可使Multicycle hold的值>multicycle,如设为2和1.15: Can't analyze file -- file E://quartusii/*/*.v is missing原因:试图编译一个不存在的文件,该文件可能被改名或者删除了措施:不管他,没什么影响16.Warning: Can't find signal in vector source file for input pin whole|clk10m原因:因为你的波形仿真文件( vector source file )中并没有把所有的输入信号(input pin)加进去,对于每一个输入都需要有激励源的17.Error: Can't name logic scfifo0 of instance "inst"--function has same name as current design file原因:模块的名字和project的名字重名了措施:把两个名字之一改一下,一般改模块的名字18.Warning: Using design file lpm_fifo0.v, which is not specified as a design file for the current project, but contains definitions for 1 design units and 1 entities in project Info: Found entity 1: lpm_fifo0原因:模块不是在本项目生成的,而是直接copy了别的项目的原理图和源程序而生成的,而不是用QUARTUS将文件添加进本项目措施:无须理会,不影响使用19.Timing characteristics of device are preliminary原因:目前版本的QuartusII只对该器件提供初步的时序特征分析措施:如果坚持用目前的器件,无须理会该警告.关于进一步的时序特征分析会在后续版本的Quartus得到完善.20.Timing Analysis does not support the analysis of latches as synchronous elements for the currently selected device family原因:用analyze_latches_as_synchronous_elements setting可以让 Quaruts II来分析同步锁存,但目前的器件不支持这个特性措施:无须理会.时序分析可能将锁存器分析成回路.但并不一定分析正确.其后果可能会导致显示提醒用户: 改变设计来消除锁存器21.Warning:Found xx output pins without output pin load capacitance assignment原因:没有给输出管教指定负载电容措施:该功能用于估算TCO和功耗,可以不理会,也可以在Assignment Editor 中为相应的输出管脚指定负载电容,以消除警告22.Warning: Found 6 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew原因:使用了行波时钟或门控时钟,把触发器的输出当时钟用就会报行波时钟, 将组合逻辑的输出当时钟用就会报门控时钟措施:不要把触发器的输出当时钟,不要将组合逻辑的输出当时钟,如果本身如此设计,则无须理会该警告23.Warning (10268): Verilog HDL information at lcd7106.v(63): Always Construct contains both blocking and non-blocking assignments原因: 一个always模块中同时有阻塞和非阻塞的赋值24.Warning: Can't find signal in vector source file for input pin|whole|clk10m原因:这个时因为你的波形仿真文件( vector source file )中并没有把所有的输入信号(input pin)加进去,对于每一个输入都需要有激励源的在QuartusII下进行编译和仿真的时候,会出现一堆warning,有的可以忽略,有的却需要注意,虽然按F1可以了解关于该警告的帮助,但有时候帮助解释的仍然不清楚,大家群策群力,把自己知道和了解的一些关于警告的问题都说出来讨论一下,免得后来的人走弯路.上面是我收集整理的一些,有些是自己的经验,有些是网友的,希望能给大家一点帮助,如有不对的地方,请指正,如果觉得好,请版主给点威望吧,谢谢1.Found clock-sensitive change during active clock edge at time <time> on register "<name>"原因:vector source file中时钟敏感信号(如:数据,允许端,清零,同步加载等)在时钟的边缘同时变化。
FPGA设计常犯错误大全,你中招了吗?

FPGA设计常犯错误大全,你中招了吗?FPGA的用处比我们平时想象的用处更广泛,原因在于其中集成的模块种类更多,而不仅仅是原来的简单逻辑单元(LE)。
现在的FPGA不仅包含以前的LE,RAM也更大更快更灵活,管教IOB也更加的复杂,支持的IO类型也更多,而且内部还集成了一些特殊功能单元,包括:DSP:实际上就是乘加器,FPGA内部可以集成多个乘加器,而一般的DSP芯片往往每个core只有一个。
换言之,FPGA可以更容易实现多个DSP core功能。
在某些需要大量乘加计算的场合,往往多个乘加器并行工作的速度可以远远超过一个高速乘加器。
SERDES:高速串行接口。
将来PCI-E、XAUI、HT、S-ATA等高速串行接口会越来越多。
有了SERDES模块,FPGA可以很容易将这些高速串行接口集成进来,无需再购买专门的接口芯片。
CPU core:分为2种,软core和硬core.软core是用逻辑代码写的CPU模块,可以在任何资源足够的FPGA中实现,使用非常灵活。
而且在大容量的FPGA中还可以集成多个软core,实现多核并行处理。
硬core是在特定的FPGA内部做好的CPU core,优点是速度快、性能好,缺点是不够灵活。
不过,FPGA还是有缺点。
对于某些高主频的应用,FPGA就无能为力了。
现在虽然理论上FPGA可以支持的500MHz,但在实际设计中,往往200MHz以上工作频率就很难实现了。
FPGA设计要点之一:时钟树对于FPGA来说,要尽可能避免异步设计,尽可能采用同步设计。
同步设计的第一个关键,也是关键中的关键,就是时钟树。
一个糟糕的时钟树,对FPGA设计来说,是一场无法弥补的灾难,是一个没有打好地基的大楼,崩溃是必然的。
具体一些的设计细则:1)尽可能采用单一时钟;2)如果有多个时钟域,一定要仔细划分,千万小心;3)跨时钟域的信号一定要做同步处理。
对于控制信号,可以采用双采样;对于数据信号,可以采用异步fifo.需要注意的是,异步fifo不是万能的,一个异步fifo也只能解决一定范围内的频差问题。
FPGA研发之道(4)灵活性的陷阱

FPGA研发之道(4)灵活性的陷阱假如说用一个词来描述的特性,灵便性绝对名列前茅。
FPGA的灵便性在于:(一)I/O的灵便性,其可以通过其I/O组成各种接口与各种器件衔接,并且支持不同的电气特性。
(二)内部存储器灵便性,可以通过IP生成工具生成各种深度和宽度的RAM或者FIFO等。
(三)规律的灵便性,内部规律通可生成的各种类型IP。
对于I/O接口来说,FPGA的I/O可以支持不同类型的电平和驱动能力,各I/O未定义之前其地位平等,例如一个数据信号可将其约束在随意引脚,只要其电平符合衔接的规范。
因此基于这种熟悉,在布线时,基于布线需要,便调节其布线的挨次,例如互换两个信号的位置。
通常状况上,这种调节是没有任何问题的。
但是随着FPGA的接口IP核硬核化的趋势,逐渐由无数的接口IP不能支持这种调节。
例如对于较早的SDRAM 或者DDRSDRAM来说,在xilinx和ARA的FPGA上,其数据、地址信号等都是可调的。
但是随着DDR2,DDR3接口的浮现,其IP接口,只能支持在某个BANK并且例化结束后挺直生成相应的约束文件,而这些的改动将会导致布局布线的错误。
另一些例子则是一些高速SERDES的组合。
例如对于XAUI接口来说,其硬核IP(ALTERA)上就不支持4组SERDES的挨次互换,这将会影响其硬核FCS的编码。
假如板级衔接上与PHY的挨次与FPGA例化IP的约束不全都,则其硬核PCS就不能布局布线通过(软核FCS可以支持调节)。
这种灵便性熟悉导致硬件板级互联的问题可谓屡见不鲜,特殊是系统复杂度的升高,板级连线的增强,将会导致设计人员疏忽从而掉入“灵便性的陷阱”。
解决此类问题的办法。
包括(1)预评估,在设计之前就在FPGA上评估所需的接口的规律占用、约束位置、时钟需求等等,预先评估给系统设计提供相应的数据支撑和设计参考。
(2)交流,对于设计的变更,要举行有效交流,不能使铁路警察,各管一段。
(3)设计评审,虽然老套,第1页共3页。
FPGA常用错误

说明:本文内容来自网络1.Error (10028): Can't resolve multiple constant drivers for net ……解析:不能在两个以上always内对同一变量赋值,这个细节一般看书看资料会看到,但是编程时,就是没想到。
2.Error (10158): Verilog HDL Module Declaration error at clkseg.v(1): port "XXXX" is not declared as port解析:大意了,端口类型还没定义啊!3.Error (10110): variable "en" has mixed blocking and nonblocking Procedural Assignments -- must be all blocking or all nonblocking assignments解析:en在程序中有时用非阻塞赋值,有时用阻塞赋值,这是禁止的。
在初学的时候,可能分得不是很清楚,所以在检查时,一定要一步步观察慢慢来。
4.Error (10161): Verilog HDL error at clkseg.v(36): object "count" is not declared解析:这个错误应该很明显啦,只要能读得懂。
5.Error (10170): Verilog HDL syntax error at clkseg.v(37) near text "***"; expecting ";"解析:意思应该也很简单,就是检查的时候要细心点。
6.Error (10171): Verilog HDL syntax error at ir_ctrl.v(149) near end of file ; expecting an identifier, or "endmodule", or a parallel statement解析:最后上了endmodule。
关于FPGA的几点问题,你了解吗?

关于FPGA的几点问题,你了解吗?
1. FPGA编程语言为何叫硬件描述语言?
硬件即FPGA硬件,硬件描述语言,也就自然地告诉我们可以通过语言来描述FPGA内部硬件。
如:用y=ab来描述一个2输入的与门,用PLL来描述类似外部时钟管理芯片。
因此,要想学好FPGA,你得用硬件的思维方式来编写代码,注重FPGA的系统结构设计,好的系统结构设计会带来质的飞跃,这就告诉我们RTL Coding其实是硬件结构设计,而非基于处理器架构的C语言程序开发,好的RTL Coding就是好的硬件结构。
2. FPGA设计是做串并操作的时序设计?
FPGA内部硬件之间的通信为多对多节点通信,不仅存在无先后顺序的并行逻辑,而且还存在先后顺序的串行逻辑,这和CPU基于指令的顺序执行逻辑完全不同,我们需要严格控制设计中各个信号之间的时间关系,以满足最终的时间上的需求,即时序要求。
因此,FPGA设计就是针对既有串行操作,又有并行操作的时序设计,即FPGA串并操作的时序设计。
3. FPGA串并操作,该如何理解?
a.执行完A后再执行B;
b.A和B之间并行执行,且没有关联;
c.A和B之间并行执行,且开始时有先后顺序,即串行逻辑;
d.FPGA的复杂系统包含上述多种灵活组合,设计时需多多琢磨思考,合理设计。
4. FPGA内部最基本硬件结构LUT,你理解吗?
LUT的原理很简单,就是把各种可能的结果存起来标个号,每次根据输入的号来输出结果。
如:一位加法器有4种可能输入对应3种结果,就只需要做一张表格,把所有的输入和输出一一对应即可。
图1 LUT实现方式。
FPGA学习总结

首先,先说一下自己的在学习中所发现自己的不足之处:
1. 不会总结。
2. 记录警告,分析原因
3. 记录经典代码,算法,以及要注意的细节,重点知识
4.了解FPGA内部逻辑及其工作原理
5.下载不了,这是一个新手经常遇到的问题。
一般来说,大多数人会去检查下载电路的原理图,如果发现和正确的原理图没有区别就没办法了,开始怀疑芯片是不是坏了,焊接是不是有问题,是不是哪里有干扰啊等等。
而有的细心一些的人,就会仔细的看看下载的原理,信号的时序,用示波器看看板上信号的时序,一步一步的找原因。
如果没有找到,就会仔细检查FPGA的电路,从电源设计,到去耦电容摆放等等方面去动手查找原因。
如果觉得那里有问题,就动手改一看看,测一侧有没有改变,而不是坐着想哪里出问题。
可能最后就是芯片坏了,或者没有焊接好,但是后者确在这个过程中学到了很多东西,至少对f pga下载的原理了解的十分清楚。
6.如果电路工作不正常,那么99%的原因是和设计有关的,是可以找到确定的原因的,而不是偶然的,即使是噪声或者干扰。
FPGA学习总结

FPGA学习总结首先,先说一下自己的在学习中所发现自己的缺乏之处:1. 不会总结。
2. 学习的良好习惯没养成。
在写FPGA的根本模块时,遇到的问题有许多,譬如,写代码时的警告,特别是一些不能无视的警告,每次遇到时,总是还要检查一会儿才能改正来,或者有的警告已经出现了几次,但是就是解决不掉。
每次在学一个模块时,只要是看懂了,它的一些重点就没有及时的记录在本子上,只有个别的想起来时,才会做笔记。
每做完一个模块,没有及时记录下自己从这个模块中学到了什么。
上面的缺乏,都是在写模块的过程中,自己逐渐暴露出来的。
我很庆幸自己的一些问题能及时的被发现,虽然年前的学习将暂告一段落,但是,在年后的学习中,我一定会时刻记得自己以前在学习上出现了怎样的缺乏,防止类似的事情再次发生。
像遇到警告时,都要记录下来,通过改正后,要注释,写下警告的原因,定期看一下。
每次写模块的时候,都要记下重点知识,即使是自己懂得的,好记性都是比不过烂笔头的。
其次,就谈一下自己在学习FPGA中,截止目前,学到了什么,认识到那些。
FPGA简单的说,就是现场可编程逻辑阵列。
它的内部是逻辑单元,它们之间可以用线连接,至于以怎样的形式相连,那么可以根据应用者写入的逻辑决定。
每次布线都会重新组合逻辑单元,从而可以任意的编写不同的逻辑。
当然,前提是定义的逻辑块不超出它可读写的最大值。
可能自己说的术语并不专业,又或者是理解或表达的不透彻,但随着学习的加深,一定会有更加透彻的理解吧。
学习FPGA ,虽然资料很多,但是看的资料并不是很多,除了看夏宇闻编写的语法书外,看的最多的就是特权同学的,一个年轻的电子工程师,他就是通过自己的努力和坚持不懈有了现在的水平,虽然不能说是最好的工程师,但是,他在这条路上的成长历程,却代表着更广阔的青年的奋斗轨迹。
他的《深入浅出玩转FPGA》这本书,以前只听网友说不错,等到自己开始看后,发现里面的内容确实是值得学习,不仅是学习的层次性,同时里面的方法也是很不错的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA学习的一些误区作者:某人(摘自网络,不知道作者)我常年担任多个有关FPGA学习研讨的QQ群管理员,长期以来很多新入群的菜鸟们总是在重复的问一些非常简单但是又让新手困惑不解的问题。
作为管理员经常要给这些菜鸟们普及基础知识,但是非常不幸的是很多菜鸟怀着一种浮躁的心态来学习FPGA,总是急于求成。
再加上国内大量有关FPGA的垃圾教材的误导,所以很多菜鸟始终无法入门。
为什么大量的人会觉得FPGA难学?作为著名FPGA提供商Altera授权的金牌培训师,本管理员决心开贴来详细讲一下菜鸟觉得FPGA难学的几大原因。
1、不熟悉FPGA的内部结构,不了解可编程逻辑器件的基本原理。
FPGA为什么是可以编程的?恐怕很多菜鸟不知道,他们也不想知道。
因为他们觉得这是无关紧要的。
他们潜意识的认为可编程嘛,肯定就是像写软件一样啦。
软件编程的思想根深蒂固,看到Verilog或者VHDL就像看到C语言或者其它软件编程语言一样。
一条条的读,一条条的分析。
如果这些菜鸟们始终拒绝去了解为什么FPGA是可以编程的,不去了解FPGA的内部结构,要想学会FPGA 恐怕是天方夜谭。
虽然现在EDA软件已经非常先进,像写软件那样照猫画虎也能综合出点东西,但也许只有天知道EDA软件最后综合出来的到底是什么。
也许点个灯,跑个马还行。
这样就是为什么很多菜鸟学了N久以后依然是一个菜鸟的原因。
那么FPGA为什么是可以“编程”的呢?首先来了解一下什么叫“程”。
启示“程”只不过是一堆具有一定含义的01编码而已。
编程,其实就是编写这些01编码。
只不过我们现在有了很多开发工具,通常都不是直接编写这些01编码,而是以高级语言的形式来编写,最后由开发工具转换为这种01编码而已。
对于软件编程而言,处理器会有一个专门的译码电路逐条把这些01编码翻译为各种控制信号,然后控制其内部的电路完成一个个的运算或者是其它操作。
所以软件是一条一条的读,因为软件的操作是一步一步完成的。
而FPGA的可编程,本质也是依靠这些01编码实现其功能的改变,但不同的是FPGA之所以可以完成不同的功能,不是依靠像软件那样将01编码翻译出来再去控制一个运算电路,FPGA里面没有这些东西。
FPGA内部主要三块:可编程的逻辑单元、可编程的连线和可编程的IO模块。
可编程的逻辑单元是什么?其基本结构某种存储器(SRAM、 FLASH等)制成的4输入或6输入1输出地“真值表”加上一个D触发器构成。
任何一个4输入1输出组合逻辑电路,都有一张对应的“真值表”,同样的如果用这么一个存储器制成的4输入1输出地“真值表”,只需要修改其“真值表”内部值就可以等效出任意4输入1输出的组合逻辑。
这些“真值表”内部值是什么?就是那些01编码而已。
如果要实现时序逻辑电路怎么办?这不又D触发器嘛,任何的时序逻辑都可以转换为组合逻辑+D触发器来完成。
但这毕竟只实现了4输入 1输出的逻辑电路而已,通常逻辑电路的规模那是相当的大哦。
那怎么办呢?这个时候就需要用到可编程连线了。
在这些连线上有很多用存储器控制的链接点,通过改写对应存储器的值就可以确定哪些线是连上的而哪些线是断开的。
这就可以把很多可编程逻辑单元组合起来形成大型的逻辑电路。
最后就是可编程的IO,这其实是FPGA作为芯片级使用必须要注意的。
任何芯片都必然有输入引脚和输出引脚。
有可编程的IO可以任意的定义某个非专用引脚(FPGA中有专门的非用户可使用的测试、下载用引脚)为输入还是输出,还可以对IO的电平标准进行设置。
总归一句话,FPGA之所以可编程是因为可以通过特殊的01代码制作成一张张“真值表”,并将这些“真值表”组合起来以实现大规模的逻辑功能。
不了解FPGA内部结构,就不能明白最终代码如何变到FPGA里面去的。
也就无法深入的了解如何能够充分运用FPGA。
现在的FPGA,不单单是有前面讲的那三块,还有很多专用的硬件功能单元,如何利用好这些单元实现复杂的逻辑电路设计,是从菜鸟迈向高手的路上必须要克服的障碍。
而这一切,还是必须先从了解FPGA内部逻辑及其工作原理做起。
2、错误理解HDL语言,怎么看都看不出硬件结构。
HDL语言的英语全称是:Hardware Description Language,注意这个单词Description,而不是Design。
老外为什么要用Description这个词而不是Design呢?因为HDL确实不是用用来设计硬件的,而仅仅是用来描述硬件的。
描述这个词精确地反映了HDL语言的本质,HDL语言不过是已知硬件电路的文本表现形式而已,只是将以后的电路用文本的形式描述出来而已。
而在编写语言之前,硬件电路应该已经被设计出来了。
语言只不过是将这种设计转化为文字表达形式而已。
但是很多人就不理解了,既然硬件都已经被设计出来了,直接拿去制作部就完了,为什么还要转化为文字表达形式再通过EDA工具这些麻烦的流程呢?其实这就是很多菜鸟没有了解设计的抽象层次的问题,任何设计包括什么服装、机械、广告设计都有一个抽象层次的问题。
就拿广告设计来说吧,最初的设计也许就是一个概念,设计出这个概念也是就是一个点子而已,离最终拍成广告还差得很远。
硬件设计也是有不同的抽象层次,每一个层次都需要设计。
最高的抽象层次为算法级、然后依次是体系结构级、寄存器传输级、门级、物理版图级。
使用HDL的好处在于我们已经设计好了一个寄存器传输级的电路,那么用HDL描述以后转化为文本的形式,剩下的向更低层次的转换就可以让EDA工具去做了,这就大大的降低了工作量。
这就是可综合的概念,也就是说在对这一抽象层次上硬件单元进行描述可以被EDA工具理解并转化为底层的门级电路或其他结构的电路。
在FPGA设计中,就是在将这以抽象层级的意见描述成HDL语言,就可以通过FPGA开发软件转化为问题1中所述的FPGA内部逻辑功能实现形式。
HDL也可以描述更高的抽象层级如算法级或者是体系结构级,但目前受限于EDA软件的发展,EDA软件还无法理解这么高的抽象层次,所以 HDL描述这样抽象层级是无法被转化为较低的抽象层级的,这也就是所谓的不可综合。
所以在阅读或编写HDL语言,尤其是可综合的HDL,不应该看到的是语言本身,而是要看到语言背后所对应的硬件电路结构。
如果看到的HDL始终是一条条的代码,那么这种人永远摆脱不了菜鸟的宿命。
假如哪一天看到的代码不再是一行行的代码而是一块一块的硬件模块,那么恭喜脱离了菜鸟的级别,进入不那么菜的鸟级别。
3、FPGA本身不算什么,一切皆在FPGA之外这一点恐怕也是很多学FPGA的菜鸟最难理解的地方。
FPGA是给谁用的?很多学校解释为给学微电子专业或者集成电路设计专业的学生用的,其实这不过是很多学校受资金限制,卖不起专业的集成电路设计工具而用FPGA工具替代而已。
其实FPGA是给设计电子系统的工程师使用的。
这些工程师通常是使用已有的芯片搭配在一起完成一个电子设备,如基站、机顶盒、视频监控设备等。
当现有芯片无法满足系统的需求时,就需要用FPGA来快速的定义一个能用的芯片。
前面说了,FPGA里面无法就是一些“真值表”、触发器、各种连线以及一些硬件资源,电子系统工程师使用FPGA进行设计时无非就是考虑如何将这些以后资源组合起来实现一定的逻辑功能而已,而不必像IC设计工程师那样一直要关注到最后芯片是不是能够被制造出来。
本质上和利用现有芯片组合成不同的电子系统没有区别,只是需要关注更底层的资源而已。
要想把FPGA用起来还是简单的,因为无非就是那些资源,在理解了前面两点再搞个实验板,跑跑实验,做点简单的东西是可以的。
而真正要把FPGA用好,那光懂点FPGA知识就远远不够了。
因为最终要让FPGA 里面的资源如何组合,实现何种功能才能满足系统的需要,那就需要懂得更多更广泛的知识。
目前FPGA的应用主要是三个方向:第一个方向,也是传统方向主要用于通信设备的高速接口电路设计,这一方向主要是用FPGA处理高速接口的协议,并完成高速的数据收发和交换。
这类应用通常要求采用具备高速收发接口的 FPGA,同时要求设计者懂得高速接口电路设计和高速数字电路板级设计,具备EMC/EMI设计知识,以及较好的模拟电路基础,需要解决在高速收发过程中产生的信号完整性问题。
FPGA最初以及到目前最广的应用就是在通信领域,一方面通信领域需要高速的通信协议处理方式,另一方面通信协议随时在修改,非常不适合做成专门的芯片。
因此能够灵活改变功能的FPGA就成为首选。
到目前为止FPGA的一半以上的应用也是在通信行业。
第二个方向,可以称为数字信号处理方向或者数学计算方向,因为很大程度上这一方向已经大大超出了信号处理的范畴。
例如早就在2006年就听说老美将FPGA用于金融数据分析,后来又见到有将FPGA用于医学数据分析的案例。
在这一方向要求FPGA设计者有一定的数学功底,能够理解并改进较为复杂的数学算法,并利用FPGA内部的各种资源使之能够变为实际的运算电路。
目前真正投入实用的还是在通信领域的无线信号处理、信道编解码以及图像信号处理等领域,其它领域的研究正在开展中,之所以没有大量实用的主要原因还是因为学金融的、学医学的不了解这玩意。
不过最近发现欧美有很多电子工程、计算机类的博士转入到金融行业,开展金融信号处理,相信随着转入的人增加,FPGA 在其它领域的数学计算功能会更好的发挥出来,而我也有意做一些这些方面的研究。
不过国内学金融的、学医的恐怕连数学都很少用到,就不用说用FPGA来帮助他们完成数学_运算了,这个问题只有再议了。
第三个方向就是所谓的SOPC方向,其实严格意义上来说这个已经在FPGA设计的范畴之内,只不过是利用FPGA这个平台搭建的一个嵌入式系统的底层硬件环境,然后设计者主要是在上面进行嵌入式软件开发而已。
设计对于FPGA本身的设计时相当少的。
但如果涉及到需要在FPGA做专门的算法加速,实际上需要用到第二个方向的知识,而如果需要设计专用的接口电路则需要用到第一个方向的知识。
就目前SOPC方向发展其实远不如第一和第二个方向,其主要原因是因为SOPC以FPGA为主,或者是在FPGA内部的资源实现一个“软”的处理器,或者是在FPGA内部嵌入一个处理器核。
但大多数的嵌入式设计却是以软件为核心,以现有的硬件发展情况来看,多数情况下的接口都已经标准化,并不需要那么大的FPGA逻辑资源去设计太过复杂的接口。
而且就目前看来SOPC相关的开发工具还非常的不完善,以ARM为代表的各类嵌入式处理器开发工具却早已深入人心,大多数以ARM为核心的SOC芯片提供了大多数标准的接口,大量成系列的单片机/嵌入式处理器提供了相关行业所需要的硬件加速电路,需要专门定制硬件场合确实很少。
通常是在一些特种行业才会在这方面有非常迫切的需求。