第一章 数字信号处理、计算、程序、
算法和硬线逻辑的基本概念
引言:
现代计算机与通讯系统电子设备中广泛使用了数字信号处理专用集成电路,它们主要
用于数字信号传输中所必需的滤波、变换、加密、解密、编码、解码、纠检错、压缩、解
压缩等操作。这些处理工作从本质上说都是数学运算。从原则上讲,它们完全可以用计算
机或微处理器来完成。这就是为什么我们常用 C、Pascal 或汇编语言来编写程序,以研究
算法的合理性和有效性的道理。
在数字信号处理的领域内有相当大的一部分工作是可以事后处理的。我们可以利用通
用的计算机系统来处理这类问题。如在石油地质调查中,我们通过钻探和一系列的爆破,
记录下各种地层的回波数据,然后用计算机对这些数据进行处理,去除噪声等无用信息,
最后我们可以得到地层的构造,从而找到埋藏的石油。因为地层不会在几年内有明显的变
化,因此花几十天的时间把地层的构造分析清楚也能满足要求。这种类型的数字信号处理
是非实时的,用通用的计算机就能满足需要。
还有一类数字信号处理必须在规定的时间内完成,如在军用无线通信系统和机载雷达系统
中我们常常需要对检测到的微弱信号增强、加密、编码、压缩,在接收端必须及时地解压
缩、解码和解密并重现清晰的信号。我们很难想象用一个通用的计算机系统来完成这项工
作,因此,我们不得不自行设计非常轻便小巧的高速专用硬件系统来完成该任务。
有的数字信号处理对时间的要求非常苛刻,以至于用高速的通用微处理器芯片也无法在规
定的时间内完成必须的运算。我们必须为这样的运算设计专用的硬线逻辑电路,这可以在
高速 FPGA 器件上实现或制成高速专用集成电路。这是因为通用微处理器芯片是为一般目的
而设计的,运算的步骤必须通过程序编译后生成的机器码指令加载到存贮器中,然后在微
处理器芯片控制下,按时钟的节拍,逐条取出指令、分析指令,然后执行指令,直至程序
的结束。微处理器芯片中的内部总线和运算部件也是为通用的目的而设计,即使是专为信
号处理而设计的通用微处理器,因为它的通用性,也不可能为某一个特殊的算法来设计一
系列的专用的运算电路,而且其内部总线的宽度也不能随意改变,只有通过改变程序,才
能实现这个特殊的算法。因而其运算速度就受到限制。
本章的目的是想通过对数字信号处理、计算(Computing)、算法和数据结构、编程语言和
程序、体系结构和硬线逻辑等基本概念的介绍,了解算法与硬线逻辑之间的关系从而引入
利用 Verilog HDL 硬件描述语言设计复杂的数字逻辑系统的概念和方法。向读者展示一种
九十年代才真正开始在美国等先进的工业国家逐步推广的数字逻辑系统的设计方法。借助
于这种方法,在电路设计自动化仿真和综合工具的帮助下,只要我们对并行的计算结构有
第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念
—————————————————————————————————————————————–
2
一定程度的了解,对有关算法有深入的研究,我们完全有能力设计并制造出有自己知识产
权的 DSP(数字信号处理)类和任何复杂的数字逻辑集成电路芯片,为我国的电子工业和
国防现代化作出应有的贡献。
1.1 数字信号处理
大规模集成电路设计制造技术和数字信号处理技术,近三十年来,各自得到了迅速的发展。
这两个表面上看来没有什么关系的技术领域实质上是紧密相关的。因为数字信号处理系统
往往要进行一些复杂的数学运算和数据的处理,并且又有实时响应的要求,它们通常是由
高速专用数字逻辑系统或专用数字信号处理器所构成,电路是相当复杂的。因此只有在高
速大规模集成电路设计制造技术进步的基础上,才有可能实现真正有意义的实时数字信号
处理系统。对实时数字信号处理系统的要求不断提高,也推动了高速大规模集成电路设计
制造技术的进步。现代专用集成电路的设计是借助于电子电路设计自动化(EDA)工具完成
的。学习和掌握硬件描述语言(HDL)是使用电子电路设计自动化(EDA)工具的基础。
1.2 计算(Computing)
说到数字信号处理,我们自然就会想到数学计算(或数学运算)。现代计算机和通信系统中
广泛采用了数字信号处理的技术和方法。基本思路是先把信号用一系列的数字来表示,如
是连续的模拟信号,则需通过采样和模拟数字转换,把信号转换成一系列的数字信号,然
后对这些数字信号进行各种快速的数学运算,其目的是多种多样的,有的是为了加密,有
的是通过编码来减少误码率以提高信道的通信质量,有的是为了去掉噪声等无关的信息也
可以称为滤波,有的是为了数据的压缩以减少占用的频道…。有时我们也把某些种类的数
字信号处理运算称为变换如离散傅利叶变换(DFT)、离散余弦变换(DCT)、小波变换(Wavelet
T)等。
我们这里所说的计算是从英语 Computing 翻译过来的,它的含义要比单纯的数学计算广泛
得多。“Computing 这门学问研究怎样系统地有步骤地描述和转换信息,实质上它是一门覆
盖了多个知识和技术范畴的学问,其中包括了计算的理论、分析、设计、效率和应用。它
提出的最基本的问题是什么样的工作能自动完成,什么样的不能。”(摘自 Denning et al.,
“Computing as a Discipline,” Communication of ACM, January,1989)。
本文中凡提到计算这个词处,指的就是上面一段中 Computing 所包含的意思。由传统的观
点出发,我们可以从三个不同的方面来研究计算,即从数学、科学和工程的不同角度。
由比较现代的观点出发,我们可以从四个主要的方面来研究计算,即从算法和数据结构、
编程语言、体系结构、软件和硬件设计方法学。本课本的主题是从算法到硬线逻辑的实现,
因此我们将从算法和数据结构、编程语言和程序、体系结构和硬线逻辑以及设计方法学等
方面的基本概念出发来研究和探讨用于数字信号处理等领域的复杂硬线逻辑电路的设计技
术和方法。特别强调利用 Verilog 硬件描述语言的 Top-Down 设计方法的介绍。
第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念
—————————————————————————————————————————————–
3
1.3 算法和数据结构
为了准确地表示特定问题的信息并顺利地解决有关的计算问题,我们需要采用一些特殊方
法并建立相应的模型。所谓算法就是解决特定问题的有序步骤,所谓数据结构就是解决特
定问题的相应的模型。
1.4 编程语言和程序
程序员利用一种由专家设计的既可以被人理解,也可以被计算机解释的语言来表示算法问
题的求解过程。这种语言就是编程语言。由它所表达的算法问题的求解过程就是程序。我
们已经熟悉通过编写程序来解决计算问题, C、Pascal、Fortran、Basic 或汇编语言语言
是几种常用的编程语言。如果我们只研究算法,只在通用的计算机上运行程序或利用通用
的 CPU 来设计专用的微处理器嵌入系统,掌握上述语言就足够了。如果还需要设计和制造
能进行快速计算的硬线逻辑专用电路,我们必须学习数字电路的基本知识和硬件描述语言。
因为现代复杂数字逻辑系统的设计都是借助于 EDA 工具完成的,无论电路系统的仿真和综
合都需要掌握硬件描述语言。在本书中我们将要比较详细地介绍 Verilog 硬件描述语言。
1.5 系统结构和硬线逻辑
计算机究竟是如何构成的?为什么它能有效地和正确地执行每一步程序?它能不能用另外
一种结构方案来构成?运算速度还能不能再提高?所谓计算机系统结构就是回答以上问题
并从硬线逻辑和软件两个角度一起来探讨某种结构的计算机的性能潜力。比如, Von
Neumann(冯诺依曼)在 1945 设计的 EDVAC 电子计算机,它的结构是一种最早的顺序机执
行标量数据的计算机系统结构。顺序机是从位串行操作到字并行操作,从定点运算到浮点
运算逐步改进过来的。由于 Von Neumann 系统结构的程序是顺序执行的,所以速度很慢。
随着硬件技术的进步,不断有新的计算机系统结构产生,其计算性能也在不断提高。计算
机系统结构是一门讨论和研究通用的计算机中央处理器如何提高运算速度性能的学问。对
计算机系统结构的深入了解是设计高性能的专用的硬线逻辑系统的基础,因此将是本书讨
论的重点之一。但由于本书的重点是利用 Verilog HDL 进行复杂数字电路的设计技术和方
法,大量的篇幅将介绍利用 HDL 进行设计的步骤、语法要点、可综合的风格要点、同步有
限状态机和由浅入深的设计实例。
1.6 设计方法学
复杂数字系统的设计是一个把思想(即算法)转化为实际数字逻辑电路的过程。我们都知
道同一个算法可以用不同结构的数字逻辑电路来实现,从运算的结果说来可能是完全一致
的,但其运算速度和性能价格比可以有很大的差别。我们可用许多种不同的方案来实现能
实时完成算法运算的复杂数字系统电路,下面列出了常用的四种方案:1)以专用微处理机
芯片为中心来构成完成算法所需的电路系统;2)用高密度的 FPGA(从几万门到百万门);3)
第一章数字信号处理、计算、程序、算法和硬线逻辑的基本概念
—————————————————————————————————————————————–
4
设计专用的大规模集成电路(ASIC);4)利用现成的微处理机的 IP 核并结合专门设计的高
速 ASIC 运算电路。究竟采用什么方案要根据具体项目的技术指标、经费、时间进度和批量
综合考虑而定。
在上述第二、第三、第四种设计方案中,电路结构的考虑和决策至关重要。有的电路结构
速度快,但所需的逻辑单元多,成本高;而有的电路结构速度慢,但所需的逻辑单元少,
成本低。复杂数字逻辑系统设计的过程往往需要通过多次仿真,从不同的结构方案中找到
一种符合工程技术要求的性能价格比最好的结构。一个优秀的有经验的设计师,能通过硬
件描述语言的顶层仿真较快地确定合理的系统电路结构,减少由于总体结构设计不合理而
造成的返工,从而大大加快系统的设计过程。
1.7 专用硬线逻辑与微处理器的比较
在信号处理专用计算电路的设计中,以专用微处理器芯片为中心来构成完成算法所需的电
路系统是一种较好的办法。我们可以利用现成的微处理器开发系统,在算法已用 C 语言验
证的基础上,在开发系统工具的帮助下,把该 C 语言程序转换为专用微处理器的汇编再编
译为机器代码,然后加载到样机系统的存储区,即可以在开发系统工具的环境下开始相关
算法的运算仿真或运算。采用这种方法,设计周期短、可以利用的资源多,但速度、能耗、
体积等性能受该微处理器芯片和外围电路的限制。
用高密度的 FPGA(从几万门到几十万门)来构成完成算法所需的电路系统也是一种较好的
办法。我们必须购置有关的 FPGA 开发环境、布局布线和编程工具。有些 FPGA 厂商提供的
开发环境不够理想,其仿真工具和综合工具性能不够好,我们还需要利用性能较好的硬件
描述语言仿真器、综合工具,才能有效地进行复杂的 DSP 硬线逻辑系统的设计。由于 FPGA
是一种通用的器件,它的基本结构决定了对某一种特殊应用,性能不如专用的 ASIC 电路。
采用自行设计的专用 ASIC 系统芯片(System On Chip), 即利用现成的微处理机 IP 核或
根据某一特殊应用设计的微处理机核(也可以没有微处理机核),并结合专门设计的高速
ASIC 运算电路,能设计出性能价格比最高的理想数字信号处理系统。这种方法结合了微处
理器和专用的大规模集成电路的优点,由于微处理器 IP 核的挑选结合了算法和应用的特
点,又加上专用的 ASIC 在需要高速部分的增强,能“量体裁衣”, 因而各方面性能优越。
但由于设计和制造周期长、投片成本高,往往只有经费充足、批量大的项目或重要的项目
才采用这一途径。当然性能优良的硬件描述语言仿真器、综合工具是不可缺少的,另外对
所采用的半导体厂家基本器件库和 IP 库的深入了解也是必须的。
以上所述算法的专用硬线逻辑实现都需要对算法有深入的了解,还需掌握硬件描述语言和
相关的 EDA 仿真、综合和布局布线工具。
1.8 C 语言与硬件描述语言在算法运算电路设计的关系和作用
数字电路设计工程师一般都学习过编程语言、数字逻辑基础、各种 EDA 软件工具的使用。
就编程语言而言,国内外大多数学校都以 C 语言为标准,只有少部分学校使用 Pascal 和
Fortran。
算法的描述和验证常用 C 语言来做。例如要设计 Reed-Solomen 编码/解码器,我们必须先
深入了解 Reed-Solomen 编码/解码的算法,再编写 C 语言的程序来验证算法的正确性。运
行描述编码器的 C 语言程序,把在数据文件中的多组待编码的数据转换为相应的编码后数
据并存入文件。再编写一个加干扰用的 C 语言程序,用于模拟信道。它能产生随机误码位
(并把误码位个数控制在纠错能力范围内)将其加入编码后的数据文件中。运行该加扰程
序,产生带误码位的编码后的数据文件。然后再编写一个解码器的 C 语言程序,运行该程
序把带误码位的编码文件解码为另一个数据文件。只要比较原始数据文件和生成的文件便
可知道编码和解码的程序是否正确(能否自动纠正纠错能力范围内的错码位)。用这种方法
我们就可以来验证算法的正确性。但这样的数据处理其运行速度只与程序的大小和计算机
的运行速度有关,也不能独立于计算机而存在。如果要设计一个专门的电路来进行这种对
速度有要求的实时数据处理,除了以上介绍的 C 程序外,还须编写硬件描述语言(如 Verilog
HDL 或 VHDL)的程序,进行仿真以便从电路结构上保证算法能在规定的时间内完成,并
能与前端和后端的设备或器件正确无误地交换数据。
用硬件描述语言(HDL)的程序设计硬件的好处在于易于理解、易于维护、调试电路速度
快、有许多的易于掌握的仿真、综合和布局布线工具,还可以用 C 语言配合 HDL 来做逻
辑设计的前后仿真,验证功能是否正确。
在算法硬件电路的研制过程中,计算电路的结构和芯片的工艺对运行速度有很大的影响。
所以在电路结构确定之前,必须经过多次仿真:
1) C 语言的功能仿真。
2) C 语言的并行结构仿真。
3) Verilog HDL 的行为仿真。
4) Verilog HDL RTL 级仿真。
5) 综合后门级结构仿真。
6) 布局布线后仿真。
7) 电路实现验证。
下面介绍用 C 语言配合 Verilog HDL 来设计算法的硬件电路块时考虑的三个主要问题:
z 为什么选择 C 语言与 Verilog HDL 配合使用?
z C 语言与 Verilog HDL 的使用有何限制?
z 如何利用 C 来加速硬件的设计和故障检测?
1) 为什么选择 C 语言与 Verilog 配合使用
首先,C 语言很灵活,查错功能强,还可以通过 PLI(编程语言接口)编写自己的系
统任务直接与硬件仿真器(如 Verilog-XL)结合使用。C 语言是目前世界上应用最为
广泛的一种编程语言,因而 C 程序的设计环境比 Verilog HDL 的完整。此外,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 语言来加快硬件的设计和查错
没有回复内容