FPGA-Verilog学习资料目录第1章概述..........................................................................................................11.1数字逻辑.....................................................................................................11.2Verilog..........................................................................................................2第2章基本逻辑门..............................................................................................32.1真值表和逻辑表达式.................................................................................32.1.1三种基本逻辑门..................................................................................32.1.2四种常用逻辑门..................................................................................42.2基于乘积和的设计.....................................................................................62.3基于和项积的设计.....................................................................................8第3章现场可编程门阵列(FPGA)...................................................................21第4章Basys2原理图.......................................................................................25第5章组合逻辑................................................................................................32第6章运算电路................................................................................................83第7章时序电路..............................................................................................110附录A代码仿真及设计实现..........................................................................1611第1章概述1.1数字逻辑今天的数字设计人员用硬件描述语言(HDL)设计数字电路系统。其中,应用最广泛的硬件描述语言是VHDL和Verilog。这两种硬件描述语言都允许用户通过程序描述数字电路的行为,从而进行数字电路的设计。这些程序可以被用来仿真电路的功能,以及综合到CPLD,FPGA或专用集成电路(ASIC)中。为了让大家更容易地掌握Verilog知识,本书在介绍基础数字电路设计的过程中列举了很多Verilog的例程,并假设读者一没有任何的数字逻辑基础知识。我们将用XilinxISE来仿真和综合我们的Verilog代码。Verilog程序可以用任何Verilog仿真器仿真。在附录A中,我们提供了一卜简明的XilinxISE软件的使用向导。你可以在Xilinx网站上下载免费版的ISETMWebPACKTM。在程序实现过程中,产生的“*.bit”文件可以下载到BASYS2,NEXYS2(如图1.1所示)和类似功能的FPGA开发板上。Digilent公司的BASYS2开发板包含一块10万门的XilinxSpartan3EFPGA(同时提供25万门的版本)、8个拨位开关、4个按钮开关、8个LED和7段数码管。开发板上时钟频率可采用跳线的方式将其设置为25MHz、50MHz或100MHz。同时,它还提供了外部电路的接口,包含一个VGA口和一个PS/2口。NEXYS2开发板和BASYS2有些类似,但是其功能更为强大,它包含一块50万门或120万门的Spartan3EFPGA、一个HiroseFX2扩展口、16MB的快速PSDRAM,16MB的Flash,50MHz时钟和为外部时钟而设的管座。这使得NEXYS2非常适用于嵌入式处理。本书中所有的Verilog程序都可以用BASYS2,NEXYS2和类似功能的FPGA开发板来实现。唯一的区别在于,不同的开发板需要选用不同的约束文件,文件“nexys2.ucf约束NEXYS2开发板中的引脚,文件“basys2.ucf”约束BASYS2开发板中的引脚。相关的配套资料可以到译者序中提供的网址下载。表1.2列出了BASYS2开发板和NEXYS2开发板的跳线设置。2(a)BASYS2开发板(b)NEXYS2开发板图1.1开发板实物图表1.1开发板跳线设置BASYS2开发板NEXYS2开发板JP3跳线设置为JTAG电源选项跳线设置为USB移除JP4跳线选择50MHz时钟模式跳线设置为JTAG1.2VerilogVerilog基于C语言但又不是C语言,它是硬件描述语言,用来对数字逻辑电路进行建模。它和C语言的语法非常相似,但语言本身的行为却大不相同。在本书中,你可以通过学习其中的例程,以及完成每章之后的习题来学习Verilog。和任何程序语言一样,你只有通过自己编写程序,然后仿真你的设计并观察输出波形才能学会Verilog。除此之外,通过这样的力一法,你还能学会数字电路的设计方法。3第2章基本逻辑门所有的数字系统都由一些基本的数字电路,也就是逻辑门构成。它们实现最基本的逻辑函数,这在本章将会详细讲解。而逻辑门电路的实现方式也在过去的数十年中经历了继电器、电子管、晶体管及集成电路的演变过程。2.1真值表和逻辑表达式所有计算机里的数据都是以二进制的形式存储的。这些二进制位通常被认为是逻辑值0和1。其中,1为“真”而0为“假”。与其相关联的物理量可以是低电平(0)或高电平(5V)。对于所有可能的逻辑输入,真值衷定义了其对应的逻辑输出。在本节中我们将通过真值表介绍3种基本的逻辑门:非门、与门和或门,然后我们将用这3种基本逻辑门来定义一些其他的逻辑门。利用真值表我们将认识著名的迪摩根定律,接着我们将讨论将0作为“真”,将1作为“假”的可能性,这将加深我们对各种门的认识。2.1.1三种基本逻辑门1.非门图2.1所示为非门的逻辑符号和真值表。非门的逻辑符号为一个输入x和个输出y。y的值是x的反码。当x为0时,Y为1;当x为1时,Y为0。简单地说,非门就是将输入值取反并输出。常见的取反运算表达形式有y=x′y=!xy=xy=/xy=-x在Verilog中,用“~”图2.1所示非门的表达式为y=~x。2.与门图2.2所示为与门的逻辑符号和真值表。与门的逻辑符号为两个输入x,y及一个输出z。仅当x,都为1(“真”或高电平)时,与门的输出z为1;当x或y其中有一个为0。时,输出z为0。常见的与运算表达形式有Z=x∩yx*yxy4最后一种表达方式限制了逻辑变量名只能包含单个字母。图2.1非门图2.2与门在Verilog中,用“&”符号作与运算符。图2.2所示与门的表达式为z=x&y。3.或门图2.3所示为或门的逻辑符号和真值表。或门的逻辑符号为两个输入x,y和一个输出z。当x或y中有一个为1(真”或高电平)或两个都为1时,或门输出z为1;只有当x和y都为0时,输出z为0。常见的或运算表达形式有z=x+yx#yx∨yx∪y在Verilog中,用“|”符号作或运算符。图2.3所示或门的表达式z为:z=x|y。图2.3或门可能会使人惊讶的地方在于,所有的数字系统,包括计算机,都可以用这3种基本的逻辑门构建。接下来我们将介绍其他4种常用逻辑门,它们也可以用上述的基本逻辑门构建,表达式中运算符采用Verilog语言符号。2.1.2四种常用逻辑门利用之前所述3种基本逻辑门,我们可以构建4种新的常用逻辑门:与非、或非、异或及同或门。1.与非门5图2.4所示为与非门的逻辑符号和真值表。与非门的逻辑符号同与门的逻辑符号非常相似,只是在输出端多了一个小圆圈。从真值表中我们看到,当且仅当与非门的两个输入都为1时,输出z为0;否则,z为1。另外,从图中两个真值表中我们得知,与非门等价于与门连接一个非门。图2.4与非门2.或非门图2.5所示为或非门的逻辑符号和真值表。或非门的逻辑符号同或门的逻辑符号非常相似,只是在输出端多了一个小圆圈。从真值表中我们看到,当且仅当或非门的两个输入都为0时,输出z为1。或非门等价于或门之后接一个非门。图2.5或非门3.异或门图2.6所示为异或门的逻辑符号和真值表。异或门的逻辑符号同或门的逻辑符号相似,只是在输入端多了一段圆弧。从真值表中我们看到,当异或门的两个输入不同〔一个为1,一个为0)时,输出z为1;当两个输入相同(同6为1或同为0)时,输出z为0。在Verilog中,用“^”符号作异或运算符。异或门的逻辑表达式为z=x^y。从图2.6中我们看到,异或门可以通过两个反相器、两个与门和一个门构建。因此,异或运算叫一以写成:z=x^y=(~x&y)}(x&~y)(2.1)图2.6异或门4.同或门图2.7所示为同或门的逻辑符号和真值表。同或门实质上就是非异或门,所以它的逻辑符号与异或门的逻辑符号相似,只是在输出端多了一个小圆圈。从真值表中我们看到,当同或门的两个输入相同时(同为0或同为1时),其输出为1;当两个输入不同时(一个为1而另一个为0),其输出为0。图2.7同或门在Verilog中,用“~^”,符号作同或运算符。同或门的逻辑表达式为z=x~^y。72.2基于乘积和的设计对于真值表中的每一行,都可以写出对应的乘积项,也就是最小项(minterm)。最小项由各输入变量做与运算构成。如果真值表中某行某一变量(比如x)的输入值为1,我们直接将其写为x。与此相对,如果其输入值为0,我们就将其写为~x。因此,对于图2.8所示的真值表中的第一行,其最小项应写成m0=~x&~y。注意:当x和y均为0时,其输出值为0。同样,第三行的最小项应为m2=x&~y。注意:当x为1且Y为0时,其输出为1。图2.8列出了两输入(x,y)户的所有最小项表达式。图2.8基于1输出的乘积和设计图2.8所小右边的真值表对应异或运算函数。观察其中输出为1的各行,我们注意到当m1或m2为1时,输出z为1。而当x为。且y为1时,ml为1,因为此时~x&y的值为1。同理,当x为1目~y为0时,m2为1。将ml和m2(也就是输出值为1的最小项)做或运算,就可以得到z的最终表达式:z=m1|m2(2.2)=(~x&y)|(x&y)这同我们在图2.6中所用的异或表达式一模一样。在逻辑表达式中,我们采用以下的优先级定义:(1)所有取反运算(“~”)最先被执行。(2)所有与运算(“&”)其次被执行。(3)所有或运算(“|“)最后被执行。根据优先级的定义,式(2