链接:https://pan.baidu.com/s/12nHXq54EEjUeYRVefVXLIg
提取码:1234
功能
本设计主要分为三个主要部分:按键控制部分、数码管转速档位显示部分、PWM信号产生部分。分别采用verilog 语言完成底层模块的设计和以原理图的方法完成顶层模块的设计,采用自顶向下的设计方法,实现通过按键控制直流电机的转速,并将转速档位分为10个等级,同时将当前的转速档位显示到数码。在软件平台下分别对设计项目、各个模块以及顶层模块进行仿真分析。
module key(
clk,
reset_n,
key,
key_en_out
);
input clk,reset_n,key; //时钟输入,按键输入
output key_en_out;//经消抖后的按键信号下降沿检测有效信号输出
/***********************按键消抖***************************/
// 功能:按键消抖
// 说明:
// 采用状态机的方式对按键信号进行消抖
// 状态机型消抖电路
// 状态机型消抖电路采用有限状态机的设计方法来描述与实现,状态机有S0,S1,S2,s3四种状态,
// 在S0状态下key_out输出为低电平,并以clk时钟信号的频率采样按键输入信号,如果key_in=‘0’,
// 则保持在S0状态,并继续采样按键输入信号的状态;
// 如果key_in=‘1’,则转入S1状态;在S1状态下key_out输出仍为低电平,
// 继续采样按键输入信号的状态,如果key_in=‘1’,则转入S2状态,如果key_in=‘0’则转入S0状态;
// 在S2状态下继续采样按键输入信号的状态,如果key_in=‘1’,则保持在S2状态,
// key_out输出正脉冲,如果key_in=‘0’,则转入S3状态;
// 在S3状态下继续采样按键输入信号的状态,如果key_in=‘1’,则保持在S3状态,
// key_out输出正脉冲,如果key_in=‘0’,则转入S0状态;key_out输出消抖后的低电平有效信号。
// 本设计消抖模块采用的是14个状态机进行消抖
// ***********************************************************
reg key_out;
parameter s0=4'd0,
s1=4'd1,
s2=4'd2,
s3=4'd3,
s4=4'd4,
s5=4'd5,
s6=4'd6,
s7=4'd7,
s8=4'd8,
s9=4'd9,
s10=4'd10,
s11=4'd11,
s12=4'd12,
s13=4'd13;
reg [3:0] state;
reg clk_div;//产生分频信号用于对按键信号进行消抖
reg[31:0] counter1;
always @(posedge clk or negedge reset_n)
begin
if(!reset_n)
begin
counter1 <= 32'd0;
clk_div <= 1'b0;
end
else
if(counter1 == 32'd499)
begin
counter1 <= 32'd0;
clk_div <= ~clk_div;
end
else
counter1 <= counter1 + 1'b1;
end
// always @(posedge clk or negedge reset_n)//仅用于仿真
always @(posedge clk_div or negedge reset_n)//
begin
if(reset_n == 1'b0)
begin
state<=s0;
key_out<=1'b1;
end
else
begin
case (state)
s0:
begin
key_out<=1'b1;
if(key==1'b0)
state<=s1;
else
state<=s0;
end
s1:
begin
if(key==1'b0)
state<=s2;
else
state<=s0;
end
s2:
begin
if(key==1'b0)
state<=s3;
else
state<=s0;
end
s3:
begin
if(key==1'b0)
state<=s4;
else
state<=s0;
end
s4:
begin
if(key==1'b0)
state<=s5;
else
state<=s0;
end
s5:
begin
if(key==1'b0)
state<=s6;
else
state<=s0;
end
s6:
begin
if(key==1'b0)
state<=s7;
else
state<=s0;
end
s7:
begin
if(key==1'b0)
state<=s8;
else
state<=s0;
end
s8:
begin
if(key==1'b0)
state<=s9;
else
state<=s0;
end
s9:
begin
if(key==1'b0)
state<=s10;
else
state<=s0;
end
s10:
begin
if(key==1'b0)
state<=s11;
else
state<=s0;
end
s11:
begin
if(key==1'b0)
state<=s12;
else
state<=s0;
end
s12:
begin
if(key==1'b0)
state<=s13;
else
state<=s0;
end
s13:
begin
if(key==1'b0)
begin
key_out<=1'b0;
state<=s13;
end
else
begin
key_out<=1'b1;
state<=s0;
end
end
default:
state<=s0;
endcase
end
end
//检测消抖后按键信号的下降沿
reg key_out_r1;
reg key_out_r2;
always @(posedge clk or negedge reset_n)
begin
if(!reset_n)
begin
key_out_r1 <= 1'b0;
key_out_r2 <= 1'b0;
end
else
begin
key_out_r1 <= key_out;
key_out_r2 <= key_out_r1;
end
end
assign key_en_out = ~(key_out_r2 && (~key_out_r1));//下降沿检测 低电平有效
endmodule