发 帖  
原厂入驻New
[问答]

矩阵键盘 verilog 状态机问题

245 verilog
分享
矩阵键盘状态转移图都对,但是跳转到scan_col0这个后就不会往下跳转,所以按键只有第一列有反应,其他的几列都不会有反应,实在找不出问题在哪里恳请帮助


//状态机第一部分
always @ (posedge clk100 or negedge rst_n)
  if(!rst_n)
     current_state <= idle;
  else
     current_state <= next_state;


                                 
// 状态机第二部分
always @ (*)begin
if(!rst_n)
  next_state  = idle;  
else   
  case (current_state)
    idle :                    
        if (row != 5'h1F)
          next_state = key_jitter1;
        else
          next_state = idle;
    key_jitter1 :                        
        if (row != 5'h1F)
                    if ( delay_done == 1'b1)
            next_state = scan_col0  ;
          else
           next_state = key_jitter1;
                 else
                   next_state = idle;
    scan_col0 :                                      
        if (row != 5'h1F)
            next_state = key_judge;
                  else
          next_state = scan_col1;   
    scan_col1 :                        
        if (row != 5'h1F)
           next_state = key_judge;
                  else   
          next_state = scan_col2;
    scan_col2 :                        
        if (row != 5'h1F)
                     next_state = key_judge;
                  else
           next_state = scan_col3;
         scan_col3 :                        
             if (row != 5'h1F)          
                     next_state = key_judge;
                  else
                     next_state = idle;  
         key_judge :                        // 有按键按下,判断是否为特殊按键
        if (({col,row} == 9'b1011_11101) || ({col,row} == 9'b1101_11011) || ({col,row} == 9'b1101_11110) || ({col,row} == 9'b1110_11101)  || ({col,row} == 9'b0111_11011)  || ({col,row} == 9'b0111_11101)  || ({col,row} == 9'b1101_01111)  || ({col,row} == 9'b1110_01111))
          next_state = key_pressed;
        else
          next_state = key_pressed3;
    key_pressed :                        
        if (row != 5'h1F)
          next_state = key_read1;
        else
          next_state = idle;
         key_read1 :
        if (row != 5'h1F) begin         
              if (cnt_1s_sig == 1'b0)        //按键小于1s,特殊按键单输出
                   begin   next_state = key_read1; end
                   else
                   begin   next_state = key_read2; end
                  end
                  else
                     next_state = idle;
         key_read2 :                       //特殊按键长按输出
             if (row != 5'h1F )
                   next_state = idle;
        else
          next_state = key_read2;
         key_pressed3 :         //普通按键         
        if (row != 5'h1F )   
         next_state = key_read3;
        else
          next_state = idle;
    key_read3 :                      //普通按键输出
        if  (row == 5'h1F && delay_done == 1'b1)   
                next_state = idle;
       else
           next_state = key_read3;
   default: next_state = idle;                                               
  endcase
              end


reg [3:0] col_val;
reg [4:0] row_val;

// 根据次态,给相应寄存器赋值
always @ (posedge clk100 or negedge rst_n)
  if (!rst_n)
    begin
      col <= 4'h0;
    end
else
    case (next_state)
           idle:col<=4'h0;
                key_jitter1:begin end
      scan_col0: col <= 4'b0111;
      scan_col1: col <= 4'b1011;
      scan_col2: col <= 4'b1101;
      scan_col3: col <= 4'b1110;
                key_judge: col <= col;     
      key_pressed:  begin
        col_val<=col;   
        row_val<=row;  //锁存键值   
       end
                key_read1:    begin       end
               
                key_read2:    begin       end
                key_pressed3: begin       end
                key_read3:    begin       end
         default:;  
        endcase
                

0
已退回80积分
2020-10-8 11:48:54   评论 分享淘帖 邀请回答
2个回答
只有第一列的按键才有反应,其他列的都没反应
2020-10-8 11:51:29 评论

举报

请使用插入代码功能将完整代码上传便于仿真定位问题。
2020-10-9 08:46:12 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
快速回复 返回顶部 返回列表