三、简单组合逻辑——半加器

加法器是数字电路中经常用到的一种基本器件,主要用于两个数或者多个数的加和,加法器又分为半加器和全加器。

半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。

全加器是在半加器的基础上的升级版,除了加数和被加数加和外还要加上上一级传进来的进位信号。

本项目用按键和led灯实现,用按键代表两个二进制位的输入,用一个灯表示结果位,另一个灯表示进位输出。

一、Visio画图

模块图,真值表,波形图如图:

二、写代码

module half_adder(
    input wire in_1,
    input wire in_2,
    output wire sum,
    output wire count//注意这里sum 和 count 应该声明为 wire 类型,而不是 reg 类型,因为它们是通过连续赋值语句来生成的。
);
/* 使用 wire 的场景:

用于组合逻辑。
用于连接模块之间的信号。
用于 assign 语句。
使用 reg 的场景:

用于时序逻辑(需要在时钟边沿进行更新的信号)。
在 always 或 initial 块中存储信号。
作为组合逻辑的输出信号,但必须在 always 块中进行赋值。 */
assign {count,sum}=in_1+in_2;
endmodule

三、仿真

仿真文件编写:

`timescale 1ns/1ns
module tb_half_adder();
    reg in_1;//被赋值用reg
    reg in_2;
    wire sum;
    wire count;
    //初始化
    initial
        begin
            in_1<=1'b0;
            in_2<=1'b0;
        end
    
    always #10 in_1<={$random}%2;
    always #10 in_2<={$random}%2;
    
    
    //打印系统函数便于观察
    initial
        begin
            $timeformat{-9,0,"ns",6};
            $monitor{"@time %t:in_1=%b,in_2=%b,sum=%b,count=%b",$time,in_1,in_2,sum,count};
        end
    //实例化
half_adder(
    .in_1 (in_1),
    .in_2 (in_2),
    .sum  (sum),
    .count(count)
);
endmodule

仿真结果如图:

查看打印信息

与真值表一致,仿真验证通过

四、管脚绑定及上板验证

之后进行一次全编译,然后给板上电,接着下载程序,便可进行上板验证

当未按下按键时,两个按键都是高电平,都等于1,所以结果位led灯亮,结果位led不亮;

当按下其中之一的按键,一个为1,一个为0,则结果位led不亮,进位led亮;

当两个按键均按下时,两个按键均为低电平,结果位和进位输出位led均点亮。

(注:led也是低电平点亮,高电平不亮)

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值