【FPGA】使用1 bit 全加器,计算一个8 bit 数中 1 的个数,并将计算结果通过数码管显示。

一、解题思路

  • 什么是全加器?

全加器就是考虑进位的加法运算器。

一位全加器有Ci-1,Ai,Bi,Si,Ci。

输入端有Ci-1,Ai,Bi。
Ci-1:前一次运算后是否有进位,有进位则为1,无进位则为0.
Ai:被加数
Bi:加数
输出端:Si,Ci
Si:输出结果
Ci:输出本次运算的进位

全加器真值表:

在这里插入图片描述
下面就8bit数值进行逻辑结果上的梳理:
在这里插入图片描述
通过这7个全加器我们就可以得到8 bit 数中 1 的个数。

二、代码实现

module add_8 (
    input        [3:0]    key      ,

    output                sel      ,
    output  reg  [7:0]    seg_dig
);

    wire s0,s1,s2,s3,s4,s5,s6;
    wire c0,c1,c2,c3,c4,c5,c6;

    reg   [7:0] data_in ;
    wire  [3:0] data_out;

//位选信号
    assign sel = 1'b0;

//段选信号
    always @(*) begin
        case(data_out)
            4'd0: seg_dig <= 8'b1100_0000;
            4'd1: seg_dig <= 8'b1111_1001;
            4'd2: seg_dig <= 8'b1010_0100;
            4'd3: seg_dig <= 8'b1011_0000;
            4'd4: seg_dig <= 8'b1001_1001;
            4'd5: seg_dig <= 8'b1001_0010;
            4'd6: seg_dig <= 8'b1000_0010;
            4'd7: seg_dig <= 8'b1111_1000;
            4'd8: seg_dig <= 8'b1000_0000;
            4'd9: seg_dig <= 8'b1001_0000;
            default:seg_dig<=8'b1100_0000; 
        endcase
    end

//输入8bit数
    always @(*) begin
        if(key[0] == 1'b0)begin
            data_in = 8'b1101_0100;//4个1
        end
        else if (key[1] == 1'b0)begin
            data_in = 8'b0111_1100;//5个1
        end
        else if(key[2] == 1'b0)begin
            data_in = 8'b1111_0011;//6个1
        end
        else  if(key[3] == 1'b0)begin
            data_in = 8'b0110_0001;//3个1x
        end
        else begin
            data_in = 8'b0000_0000;
        end        
    end  
    
    assign {c0,s0}= data_in[0] + data_in[1] + data_in[2];
    assign {c1,s1}= data_in[3] + data_in[4] + data_in[5];
    assign {c2,s2}= s0         + s1         + data_in[6];
    assign {c3,s3}= s2         + data_in[7] + 1'b0      ;
    assign {c4,s4}= c0         + c1         + c2        ;
    assign {c5,s5}= s4         + c3         + 1'b0      ;
    assign {c6,s6}= c5         + c4         + 1'b0      ;

    assign data_out = {c6,s6,s5,s3};

endmodule

三、仿真

1、仿真代码

`timescale 1ns/1ps
module tb_add_8;
    reg [3:0] tb_key  ;
    

    wire    tb_sel    ;
    wire    tb_seg_dig;
    
    parameter CYCLE = 20;  // 时钟周期
    initial begin
       
        tb_key = 4'b0001;
        #(CYCLE * 100); 
         tb_key = 4'b0010;
        #(CYCLE * 100); 
         tb_key = 4'b0100;
        #(CYCLE * 100); 
         tb_key = 4'b1000;
        #(CYCLE * 100); 
		  $stop;

        end
    add_8 u_add_8(
    .key      (tb_key),
    .sel      (tb_sel),
    .seg_dig  (tb_seg_dig)


    );

endmodule

2、仿真截图

在这里插入图片描述

四、演示视频

使用1 bit 全加器,计算一个8 bit 数中 1 的个数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值