数字电路中根据模块层次不同有两种基本的结构设计方法:自底向上的设计方法和自顶向下的设计方法
自底向上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的(基本单元是已有的或者是购买的),有基本单元构建高层单元,依次向上,直至构建系统
从系统开始,把系统分为基本单元,然后再把每个单元划分为下一层次的基本单元,一直这样做下去,直到直接可以使用EDA元件库中的元件来实现为止
将顶层模块进行继续划分
module half_adder( input wire in_1, input wire in_2, output wire sum, output wire count ); assign {count,sum} = in_1 + in_2; endmodule
module full_adder( input wire in_1, // 输入两个加数和一个低位进位 input wire in_2, input wire cin, output wire sum, // 输出和 进位 output wire count ); // 例化过程中需要引出的线,单独进行命名 // 第一个半加器的输出 sum -- 顶层没有定义子模块的输出,所以要自己定义 // 声明两个变量,将第一个半加器的输出引出来 // 可以对变量进行重新进行命名 wire h0_sum; wire h0_count; // 将第二个半加器的输出引出来 wire h1_count; half_adder half_adder_inst1( .in_1 (in_1), // 输入in_1 in_2 .in_2 (in_2), .sum (h0_sum), // in_1 ^ in_2 .count (h0_count) // in_1 & in_2 ); half_adder half_adder_inst2( .in_1 (cin), // 输入是第一个半加器的输入和进位 .in_2 (h0_count), .sum (sum), // 输出是 in_1 ^ in_2 ^ cin .count (h1_count) // 进位是 (in_1 ^ in_2) & cin + in_1 & in_2 ); assign count = (h0_count | h1_count); endmodule
`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: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