全加器(层次化设计)
该篇博客根据上一篇半加器的设计,再结合层次化的设计思想来实现一个全加器!
层次化设计理论部分:
数字电路中根据模块层次的不同有两种基本的结构设计方法:自底向上的设计方法 和 自顶向下的设计方法
自底向上(Bottom-Up)
自底向上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的,由基本单元构建高层单元,依次向上,直至构建系统,
自上而下(Top-Down)
从系统级开始,把系统分为基本单元,然后再把每个单元划分为下一层次的基本单元,一直这样做下去,直到直接可以用EDA元件库中的原件来实现为止。
混合使用
全加器设计:
全加器模块框图:
层次化设计 -- 用两个半加器组成的全加器模块框图:
代码部分:
选择器代码:在Src文件夹中新建 full_adder.v文件
module full_adder ( input wire in_1, input wire in_2, input wire cin, output wire sum, output wire count ); // 对变量进行重新命名,为了区分来自于哪个半加器 wire h0_sum; wire h0_count; wire h1_count; half_adder half_adder_inst0 ( .in_1 (in_1), .in_2 (in_2), .sum (h0_sum), .count(h0_count) ); half_adder half_adder_inst1 ( .in_1 (cin), .in_2 (h0_sum), .sum (sum), .count(h1_count) ); assign count = (h0_count | h1_count); endmodule
仿真文件代码:在Sim文件夹中新建 tb_full_adder.v文件
`timescale 1ns/1ns module tb_full_adder(); reg in_1 ; reg in_2 ; reg cin ; wire sum ; wire count; initial begin in_1 <= 1'b0 ; in_2 <= 1'b0 ; cin <= 1'b0 ; end initial begin $timeformat(-9,0,"ns",6); $monitor("@time %t:in_1=%b,in_2=%b,cin+%b,sum=%b,count=%b", $time, in_1, in_2, cin, sum, count); end always #10 in_1 <= {$random} % 2; always #10 in_2 <= {$random} % 2; always #10 cin <= {$random} % 2; full_adder full_adder_inst ( .in_1 (in_1), .in_2 (in_2), .cin (cin), .sum (sum), .count(count) ); endmodule
结果:
打印的日志正常
波形也正常