当前位置: 附加器 >> 附加器市场 >> 笔试1bit的半加器全加器实现
什么是半加器,什么是全加器,请用Verilog分别实现1位半加器和1位全加器,并写TestBench仿真文件,给出WORD或PDF版本的报告,包括但不限于文字说明、代码、仿真测试图等。
1.原理
半加器
全加器
当多位数相加时,半加器可用于最低位求和,并给出进位数。第二位的相加有两个待加数和,还有一个来自前面低位送来的进位数。这三个数相加,得出本位和数(全加和数)和进位数。这种就是“全加"真值表:
2.编程思路
(1)根据真值表编写
按照半加器和全加器的真值表写出输出端的逻辑表达式,对半加器,输出的进位端是量输入的“与”,输出的计算结果是量输入的异或;对全加器,也按照逻辑表达式做。
//半加器模块moduleadder_half(inputa,inputb,outputregsum,outputregcout);//这里的always
(*)搭配里面的“=”阻塞赋值符号//实现的效果和assignsum=a^b;assigncout=ab;是一样的always(*)beginsum=a^b;cout=ab;endendmodule全加器:
moduleall_adder(cout,sum,a,b,cin);inputa,b,cin;outputsum,cout;wiresum,cout;assignsum=a^b^cin;assigncout=(ab)
(acin)
(bcin);endmodule
3.问题汇总
(1)`timescale1ns/1ps
timescale是verilog中的一种时间尺度预编译指令,用来定义仿真时的时间单位和时间精度,左边是时间单位,右边是时间精度,时间单位是用于编写激励文件,时间精度是显示时的刻度,比如#也就是ns。时间精度不能大于时间单位,比如`timescale1ns/1ps是正确的,而`timescale1ps/1ns是错误的。
(2)#({$random}%)
首先,#代表延时,这个语句表示延时随机的一个时间,结合`timescale1ns/1ns是延时随机的ns。
$random是verilog中产生随机数的系统函数,在调用时返回一个32位的随机数,是带符号的整形数。有几种用法:
$random和$random()意义一样,都是产生随机数;
$random%在-99到99之间产生随机数;
{$random}%采用位拼接符,在0到之间产生随机数;
如seed=10,$random(seed)根据seed值产生随机数,而后seed值也会更新。
(3)addt0(.cin(cin),.a(a),.b(b),.sum(sum),.count(count));
例化的格式,先建立一个叫add的模块(module),有5个引脚,分别是cin/a/b/sum/count,例化的模块叫做t0,比较简单的例化方式就是如上所示的,括号外的引脚与括号内的引脚名称完全一致,无需区分。
实际上,括号外的引脚名称代表的是模块定义时的引脚,括号内的引脚是目前实际使用的引脚名称,如可以将
大神袁的测试文件改为:`timescale1ns/1ns
moduletop_tb();
rega1;
regb1;
wiresum1;
wirecount1;
initial
begin
a1=0;
b1=0;
forever
begin
#({$random}%)
a1=~a1;
#({$random}%)
b1=~b1;
end
end
topt0(.a(a1),.b(b1),.sum(sum1),.count(count1));
endmodule
(4)对于延时,可以采用直接赋值的延时,如#5,使用随机延时目前暂时不常用。
当仿真到想结束时,可以在initial块的最后加$finish(此处可参考
大神李),即调用系统函数结束仿真,否则,仿真在ModelSim中会一直进行下去,不方便观察(在Vivado中设置的第一次仿真结束时间停止,默认1ns)。此外,这里建议使用$stop来代替$finish,即停止仿真,在ModelSim中是暂停了仿真,而$finishi则可能会退出,看不到仿真波形。
笔试
Verilog串并转换代码(in_valid不连续)
实习
英伟达(芯片设计、芯片验证、芯片架构、自动驾驶、深度学习)
实习
上海海思(小海思,数字/模拟芯片)
FPGA探索者