【FPGA入门十二】1bit全加器实现计算8位二进制数中1的个数

这篇博客介绍了如何使用FPGA设计一个系统,通过按键输入8位二进制数并计算其中1的个数。文章详细阐述了设计思路,包括按键消抖、位拼接、1位全加器的7次例化来计数1的个数,以及数码管显示。最后,作者进行了仿真验证并总结了设计过程的关键点。
摘要由CSDN通过智能技术生成

一.实验任务

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

二.设计思路

按键KEY2和KEY3经过消抖后,作为信号0,1的输入,经过八次按下按键后,通过位拼接操作得到一个8位寄存器存储的2进制数,同时用一个计数器记录按键按下的次数,当按下8次后,会有一个1s计数器开启,计数器开启的时间内,按键不可操作,直到计时满1s后,计数器
开启标志置0,按键恢复可操作状态,这是为了数码管显示的时间为1s后清零,将该数传入1个数计数模块,经过1bit全加器的7次例化后得到8位二进制数中的1的个数,将该数传入数码管显示模块,通过传入的数选择对应的端选信号,顶层模块例化按键消抖模块,按键 输入模块数码管显示模块,1个数计数模块

三.代码实现

①设计按键消抖模块

说明:

该模块通过检测按键输入的下降沿后延迟20ms后采样,得到按键按下一次的一个高电平脉冲。

key.v

module key(
    input                clk     ,
    input                rst_n   ,
    input        [1:0]   key_in  ,

    output  reg  [1:0]   key_done
);

//参数定义
parameter TIME_delay = 1000_000;//20ms

//信号定义
reg     [19:0]      cnt     ;
reg     [1 :0]      key_r0  ;//同步
reg     [1 :0]      key_r1  ;//触发器打拍
reg                 flag    ;//计数器开启标志

wire    [1 :0]      nedge   ;       
wire                add_cnt ;
wire                end_cnt ;

//同步
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        key_r0 <= 2'b11;
    end
    else begin
        key_r0 <= key_in;
    end
end

//打拍
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        key_r1 <= 2'b11;
    end
    else begin
        key_r1 <= key_r0;
    end
end

assign nedge = {
   ~key_r0[1] && key_r1[1],~key_r0[0] && key_r1[0]};//~key_r0 & key_r1

//计数器开启标志
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            flag <= 1'b0;
        end
        else if(nedge)begin//开启
            flag <= 1'b1;
        end
        else if(end_cnt) begin
            flag <= 1'b0;
        end
    end
//计数器
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)begin
            cnt <= 0;
        end
        else if(add_cnt)begin
            if(end_cnt)begin//计满清零
                cnt <= 0;
            end
            else begin
                cnt <= cnt + 1;
            end
        end
    end

    assign add_cnt = flag;
    assign end_cnt = add_cnt && cnt == TIME_delay - 1;

//key_done输出值
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            key_done <= 2'd0;
        end
        else if(cnt == TIME_delay - 1)begin
            key_done <= ~key_r0;
        end
        else begin
            key_done <= 0;
        end
    end

endmodule

②设计按键输入8bit二进制数

说明:

key_done[0]:输入0,key_done[1]:输入1

key_in_num.v

//按键输入8bit二进制数
module key_in_num(
    input                clk     ,//时钟信号
    input                rst_n   ,/
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值