1.1 FPGA技术背景大规模集成电路设计制造技术和数字信号处理技术,近三十年来,各自得到了迅速的发展。这两个表面上看来没有什么关系的技术领域实质上是紧密相关的。因为数字信号处理系统往往要进行一些复杂的数学运算和数据的处理,并且又有实时响应的要求,它们通常是由高速专用数字逻辑系统或专用数字信号处理器所构成,电路是相当复杂的。因此只有在高速大规模集成电路设计制造技术进步的基础上,才有可能实现真正有意义的实时数字信号处理系统。对实时数字信号处理系统的要求不断提高,也推动了高速大规模集成电路设计制造技 术的进步。现代专用集成电路的设计是借助于电子电路设计自动化(EDA)工具完成的。学习和掌握硬件描述语言(HDL)是使用电子电路设计自动化(EDA)工具的基础。 笔者建议Verilog,虽然很多学校古董级的老师还在教VHDL.当然VHDL也是要了解的,因为这门古老的语言的历史遗留问题,现在还有很多VHDL的模块,有的时候我们要拿来主义,所以还有必要了解下的。但是历史的车轮总是在前进,优胜劣汰。也许不久的将来Verilog也会被C,C++这种高级语言代替。 为了更方面地切入主题,笔者假设,你已经学过单片机,并且掌握C语言。因为单片机,和C语言,可以说是当代大学生的一项基本能力。有了这个基础,再学习其他现代计算机编程,算法,才能达到事半功倍的效果。如果你还不会单片机和C语言,建议你首先学会单片机,或者C语言。当然,这只是笔者的建议,不会单片机,或者C语言,并不代表学不好Verilog语言。 学过单片机的都知道,我们的程序代码是一条指令一条指令来执行的。CPU首先通过总线,读取一条指令,然后解析这条指令,再然后执行这条指令。我们写的C代码总是一条一条地执行。如果我们同时要处理10个子程序,那么CPU必须一个个子程序来执行。如果有些实时性较高的,如扫描下矩阵键盘,VGA刷个屏,都需要中断来实现。如果刷屏时间比较长,就会影响到你按键的灵敏度。另外比如,我们的单片机在用串口接收数据,并且也要发送数据,同时我们的单片机要处理外部的IO信号,如果我们的IO信号非常快,并且有几百个信号,可能同一个时刻触发,很显然,如果这些信号比较快,那么我们的单片机,就没法实现了。 这是笔者简单举了两种情况,那么如果使用FPGA就可以很方便地解决以上问题。由于FPGA的并行性,不管是扫描键盘,还是扫描VGA,都可以把它们做成独立的模块,时间上没有冲突,每个模块可以同时执行。 再比如用一个FPGA,就可以同时完成串口的收发,以及IO的监控,因为FPGA的程序实际上就是电路,是瞬间就完成了,我们只要用Verilog写出来相应功能的程序模块,这些模块是同时运行的。 这样看来FPGA真是太强大了,太完美了。但不要高兴地太早,由于FPGA可以在一个时钟内,完成多条语句的赋值,但是如果赋值必须有个前后顺序呢?也就是需要一步步的完成,怎么办?如果说并行控制是FPGA的优点,那么顺序控制就是他的不足之处。世界上永远没有完美的东西,我们在获得一种优势的时候,往往也获得了一种劣势。但是,办法总比问题多。 ■顺序控制的第一种办法——状态机设计 可以说,我们用Verilog来写程序,状态机无处不在。顾名思义,通过设计状态机,我们可可以控制Verilog让他该快的时候快,该慢的时候慢,该做什么的时候就做什么。这才是我们想要的。状态机是很不错的东西,初学者对他望而生畏,而熟悉Verilog语言的人都对其会爱不释手。 ■顺序控制的第二种方法——FPGA中运行CPU FPGA也可以运行CPU?是的,没错,FPGA也可以像单片机一样使用,这样我们就可以用C代码来一条条指令来执行了,这不是太强大了?是的,没错。关键的问题是,我们是可以把一些逻辑控制顺序复杂的事情用C代码来实现,而实时处理的部分仍然用Verilog来实现。并且那部分Verilog可以被C代码控制。Xilinx FPGA目前支持的CPU有Microblaze,ARM9,POWERPC,CortexA9(zynq就Xilinx比较新的一款片子,完美的将CortexA9和FPGA整合到一起,有兴趣的可以淘宝搜索MiZ702)其中Microblaze是一款软CPU,是软核。ARM9,CortexA9和POWERPC是硬核。这里有两个概念: 1)软核就是用代码就是能现的CPU核,这种核配置灵活,成本较低。但是要占用FPGA宝贵的资源。 2)硬核就是一块电路,做到FPGA内部,方便使用,性能更高。比如Xilinx的DDR内存控制器,就是一种硬核,其运行速度非常高,我们只要做些配置,就可以方便使用。 两种核可谓各有所长。 ■FPGA还是ASIC 根据具体看情况而定,从我们上面的一些介绍,笔者相信你已经有一定的判断能力了。笔者的建议是,低速场合,实时性要求的低的地方用ASIC,有些功能用ASIC方便的用ASIC,成本低的用ASIC。排除那些可以不用FPGA地方,那么剩余的就要考虑是不是用FPGA来实现更加方便。一般来说,FPGA程序开发相对来说要难度大一些,并且成本要高一些。 讲了这么多的背景知识,我们来看一小段代码:
同样是实现了求和,但是,C代码需要N多个(很多)CPU周期才得出结果,而用Verilog一个clk周期就计算出来了。 或许现在你还不知道为什么。没关系,下面的内容笔者讲解Verilog语言基础。 1.2 Verilog基础语法Verilog和C在外形上有很大相识的地方,有了C基础背景,Verilog看起来就并不陌生。 C语言和Verilog的关键词和结构对比: C语言和Verilog运算符对比: 真是太振奋人心了,一切都是这么熟悉。学好FPGA已经没有心理障碍了。 1.3 关键字1.3.1 module
代表一个模块,我们的代码写在这个两个关键字中间 1.3.2 input outputinput关键词,模块的输入信号,比如input Clk,Clk是外面关键输入的时钟信号; output关键词,模块的输出信号,比如output[3:0]Led; 这个地方正好是一组输出信号。其中[3:0]表示0~3共4路信号。 inout模块输入输出双向信号。这种类型,我们的例子24LC02中有使用。数总线的通信中,这种信号被广泛应用; wire关键词,线信号。例如:wire C1_Clk; 其中C1_Clk就是wire类型的信号; 线信号,三态类型,我们一般常用的线信号类型有input,output,inout,wire; reg关键词,寄存器。和线信号不同,它可以在always中被赋值,经常用于时序逻辑中。比如reg[3:0]Led;表示了一组寄存器。 1.3.3 alwaysalways@()括号里面是敏感信号。这里的always@(posedge Clk)敏感信号是posedge Clk含义是在上升沿的时候有效,敏感信号还可以negedge Clk含义是下降沿的时候有效,这种形式一般时序逻辑都会用到。还可以是*这个一符号,如果是一个*则表示一直是敏感的,一般用于组合逻辑。 1.3.4 assignassign用来给output,inout以及wire这些类型进行连线。assign相当于一条连线,将表达式右边的电路直接通过wire(线)连接到左边,左边信号必须是wire型(output和inout属于wire型)。当右边变化了左边立马变化,方便用来描述简单的组合逻辑。示例:
1.3.5 if...else...这些语句含义上都和高级语言一样:
1.3.6 case...endcasecase...endcase作用域用于状态机的编写
关注米联客扫描关注,了解最新资讯
资讯幻灯片
热门评论
热门专题
排行榜
|