第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念

shift后门怎么用  时间:2021-04-04  阅读:()

1第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念引言:现代计算机与通讯系统电子设备中广泛使用了数字信号处理专用集成电路,它们主要用于数字信号传输中所必需的滤波、变换、加密、解密、编码、解码、纠检错、压缩、解压缩等操作.
这些处理工作从本质上说都是数学运算.
从原则上讲,它们完全可以用计算机或微处理器来完成.
这就是为什么我们常用C、Pascal或汇编语言来编写程序,以研究算法的合理性和有效性的道理.
在数字信号处理的领域内有相当大的一部分工作是可以事后处理的.
我们可以利用通用的计算机系统来处理这类问题.
如在石油地质调查中,我们通过钻探和一系列的爆破,记录下各种地层的回波数据,然后用计算机对这些数据进行处理,去除噪声等无用信息,最后我们可以得到地层的构造,从而找到埋藏的石油.
因为地层不会在几年内有明显的变化,因此花几十天的时间把地层的构造分析清楚也能满足要求.
这种类型的数字信号处理是非实时的,用通用的计算机就能满足需要.
还有一类数字信号处理必须在规定的时间内完成,如在军用无线通信系统和机载雷达系统中我们常常需要对检测到的微弱信号增强、加密、编码、压缩,在接收端必须及时地解压缩、解码和解密并重现清晰的信号.
我们很难想象用一个通用的计算机系统来完成这项工作,因此,我们不得不自行设计非常轻便小巧的高速专用硬件系统来完成该任务.
有的数字信号处理对时间的要求非常苛刻,以至于用高速的通用微处理器芯片也无法在规定的时间内完成必须的运算.
我们必须为这样的运算设计专用的硬线逻辑电路,这可以在高速FPGA器件上实现或制成高速专用集成电路.
这是因为通用微处理器芯片是为一般目的而设计的,运算的步骤必须通过程序编译后生成的机器码指令加载到存贮器中,然后在微处理器芯片控制下,按时钟的节拍,逐条取出指令、分析指令,然后执行指令,直至程序的结束.
微处理器芯片中的内部总线和运算部件也是为通用的目的而设计,即使是专为信号处理而设计的通用微处理器,因为它的通用性,也不可能为某一个特殊的算法来设计一系列的专用的运算电路,而且其内部总线的宽度也不能随意改变,只有通过改变程序,才能实现这个特殊的算法.
因而其运算速度就受到限制.
本章的目的是想通过对数字信号处理、计算(Computing)、算法和数据结构、编程语言和程序、体系结构和硬线逻辑等基本概念的介绍,了解算法与硬线逻辑之间的关系从而引入利用VerilogHDL硬件描述语言设计复杂的数字逻辑系统的概念和方法.
向读者展示一种九十年代才真正开始在美国等先进的工业国家逐步推广的数字逻辑系统的设计方法.
借助于这种方法,在电路设计自动化仿真和综合工具的帮助下,只要我们对并行的计算结构有第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念2一定程度的了解,对有关算法有深入的研究,我们完全有能力设计并制造出有自己知识产权的DSP(数字信号处理)类和任何复杂的数字逻辑集成电路芯片,为我国的电子工业和国防现代化作出应有的贡献.
1.
1数字信号处理大规模集成电路设计制造技术和数字信号处理技术,近三十年来,各自得到了迅速的发展.
这两个表面上看来没有什么关系的技术领域实质上是紧密相关的.
因为数字信号处理系统往往要进行一些复杂的数学运算和数据的处理,并且又有实时响应的要求,它们通常是由高速专用数字逻辑系统或专用数字信号处理器所构成,电路是相当复杂的.
因此只有在高速大规模集成电路设计制造技术进步的基础上,才有可能实现真正有意义的实时数字信号处理系统.
对实时数字信号处理系统的要求不断提高,也推动了高速大规模集成电路设计制造技术的进步.
现代专用集成电路的设计是借助于电子电路设计自动化(EDA)工具完成的.
学习和掌握硬件描述语言(HDL)是使用电子电路设计自动化(EDA)工具的基础.
1.
2计算(Computing)说到数字信号处理,我们自然就会想到数学计算(或数学运算).
现代计算机和通信系统中广泛采用了数字信号处理的技术和方法.
基本思路是先把信号用一系列的数字来表示,如是连续的模拟信号,则需通过采样和模拟数字转换,把信号转换成一系列的数字信号,然后对这些数字信号进行各种快速的数学运算,其目的是多种多样的,有的是为了加密,有的是通过编码来减少误码率以提高信道的通信质量,有的是为了去掉噪声等无关的信息也可以称为滤波,有的是为了数据的压缩以减少占用的频道….
有时我们也把某些种类的数字信号处理运算称为变换如离散傅利叶变换(DFT)、离散余弦变换(DCT)、小波变换(WaveletT)等.
我们这里所说的计算是从英语Computing翻译过来的,它的含义要比单纯的数学计算广泛得多.
"Computing这门学问研究怎样系统地有步骤地描述和转换信息,实质上它是一门覆盖了多个知识和技术范畴的学问,其中包括了计算的理论、分析、设计、效率和应用.
它提出的最基本的问题是什么样的工作能自动完成,什么样的不能.
"(摘自Denningetal.
,"ComputingasaDiscipline,"CommunicationofACM,January,1989).
本文中凡提到计算这个词处,指的就是上面一段中Computing所包含的意思.
由传统的观点出发,我们可以从三个不同的方面来研究计算,即从数学、科学和工程的不同角度.
由比较现代的观点出发,我们可以从四个主要的方面来研究计算,即从算法和数据结构、编程语言、体系结构、软件和硬件设计方法学.
本课本的主题是从算法到硬线逻辑的实现,因此我们将从算法和数据结构、编程语言和程序、体系结构和硬线逻辑以及设计方法学等方面的基本概念出发来研究和探讨用于数字信号处理等领域的复杂硬线逻辑电路的设计技术和方法.
特别强调利用Verilog硬件描述语言的Top-Down设计方法的介绍.
第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念31.
3算法和数据结构为了准确地表示特定问题的信息并顺利地解决有关的计算问题,我们需要采用一些特殊方法并建立相应的模型.
所谓算法就是解决特定问题的有序步骤,所谓数据结构就是解决特定问题的相应的模型.
1.
4编程语言和程序程序员利用一种由专家设计的既可以被人理解,也可以被计算机解释的语言来表示算法问题的求解过程.
这种语言就是编程语言.
由它所表达的算法问题的求解过程就是程序.
我们已经熟悉通过编写程序来解决计算问题,C、Pascal、Fortran、Basic或汇编语言语言是几种常用的编程语言.
如果我们只研究算法,只在通用的计算机上运行程序或利用通用的CPU来设计专用的微处理器嵌入系统,掌握上述语言就足够了.
如果还需要设计和制造能进行快速计算的硬线逻辑专用电路,我们必须学习数字电路的基本知识和硬件描述语言.
因为现代复杂数字逻辑系统的设计都是借助于EDA工具完成的,无论电路系统的仿真和综合都需要掌握硬件描述语言.
在本书中我们将要比较详细地介绍Verilog硬件描述语言.
1.
5系统结构和硬线逻辑计算机究竟是如何构成的为什么它能有效地和正确地执行每一步程序它能不能用另外一种结构方案来构成运算速度还能不能再提高所谓计算机系统结构就是回答以上问题并从硬线逻辑和软件两个角度一起来探讨某种结构的计算机的性能潜力.
比如,VonNeumann(冯诺依曼)在1945设计的EDVAC电子计算机,它的结构是一种最早的顺序机执行标量数据的计算机系统结构.
顺序机是从位串行操作到字并行操作,从定点运算到浮点运算逐步改进过来的.
由于VonNeumann系统结构的程序是顺序执行的,所以速度很慢.
随着硬件技术的进步,不断有新的计算机系统结构产生,其计算性能也在不断提高.
计算机系统结构是一门讨论和研究通用的计算机中央处理器如何提高运算速度性能的学问.
对计算机系统结构的深入了解是设计高性能的专用的硬线逻辑系统的基础,因此将是本书讨论的重点之一.
但由于本书的重点是利用VerilogHDL进行复杂数字电路的设计技术和方法,大量的篇幅将介绍利用HDL进行设计的步骤、语法要点、可综合的风格要点、同步有限状态机和由浅入深的设计实例.
1.
6设计方法学复杂数字系统的设计是一个把思想(即算法)转化为实际数字逻辑电路的过程.
我们都知道同一个算法可以用不同结构的数字逻辑电路来实现,从运算的结果说来可能是完全一致的,但其运算速度和性能价格比可以有很大的差别.
我们可用许多种不同的方案来实现能实时完成算法运算的复杂数字系统电路,下面列出了常用的四种方案:1)以专用微处理机芯片为中心来构成完成算法所需的电路系统;2)用高密度的FPGA(从几万门到百万门);3)第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念4设计专用的大规模集成电路(ASIC);4)利用现成的微处理机的IP核并结合专门设计的高速ASIC运算电路.
究竟采用什么方案要根据具体项目的技术指标、经费、时间进度和批量综合考虑而定.
在上述第二、第三、第四种设计方案中,电路结构的考虑和决策至关重要.
有的电路结构速度快,但所需的逻辑单元多,成本高;而有的电路结构速度慢,但所需的逻辑单元少,成本低.
复杂数字逻辑系统设计的过程往往需要通过多次仿真,从不同的结构方案中找到一种符合工程技术要求的性能价格比最好的结构.
一个优秀的有经验的设计师,能通过硬件描述语言的顶层仿真较快地确定合理的系统电路结构,减少由于总体结构设计不合理而造成的返工,从而大大加快系统的设计过程.
1.
7专用硬线逻辑与微处理器的比较在信号处理专用计算电路的设计中,以专用微处理器芯片为中心来构成完成算法所需的电路系统是一种较好的办法.
我们可以利用现成的微处理器开发系统,在算法已用C语言验证的基础上,在开发系统工具的帮助下,把该C语言程序转换为专用微处理器的汇编再编译为机器代码,然后加载到样机系统的存储区,即可以在开发系统工具的环境下开始相关算法的运算仿真或运算.
采用这种方法,设计周期短、可以利用的资源多,但速度、能耗、体积等性能受该微处理器芯片和外围电路的限制.
用高密度的FPGA(从几万门到几十万门)来构成完成算法所需的电路系统也是一种较好的办法.
我们必须购置有关的FPGA开发环境、布局布线和编程工具.
有些FPGA厂商提供的开发环境不够理想,其仿真工具和综合工具性能不够好,我们还需要利用性能较好的硬件描述语言仿真器、综合工具,才能有效地进行复杂的DSP硬线逻辑系统的设计.
由于FPGA是一种通用的器件,它的基本结构决定了对某一种特殊应用,性能不如专用的ASIC电路.
采用自行设计的专用ASIC系统芯片(SystemOnChip),即利用现成的微处理机IP核或根据某一特殊应用设计的微处理机核(也可以没有微处理机核),并结合专门设计的高速ASIC运算电路,能设计出性能价格比最高的理想数字信号处理系统.
这种方法结合了微处理器和专用的大规模集成电路的优点,由于微处理器IP核的挑选结合了算法和应用的特点,又加上专用的ASIC在需要高速部分的增强,能"量体裁衣",因而各方面性能优越.
但由于设计和制造周期长、投片成本高,往往只有经费充足、批量大的项目或重要的项目才采用这一途径.
当然性能优良的硬件描述语言仿真器、综合工具是不可缺少的,另外对所采用的半导体厂家基本器件库和IP库的深入了解也是必须的.
以上所述算法的专用硬线逻辑实现都需要对算法有深入的了解,还需掌握硬件描述语言和相关的EDA仿真、综合和布局布线工具.
1.
8C语言与硬件描述语言在算法运算电路设计的关系和作用数字电路设计工程师一般都学习过编程语言、数字逻辑基础、各种EDA软件工具的使用.
第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念5就编程语言而言,国内外大多数学校都以C语言为标准,只有少部分学校使用Pascal和Fortran.
算法的描述和验证常用C语言来做.
例如要设计Reed-Solomen编码/解码器,我们必须先深入了解Reed-Solomen编码/解码的算法,再编写C语言的程序来验证算法的正确性.
运行描述编码器的C语言程序,把在数据文件中的多组待编码的数据转换为相应的编码后数据并存入文件.
再编写一个加干扰用的C语言程序,用于模拟信道.
它能产生随机误码位(并把误码位个数控制在纠错能力范围内)将其加入编码后的数据文件中.
运行该加扰程序,产生带误码位的编码后的数据文件.
然后再编写一个解码器的C语言程序,运行该程序把带误码位的编码文件解码为另一个数据文件.
只要比较原始数据文件和生成的文件便可知道编码和解码的程序是否正确(能否自动纠正纠错能力范围内的错码位).
用这种方法我们就可以来验证算法的正确性.
但这样的数据处理其运行速度只与程序的大小和计算机的运行速度有关,也不能独立于计算机而存在.
如果要设计一个专门的电路来进行这种对速度有要求的实时数据处理,除了以上介绍的C程序外,还须编写硬件描述语言(如VerilogHDL或VHDL)的程序,进行仿真以便从电路结构上保证算法能在规定的时间内完成,并能与前端和后端的设备或器件正确无误地交换数据.
用硬件描述语言(HDL)的程序设计硬件的好处在于易于理解、易于维护、调试电路速度快、有许多的易于掌握的仿真、综合和布局布线工具,还可以用C语言配合HDL来做逻辑设计的前后仿真,验证功能是否正确.
在算法硬件电路的研制过程中,计算电路的结构和芯片的工艺对运行速度有很大的影响.
所以在电路结构确定之前,必须经过多次仿真:1)C语言的功能仿真.
2)C语言的并行结构仿真.
3)VerilogHDL的行为仿真.
4)VerilogHDLRTL级仿真.
5)综合后门级结构仿真.
6)布局布线后仿真.
7)电路实现验证.
下面介绍用C语言配合VerilogHDL来设计算法的硬件电路块时考虑的三个主要问题:z为什么选择C语言与VerilogHDL配合使用zC语言与VerilogHDL的使用有何限制z如何利用C来加速硬件的设计和故障检测1)为什么选择C语言与Verilog配合使用首先,C语言很灵活,查错功能强,还可以通过PLI(编程语言接口)编写自己的系统任务直接与硬件仿真器(如Verilog-XL)结合使用.
C语言是目前世界上应用最为广泛的一种编程语言,因而C程序的设计环境比VerilogHDL的完整.
此外,C语言第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念6可应用于许多领域,有可靠的编译环境,语法完备,缺陷较少.
比较起来,Verilog语言只是针对硬件描述的,在别处使用(如用于算法表达等)并不方便.
而且Verilog的仿真、综合、查错工具等大部分软件都是商业软件,与C语言相比缺乏长期大量的使用,可靠性较差,亦有很多缺陷.
所以,只有在C语言的配合使用下,Verilog才能更好地发挥作用.
面对上述问题,最好的方法是C语言与Verilog语言相辅相成,互相配合使用.
这就是既要利用C语言的完整性,又要结合Verilog对硬件描述的精确性,来更快更好地设计出符合性能要求的硬件电路系统.
利用C语言完善的查错和编译环境,设计者可以先设计出一个功能正确的设计单元,以此作为设计比较的标准.
然后,把C程序一段一段地改写成用并型结构(类似于Verilog)描述的C程序,此时还是在C的环境里,使用的依然是C语言.
如果运行结果都正确,就将C语言关键字用Verilog相应的关键字替换,进入Verilog的环境.
将测试输入同时加到C与Verilog两个单元,将其输出做比较.
这样很容易发现问题的所在,然后更正,再做测试,直至正确无误.
剩下的工作就交给后面的设计工程师继续做.
2)C语言与Verilog语言互相转换中存在的问题这样的混合语言设计流程往往会在两种语言的转换中会遇到许多难题.
例如,怎样把C程序转换成类似Verilog结构的C程序,来增加并行度,以保证用硬件实现时运行速度达到设计要求;又如怎样不使用C中较抽象的语法:例如迭代,指针,不确定次数的循环等等,也能来表示算法(因为转换的目的是要用可综合的Verilog语句来代替C程序中的语句,而可用于综合的Verilog语法是相当有限的,往往找不到相应的关键字来替换).
C程序是一行接一行依次执行的,属于顺序结构,而Verilog描述的硬件是可以在同一时间同时运行的,属于并行结构.
这两者之间有很大的冲突.
而Verilog的仿真软件也是顺序执行的,在时间关系上同实际的硬件是有差异的,可能会出现一些无法发现的问题.
Verilog可用的输出输入函数很少.
C语言的花样则很多,转换过程中会遇到一些困难.
C语言的函数调用与Verilog中模块的调用也有区别.
C程序调用函数是没有延时特性的,一个函数是唯一确定的,对同一个函数的不同调用是一样的.
而Verilog中对模块的不同调用是不同的,即使调用的是同一个模块,必须用不同的名字来指定.
Verilog的语法规则很死,限制很多,能用的判断语句有限.
仿真速度较慢,查错功能差,错误信息不完整.
仿真软件通常也很昂贵,而且不一定可靠.
C语言没有时间关系,转换后的Verilog程序必须要能做到没有任何外加的人工延时信号,也就是必须表达为有限状态机,即RTL级的Verilog,否则将无法使用综合工具把Verilog源代码转化为门级逻辑.
3)如何利用C语言来加快硬件的设计和查错第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念7下表中列出了常用的C与Verilog相对应的关键字与控制结构CVerilogsub-functionmodule,function,taskif-then-elseif-then-elseCaseCase{,}begin,endForForWhileWhileBreakDisableDefineDefineIntIntPrintfmonitor,display,strobe下表中,列出了C与Verilog相对应的运算符CVerilog功能**乘//除++加--减%%取模!
!
反逻辑&&&&逻辑且||||逻辑或>>大于=>=大于等于>>>右移综合到布局布线-->投片生成这样一系列步骤.
HDL设计文件HDL功能仿真HDL综合优化、布局布线布线后门级仿真图2-6-3HDL设计流程图电路功能仿真电路图设计文件电路制造工艺文件或FPGA码流文件有问题没问题有问题没问题有问题没问题与实现逻辑的物理器件有关的工艺技术文件确定实现电路的具体库名第二章VerilogHDL设计方法概述192)设计验证:也就是进行各种仿真的一系列步骤,如果在仿真过程中发现问题就返回设计输入进行修改.
2.
6.
4.
对应具体工艺器件的优化、映象、和布局布线由于各种ASIC和FPFA器件的工艺各不相同,因而当用不同厂家的不同器件来实现已验证的逻辑网表(EDIF文件)时,就需要不同的基本单元库与布线延迟模型与之对应才能进行准确的优化、映象、和布局布线.
基本单元库与布线延迟模型由熟悉本厂工艺的工程师提供,再由EDA厂商的工程师编入相应的处理程序,而逻辑电路设计师只需用一文件说明所用的工艺器件和约束条件,EDA工具就会自动地根据这一文件选择相应的库和模型进行准确的处理从而大大提高设计效率.
2.
7.
小结采用VerilogHDL设计方法比采用电路图输入的方法更有优越性,这就是为什么美国等先进工业国家在进入九十年代以后纷纷采用HDL设计方法的原因.
在两种符合IEEE标准的硬件描述语言中,VerilogHDL与VHDL相比更加基础、更易学习,掌握HDL设计方法应从学习VerilogHDL设计方法开始.
VerilogHDL可用于复杂数字逻辑电路和系统的总体仿真、子系统仿真和具体电路综合等各个设计阶段.
由于TOP_DOWN的设计方法是首先从系统设计入手,从顶层进行功能划分和结构设计.
系统的总体仿真是顶层进行功能划分的重要环节,这时的设计是与工艺无关的.
由于设计的主要仿真和调试过程是在高层次完成的所以能够早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑仿真的工作量.
自顶向下的设计方法方便了从系统级划分和管理整个项目,使得几十万门甚至几百万门规模的复杂数字电路的设计成为可能,并可减少设计人员,避免不必要的重复设计,提高了设计的一次成功率.
从底向上的设计在某种意义上讲可以看作上述TOP_DOWN设计的逆过程.
虽然设计也是从系统级开始,即从设计树的树根开始对设计进行逐次划分,但划分时首先考虑的是单元是否存在,即设计划分过程必须从存在的基本单元出发,设计树最末枝上的单元要么是已经制造出的单元,要么是其它项目已开发好的单元或者是可外购得到的单元.
自顶向下的设计过程中在每一层次划分时都要对某些目标作优化,TOP_DOWN的设计过程是理想的设计过程,它的缺点是得到的最小单元不标准,制造成本可能很高.
从底向上的设计过程全采用标准基本单元,通常比较经济,但有时可能不能满足一些特定的指标要求.
复杂数字逻辑电路和系统的设计过程通常是这两种设计方法的结合,设计时需要考虑多个目标的综合平衡.
第二章VerilogHDL设计方法概述202.
8思考题1.
什么是硬件描述语言它的主要作用是什么2.
目前世界上符合IEEE标准的硬件描述语言有哪两种它门各有什么特点3.
什么情况下需要采用硬件描述语言的设计方法4.
采用硬件描述语言设计方法的优点是什么有什么缺点5.
简单叙述一下利用EDA工具并采用硬件描述语言(HDL)的设计方法和流程.
6.
硬件描述语言可以用哪两种方式参与复杂数字电路的设计7.
用硬件描述语言设计的数字系统需要经过哪些步骤才能与具体的电路相对应8.
为什么说用硬件描述语言设计的数字逻辑系统具有最大的灵活性可以映射到任何工艺的电路上9.
软核是什么虚拟器件是什么它们的作用是什么10.
固核是什么硬核是什么与软核相比它们各有什么优缺点11.
简述TOP-DOWN设计方法和硬件描述语言的关系.
第三章VerilogHDL基本语法------17第三章VerilogHDL的基本语法前言VerilogHDL是一种用于数字逻辑电路设计的语言.
用VerilogHDL描述的电路设计就是该电路的VerilogHDL模型.
VerilogHDL既是一种行为描述的语言也是一种结构描述的语言.
这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的VerilogHDL模型.
Verilog模型可以是实际电路的不同级别的抽象.
这些抽象的级别和它们对应的模型类型共有以下五种:系统级(system):用高级语言结构实现设计模块的外部性能的模型.
算法级(algorithm):用高级语言结构实现设计算法的模型.
RTL级(RegisterTransferLevel):描述数据在寄存器之间流动和如何处理这些数据的模型.
门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型.
开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型.
一个复杂电路系统的完整VerilogHDL模型是由若干个VerilogHDL模块构成的,每一个模块又可以由若干个子模块构成.
其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源.
利用VerilogHDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证.
VerilogHDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计.
这种行为描述语言具有以下功能:可描述顺序执行或并行执行的程序结构.
用延迟表达式或事件表达式来明确地控制过程的启动时间.
通过命名的事件来触发其它过程里的激活行为或停止行为.
提供了条件、if-else、case、循环程序结构.
提供了可带参数且非零延续时间的任务(task)程序结构.
提供了可定义新的操作符的函数结构(function).
提供了用于建立表达式的算术运算符、逻辑运算符、位运算符.
VerilogHDL语言作为一种结构化的语言也非常适合于门级和开关级的模型设计.
因其结构化的特点又使它具有以下功能:提供了完整的一套组合型原语(primitive);提供了双向通路和电阻器件的原语;可建立MOS器件的电荷分享和电荷衰减动态模型.
VerilogHDL的构造性语句可以精确地建立信号的模型.
这是因为在VerilogHDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型.
信号值可以有不同的的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响.
VerilogHDL作为一种高级的硬件描述编程语言,有着类似C语言的风格.
其中有许多语句如:if语句、case语句等和C语言中的对应语句十分相似.
如果读者已经掌握C语言编程的基础,那么学习VerilogHDL并不困难,我们只要对VerilogHDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路.
下面我们将对VerilogHDL中的基本语法逐一加以介绍.
3.
1.
简单的VerilogHDL模块3.
1.
1.
简单的VerilogHDL程序介绍第三章VerilogHDL基本语法------18下面先介绍几个简单的VerilogHDL程序,然后从中分析VerilogHDL程序的特性.
例[3.
1.
1]:moduleadder(count,sum,a,b,cin);input[2:0]a,b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule这个例子通过连续赋值语句描述了一个名为adder的三位加法器可以根据两个三比特数a、b和进位(cin)计算出和(sum)和进位(count).
从例子中可以看出整个VerilogHDL程序是嵌套在module和endmodule声明语句里的.
例[3.
1.
2]:modulecompare(equal,a,b);outputequal;//声明输出信号equalinput[1:0]a,b;//声明输入信号a,bassignequal=(a==b)1:0;/*如果a、b两个输入信号相等,输出为1.
否则为0*/endmodule这个程序通过连续赋值语句描述了一个名为compare的比较器.
对两比特数a、b进行比较,如a与b相等,则输出equal为高电平,否则为低电平.
在这个程序中,和/表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的.
例[3.
1.
3]:moduletrist2(out,in,enable);outputout;inputin,enable;bufif1mybuf(out,in,enable);endmodule这个程序描述了一个名为trist2的三态驱动器.
程序通过调用一个在Verilog语言库中现存的三态驱动器实例元件bufif1来实现其功能.
例[3.
1.
4]:moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);//调用由mytri模块定义的实例元件tri_instendmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enablein:'bz;endmodule这个程序例子通过另一种方法描述了一个三态门.
在这个例子中存在着两个模块.
模块trist1调用由模块mytri定义的实例元件tri_inst.
模块trist1是顶层模块.
模块mytri则被称为子模块.
通过上面的例子可以看到:第三章VerilogHDL基本语法------19VerilogHDL程序是由模块构成的.
每个模块的内容都是嵌在module和endmodule两个语句之间.
每个模块实现特定的功能.
模块是可以进行层次嵌套的.
正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能.
每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述.
VerilogHDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行.
除了endmodule语句外,每个语句和数据定义的最后必须有分号.
可以用/和/对VerilogHDL程序的任何部分作注释.
一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性.
3.
1.
2.
模块的结构Verilog的基本设计单元是"模块"(block).
一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的.
下面举例说明:请看上面的例子,程序模块旁边有一个电路图的符号.
在许多方面,程序模块和电路图符号是一致的,这是因为电路图符号的引脚也就是程序模块的接口.
而程序模块描述了电路图符号所实现的逻辑功能.
上面的Verilog设计中,模块中的第二、第三行说明接口的信号流向,第四、第五行说明了模块的逻辑功能.
以上就是设计一个简单的Verilog程序模块所需的全部内容.
从上面的例子可以看出,Verilog结构完全嵌在module和endmodule声明语句之间,每个Verilog程序包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义.
3.
1.
3.
模块的端口定义模块的端口声明了模块的输入输出口.
其格式如下:module模块名(口1,口2,口3,口4,………);3.
1.
4.
模块内容模块的内容包括I/O说明、内部信号声明、功能定义.
yI/O说明的格式如下:输入口:input端口名1,端口名2,………,端口名i;//(共有i个输入口)输出口:output端口名1,端口名2,………,端口名j;//(共有j个输出口)I/O说明也可以写在端口声明语句里.
其格式如下:modulemodule_name(inputport1,inputport2,…moduleblock(a,b,c,d);inputa,b;outputc,d;assignc=a|b;assignd=a&b;endmoduleabcd第三章VerilogHDL基本语法------20outputport1,outputport2…);y内部信号说明:在模块内用到的和与端口有关的wire和reg变量的声明.
如:reg[width-1:0]R变量1,R变量2.
.
.
.
;wire[width-1:0]W变量1,W变量2.
.
.
.
;……….
.
y功能定义:模块中最重要的部分是逻辑功能定义部分.
有三种方法可在模块中产生逻辑.
1).
用"assign"声明语句如:assigna=b&c;这种方法的句法很简单,只需写一个"assign",后面再加一个方程式即可.
例子中的方程式描述了一个有两个输入的与门.
2).
用实例元件如:andand_inst(q,a,b);采用实例元件的方法象在电路图输入方式下,调入库元件一样.
键入元件的名字和相连的引脚即可,表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a,b,输出为q.
要求每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆.
3).
用"always"块如:always@(posedgeclkorposedgeclr)beginif(clr)q这是一种全面的描述方式.
2)在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位).
3)在这种描述方式中,采用缺省进制十进制.
在表达式中,位宽指明了数字的精确位数.
例如:一个4位二进制数的数字的位宽为4,一个4位十六进制数的数字的位宽为16(因为每单个十六进制数就要用4位二进制数来表示).
见下例:8'b10101100//位宽为8的数的二进制表示,'b表示二进制8'ha2//位宽为8的数的十六进制,'h表示十六进制.
yx和z值:在数字电路中,x代表不定值,z代表高阻值.
一个x可以用来定义十六进制数的四位二进制数的状态,八进制数的三位,二进制数的一位.
z的表示方式同x类似.
z还有一种表达方式是可以写作.
在使用case表达式时建议使用这种写法,以提高程序的可读性.
见下例:4'b10x0//位宽为4的二进制数从低位数起第二位为不定值4'b101z//位宽为4的二进制数从低位数起第一位为高阻值12'dz//位宽为12的十进制数其值为高阻值(第一种表达方式)12'd//位宽为12的十进制数其值为高阻值(第二种表达方式)8'h4x//位宽为8的十六进制数其低四位值为不定值y负数:一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面.
注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间.
见下例:-8'd5//这个表达式代表5的补数(用八位二进制数表示)8'd-5//非法格式y下划线(underscore_):下划线可以用来分隔开数的表达以提高程序可读性.
但不可以用在位宽和进制处,只能用在具体的数字之间.
见下例:16'b1010_1011_1111_1010//合法格式8'b_0011_1010//非法格式当常量不说明位数时,默认值是32位,每个字母用8位的ASCII值表示.
例:10=32'd10=32'b1010第三章VerilogHDL基本语法------221=32'd1=32'b1-1=-32'd1=32'hFFFFFFFF'BX=32'BX=32'BXXXXXXX…X"AB"=16'B01000001_01000010二.
参数(Parameter)型在VerilogHDL中用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性.
parameter型数据是一种常数型的数据,其说明格式如下:parameter参数名1=表达式,参数名2=表达式,…,参数名n=表达式;parameter是参数型数据的确认符,确认符后跟着一个用逗号分隔开的赋值语句表.
在每一个赋值语句的右边必须是一个常数表达式.
也就是说,该表达式只能包含数字或先前已定义过的参数.
见下列:parametermsb=7;//定义参数msb为常量7parametere=25,f=29;//定义二个常数参数parameterr=5.
7;//声明r为一个实型参数parameterbyte_size=8,byte_msb=byte_size-1;//用常数表达式赋值parameteraverage_delay=(r+f)/2;//用常数表达式赋值参数型常数经常用于定义延迟时间和变量宽度.
在模块或实例引用时可通过参数传递改变在被引用模块或实例中已定义的参数.
下面将通过两个例子进一步说明在层次调用的电路中改变参数常用的一些用法.
[例1]:在引用Decode实例时,D1,D2的Width将采用不同的值4和5,且D1的Polarity将为0.
可用例子中所用的方法来改变参数,即用#(4,0)向D1中传递Width=4,Polarity=0;用#(5)向D2中传递Width=5,Polarity仍为1.
moduleDecode(A,F);parameterWidth=1,Polarity=1;……………endmodulemoduleTop;wire[3:0]A4;wire[4:0]A5;wire[15:0]F16;wire[31:0]F32;Decode#(4,0)D1(A4,F16);Decode#(5)D2(A5,F32);Endmodule[例2]:下面是一个多层次模块构成的电路,在一个模块中改变另一个模块的参数时,需要使用defparam命令第三章VerilogHDL基本语法------233.
2.
2变量变量即在程序运行过程中其值可以改变的量,在VerilogHDL中变量的数据类型有很多种,这里只对常用的几种进行介绍.
网络数据类型表示结构实体(例如门)之间的物理连接.
网络类型的变量不能储存值,而且它必需受到驱动器(例如门或连续赋值语句,assign)的驱动.
如果没有驱动器连接到网络类型的变量上,则该变量就是高阻的,即其值为z.
常用的网络数据类型包括wire型和tri型.
这两种变量都是用于连接器件单元,它们具有相同的语法格式和功能.
之所以提供这两种名字来表达相同的概念是为了与模型中所使用的变量的实际情况相一致.
wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据.
如果wire型或tri型变量没有定义逻辑强度(logicstrength),在多驱动源的情况下,逻辑值会发生冲突从而产生不确定值.
下表为wire型和tri型变量的真值表(注意:这里假设两个驱动源的强度是一致的,关于逻辑强度建模请参阅附录:Verilog语言参考书).
wire/tri01xz00xx01x1x1xxxxxz01xz一.
wire型ModuleTest;wireW;TopT();emdmodulemoduleTop;wireWBlockB1();BlockB2();endmodulemoduleBlock;ParameterP=0;endmodulemoduleAnnotate;defparamTest.
T.
B1.
P=2,Test.
T.
B2.
P=3;endmoduleTestTopTBlockBlockB1B2Annote第三章VerilogHDL基本语法------24wire型数据常用来表示用于以assign关键字指定的组合逻辑信号.
Verilog程序模块中输入输出信号类型缺省时自动定义为wire型.
wire型信号可以用作任何方程式的输入,也可以用作"assign"语句或实例元件的输出.
wire型信号的格式同reg型信号的很类似.
其格式如下:wire[n-1:0]数据名1,数据名2,…数据名i;//共有i条总线,每条总线内有n条线路或wire[n:1]数据名1,数据名2,…数据名i;wire是wire型数据的确认符,[n-1:0]和[n:1]代表该数据的位宽,即该数据有几位.
最后跟着的是数据的名字.
如果一次定义多个数据,数据名之间用逗号隔开.
声明语句的最后要用分号表示语句结束.
看下面的几个例子.
wirea;//定义了一个一位的wire型数据wire[7:0]b;//定义了一个八位的wire型数据wire[4:1]c,d;//定义了二个四位的wire型数据二.
reg型寄存器是数据储存单元的抽象.
寄存器数据类型的关键字是reg.
通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当.
VerilogHDL语言提供了功能强大的结构语句使设计者能有效地控制是否执行这些赋值语句.
这些控制结构用来描述硬件触发条件,例如时钟的上升沿和多路器的选通信号.
在行为模块介绍这一节中我们还要详细地介绍这些控制结构.
reg类型数据的缺省初始值为不定值,x.
reg型数据常用来表示用于"always"模块内的指定信号,常代表触发器.
通常,在设计中要由"always"块通过使用行为描述语句来表达逻辑关系.
在"always"块内被赋值的每一个信号都必须定义成reg型.
reg型数据的格式如下:reg[n-1:0]数据名1,数据名2,…数据名i;或reg[n:1]数据名1,数据名2,…数据名i;reg是reg型数据的确认标识符,[n-1:0]和[n:1]代表该数据的位宽,即该数据有几位(bit).
最后跟着的是数据的名字.
如果一次定义多个数据,数据名之间用逗号隔开.
声明语句的最后要用分号表示语句结束.
看下面的几个例子:regrega;//定义了一个一位的名为rega的reg型数据reg[3:0]regb;//定义了一个四位的名为regb的reg型数据reg[4:1]regc,regd;//定义了两个四位的名为regc和regd的reg型数据对于reg型数据,其赋值语句的作用就象改变一组触发器的存储单元的值.
在Verilog中有许多构造(construct)用来控制何时或是否执行这些赋值语句.
这些控制构造可用来描述硬件触发器的各种具体情况,如触发条件用时钟的上升沿等,或用来描述具体判断逻辑的细节,如各种多路选择器.
reg型数据的缺省初始值是不定值.
reg型数据可以赋正值,也可以赋负值.
但当一个reg型数据是一个表达式中的操作数时,它的值被当作是无符号值,即正值.
例如:当一个四位的寄存器用作表达式中的操作数时,如果开始寄存器被赋以值-1,则在表达式中进行运算时,其值被认为是+15.
注意:第三章VerilogHDL基本语法------25reg型只表示被定义的信号将用在"always"块内,理解这一点很重要.
并不是说reg型信号一定是寄存器或触发器的输出.
虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样.
在本书中我们还会对这一点作更详细的解释.
三.
memory型VerilogHDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器,ROM存储器和reg文件.
数组中的每一个单元通过一个数组索引进行寻址.
在Verilog语言中没有多维数组存在.

酷番云78元台湾精品CN2 2核 1G 60G SSD硬盘

酷番云怎么样?酷番云就不讲太多了,介绍过很多次,老牌商家完事,最近有不少小伙伴,一直问我台湾VPS,比较难找好的商家,台湾VPS本来就比较少,也介绍了不少商家,线路都不是很好,有些需求支持Windows是比较少的,这里我们就给大家测评下 酷番云的台湾VPS,支持多个版本Linux和Windows操作系统,提供了CN2线路,并且还是原生IP,更惊喜的是提供的是无限流量。有需求的可以试试。可以看到回程...

racknerd新上架“洛杉矶”VPS$29/年,3.8G内存/3核/58gSSD/5T流量

racknerd发表了2021年美国独立日的促销费用便宜的vps,两种便宜的美国vps位于洛杉矶multacom室,访问了1Gbps的带宽,采用了solusvm管理,硬盘是SSDraid10...近两年来,racknerd的声誉不断积累,服务器的稳定性和售后服务。官方网站:https://www.racknerd.com多种加密数字货币、信用卡、PayPal、支付宝、银联、webmoney,可以付...

提速啦(24元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

shift后门怎么用为你推荐
百花百游百花净斑方多少钱一盒www.5any.comwww.qbo5.com 这个网站要安装播放器sesehu.comwww.hu338.com 怎么看不到啊baqizi.cc曹操跟甄洛是什么关系dadi.tv海信电视机上出现英文tvservice是什么意思?66smsm.comffff66com手机可以观看视频吗?59ddd.comarmada m300什么装系统朴容熙这个人男的女的,哪国人。叫什么。鹤城勿扰黑龙江省的那个 城市是被叫做鹤城?彪言彪语很多的话:( )言( )语 豪迈雄壮:( )言( )语 含有讽刺意味的风凉话:( )言( )语
美国和欧洲vps 双线vps 中国域名交易中心 草根过期域名 星星海 bluehost java主机 哈喽图床 网页背景图片 免费ftp空间申请 蜗牛魔方 ftp教程 如何用qq邮箱发邮件 最好的qq空间 网通服务器托管 免费phpmysql空间 33456 购买国外空间 linux使用教程 游戏服务器出租 更多