FPGA学习日志——一位全加器full_adder

全加器

全加器能进行被加数、加数和来自低位的进位信号相加,并根据求和结果给出该位的进位信号。
在电路上可以由两个半加器和一个或门构成全加器。
值得注意的是:一位全加器实现完成后,可以根据多个1位全加器的级联实现多位全加器。

实验框图
FPGA学习日志——一位全加器full_adder_第1张图片

模块调用

  1. 模块的实际意义是代表硬件电路上的逻辑实体。
  2. 每个模块都实现特定的功能。
  3. 模块之间是并行运行的。
  4. 模块是分层的,高层模块通过调用,连接低层模块的实例来实现复杂的功能。
  5. 各模块连接完成整个系统需要一个顶层模块。

悬空端口的处理

在实例化中,可能有些管脚没有用到,可以在映射中采用空白处理。
其中,输入管脚悬空,该管教输入为高阻态Z,输出管脚悬空,该管脚废弃不用。

实验代码

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

同一个模块多次调用时应注意后缀名称不同

仿真代码

`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

你可能感兴趣的:(FPGA学习日志,fpga开发,学习)