【摘要】随着EDA技术的发展,基于硬件描述语言的数字系统设计正越来越流行。本文以数字电路中常见的全加器为基础,介绍如何将硬件描述语言引入到数字电路的学习中,为未来学习可编程器件打下良好的基础。
【关键词】全加器 ;Verilog HDL;多位设计
引言
随着信息时代的来临,“数字”二字正越来越多的出现在各个领域,数字电视、数字通信、数字电影、数字控制……数字化已成为当今信息社会的技术基础,电子技术发展的潮流。
数字电路已从早期的分立元件发展到集成电路,以及具有特定功能的专用集成电路,其设计的复杂度、集成度越来越大,而传统的设计方式已无能为力。为解决这一问题,基于硬件描述语言(HDL,Hardware Description Lan-guage)的全新设计方法应运而生。硬件描述语言是一种用形式化方法描述数字电路和系统的语言,形式上和普通计算机编程语言很相似。利用这种语言,数字电路系统的设计可以从上层到下层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。
传统的数字电路设计方法其设计步骤分为:设计原始状态表、状态化简、状态编码、根据状态转换表建立输入和输出方程,画出逻辑电路并连接。这种方法需要一定的逻辑推导与化简,学习起来枯燥乏味,极易挫伤学习兴趣。但是如果在学习过程中将硬件描述语言加入其中,自行编写程序,从仿真波形中观察信号的逻辑变化,将被动学习变为主动学习,将会更加容易理解和掌握数字逻辑电路。当今最为流行的硬件描述语言以VHDL和Verilog HDL应用最为广泛。Verilog HDL以其易学自由的特点被美国80%以上的电子工程师使用,而国内大多数公司和研究单位也在使用Verilog HDL语言。
Verilog HDL语言简单易学,比较适合底层逻辑电路的描述,只要有C语言编程基础,即可在短时间掌握。而C语言是大多数理工类学生必修的编程语言之一。这里以Verilog HDL语言为基础,介绍如何在数字电路中引入硬件描述语言学习全加器。
一、传统方法设计全加器
全加器是用门电路实现两个二进制数相加并求出和的组合电路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。它与半加器的区别在于需要考虑来自低位的进位,因此其输入端除了加数和被加数以外,还应有一个进位输入端。根据二进制加法运算规则,用A和B代表加数,CI代表来自低位的进位输入,S代表相加的和,CO代表向高位的进位,可列出一位全加器的真值表,如表1所示。
表1 全加器的真值表
输入 输出
CI A B S CO
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
根据真值表写出输出端S和CO的逻辑表达式:
对逻辑表达式进行化简,可得如下表达式:
根据化简后的表达式画出全加器的结构图,如图1所示。
图1 全加器的逻辑电路图
虽然依照传统的设计模式绘出了全加器的逻辑电路图,但是无法展现它是否符合真值表,无法检测设计的正确与否。引入硬件描述语言Verilog HDL,利用仿真验证,可以有效地直观感受设计效果。
二、基于Verilog HDL的全加器设计
Verilog HDL语言以模块集合的形式来描述数字电路系统,其基本设计单元是模块(module),整个程序包括在关键字module、endmodule之内,其模块类似C语言中的函数,提供输入、输出端口,通过实例化来调用其他模块,以及模块间相互连接来实现设计功能。在硬件描述语言的建模中,主要有结构化描述方式、数据流描述方式和行为描述方式,其中数据流描述方式与逻辑表达式很相识。这里以化简后的逻辑表达式对电路进行描述。
module full_adder1(a,b,ci,s,co);
//模块定义行:module 模块名(端口名表项)
input a,b;//端口类型说明:说明端口的输入或输出特性
input ci;//来自低位的进位输入端
output s;//加数之和的输出
output co;//向高位的进位输出端
assign s=a^b^ci;//功能描述:对模块的功能或结构进行具体描述
assign co=(a&B)|(ci&(a^b)); //向高位的进位端描述
endmodule//结束行:标志模块结束
图2 一位全加器模块的仿真结果
在模块描述完成之后,需要通过测试文件对模块进行仿真验证,以检查设计是否达到要求。想要对模块进行仿真测试首先要规定时间单位,而且最好在测试文件中统一规定时间单位,比如,‘timescale 1ns/1ps表示仿真的单位时间为1ns,精度为1ps。测试模块可以看做一个模块或者设备,和你已经编写的模块进行通信。通过测试模块向待测模块输出信号作为激励,同时接收从待测模块输出的信号来查看结果。一般在测试模块中将测试模块的输入信号(input)定义为reg型,输出信号(output)定义为wire型。处理完接口和声明之后,需要自己设置一些激励信号,激励信号的内容就是能输入到待测模块中的波形。对上述模块编写测试程序,查看仿真结果,如图2所示。从图中可知,其仿真结果与真值表完全一致,说明全加器的设计正确,达到设计要求。
通过真值表推导出逻辑表达式,再用数据流描述方式建模的方法是否可以再进一步改进,以符合我们传统的数学表达方式呢?答案是肯定的。采用行为描述方式建模,将加数、被加数和低位的进位以加法的形式表示,而和与高位的进位用拼接运算符({ })来表示。将上述程序的功能描述语句修改如下:
assign {s,co}=a+b+ci; //功能描述,带进位的加法运算
再进行一次验证仿真,结果一模一样。说明这种描述方式是正确的,而且更接近于数学表达,更容易掌握。
图4 四位全加器数学表示图
三、全加器的改进与多位设计
一位的全加器解决了,那么多位的全加器怎么办呢?也很简单。只需要增加加数与被加数的位宽即可。这里以四位全加器为例,将源程序进行修改。
module full_adder2(a,b,ci,s,co);
input [3: 0]a,b;//四位的加数与被加数,[3:0]代表位宽为4
input ci;
output [3:0]s;//和也是4位
output co;
assign {s,co}=a+b+ci;
//行为描述方式,即电路功能描述
endmodule
编写测试模块程序,查看仿真结果,如图3、图4所示。从图中很明显的看到,无论从波形图还是数学结构上都可论证全加器的设计正确,符合数学学习的规律,可将其作为一个模块电路运用具体电路中,作为其他设计的一个功能电路。
四、结束语
从上述的全加器的学习分析中,可以发现在数字电路学习中引入硬件描述语言可以让数字电路的学习更加直观,更能了解电路的功能作用,更易掌握所学知识。此外,以Verilog HDL语言为学习EDA技术的切入点,有利于学习电子电路自动化设计的思想,有助于掌握EDA技术这门代表电子设计技术最新发展的方向,为将来学习FPGA可编程器件打下良好的基础。
参考文献
[1]阎石.数字电子技术基础(第四版)[M].高等教育出版社,1998(11).
[2]董海青.可编程逻辑器件基础[M].清华大学出版社,2012(8).
作者简介:张定祥(1978—),男,贵州黄平人,副教授,现供职于贵州电子信息职业技术学院,研究方向:EDA技术,单片机技术。