微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 为什么按下一个不加一,而是数值是乱的,在线等

为什么按下一个不加一,而是数值是乱的,在线等

时间:10-02 整理:3721RD 点击:
//矩阵键盘扫描 并将键值送出
module matrix_key
(
  clk,  //48MHZ
  reset,
  col,   //列
  row,   //行
  data_1,//键值,个位
  data_10,//十位
     data_100,//百位
  data_1000  //千位
);
input clk,reset;
input [1:0] col;
output [1:0] row;
output [3:0] data_1,data_10,data_100,data_1000;
reg [1:0] row;
reg [3:0] data_1,data_10,data_100,data_1000;
reg [5:0] count;//delay_20ms
reg [2:0] state;  //状态标志
reg key_flag;   //按键标志位
reg clk_500khz;  //500KHZ时钟信号
reg [1:0] col_reg;  //寄存扫描列值
reg [1:0] row_reg;  //寄存扫描行值
reg [19:0] cnt;
reg [3:0] num;
//initial begin num=  4'd0;end
always @(posedge clk or negedge reset)

if(!reset)
  begin
   clk_500khz =50)
    begin
     //cnt<=cnt+1;
     clk_500khz<=~clk_500khz;
     count<=0;
    end
       else
   count<=count+1;
     end
always @(posedge clk_500khz or negedge reset)
if(!reset)
  begin
   row<=2'b00;
   state<=0;
   
  end
    else
// if(cnt==20'hfffff)

     begin
   
       case (state)
       0:
           begin
           row[1:0]<=2'b00;
           key_flag<=1'b0;
     cnt<=0;
           if(col[1:0]!=2'b11) //有键按下,扫描第一行
      begin
       state<=1;
       row[1:0]<=2'b10;
      end
           else
      state<=0;
    end
       1:  
          begin
           if(col[1:0]!=2'b11)//判断是否是第一行
      begin
       state<=5;
      end   
           else      //准备扫描第二行
      begin
       state<=2;
       row[1:0]<=2'b01;
      end  
           end
       2:
          begin   
           if(col[1:0]!=4'b11) //判断是否是第二行
      begin
       state<=5;
      end   
           else   
      begin
       state<=0;//重新扫描
       row[1:0]<=2'b00;
      end  
          end
       5:
           begin  
             if(col[1:0]!=2'b11)
       //if(cnt==15'hffff)
       begin
       if(cnt==15'hfff)
        begin
        cnt<=0;
        row_reg<=row;  //保存扫描列值  
        col_reg<=col;  //保存扫描行值
        
        key_flag<=1'b1;  //有键按下
       end
        else
        cnt<=cnt +1;
        state<=5;
      
       end  
        
             else
               begin
       state<=0;
      end
           end   
       endcase
     end           
always @(posedge clk_500khz or negedge reset)//(posedge clk_500khz) //or reset or row_reg or col_reg)
   if(!reset)
  begin
  num<=1'b0;
  end
else
  if(cnt==15'hff)
  begin
// if(key_flag==1'b1)

   num<=num+1;
   case ({row_reg,col_reg})
    4'b1010:
//   if(cnt==20'hfffff)
    begin
     
     if(num < 10)
     begin
       num <= num +1'b1;
      
     end
     else
       num <= 1'b0;
    end
   4'b1001:
//   if(cnt==20'hfffff)
     begin
     
      if(num==0)
       num <=9;
       else
         num <= num -1;
     end
    default:;//啥也不做
   endcase
  end
always @(clk_500khz)  //or col_reg or row_reg or reset)
if(!reset)
  begin
   data_1=15;//复位全灭,显示模块只解析0-9,其他全为灭
   data_10=15;
   data_100=15;
   data_1000=15;
  end
else
// if(key_flag==1'b1)
      begin
    //case ({row_reg,col_reg})
             // 4'b1010:
     // begin
      data_1=num;data_10=0;data_100=0;data_1000=10;
     // end//key1
             //    4'b1001:
     //   begin
     //   data_1=num;data_10=0;data_100=0;data_1000=10;
     //   end
             //    4'b0110:begin data_1=3;data_10=0;data_100=0;data_1000=10;end
             //    4'b0101:begin data_1=4;data_10=0;data_100=0;data_1000=10;end//key4
    // default:;//啥也不做      
           //  endcase
     
       end   
endmodule

Modelsim 仿真一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top