文章目录
一.实验任务
使用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 ,/