FPGA应用开发和仿真(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-07 14:25:48

点击下载

作者:王贞炎

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

FPGA应用开发和仿真

FPGA应用开发和仿真试读:

前言

笔者2004年开始学习FPGA,并被其强大的灵活性所吸引,从此一切成本不敏感的项目能用FPGA的,则不会考虑其他方案。从简单的逻辑控制、MCU替代到高速的信号处理、网络与通信应用,没有什么是一片FPGA(或含有处理器核)不能驾驭的,“一片不行,那就两片!”在成本不敏感的领域,如科研、产品或芯片原型研发和验证中,FPGA扮演了极其重要的角色,因为在这些领域往往包含大量特殊的、创新的定制逻辑和功能,或者具备极高的数据传输带宽,并非MCU、MPU(DSP是MPU的一种)或应用处理器所能胜任。

即使是MCU或MPU能够胜任的工作,若使用FPGA来完成,你可以肆意挥洒自己的创意,构建符合自己习惯的逻辑接口和功能,创造符合特殊要求的功能模块和处理器外设,而不必像使用通用MCU或MPU那样,需要学习为了功能通用而设置的纷繁复杂的接口、控制寄存器或API函数。当然,一切的前提是项目成本不敏感,并且你具备深厚的FPGA开发功力——这比MCU或MPU开发要难很多。

但终端产品领域是FPGA尚无法触及的,主要限制是成本、功耗和开发难度。在成本和功耗上,FPGA灵活的本质决定了它无法与MCU或MPU抗衡,同时终端产品往往出货量也很大,因而在高带宽或特殊定制逻辑方面,也可以由ASIC胜任——ASIC在量大时成本极低。

而开发难度大则源于多个方面。在理论方面,想要学好FPGA,甚至说想要入门FPGA,都必须掌握扎实的数字逻辑基础知识。在语言方面,用于FPGA开发的硬件描述语言(HDL)描述的数字逻辑电路是并行的,与人类思维的串行性(即一步一步的思考)不符,而MCU等开发使用的程序语言则符合人类思维的串行性,相对易于入门和掌握。依笔者浅见,“程序”一词含有“依序执行的过程”之意,与可综合的硬件描述语言的并行性不符,因而本书尽量避免使用“程序”一词指代可综合的硬件描述语言代码。

开发困难还源于FPGA技术近年来的快速发展和FPGA相关教育的滞后。

笔者自六年前开始面向华中科技大学启明学院电工电子科技创新中心(以下简称“创新中心”)的学生开设与FPGA应用相关的选修课,并为他们设计开发板,无论课程内容还是开发板,每年都可能会变动以跟进新的技术发展。

创新中心的学生主要来自全校各电类相关院系,并经过严格的考核选入,都是理论成绩和实践能力兼优并对电子技术有着浓厚兴趣的学生。即便如此,笔者依然感受到FPGA应用教学的困难,特别是在引导和帮助他们使用FPGA实现具备一定难度和深度的功能的时候,或者在实现一个完备的电子电路系统,比如将FPGA用作大学生电子设计竞赛作品主控或者各类研究、双创项目的主要实现平台的时候。

笔者以为,FPGA应用教学的困难直接反映了数字电路应用教学的困难,这与传统数字电路课程设置不无关系。在电子技术子领域日趋细分、国内大学电类专业日趋细分的当代,侧重数字电路应用的专业(如通信、电气、自动化等)仍然在深入学习SR锁存器的电路构成,深入学习如何用74系列IC设计异步时序逻辑电路。笔者并不认为这些不重要,但以为这些应该是侧重数字电路理论的专业(如电子、电信等)才需要深入学习的内容,毕竟侧重数字电路应用的专业的学生以后一般不需要设计IC;不需要在数字逻辑电路中做晶体管级的优化;也不需要为少数关键路径而动用异步逻辑、锁存器逻辑。相应地,在侧重数字电路应用的专业中,现代数字电路应用中的同步时序逻辑内容并没有提升到应有的地位,与之相关的时钟概念和知识、常用的时序逻辑功能单元、基础的时序分析概念和知识也是比较缺失的。

在本书中,笔者提炼和扩展了传统数字电路课程中与FPGA应用相关的部分,形成了本书的第1章,便于读者快速强化FPGA应用设计所需的数字电路基础知识,尚未学习数字电路课程的低年级读者也可以通过学习第1章来入门数字电路基础。

第2章则是SystemVerilog(IEEE 1800—2012)简明语法讲解,主要侧重可综合(即可以在FPGA中实现)的语法,最新的IEEE 1800—2012标准较早期版本引入了不少“漂亮”的语法元素,让笔者急切地想与读者分享,后果是少数理应可综合的语法在目前主流开发工具中尚不支持,或许它们还需要一点时间来跟进,遇到这些特例,书中均会给出解决方法。

第3章是使用ModelSim进行Verilog功能仿真的简单教程。

第4章是Verilog的基本应用,这一章主要介绍各种数字逻辑基本功能单元的描述,并着重介绍了时钟、使能的概念和跨时钟域处理。从这一章起,我们正式开始了FPGA应用设计之旅。

第5章介绍IO规范,首先通识性地介绍了IO连接的常识和常见电平规范,而后以四种常见外部逻辑接口规范为例,介绍了通用接口逻辑的设计和实现。希望读者能在学习过程中领会到此类设计的一般思路和处理方法。

第6章介绍片上系统的内部互连。片上系统(SoC)结合了通用处理器和FPGA逻辑的优势,实现了软硬件协同设计,是当下FPGA应用技术的热门。而要充分利用SoC的优势,发挥软硬件协同的潜力,处理器系统与FPGA逻辑的高速互连至关重要。此章从一种简单的互连接口入手,逐步过渡到目前应用最为广泛的AXI互连协议。

第7章介绍Verilog在数字信号处理中的基本应用,主要介绍了一些基础数字信号处理算法的实现,包括频率合成、FIR和IIR滤波器、采样率变换、傅里叶变换和常见于数字控制系统的PID控制器。

第8章介绍Verilog在数字通信中的基本应用,主要介绍了基带编解码、各类基础调制解调的实现。

这些章节的依赖关系如下图所示。

本书侧重Verilog在FPGA中的应用基础,对于特定FPGA芯片、特定开发工具、特定外部连接和具体系统案例,请关注即将出版的本书的姊妹篇。

本书特别注重理论与工程实现的结合,以实现为主,以相关理论的结论为指导,读者应着重理解理论与实现的对应关系,注意培养将理论转换为工程实现的能力。

本书中的代码均为可综合代码,均是从笔者多年教学和工程实践中实际应用过的代码中提炼而来的,具备极高的实践参考价值,并大量采用参数化设计方法,大量采用生成块和常量表达式/函数,具备极高的可重用性。书中不可综合的代码只有:明确说明为测试平台;明确说明有些开发工具尚不支持的某些新语法,但一般会给出修改方法。

本书是笔者多年FPGA开发和教学经验的总结,弥补了多年来面向创新中心学生讲授FPGA应用课程时的教材缺失——虽然优秀教材有很多,但并没有特别吻合笔者思路和学生要求的。希望本书能对正在学习FPGA应用技术的本、专科学生给予有力的帮助,也希望能给正在使用FPGA进行项目开发的在校研究生、在业工程师一点借鉴和提示。

书中涉及少数较新的英文术语,因未见到广泛统一或权威的翻译,笔者尝试对其进行了翻译并在文中保留了英文,便于读者对照理解。

笔者水平有限,书中难免有偏颇谬误之处,欢迎广大读者批评指正!

最后,感谢创新中心尹仕、肖看老师和电气与电子工程学院实验教学中心的同事们!感谢我的父母、女友!感谢创新中心605实验室的同学们!由于他们的支持和帮助,本书才得以顺利完成。特别感谢姜鑫同学通读了书稿,并协助我完成了部分审校工作;特别感谢我的女友帮助绘制了书中电路图的国标版本,特别感谢出版社的编辑们进一步修订了这些电路图。第1章数字电路基础

本章介绍数字电路的一些基础知识。在FPGA应用领域,对许多经典的数字电路知识的依赖逐渐减少,因而本章并不会太细致地讲述数字电路的基本原理和相关知识,而是提纲挈领地带领读者了解数字电路的原理并掌握FPGA开发必要的知识。1.1 模拟电路与数字电路

在自然界中,特别是在宏观世界中,大多数物理量都是随时间连续变化的函数,而且取值也是连续的。例如声音,一个声压级约为80dB、频率为440Hz的声音的声压随时间变化的函数图像如图1-1所示,它是一个正弦函数图像。我们称随时间变化的函数为时域信号,或简称为“信号”,称信号的图像为“波形”。

图1-2所示则是人声“啊”的声压波形。图1-1 80dB、440Hz声音的波形图1-2 人声“啊”的波形

这两个信号都是在时间上连续,在取值上也连续,这样的信号称为“模拟信号”。

在电路中,可以用电压信号来表达声压信号,充当声压信号和电压信号相互转换的器件便是大家熟知的麦克风或扬声器。以一个扩音机为例,麦克风将空气中的声压信号转换为电路中的电压信号,常见的麦克风转换声压到电压的灵敏度在10mV/Pa量级,毫伏级的信号经由电压放大器放大至数伏或数十伏之后,再由功率放大器增大输出功率推动扬声器发声,常见的扬声器的灵敏度(在距离它1m处产生的声压与输入功率之比)为90dB/W左右。

像扩音机这样处理模拟信号的电路,称为模拟电路。在模拟电路中,一般使用电路节点上的电压或回路中的电流来表达我们感兴趣的信号。

我们也可以直接使用“数”来表达信号,例如图1-2所示的人声“啊”的声压信号,其取值大致可以用区间(-0.1,0.1)的实数(以Pa为单位)来表达。信号在时间上连续,所以一段时间的信号需要无数个实数,而实数往往又是无限长的(比如循环小数或无理数),所以这样用“数”表达信号的方式并不现实。

但是,在时间上我们并不需要记录无限个数值,可以每隔一段足够短的时间记录一个,比如每隔125μs记录一个,这称为“采样”,“采样周期”为125μs,即“采样率”为1/125μs=8kHz,或称8ksps(Samples per Second),采样后,信号在时间上变得离散。在值域上也不必使用连续的实数区间,可以使用足够小的细分阶梯,比如把每个值四舍五入到整1mPa,称为“量化”,“量化间隔”是1mPa,即“分辨率”是0.2Pa/1mPa=200。只要采样率足够高、量化分辨率足够高,几乎就可以无损失地记录原始信号。图1-3所示是图1-2所示信号0~5ms部分经过采样和量化之后的图像。

其中,数据值序列是:{-0.040,-0.035,-0.010,-0.003,0.029,0.039,0.038,0.010,…},精确到0.001。

如果使用电子电路进行采样和量化,一般使用模-数转换器(ADC),它可在一定的时间节拍控制下,将一定范围内的模拟电压信号,逐个线性地转换为一定范围内的有限字长的数。比如在8kHz的节拍下,将区间[0V,1V)的电压线性地转换为[-128,127]的整数——0V对应着-128、1V/256对应着-127、…、255V/256对应着127。如果我们将图1-2所示的区间[-0.1Pa,0.1Pa)的信号,经过10mV/Pa灵敏度的麦克风,将得到区间[-1mV,1mV)的电压信号;再经过500倍电压放大和+0.5V的偏置,将得到区间[0V,1V)的电压;最后使用ADC,则可得到[-128,127)间的数,如图1-4所示。图1-3 采样量化后的人声“啊”图1-4 经过转换和ADC采样之后的人声“啊”

其中,数值序列是:{-51,-44,-13,-4,37,49,49,13,…}。

在现在的电子电路中,准确表达数值的方式是使用多个电路节点组成多位“二进制”,每个节点的电压代表一个二进制位。电压接近电源电压,称为“高电平”,代表二进制数字“1”,电压接近地电压(0V),称为“低电平”,代表二进制数字“0”,表达二进制数值的多个节点也称为“总线”。当然,如果把节点电压按照高低区分为高电平、中电平和低电平,也可使用三进制来把多个节点的电平组合成数值。以此类推,还可以有其他进制的表达方法。

这种使用节点电平高低表达有限字长的数值、使用数值表达或处理信号、信号在时间上离散的电路,称为“数字电路”。目前几乎所有数字电路都是使用二进制来表达数值。

数字电路表达信息不易受到干扰,电路模式也相对模拟电路规整单一,但电路规模相较于同等功能的模拟电路庞大很多。不过得益于大规模集成电路制造工艺和数字电路自动化设计工具的发展,数字电路的优势越来越明显,越来越多的信号处理、记录都采用数字电路实现,整个计算机技术的发展也是建立在数字电子技术之上。

当然,模拟电路也绝不会销声匿迹,其重要性从未因为数字电路的兴起而降低。往大处说,我们生活的宏观世界的一切都是模拟的,信息的处理、记录可以用数字方式,但信息的采集和复现一定是模拟的;往小处说,功率的放大、高带宽信号的处理、通信中的射频电路等许多地方,还是目前的数字电路无法涉及的。1.2 二进制相关知识1.2.1 二进制和其他进制

十进制是我们日常使用的进制,不同位的数字代表10的不同次幂,小数点左侧的数字为0次,向左依此增加,向右依此减小。例如:

即:

其中,F是小数位数,I是整数位数,d是第i位上的数字,显然0≤id≤9且d∈Z。ii

假设我们需要使用节点电平来表达某位上的数字,如果采用十进制则需要区分10个不同的电平,在后续计算和处理上会比较麻烦,而如果采用二进制,则只需区分高低两种电平,显然更为简单。

与十进制类似,可以定义二进制的值:

其中,F是小数位数,I是整数位数,b是第i位上的数字,显然bii只能是0或1。于是有这样的例子:

其中括号右下角的“2”表示括号内是二进制数,以示与十进制的区分。

当然也可以有负数:

有时也这样写二进制数:0b11011.101、-0b101.101,b取binary之意。i

注意,本书后续称二进制数的第i位均指代表的数量等于2的那一i位,这个2也称为第i位的“权”,如0b101.01:

小数点左侧那一位称为“第0位”,再向左依次称为“第1位”、“第2位”、…,向右依次称为“第-1位”、“第-2位”、…

与式(1-2)类似,还有十六进制:

显然,x可以是0~15的整数,然而阿拉伯人并没有创造10~15i的单字,我们也不能在一位上写上两位,于是借用拉丁字母的a~f依次来表达10~15。于是有这样的例子:

同样也可以有负数。有时也这样写十六进制数:0xa05.9f、-0x10.e。x取hexadecimal之意。

因为一定范围的二进制数书写起来很长,而十六进制与二进制的4转换很方便(2=16,四位二进制正好对应一位十六进制),所以在数字电路和计算机专业中,常常书写十六进制而不是二进制。除十六进制外,八进制也较为常用。

十进制计数是“逢十进位”,二进制计数则是“逢二进位”。例如二进制数0~10:0b0、0b1、0b10、0b11、0b100、0b101、0b110、0b111、0b1000、0b1001、0b1010。

二进制的“位”,英文为“bit”;8位二进制组合在一起,称为一“字节”(byte)。1.2.2 进制间的相互转换

二进制向十进制的转换直接使用式(1-2)即可。

十进制向二进制的转换可分整数部分和小数部分分别进行,整数部分使用短除法,小数部分使用短乘法。比如25.375,其整数部分是25:

每次的余数写在短除式的右侧,最后将所有的余数自下而上组合得到“11001”,即为25的二进制表达。

25.375的小数部分是0.375:

每次乘法只对小数部分做,直到小数部分为0,或达到所需的精度(因为常常乘不尽),最后将进位得到的所有整数部分自上而下组合得到“.011”即是0.375的二进制表达。所以25.375=0b11001.011

但即使是有限长的十进制也常常乘不尽,比如0.2:

于是,是一个二进制无限循环小数,这时,只需要取到足够精度即可。有限长十进制小数转换为二进制未必还是有限长的,但有限长的二进制小数转换为十进制却一定还是有限长的,这与数制基数的质因数有关,有兴趣的读者可查阅相关数学书籍;无理数放之任何整数制下都是无限不循环的,有理数放之任何整数制下也都是或有限或无限循环的。

前面说过,四位二进制正好对应一位十六进制,如表1-1所示。表1-1 四位二进制与十六进制对应

将二进制转换为十六进制只需要从小数点向左和向右每四位一节,然后查表1-1即可,反之就更简单了。例如:0b10,1101,0100.1010,1=0x2d4.a8,0x5.c=0b101.11。

十进制与十六进制的转换可以仿照与二进制互相转换的短除法和短乘法进行。

在后续的章节中,十六进制会经常用到,希望读者将表1-1倒背如流!1.2.3 二进制的四则运算

二进制加法:满2进1,可与十进制加法相似地使用竖式计算,如0b110.11+0b1110.01=0b10101.00,即6.75+14.25=21:

二进制减法:借1当2,使用竖式计算,如0b1100.01-0b110.11=0b101.1,即12.25-6.75=5.5:

乘法和除法类似,如0b1011.1×0b10.1=0b11100.11,即11.5×2.5=28.75:

除法如0b1011.1÷0b10.1=0b100.100110·011·,即11.5÷2.5=4.6:1.3 二进制在电路中的表达

本节主要介绍二进制整数在电路中的表达和计算,关于二进制表达小数的问题将在1.11节介绍。1.3.1 有限字长和补码

在电子电路中,二进制数的字长(即位数,或称“位宽”)一定是有限的,如果要明确地表达某个二进制数是有限的若干位,可以使用这样的写法:

有限位二进制中的最低位称为“LSB”,为Least Significant Bit之缩写;最高位称为“MSB”,为Most Significant Bit之缩写。48

4位二进制共能表达2=16个数,8位二进制共能表达2=256个数。16和256分别称为4位二进制和8位二进制的“模”。对于W位的二进制,其模M:W

如果两个位宽同为W位的二进制数a和b之和等于模,即2,则称a和b互为补码,或者说a是b的补码、b是a的补码,例如,对于4位二进制,4'b11和4'b1101互为补码;对于8位二进制,8'b10100101和8'b1011011互为补码。1.3.2 负数、有符号数和无符号数

如何在电路中表达二进制负数?最简单的方法是专门使用一位记录符号,低电平为正、高电平为负,而用剩余的位记录绝对值。例如:

但是,这样的记录方法在用电路实现有关负数的运算的时候,电路将比另一种称为“补码表达”的记录方法复杂。

有限字长的二进制数不断计数,或者加上足够大的数,必然会发生溢出。以4位二进制为例,4'b1111再加一,将得到5'b10000,这是无法用4位记录的,一般只能留下低四位。于是,对于4位二进制,有:

那么,是不是可以认为

即:4'b1111=-1,或者更准确地说,4'b1111表达了-1呢?

这样的表达负数的方法称为“补码表达”,即在一定的位宽下,使用负数绝对值的补码来表达负数,而不是使用额外的位来记录符号。对于4位二进制的补码表达见表1-2。表1-2 4位补码表达负数

4位二进制一共可表达16个数,除去没有补码的0,一般也并不会将剩下的全部15个都用来表达负数。在需要4位二进制数既能表达正数又能表达负数的时候,一般使用8个表达负数,8个表达非负数,称为4位“有符号数”。在不需要表达负数时,4位二进制数直接表达16个非负数,称为“无符号数”。4位二进制表达有符号数和无符号数如表1-3所示。表1-3 4位二进制表达有符号数和无符号数

可以看出,二进制的最高位为“1”时,有符号数为负数,而最高位为“0”时,有符号数为正数或零。因此,有符号数的二进制最高位也称为“符号位”,虽然有点名不副实(数学中一般认为0没有符号)。

W位二进制有符号可表达数的范围是:W-1W-1

有时也写作[-2,2)。反过来,对于某个数x,使用二进制有符号数表达时需要的位数是:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载