拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FPGA应用开发和仿真【1.0】

第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.10.1的实数以Pa为单位来表达。信号在时间上连续所以一段时间的信号需要无数个实数而实数往往又是无限长的比如循环小数或无理数所以这样用“数”表达信号的方式并不现实。但是在时间上我们并不需要记录无限个数值可以每隔一段足够短的时间记录一个比如每隔125μs记录一个这称为“采样”“采样周期”为125μs即“采样率”为1/125μs8kHz或称8kspsSamples per Second采样后信号在时间上变得离散。在值域上也不必使用连续的实数区间可以使用足够小的细分阶梯比如把每个值四舍五入到整1mPa称为“量化”“量化间隔”是1mPa即“分辨率”是0.2Pa/1mPa200。只要采样率足够高、量化分辨率足够高几乎就可以无损失地记录原始信号。图1-3所示是图1-2所示信号05ms部分经过采样和量化之后的图像。其中数据值序列是{-0.040-0.035-0.010-0.0030.0290.0390.0380.010…}精确到0.001。如果使用电子电路进行采样和量化一般使用模-数转换器ADC它可在一定的时间节拍控制下将一定范围内的模拟电压信号逐个线性地转换为一定范围内的有限字长的数。比如在8kHz的节拍下将区间0V1V的电压线性地转换为-128127的整数——0V对应着-128、1V/256对应着-127、…、255V/256对应着127。如果我们将图1-2所示的区间-0.1Pa0.1Pa的信号经过10mV/Pa灵敏度的麦克风将得到区间-1mV1mV的电压信号再经过500倍电压放大和0.5V的偏置将得到区间0V1V的电压最后使用ADC则可得到-128127间的数如图1-4所示。图1-3 采样量化后的人声“啊”图1-4 经过转换和ADC采样之后的人声“啊”其中数值序列是{-51-44-13-437494913…}。在现在的电子电路中准确表达数值的方式是使用多个电路节点组成多位“二进制”每个节点的电压代表一个二进制位。电压接近电源电压称为“高电平”代表二进制数字“1”电压接近地电压0V称为“低电平”代表二进制数字“0”表达二进制数值的多个节点也称为“总线”。当然如果把节点电压按照高低区分为高电平、中电平和低电平也可使用三进制来把多个节点的电平组合成数值。以此类推还可以有其他进制的表达方法。这种使用节点电平高低表达有限字长的数值、使用数值表达或处理信号、信号在时间上离散的电路称为“数字电路”。目前几乎所有数字电路都是使用二进制来表达数值。数字电路表达信息不易受到干扰电路模式也相对模拟电路规整单一但电路规模相较于同等功能的模拟电路庞大很多。不过得益于大规模集成电路制造工艺和数字电路自动化设计工具的发展数字电路的优势越来越明显越来越多的信号处理、记录都采用数字电路实现整个计算机技术的发展也是建立在数字电子技术之上。当然模拟电路也绝不会销声匿迹其重要性从未因为数字电路的兴起而降低。往大处说我们生活的宏观世界的一切都是模拟的信息的处理、记录可以用数字方式但信息的采集和复现一定是模拟的往小处说功率的放大、高带宽信号的处理、通信中的射频电路等许多地方还是目前的数字电路无法涉及的。1.2 二进制相关知识1.2.1 二进制和其他进制十进制是我们日常使用的进制不同位的数字代表10的不同次幂小数点左侧的数字为0次向左依此增加向右依此减小。例如即其中F是小数位数I是整数位数di是第i位上的数字显然0≤di≤9且di∈Z。假设我们需要使用节点电平来表达某位上的数字如果采用十进制则需要区分10个不同的电平在后续计算和处理上会比较麻烦而如果采用二进制则只需区分高低两种电平显然更为简单。与十进制类似可以定义二进制的值其中F是小数位数I是整数位数bi是第i位上的数字显然bi只能是0或1。于是有这样的例子其中括号右下角的“2”表示括号内是二进制数以示与十进制的区分。当然也可以有负数有时也这样写二进制数0b11011.101、-0b101.101b取binary之意。注意本书后续称二进制数的第i位均指代表的数量等于2i的那一位这个2i也称为第i位的“权”如0b101.01小数点左侧那一位称为“第0位”再向左依次称为“第1位”、“第2位”、…向右依次称为“第-1位”、“第-2位”、…与式1-2类似还有十六进制显然xi可以是015的整数然而阿拉伯人并没有创造1015的单字我们也不能在一位上写上两位于是借用拉丁字母的af依次来表达1015。于是有这样的例子同样也可以有负数。有时也这样写十六进制数0xa05.9f、-0x10.e。x取hexadecimal之意。因为一定范围的二进制数书写起来很长而十六进制与二进制的转换很方便2416四位二进制正好对应一位十六进制所以在数字电路和计算机专业中常常书写十六进制而不是二进制。除十六进制外八进制也较为常用。十进制计数是“逢十进位”二进制计数则是“逢二进位”。例如二进制数0100b0、0b1、0b10、0b11、0b100、0b101、0b110、0b111、0b1000、0b1001、0b1010。二进制的“位”英文为“bit”8位二进制组合在一起称为一“字节”byte。1.2 二进制相关知识1.2.1 二进制和其他进制十进制是我们日常使用的进制不同位的数字代表10的不同次幂小数点左侧的数字为0次向左依此增加向右依此减小。例如即其中F是小数位数I是整数位数di是第i位上的数字显然0≤di≤9且di∈Z。假设我们需要使用节点电平来表达某位上的数字如果采用十进制则需要区分10个不同的电平在后续计算和处理上会比较麻烦而如果采用二进制则只需区分高低两种电平显然更为简单。与十进制类似可以定义二进制的值其中F是小数位数I是整数位数bi是第i位上的数字显然bi只能是0或1。于是有这样的例子其中括号右下角的“2”表示括号内是二进制数以示与十进制的区分。当然也可以有负数有时也这样写二进制数0b11011.101、-0b101.101b取binary之意。注意本书后续称二进制数的第i位均指代表的数量等于2i的那一位这个2i也称为第i位的“权”如0b101.01小数点左侧那一位称为“第0位”再向左依次称为“第1位”、“第2位”、…向右依次称为“第-1位”、“第-2位”、…与式1-2类似还有十六进制显然xi可以是015的整数然而阿拉伯人并没有创造1015的单字我们也不能在一位上写上两位于是借用拉丁字母的af依次来表达1015。于是有这样的例子同样也可以有负数。有时也这样写十六进制数0xa05.9f、-0x10.e。x取hexadecimal之意。因为一定范围的二进制数书写起来很长而十六进制与二进制的转换很方便2416四位二进制正好对应一位十六进制所以在数字电路和计算机专业中常常书写十六进制而不是二进制。除十六进制外八进制也较为常用。十进制计数是“逢十进位”二进制计数则是“逢二进位”。例如二进制数0100b0、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.3750b11001.011但即使是有限长的十进制也常常乘不尽比如0.2于是是一个二进制无限循环小数这时只需要取到足够精度即可。有限长十进制小数转换为二进制未必还是有限长的但有限长的二进制小数转换为十进制却一定还是有限长的这与数制基数的质因数有关有兴趣的读者可查阅相关数学书籍无理数放之任何整数制下都是无限不循环的有理数放之任何整数制下也都是或有限或无限循环的。前面说过四位二进制正好对应一位十六进制如表1-1所示。表1-1 四位二进制与十六进制对应将二进制转换为十六进制只需要从小数点向左和向右每四位一节然后查表1-1即可反之就更简单了。例如0b1011010100.101010x2d4.a80x5.c0b101.11。十进制与十六进制的转换可以仿照与二进制互相转换的短除法和短乘法进行。在后续的章节中十六进制会经常用到希望读者将表1-1倒背如流1.2.3 二进制的四则运算二进制加法满2进1可与十进制加法相似地使用竖式计算如0b110.110b1110.010b10101.00即6.7514.2521二进制减法借1当2使用竖式计算如0b1100.01-0b110.110b101.1即12.25-6.755.5乘法和除法类似如0b1011.1×0b10.10b11100.11即11.5×2.528.75除法如0b1011.1÷0b10.10b100.100110·011·即11.5÷2.54.61.3 二进制在电路中的表达本节主要介绍二进制整数在电路中的表达和计算关于二进制表达小数的问题将在1.11节介绍。1.3.1 有限字长和补码在电子电路中二进制数的字长即位数或称“位宽”一定是有限的如果要明确地表达某个二进制数是有限的若干位可以使用这样的写法有限位二进制中的最低位称为“LSB”为Least Significant Bit之缩写最高位称为“MSB”为Most Significant Bit之缩写。4位二进制共能表达2416个数8位二进制共能表达28256个数。16和256分别称为4位二进制和8位二进制的“模”。对于W位的二进制其模M如果两个位宽同为W位的二进制数a和b之和等于模即2W则称a和b互为补码或者说a是b的补码、b是a的补码例如对于4位二进制4b11和4b1101互为补码对于8位二进制8b10100101和8b1011011互为补码。1.3.2 负数、有符号数和无符号数如何在电路中表达二进制负数最简单的方法是专门使用一位记录符号低电平为正、高电平为负而用剩余的位记录绝对值。例如但是这样的记录方法在用电路实现有关负数的运算的时候电路将比另一种称为“补码表达”的记录方法复杂。有限字长的二进制数不断计数或者加上足够大的数必然会发生溢出。以4位二进制为例4b1111再加一将得到5b10000这是无法用4位记录的一般只能留下低四位。于是对于4位二进制有那么是不是可以认为即4b1111-1或者更准确地说4b1111表达了-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位二进制有符号可表达数的范围是有时也写作-2W-12W-1。反过来对于某个数x使用二进制有符号数表达时需要的位数是其中符号表达上取整ceiling·函数即取不小于自变量的最小整数。上式等价于其中·符号表达下取整floor·函数即取不大于自变量的最大整数。因正数的下取整即是直接舍去小数部分的取整在计算机中容易实现故式1-5更常用。W位二进制无符号可表达数的范围是有时也写作02W。反过来对于某个数x使用二进制无符号数表达时需要的位数是表1-3还可以换成更形象直观的“数轮”如图1-5和图1-6所示。图1-5 4位有符号数的数轮图1-6 4位无符号数的数轮在图1-5和图1-6中圆圈内为4位二进制数圆圈外为表达的有符号数或无符号数从圆心出发的射线为数值边界。围绕圆周顺时针方向旋转一格数值加一逆时针方向旋转一格数值减一。对一个数加上几相当于从这个数开始沿圆周顺时针走几格而减去几相当于从它开始沿圆周逆时针走几格。如果穿越边界则发生溢出。加溢出时相当于结果减掉模即16减溢出时相当于结果加上模。容易看出如果考虑溢出无论是有符号数还是无符号数在表达它们的二进制数的加减运算上都是一样的而且减法等同于被减数加上减数的补码表1-4所示是一些具体的例子其中的“→”表示发生溢出后的结果。表1-4 补码表达下有符号数和无符号数加减运算的一致性例子补码表达下加减运算的这些一致性和简便性使得补码成为数字电路和计算机中表达负数几乎唯一的方法。对于加减运算如果要避免溢出结果必须至少扩展一位。而对于乘法运算情况则复杂得多须分无符号和有符号讨论。无符号乘法。W位二进制无符号数的范围是02W-1两个W位二进制无符号数相乘积的最小值自然是0最大值将是而当且仅当W1时取等号。因此在W≥2时2W位无符号数恰好可表达所有可能的结果。以4位为例乘积的最大结果即15×15225log2225≈7.81自然是需要8位。有符号乘法。W位二进制有符号数的范围是-2W-12W-1-1两个W位二进制有符号数相乘积的最小值是而当且仅当W2时取等号。因此在W≥3时2W-1位有符号数恰好可以表达积的所有负值。积的最大值是而当且仅当W1时取等号。为了表达这个最大值需2W位有符号数才能表达。再考虑积的次大值而所以在W≥2时这个次大值只需要2W-1位即可表达。这意味着在两个有符号数位宽W≥3时事实上在数字电路和计算机中表达数值的二进制很少有2位或以下的为了表达它们的乘积的所有可能情况确实需要2W位而只要剔除“-2W-1×-2W-1”这个唯一情况便只需要2W-1位即可全部表达了是不是有些浪费仍然以4位有符号数为例见表1-5。表1-5 4位有符号数乘法示例可以看到除了-8×-8这一种情况之外8位积的最高位即符号位与次高位都是一致的只需要低7位即可完整表达除-8×-8外的所有积。而如果需要能表达-8×-864这一个结果则需要再增加一位。对于两个不同宽度的二进制数的加减和乘法的情况读者可自行探究。1.4 门电路和基本逻辑运算“门”是输入一位或多位逻辑电平而输出一位逻辑电平的电路可实现基本的逻辑运算。最基本的逻辑运算有非、与和或对应的三种门电路是非门、与门和或门。在非、与和或运算基础上还衍生有与非、或非、异或、同或运算及其门电路。除了这些能输出高、低逻辑电平的“门”外还有能输出“高阻态”的三态门。1.4.1 非门、与门和或门非门NOT Gate包含一个输入端口和一个输出端口输出端口的电平等于输入端口电平“取反”即输入高电平时输出低电平输入低电平时输出高电平所以也称为“反相器”。其符号如图1-7所示。注意输出引脚上的小圆圈表示“取反”的意思。图1-7 非门的符号表1-6 非门的真值表图1-8 两输入与门的符号图1-9 三输入与门的符号表1-7 两输入与门的真值表图1-10 两输入或门的符号表1-8 两输入或门的真值表如果用A表示输入Y表示输出“非”逻辑运算表达为读作“A非”或“A反”。可以在一张表中罗列出所有输入情况对应的输出如表1-6所示这样的表也称为“真值表”。与门AND Gate有两个或更多输入和一个输出当所有输入都为“1”时输出“1”否则输出“0”。两输入与门的符号如图1-8所示。如果有多个输出则在符号输入一侧增加引脚即可如图1-9所示是三输入与门的符号。如果用A和B表示两输入与门的输入Y表示输出“与”逻辑运算表达为YA·B读作A与B。如有三个输入YA·B·C以及多个输入Y∏Ai表1-7是两输入与门的真值表。或门OR Gate有两个或更多输入和一个输出当所有输入都为“0”时输出为“0”否则输出“1”。两输入或门的符号如图1-10所示。如果有多个输入则在符号输入一侧增加引脚即可。如果用A和B表示两输入或门的输入Y表示输出“或”逻辑运算表达为YAB对于多个输入Y∑Ai表1-8是两输入或门的真值表。1.4.2 与非门和或非门与非门NAND Gate在逻辑上等同于与门后再接一个非门或非门NOR Gate在逻辑上等同于或门后再接一个非门它们的符号如图1-11和图1-12所示均只是在与门或或门的输出引脚上添加了一个表示“取反”的小圆圈。图1-11 两输入与非门的符号图1-12 两输入或非门的符号两输入与非的逻辑表达式为两输入或非的逻辑表达式为表1-9和表1-10分别是两输入与非门和两输入或非门的真值表。表1-9 两输入与非门的真值表表1-10 两输入或非门的真值表1.4.3 异或门和同或门异或门Exclusive-ORXOR有两个输入和一个输出。两个输入的电平不一致时输出为高否则为低同或门Exclusive-NORXNOR有两个输入和一个输出两个输入的电平一致时输出为高否则为低。图1-13 由非门、与门和或门构成的异或门异或门可以由非门、与门和或门构成如图1-13所示。其逻辑表达式是也可用专属的符号表1-11是异或门的真值表根据图1-13表中也列出了中间变量C、D、E、F。表1-11 异或门的真值表与门和或门输入端的非门也可以简化成在输入端增加一个小圆圈图1-13可简化为图1-14。图1-14 异或门电路的简化画法图1-15 异或门的符号图1-16 由非门、与门和或门构成的同或门表1-12 同或门的真值表图1-17 同或门的符号表1-13 同或门的真值表及其最小项异或门也有专门的符号如图1-15所示。同或门可以由非门、与门和或门构成如图1-16所示。其逻辑表达式是也可用专属的符号表1-12是同或门的真值表。同或门与异或门的输出刚好相反因此它的符号就是在异或门的输出上增加了一个小圆圈如图1-17所示。1.4.4 三种表达形式的转换逻辑电路、逻辑表达式和真值表是逻辑运算的三种表达形式它们之间是相互等价的是可以互相转换的。逻辑电路和逻辑表达式的转换只需要“对照着写”或“对照着画”即可上一节异或门的逻辑表达式YA·BA·B及其逻辑电路图1-13便是很好的例子。逻辑表达式和真值表的转换则比较麻烦。从逻辑表达式转换为真值表需要罗列所有可能的输入情况对于有N个输入的表达式则需罗列2N种情况然后再计算每种情况的输出值。从真值表到逻辑表达式的转换可采用“最小项之或”的方法。以表1-12为例列出每一行的“最小项”表达式如表1-13所示。所谓“最小项”是指包含所有变量的与式每个变量可以是自身或是自身的反。真值表中的每一行对应一个最小项如果该行某个变量取值为1则它在最小项中取自身否则取反。最后将所有函数值为1的行的最小项进行或运算对于自变量再多一些的真值表这样求得的表达式多半不是最简的或需要进行化简这将在1.4.8节中介绍。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门