目录
前言
加法器在很多的系统中充当着重要的基本单元。在数字电路中有着广泛的用途。
一、1bit 半加法器
数字系统设计中,逻辑上通过0和1来实现复杂的系统功能,最简单的逻辑运算就是两个1bit进行加操作。假设A、B分别代表着两个1bit输入,C、D分别代表着相加结果以及进位输出,真值表如下:
二、结构、代码
此实例设计半加法器模块,adder位顶层的外部接口,输入定义位a、b,进位输出和结果定义为cout、sum,声明为wire数据类型,数据流语句采用的是assign赋值语句。
//**********************************************************
//Project name:
//Author:
//Email:
//Create Time:
//File Name:
//Description:
//**********************************************************
//Modification History:
//Date By Version Change Description
//**********************************************************
//
//
//
//**********************************************************
`timescale 1ns/1ps
module adder (
input a,
input b,
output sum,
output cout);
wire cout,sum;
assign {cout,sum}= a + b;
endmodule
其中{cout,sum}为verilog中的拼接操作符,可以将两个或者两个以上的操作数拼接在一起,组成一个操作数,拼接操作符的每个操作数须有确定的位宽。
三 、测试文件 Testbench设计
//**********************************************************
//Project name:
//Author:
//Email:
//Create Time:
//File Name:
//Description:
//**********************************************************
//Modification History:
//Date By Version Change Description
//**********************************************************
//
//
//
//**********************************************************
`timescale 1ns/1ps
module adder_tb ();
// input
reg a,b ;
// output
wire sum,cout;
integer i,j; //define line
//dut
adder adder_tb (
.sum(sum),
.cout(cout),
.a(a),
.b(b)
);
// excitation signal
initial
begin
a = 0;
b = 0;
for (i = 1; i< 16;i= i +1)
#20 a = i;
end
initial
begin
for (j = 1; j < 16; j = j +1)
#10 b = j;
end
//monitor
initial
begin
$monitor($time,,,,,,"%d + %d = {%b,%d}",a,b,cout,sum);
#500 $finish;
end
//print the waveform
initial
begin
$fsdbDumpfile("adder.fsdb");
$fsdbDumpvars(0,adder_tb);
end
endmodule
在Verilog中所有的时延都用单位时间表示;`timescale 编译器指令将时间单位和实际时间相关联;该指令用于定义时延单位和时延精度;
在测试模块中通过输入加入激励,输入定义为reg类型;而输出是连续性赋值,输出定义wire类型; initial语句产生激励信号;initial语句中包含了一个顺序语句;在0开始执行,执行完所有语句后,永久挂起;
monitor是监视器;系统任务$monitor调用的功能是只要参数表中指定的变量值发生变化,就打印指定的字符串;
四、测试结果