矩阵键盘按键输入多位数的显示问题

2019-07-15 20:34发布

是这样的,矩阵键盘那一部分已经完成了,就是显示这一块,比如想通过键盘输入125,先按1,应该显示001;再按2,显示012;最后按5,显示125。但是问题是先后分别显示的是111、222、555。显示部分的代码如下:
数码管显示部分的时钟是1KHZ;
key_data=4'hb或4'hc或4'ha是我定义的功能键;
按理key_data_reg0、key_data_reg1、key_data_reg2、key_data_reg3的变化应该如下:
按下c键(设置按键):key_data_reg0=0
                                    key_data_reg1=0
                                    key_data_reg2=0
                                    key_data_reg3=0
按下1键:                    key_data_reg0=1
                                    key_data_reg1=0
                                    key_data_reg2=0
                                    key_data_reg3=0
按下2键:                    key_data_reg0=2
                                    key_data_reg1=1
                                    key_data_reg2=0
                                    key_data_reg3=0
按下5键:                    key_data_reg0=5
                                    key_data_reg1=2
                                    key_data_reg2=1
                                    key_data_reg3=0
按下a键(确认按键):key_data_reg0=a
                                    key_data_reg1=5
                                    key_data_reg2=2

                                    key_data_reg3=1
  1. module display(
  2.     clk    ,
  3.     rst_n     ,
  4.     key_data  ,
  5.     sel       ,
  6.     seg
  7.     );


  8.     //输入信号定义
  9.     input               clk ;
  10.     input               rst_n  ;
  11.     input[3:0]          key_data ;

  12.     //输出信号定义
  13.     output              sel    ;
  14.     output              seg    ;

  15.     //输出信号reg定义
  16.     reg[2:0]            sel    ;    //数码管的位选信号
  17.     reg[7:0]            seg    ;    //数码段的段选信号

  18.     //中间信号定义
  19.     reg[3:0]            disp_data       ;  //单个数码管要显示的数据
  20.          reg[3:0]            key_data_reg0   ;
  21.          reg[3:0]            key_data_reg1   ;
  22.          reg[3:0]            key_data_reg2   ;
  23.          reg[3:0]            key_data_reg3   ;

  24.          

  25.    always @(posedge clk or negedge rst_n)begin
  26.            if(rst_n == 1'b0)begin
  27.                 sel <= 3'b110;
  28.                 end
  29.                 else if(sel == 3'b110)begin
  30.                 sel <= 3'b101;
  31.                 end
  32.                 else if(sel == 3'b101)begin
  33.                 sel <= 3'b011;
  34.                 end
  35.                 else begin
  36.                 sel <= 3'b110;
  37.                 end
  38.          end
  39.          
  40.          always@(key_data)begin
  41.         if(rst_n==1'b0)begin
  42.             key_data_reg0 <= 4'd0;
  43.             key_data_reg1 <= 4'd0;
  44.             key_data_reg2 <= 4'd0;
  45.                                 key_data_reg3 <= 4'd0;
  46.         end
  47.         else if(key_data == 4'hb | key_data == 4'hc)begin     
  48.             key_data_reg0 <= 4'd0;
  49.             key_data_reg1 <= 4'd0;
  50.             key_data_reg2 <= 4'd0;
  51.                                 key_data_reg3 <= 4'd0;
  52.         end
  53.                   else begin
  54.                                 key_data_reg0 <= key_data;
  55.             key_data_reg1 <= key_data_reg0;
  56.                                 key_data_reg2 <= key_data_reg1;
  57.                                 key_data_reg3 <= key_data_reg2;
  58.                   end
  59.     end
  60.          
  61.          
  62.          
  63.          always  @(posedge clk or negedge rst_n)begin                                 //将对应位数的值赋给对应位数码管
  64.         case(sel)
  65.             3'b110: disp_data <= key_data_reg1 ;
  66.             3'b101: disp_data <= key_data_reg2 ;
  67.             3'b011: disp_data <= key_data_reg3;
  68.             default: disp_data <= 4'b0000;
  69.                                 endcase
  70.     end


  71.     always  @(posedge clk or negedge rst_n)begin          //数码管显示表
  72.          if(rst_n == 1'b0)begin
  73.                 seg = 8'b11000000;
  74.          end
  75.      else begin
  76.                 case(disp_data)
  77.          4'd0:seg = 8'b11000000;
  78.                         4'd1:seg = 8'b11111001;
  79.                         4'd2:seg = 8'b10100100;
  80.                         4'd3:seg = 8'b10110000;
  81.                         4'd4:seg = 8'b10011001;
  82.                         4'd5:seg = 8'b10010010;
  83.                         4'd6:seg = 8'b10000010;
  84.                         4'd7:seg = 8'b11111000;
  85.                         4'd8:seg = 8'b10000000;
  86.                         4'd9:seg = 8'b10010000;
  87.                         default:seg = 8'b10001110;
  88.                         endcase
  89.                 end
  90.     end



  91.     endmodule

复制代码
单纯的对这段代码进行了仿真,如图结果应该是正确的,但是到板子上就不对了。
怀疑是时序问题,但是对时序问题不知如何下手(可能实际按键输入值key_data与我仿真时给key_data直接赋值不一样?)

又或者是阻塞非阻塞的问题?


仿真.PNG
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。