基于FPGA的直流电机调速系统设计

链接: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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值