导航:首页 > 编程语言 > fpga状态机编程

fpga状态机编程

发布时间:2023-09-17 08:23:35

Ⅰ FPGA现在学起来怎么样难不需要了解哪些基础课程

FPGA学习重点

1. 看代码,建模型

只有在脑海中建立了一个个逻运祥模辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写Verilog和写C整体思路是不一样的,才能理解顺序执行语言和并行执行语言的设计方法上的差异。在看到一段简单程序的时候应该想到是什么样的功能电路。2. 用数学思维来简化设计逻辑

学习FPGA不仅逻辑思维很重要,好的数学思维也能让你的设计化繁为简,所以啊,那些看见高数就头疼的童鞋需要重视一下这门课哦。举个简单的例子,比如有两个32bit的数据X[31:0]与Y[31:0]相乘。当然,无论Altera还是Xilinx都有现成的乘法器IP核可以调用,这也是最简单的方法,但是两个32bit的乘法器将耗费大量的资源。那么有没有节省资源,又不太复杂的方式来实现呢?我们可以稍做修改:将X[31:0]拆成两部分X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],则X1左移16位后与X2相加可以得到X;同样将Y[31:0]拆成两部分宴者Y1[15:0]和Y2[15:0],令 Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],则Y1左移16位后与Y2相加可以得到Y,则X与Y的相乘可以转化为X1和X2 分别与Y1和Y2相乘,这样一个32bit*32bit的乘法运算转换成了四个16bit*16bit的乘法运算和三个32bit的加法运算。转换后的占用资源将会减少很多,有兴趣的童鞋,不妨综合一下看看,看看两者差多少。3. 时钟与触发器的关系

“时钟是时序电路的控制者”这句话太经典了,可以说是FPGA设计的圣言。FPGA的设计主要是以时序电路为主,因为组合逻辑电路再怎么复杂也变不出太多花样,理解起来也不没太多困难。但是时序电路就不同了,它的所有动作都是在时钟一拍一拍的节奏下转变触发,可以说时钟就是整个电路的控制者,控制不好,电路功能就会混乱。打个比方,时钟就相当于人体的心脏,它每一次的跳动就是触发一个 CLK,向身体的各个器官供血,维持着机体的正常运作,每一个器官体统正常工作少不了组织细胞的构成,那么触发器就可以比作基本单元组织细胞。

时序逻辑电路的时钟是控制时序逻辑电路旁缓状态转换的“发动机”,没有它时序逻辑电路就不能正常工作。因为时序逻辑电路主要是利用触发器存储电路的状态,而触发器状态变换需要时钟的上升或下降沿,由此可见时钟在时序电路中的核心作用。最后简单说一下体会吧,归结起来就是多实践、多思考、多问。实践出真知,看100遍别人的方案不如自己去实践一下。实践的动力一方面来自兴趣,一方面来自压力。有需求会容易形成压力,也就是说最好能在实际的项目开发中锻炼,而不是为了学习而学习。为什么你会觉得FPGA难学?

1. 不熟悉FPGA的内部结构

FPGA为什么是可以编程的?恐怕很多初学者不知道,他们也不想知道。因为他们觉得这是无关紧要的。他们潜意识的认为可编程嘛,肯定就是像写软件一样啦。软件编程的思想根深蒂固,看到Verilog或者VHDL就像看到C语言或者其它软件编程语言一样。一条条的读,一条条的分析。

拒绝去了解为什么FPGA是可以编程的,不去了解FPGA的内部结构,要想学会FPGA 恐怕是天方夜谭。那么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触发器来完成。但这毕竟只实现了4输入1输出的逻辑电路而已,通常逻辑电路的规模那是相当的大。可编程连线

那怎么办呢?这个时候就需要用到可编程连线了。在这些连线上有很多用存储器控制的链接点,通过改写对应存储器的值就可以确定哪些线是连上的而哪些线是断开的。这就可以把很多可编程逻辑单元组合起来形成大型的逻辑电路。

可编程的IO

任何芯片都必然有输入引脚和输出引脚。有可编程的IO可以任意的定义某个非专用引脚(FPGA中有专门的非用户可使用的测试、下载用引脚)为输入还是输出,还可以对IO的电平标准进行设置。

总归一句话,FPGA之所以可编程是因为可以通过特殊的01代码制作成一张张 “真值表”,并将这些“真值表”组合起来以实现大规模的逻辑功能。不了解FPGA内部结构,就不能明白最终代码如何变到FPGA里面去的,也就无法深入的了解如何能够充分运用FPGA。现在的FPGA,不单单是有前面讲的那三块,还有很多专用的硬件功能单元,如何利用好这些单元实现复杂的逻辑电路设计,是从菜鸟迈向高手的路上必须要克服的障碍。而这一切,还是必须先从了解FPGA内部逻辑及其工作原理做起。

2. 错误理解HDL语言,怎么看都看不出硬件结构

HDL语言的英语全称是:Hardware Deion Language,注意这个单词Deion,而不是Design。老外为什么要用Deion这个词而不是Design呢?因为HDL确实不是用用来设计硬件的,而仅仅是用来描述硬件的。

描述这个词精确地反映了HDL语言的本质,HDL语言不过是已知硬件电路的文本表现形式而已,只是将以后的电路用文本的形式描述出来而已。而在编写语言之前,硬件电路应该已经被设计出来了。语言只不过是将这种设计转化为文字表达形式而已。

硬件设计也是有不同的抽象层次,每一个层次都需要设计。最高的抽象层次为算法级、然后依次是体系结构级、寄存器传输级、门级、物理版图级。

使用HDL的好处在于我们已经设计好了一个寄存器传输级的电路,那么用HDL描述以后转化为文本的形式,剩下的向更低层次的转换就可以让EDA工具去做了,这就大大的降低了工作量。这就是可综合的概念,也就是说在对这一抽象层次上硬件单元进行描述可以被EDA工具理解并转化为底层的门级电路或其他结构的电路。在FPGA设计中,就是在将这以抽象层级的意见描述成HDL语言,就可以通过FPGA开发软件转化为上一点中所述的FPGA内部逻辑功能实现形式。HDL也可以描述更高的抽象层级如算法级或者是体系结构级,但目前受限于EDA软件的发展,EDA软件还无法理解这么高的抽象层次,所以HDL描述这样抽象层级是无法被转化为较低的抽象层级的,这也就是所谓的不可综合。

所以在阅读或编写HDL语言,尤其是可综合的HDL,不应该看到的是语言本身,而是要看到语言背后所对应的硬件电路结构。3. FPGA本身不算什么,一切皆在FPGA之外

FPGA是给谁用的?很多学校是为给学微电子专业或者集成电路设计专业的学生用的,其实这不过是很多学校受资金限制,买不起专业的集成电路设计工具而用FPGA工具替代而已。其实FPGA是给设计电子系统的工程师使用的。这些工程师通常是使用已有的芯片搭配在一起完成一个电子设备,如基站、机顶盒、视频监控设备等。当现有芯片无法满足系统的需求时,就需要用FPGA来快速的定义一个能用的芯片。前面说了,FPGA里面无法就是一些“真值表”、触发器、各种连线以及一些硬件资源,电子系统工程师使用FPGA进行设计时无非就是考虑如何将这些以后资源组合起来实现一定的逻辑功能而已,而不必像IC设计工程师那样一直要关注到最后芯片是不是能够被制造出来。

本质上和利用现有芯片组合成不同的电子系统没有区别,只是需要关注更底层的资源而已。要想把FPGA用起来还是简单的,因为无非就是那些资源,在理解了前面两点再搞个实验板,跑跑实验,做点简单的东西是可以的。而真正要把FPGA用好,那光懂点FPGA知识就远远不够了。因为最终要让FPGA里面的资源如何组合,实现何种功能才能满足系统的需要,那就需要懂得更多更广泛的知识。4. 数字逻辑知识是根本

无论是FPGA的哪个方向,都离不开数字逻辑知识的支撑。FPGA说白了是一种实现数字逻辑的方式而已。如果连最基本的数字逻辑的知识都有问题,学习FPGA的愿望只是空中楼阁而已。数字逻辑是任何电子电气类专业的专业基础知识,也是必须要学好的一门课。

如果不能将数字逻辑知识烂熟于心,养成良好的设计习惯,学FPGA到最后仍然是雾里看花水中望月,始终是一场空的。以上四条只是我目前总结菜鸟们在学习FPGA时所最容易跑偏的地方,FPGA的学习其实就像学习围棋一样,学会如何在棋盘上落子很容易,成为一位高手却是难上加难。要真成为李昌镐那样的神一般的选手,除了靠刻苦专研,恐怕还确实得要一点天赋。荐读

1. 入门首先要掌握HDL(HDL=verilog+VHDL)

第一句话是:还没学数电的先学数电。然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL。因为verilog太像C了,很容易混淆,最后你会发现,你花了大量时间去区分这两种语言,而不是在学习如何使用它。当然,你思维能转得过来,也可以选verilog,毕竟在国内verilog用得比较多。接下来,首先找本实例抄代码。抄代码的意义在于熟悉语法规则和编译器(这里的编译器是硅编译器又叫综合器,常用的编译器有:Quartus、ISE、Vivado、Design Compiler 、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然后再模仿着写,最后不看书也能写出来。编译完代码,就打开RTL图,看一下综合出来是什么样的电路。HDL是硬件描述语言,突出硬件这一特点,所以要用数电的思维去思考HDL,而不是用C语言或者其它高级语言,如果不能理解这句话的,可以看《什么是硬件以及什么是软件》。在这一阶段,推荐的教材是《Verilog传奇》、《Verilog HDL高级数字设计》或者是《用于逻辑综合的VHDL》。不看书也能写出个三段式状态机就可以进入下一阶段了。此外,你手上必须准备Verilog或者VHDL的官方文档,《verilog_IEEE官方标准手册-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些语法问题的时候能查一下。2. 独立完成中小规模的数字电路设计

现在,你可以设计一些数字电路了,像交通灯、电子琴、DDS等等,推荐的教材是夏老《Verilog 数字系统设计教程》(第三版)。在这一阶段,你要做到的是:给你一个指标要求或者时序图,你能用HDL设计电路去实现它。这里你需要一块开发板,可以选Altera的cyclone IV系列,或者Xilinx的Spantan 6。

还没掌握HDL之前千万不要买开发板,因为你买回来也没用。这里你没必要每次编译通过就下载代码,咱们用modelsim仿真(此外还有QuestaSim、NC verilog、Diamond的Active-HDL、VCS、Debussy/Verdi等仿真工具),如果仿真都不能通过那就不用下载了,肯定不行的。在这里先掌握简单的testbench就可以了。推荐的教材是《WRITING TESTBENCHES Functional Verification of HDL Models》。3. 掌握设计方法和设计原则

你可能发现你综合出来的电路尽管没错,但有很多警告。这个时候,你得学会同步设计原则、优化电路,是速度优先还是面积优先,时钟树应该怎样设计,怎样同步两个异频时钟等等。

推荐的教材是《FPGA权威指南》、《IP核芯志-数字逻辑设计思想》、《Altera FPGA/CPLD设计》第二版的基础篇和高级篇两本。学会加快编译速度(增量式编译、LogicLock),静态时序分析(timequest),嵌入式逻辑分析仪(signaltap)就算是通关了。如果有不懂的地方可以暂时跳过,因为这部分还需要足量的实践,才能有较深刻的理解。4. 学会提高开发效率

因为Quartus和ISE的编辑器功能太弱,影响了开发效率。所以建议使用Sublime text编辑器中代码片段的功能,以减少重复性劳动。Modelsim也是常用的仿真工具,学会TCL/TK以编写适合自己的DO文件,使得仿真变得自动化,推荐的教材是《TCL/TK入门经典》。

你可能会手动备份代码,但是专业人士都是用版本控制器的,所以,为了提高工作效率,必须掌握GIT。文件比较器Beyond Compare也是个比较常用的工具。此外,你也可以使用System Verilog来替代testbench,这样效率会更高一些。如果你是做IC验证的,就必须掌握System Verilog和验证方法学(UVM)。推荐的教材是《Writing Testbenches using SystemVerilog》、《The UVM Primer》、《System Verilog1800-2012语法手册》。掌握了TCL/TK之后,可以学习虚拟Jtag(ISE也有类似的工具)制作属于自己的调试工具,此外,有时间的话,最好再学个python。脚本,意味着一劳永逸。5. 增强理论基础

这个时候,你已经会使用FPGA了,但是还有很多事情做不了(比如,FIR滤波器、PID算法、OFDM等),因为理论没学好。我大概地分几个方向供大家参考,后面跟的是要掌握的理论课。信号处理 —— 信号与系统、数字信号处理、数字图像处理、现代数字信号处理、盲信号处理、自适应滤波器原理、雷达信号处理

接口应用 —— 如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G以太网接口)、SATA、光纤、DisplayPort

无线通信 —— 信号与系统、数字信号处理、通信原理、移动通信基础、随机过程、信息论与编码

CPU设计 —— 计算机组成原理、单片机、计算机体系结构、编译原理

仪器仪表 —— 模拟电子技术、高频电子线路、电子测量技术、智能仪器原理及应用

控制系统 —— 自动控制原理、现代控制理论、过程控制工程、模糊控制器理论与应用

压缩、编码、加密 —— 数论、抽象代数、现代编码技术、信息论与编码、数据压缩导论、应用密码学、音频信息处理技术、数字视频编码技术原理现在你发现,原来FPGA会涉及到那么多知识,你可以选一个感兴趣的方向,但是工作中很有可能用到其中几个方向的知识,所以理论还是学得越多越好。如果你要更上一层,数学和英语是不可避免的。6. 学会使用MATLAB仿真

设计FPGA算法的时候,多多少少都会用到MATLAB,比如CRC的系数矩阵、数字滤波器系数、各种表格和文本处理等。此外,MATLAB还能用于调试HDL(用MATLAB的计算结果跟用HDL算出来的一步步对照,可以知道哪里出问题)。推荐的教材是《MATLAB宝典》和杜勇的《数字滤波器的MATLAB与FPGA实现》。7. 图像处理

Photoshop

花一、两周的时间学习PS,对图像处理有个大概的了解,知道各种图片格式、直方图、色相、通道、滤镜、拼接等基本概念,并能使用它。这部分是0基础,目的让大家对图像处理有个感性的认识,而不是一上来就各种各样的公式推导。推荐《Photoshop CS6完全自学教程》。基于MATLAB或OpenCV的图像处理

有C/C++基础的可以学习OpenCV,否则的话,建议学MATLAB。这个阶段下,只要学会简单的调用函数即可,暂时不用深究实现的细节。推荐《数字图像处理matlab版》、《学习OpenCV》。图像处理的基础理论

这部分的理论是需要高数、复变、线性代数、信号与系统、数字信号处理等基础,基础不好的话,建议先补补基础再来。看不懂的理论也可以暂时先放下,或许学到后面就自然而然地开窍了。推荐《数字图像处理》。基于FPGA的图像处理

把前面学到的理论运用到FPGA上面,如果这时你有前面第七个阶段的水平,你将轻松地独立完成图像算法设计(图像处理是离不开接口的,上面第五个阶段有讲)。推荐《基于FPGA的嵌入式图像处理系统设计》、《基于FPGA的数字图像处理原理及应用》。进一步钻研数学。要在算法上更上一层,必然需要更多的数学,所以这里建议学习实分析、泛涵分析、小波分析等。

Ⅱ 用FPGA编写12864显示的程序,跪求。。。可以显示就行,内容可以是字母。。谢谢

/*LCD12864显示程序
此程序控制LCD12864液晶屏,IC为KS0108或兼容型号

图形文件获取方法:

在字模提取V21软件中 ,导入一幅128*64黑白图像.
* 参数设置:
* 参数设置->其它选项,选择纵向取模,勾上字节倒序,保留逗号,
* 取模方式为C51。
将生成的数组通过keilc等C编译软件,在编译软件中新建一工程,写入源程序如下:
unsigned char code tab[]=
{
//图像数据
}
编译此工程将得到hex文件.在QII中使用lpm_rom宏功能模块中调用此hex文件.
*
*******************************************************************************/

mole newlcd(clock,rst_n,rs,rw,en,data,lcd_cs);
// I/O口声明
input clock; //系统时钟
input rst_n; //复位信号
output[1:0] lcd_cs; //
output rs; //1:数据模式;0:指令模式
output rw; //1:读操作;0:写操作
output en; //使能信号,写操作时在下降沿将数据送出;读操作时保持高电平
output[7:0] data; //LCD数据总线

// I/O寄存器
reg rs;
reg en;
reg[1:0] lcd_cs;
reg[7:0] data;

//内部寄存器
reg[3:0] state; //状态机
reg[3:0] next_state;
reg[20:0] div_cnt; //分频计数器
reg[9:0] cnt; //写操作计数器
reg cnt_rst; //写操作计数器复位信号
wire[7:0] showdata; //要显示的数据
reg[1:0] cs_r;

reg [2:0] page_addr;
reg [5:0] row_addr;

//内部网线
wire clk_div; //分频时钟
wire clk_divs;
wire page_done; //写一行数据完成标志位
wire frame_done; //写一屏数据完成标志位
wire left_done;

//状态机参数
parameter idle =4'b0000,
setbase_1 =4'b0001,
setbase_2 =4'b0011,
setmode_1 =4'b0010,
setmode_2 =4'b0110,
SETpage_addr_1 =4'b0111,
SETpage_addr_2 =4'b0101,
SETrow_addr_1 =4'b1101,
SETrow_addr_2 =4'b1111,
write_right_1 =4'b1110,
write_right_2 =4'b1010,
write_nextpage_1 =4'b1011,
write_nextpage_2 =4'b1001,
wr_data_1 =4'b0100,
wr_data_2 =4'b1100;
// set_1 =4'b1000;

//******************************代码开始*********************************
assign rw = 1'b0; //对LCD始终为写操作

//时钟分频
always@(posedge clock or negedge rst_n)
begin
if(!rst_n)
div_cnt <= 0;
else
div_cnt <= div_cnt+1'b1;
end

assign clk_div = (div_cnt[15:0] == 20'h7fff);

//状态机转向
always@(posedge clock or negedge rst_n)
begin
if(! rst_n)
state <= idle;
else if(clk_div)
state <= next_state;

end

//************************状态机逻辑*********************************

always@(state or page_done or left_done or frame_done or cnt or showdata or page_addr or row_addr or cs_r)
begin
rs <= 1'b0;
en <= 1'b0;
lcd_cs <= cs_r;
cnt_rst <= 1'b0;
data <= 8'h0;
case(state)
idle:
begin
next_state <= setbase_1;
cnt_rst <= 1'b1;
end

//**************************初始化LCD********************************
setbase_1: //基本指令操作
begin
lcd_cs <= 2'b11;
next_state <= setbase_2;
data <= 8'hc0;
en <= 1'b1;
end

setbase_2:
begin
lcd_cs <= 2'b11;
next_state <= setmode_1;
data <= 8'hc0;
end
//******************************************************************

setmode_1:
begin
lcd_cs <= 2'b11;
next_state <= setmode_2;
data <= 8'h3f;
en <=1'b1;
end

setmode_2:
begin
next_state <= SETpage_addr_1;
data <= 8'h3f;

end

//******************************************************************
SETpage_addr_1: //设置页地址
begin
next_state <= SETpage_addr_2;
data <= ;
en <= 1'b1;
end

SETpage_addr_2:
begin
next_state <= SETrow_addr_1;
data <= ;
end

SETrow_addr_1: //设置列地址
begin
next_state <= SETrow_addr_2;
data <= ;
en <= 1'b1;
end

SETrow_addr_2:
begin
next_state <= wr_data_1;
data <= ;

end
//******************************************************************
/*
write_right_1: //写完左半屏64个,换为右半屏显示
begin
next_state <=write_right_2;
row_addr <= 0;

end

write_right_2:
begin
next_state <= SETpage_addr_1;
end

//******************************************************************
write_nextpage_1: //写完全一行128个
begin
next_state <=write_nextpage_2;
row_addr <= 0;
end

write_nextpage_2:
begin
next_state <= SETpage_addr_1;
end
*/
//******************************************************************
wr_data_1: //写数据到图形显示区
begin
next_state <= wr_data_2;
rs <= 1'b1;
en <= 1'b1;
data <= showdata;
end

wr_data_2:
begin
rs <= 1'b1;
data <= showdata;
if(left_done) //写完左半屏数据64个
begin
if(page_done) //写完一页数据128个
begin
if(frame_done) //写完一屏数据(8页)
next_state <= idle;
else
// next_state <= write_nextpage_1;
next_state <= SETpage_addr_1;
end
else
// next_state <= write_right_1;
next_state <= SETpage_addr_1;
end
else
next_state <= wr_data_1;
end
default: next_state <= idle;
endcase

end
//********************************************************************

always@(posedge clock)
begin
if(clk_div)
begin
if(cnt_rst)
begin
cnt <= 0;
end
else if(state == wr_data_2)
begin
cnt <= cnt+1'b1;
end

end
end
//****************************************************

always@(posedge clock or negedge rst_n)
if(!rst_n)
begin
cs_r <= 2'b01;
page_addr <= 0;
end
else
if(clk_div && (state == wr_data_2))
if(page_done)//
begin
cs_r <= 2'b01;
page_addr <= page_addr + 1'b1;//一页写完时写下一页
end
else
if(left_done)
begin
cs_r <= 2'b10;
end

//*********************************************************************

//********************************************************************
assign left_done = (cnt[5:0] == 6'd63); //写完左半屏数据64个
assign page_done = (cnt[6:0] == 7'd127); //写完一页数据128个
assign frame_done = (cnt[9:4] == 7'h3f); //写完一屏数据

//***********************************************************************

//*******************************************************************
//调用ROM(图片数据)
rom rom(.address(cnt+'d8),.clock(clock),.q(showdata));

endmole

开发板例程 自己看吧
我可以帮助你,你先设置我最佳答案后,我网络Hii教你。

Ⅲ 如何快速掌握FPGA

任何一个硬件工程师对FPGA都不会陌生,就好比C语言对于软件工程师来说是必修课程一样,只要是电子相关专业的学生,都要学习可编程逻辑这门课程。 FPGA的英文全称是Field Programmable Gate Array,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。

从表象看,Programmable这个单词确实能够很好的描述FPGA的特点,但这也使得很多初学者走了不少弯路。一说到编程,大家不免联想到 coding,因为软件编程的思想对工程师来说已经是根深蒂固了。因此,很多初学者都会问一个相同的问题,两种硬件编程语言VHDL和Verilog,应该学哪个?即使明确了要学习哪种设计语言,也会一头扎进浩瀚的语嫌物空法中,走向歧途。有些初学者写了大量的代码,在Demo板上跑了n个试验,可还是觉得不懂 FPGA,甚至搞不清楚它和单片机的区别。这是为什么?其实,这都归结一个原因,就是被“可编程”这3个字给迷惑了,也就是说,没有弄清楚FPGA的本质是什么。因此,对于FPGA的学习也就不着法门,事倍功半,浪费了不少时间,却仍然达不到效果。

FPGA是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。因此,从底层来看,FPGA还是属于集成电路的范畴。就当前的技术而言,使用FPGA开发项目还是全部基于数字电路设计的,所以,FPGA的“可编程”也就是实现不同的数字电路逻辑。这与所谓的软件编程有着本质的区别!归根结底,FPGA设计就是电路设计,因此,对于每个FPGA工程师来说,在做设计时必须在脑中有电路的模样,这很重要!那么,到底该如何有效地学习FPGA呢?其实,很简单,只要从以下7点着手,循序渐进,日积月累,就完全能够对FPGA设计游刃有余。

1. 首先,必须了解FPGA的结构和性能。不同厂家,不同系列的FPGA芯片都有不同的结构和性能,但是万变不离其中。刚开始,从掌握几款典型的高端芯片开始,例如Altera公司的Stratix III和Xilinx公司的Virtex 5。之后,再去了解其它系列的芯片就很容易了。至于Lattice和Actel公司的芯片,当使用时再了解也不迟,因为学习主流的东西才会更加有效!许多有关FPGA的教科书都会以几款常用的芯片为例,讲述FPGA的基本结构和原理。初学者看了后,总觉得过于抽象,有点不知所云的感觉。因此,为了深刻理解 FPGA,必须要有扎实的数字电路基础!在数字电路里,最基本的就是逻辑和时序。工程师必须明白FPGA内部逻辑结构和数字电路基本电路结构的关系。例如,任何4个输入信号的组合逻辑都可以通过FPGA提供的4输入LUT来实现。如果使用Xilinx的芯片,移位寄存器既可以通过多个触发器级联实现,也可以通过LUT来实现。通常,初学者可以设计出正确的逻辑,但却很容易忽略时序。在I/O口的设计中,与时序相关的缺陷对于产品是致命的,会影响产品的可靠性。因此,在掌握了结构后,还必须关注芯片的一些重要时序参数,例如I/O口时钟的建立时间、保持时间和从触发器到输出的延迟时间,以及芯片内部工作时钟的最高频率等等。只有充分掌握了所使用芯片的结构和性能,才能设计出一个合理的系统,才能保证FPGA的设计可靠稳定。FPGA厂商提供的大量文档是一个不错的学习资料。

2. FPGA既然是“可编程”,自然离不开编程语言。其实,早期的工程师大多使用原理图输入方式进行逻辑设计,这是一种更接近于电路设计的设计方芹瞎式。这种设计方式对设计者要求较高,而且也不利于移植和维护,因此VHDL和Verilog才渐渐流行起来。这两种语言,无所谓孰优孰劣,只不过Verilog发展的比VHDL好,蚂慎而且和将来可能一统天下的SystemVerilog比较接轨。它们都是硬件描述语言。既然叫硬件描述语言,自然是和软件世界里的编程不一样,所以,初学者不能把它当作软件编程语言来学习,否则就会舍本逐末。如果仅仅只是从事FPGA逻辑设计和做简单的功能仿真,只需学习最简单的语法就够了。那些用于写验证脚本的语法,完全不用学,基本用不上。语言仅仅只是一个工具,尤其在硬件设计里,代码写得漂不漂亮,并不重要,最关键的是设计思想。记住,FPGA工程师是在设计电路,而不是在“编程”!

3. 很多工程师会谈到算法的重要性,认为必须懂得很多算法。没错,好的算法对于设计来说犹如利器一般。可是,研究算法和如何实现算法是两个不同的概念,研究算法是在做数学题,实现算法才是工程师的职责。这里并不是说FPGA工程师不用去研究算法,而是强调职责所在。不同的算法,我们对其原理的研究和理解的要求也是不同的。例如8B/10B编码,只要你懂得在哪里需要使用它就够了,现成的IP Core可以直接调用。但是,诸如FEC编解码这样的算法,则只有了解了基本原理后才可能懂得如何实现。对于算法,FPGA工程师的重点就是在于“如何实现”!。另外,算法之外,逻辑设计里常用的设计方法必须懂得,例如,乒乓操作、流水线设计和分时复用等等。还有常用的逻辑模块,如异步FIFO、状态机,这些其实都是数字电路里最基础的东西,但是对于初学者来说,在做FPGA设计时未必会正确的使用。

4. FPGA设计必须有一个好的设计流程来支撑。代码写完后,花大量时间做完善的功能仿真和验证是很有必要的。可是一些工程师并不重视仿真和验证,而是迫不及待的上板调试。碰到BUG后就在代码上修修补补,运气好的话,BUG表面上是解决了,可真正深层次的原因却未必发现,给产品留下了隐患。一个好的设计流程要求大多数BUG在前期工作中必须解决掉,功能仿真和验证则是一个很有效也很重要的步骤。除了仿真验证,综合和布线也必须重视,这要求我们必须仔细浏览编译报告和时序报告,因为,许多时序问题都能通过报告反映出来。有时候,一些工程师碰到时序问题,仅仅做时钟反相来调整数据和时钟的相位关系,或者修改综合和布线的参数,仍无法解决问题。尤其是在用了高速时钟的设计里,大多数情况,我们只有修改代码里的逻辑才能满足设计的时序要求。这些也只有仔细分析了报告后,才能对症下药。另外,对于大多数同步逻辑设计来说,时序仿真是没有必要的,这一步完全可以省略。

5. 现阶段,FPGA发展的三大方向就是SOC,高速I/O和DSP。在有限的时间里,选择一个领域进行主攻是有必要的,只有明确了目标,才会更加投入。 SOC设计要求设计者对软件编程、CPU原理甚至是操作系统比较了解才行,因为SOC就是一个软硬件结合的系统。高速I/O设计则要求设计者掌握许多模拟电路的基本知识以及一些常用的通信协议,例如,SDH、GbE、PCI-E等等。FPGA在DSP领域的使用是近几年兴起的一个发展方向。FPGA由于其内在的并行特性,能以很高的效率实现DSP算法中计算量较大的模块,非常适合视频和图像处理等对DSP性能要求越来越高的新兴应用,设计者需要掌握数字信号处理常用算法。这3个方向完全不同,切勿囫囵吞枣,一切通吃!“术业有专功”,资深的高级工程师也很难在多个方向都取得成就。当然,若能在一个领域有较深的研究,同时,对另外两个领域也有一定的了解,那就更好了。

6. 一个优秀的FPGA工程师,必须做到“一专多能”。所谓的“一专”当然是指在FPGA设计领域的专业深度,而“多能”则是要求工程师对其它专业领域也要有所了解和掌握。例如,对于设计一个SOC系统来说,C语言就必须学习,否则对于片上系统的架构就可能不合理。另外,对于设计高速I/O口的工程师来说,电路板原理设计和PCB设计则需要有所了解。只有掌握了预加重、均衡以及阻抗匹配等这些与模拟电路相关的概念,才可能在设计和调试中得心应手。

7. 最后一点,也是最难的一点,这也是迈向高级工程师的关键,就是FPGA的设计需要一个好的系统架构方案和合理的模块化分。这有助于FPGA的调试和维护,也便于多人共同开发,尤其是在使用大规模FPGA时,这也就是常说的Top-Down设计方式。把一个庞大的、复杂的设计化分成若干个小模块,而且层次要分明,不能扁平化,这需要设计者对设计必须有全面深刻的理解。一个杂乱无序的设计对于后期的维护是灾难性的,尤其是对于接手者来说,若要修改某个逻辑,可以说是苦不堪言。从这一点看,初学者的问题都可以在这里找到答案。FPGA学什么?就是学习系统级的电路设计。所以,FPGA工程师的发展方向就是系统工程师。

以上7点若能有深刻理解,则就能看清FPGA的本质了。市场的瞬息变化,要求电子产品必须对市场具有高敏感性,产品从方案设计到市场投放的时间越来越短,FPGA在其中功不可没。另外,在面对Cost Down时,FPGA也起着不可或缺的作用。在当今时代,FPGA已经在通信、数据处理、网络、仪器、工业控制、军事和航空航天等众多领域得到了广泛应用。随着功耗和成本的进一步降低,FPGA还将进入更多的应用领域,相信FPGA工程师也必将会有一个更加广阔的施展空间。

推荐一本书《基于VHDL的FPGA开发快速入门·技巧·实例》

加油吧!

阅读全文

与fpga状态机编程相关的资料

热点内容
怎么查询哪个app是哪个公司的 浏览:731
我的世界服务器地址怎么变成ip地址 浏览:31
不用时怎么加密电脑 浏览:54
不玩手机APP怎么开启警报 浏览:560
打开微信收付款加密 浏览:400
小度app怎么关闭看护助手 浏览:739
服务器方舟boss属性怎么调 浏览:345
acos系统终端命令 浏览:915
宁德云服务器最新行情 浏览:475
压缩性骨折五十天 浏览:656
如何在服务器里把方块替换 浏览:909
变频空调摘板用什么替代压缩机 浏览:46
怎么在苹果手机上玩安卓和平精英 浏览:237
python异步调用框架 浏览:963
安卓手机如何拍live图 浏览:823
供应链管理系统源码 浏览:944
方舟编译器会适配哪些型号 浏览:470
主流云服务器哪个牌子好 浏览:267
导航怎么看服务器在那 浏览:932
广石化单片机 浏览:281