• [Verilog] 薄膜建盤4X4 電路程式設計


    最近研究需要用到4X4薄膜鍵盤設計。

    就稍微研究了一下,有些資料參考這網站介紹還蠻清楚的

    原理就是,行1~行4送掃描碼,列1~列4讀值。

    例如: 

    1. 行1~行4送 (0111)2進制的值,如果列1~列4讀到(0111)就表示Key 1被按下了。

    2. 行1~行4送 (1101)2進制的值,如果列1~列4讀到(1011)就表示Key 6被按下了。

    所以Verilog在寫程式的時候就要看現在是送那一列的掃描碼, 讀進來後是哪一個為0代表被按下。

    [Note] 其中每個列的訊號端需要接一個pull high電組 ,以防止腳位浮接。

    程式碼如下:

      1 // --------------------------------------------------------------------
      2 // Copyright (c) 2011 by TKU ICLAB. 
      3 // --------------------------------------------------------------------
      4 /*  use follow instruction to call the function
      5 
      6                             4X4 Keypad
      7            Pin1    Pin2    Pin3    Pin4    Pin5    Pin6    Pin7    Pin8
      8 function   row1    row2    row3    row4    col1    col2    col3    col4
      9 
     10 FPGA PIN  iKey_Read[3]  ~  iKey_Read[0] | oKey_Scan[3]  ~  oKey_Scan[0]
     11 
     12  */
     13 `define default_netype none 
     14 module Keypad4X4_top (
     15         iClk_50M,       // 50Mhz
     16         iRst_n,     // reset_n
     17         
     18         iKey_Read,  // Key Read 
     19         oKey_Scan,  // Key Scan code
     20         
     21         oDval,      // a trigger
     22         oKeyCode,    //  Key code4
     23         oKey
     24 
     25     );
     26 //===========================================================================
     27 // PORT declarations
     28 //===========================================================================
     29 input           iClk_50M;
     30 input           iRst_n;
     31         
     32 input   [3:0]   iKey_Read;  // Key Read 
     33 output  [3:0]   oKey_Scan;  // Key Scan code
     34         
     35 output          oDval;      // a trigger
     36 output  [4:0]   oKeyCode;   // Key code
     37 output  [15:0]  oKey;
     38 //=============================================================================
     39 // REG/WIRE declarations
     40 //=============================================================================
     41 reg  [15:0]  oKey;
     42 reg             oDval, rDval;
     43 reg     [3:0]   oKey_Scan;
     44 reg     [4:0]   oKeyCode;
     45 wire            wClk_1khz;
     46 wire    [2:0]   wKey_Dly;
     47 reg     [1:0]   rCnt, rSt;
     48 reg     [4:0]   rKeyCode, rKeyCode_d1, rKeyCode_d2, rKeyCode_d3;
     49 reg     [3:0]   rKey_Read_Dly0, rKey_Read_Dly1;
     50 reg     [3:0]   rKey_Read;
     51 wire            wclk4X;
     52 reg             rPressKey;
     53 //=============================================================================
     54 // Structural coding
     55 //=============================================================================
     56 ///*
     57 Clkdiv #( .CLKFREQ(50000000), .EXCEPTCLK(500000), .multipleX(4) ) UX1
     58         (   
     59             .iClk50M(iClk_50M),  // 50Mhz clock 
     60             .iRst_n(iRst_n),
     61             .oClk(wClk_1khz),     // 1ms clock
     62             .oSampClk(wclk4X),  // multipleX expect clock, for SignalTap use
     63         );
     64 //*/
     65 
     66 //// send column scan 
     67 always@(posedge wClk_1khz or negedge iRst_n) begin
     68     if(!iRst_n) begin
     69         rCnt <= 0;
     70         oKey_Scan <= 0;
     71         rSt <= 0;
     72     end
     73     else begin
     74         case(rSt)
     75             2'b00:  begin   oKey_Scan <= 4'b0111; rCnt <= rCnt+2'b1;
     76                             if(rCnt == 3)  rSt <= rSt + 1;
     77                             else rSt <= rSt; end // 1 column
     78             2'b01:  begin   oKey_Scan <= 4'b1011; rCnt <= rCnt+2'b1; 
     79                             if(rCnt == 3)  rSt <= rSt + 1;
     80                             else rSt <= rSt;
     81                                               end // 2 column
     82             2'b10:  begin   oKey_Scan <= 4'b1101; rCnt <= rCnt+2'b1; 
     83                             if(rCnt == 3)  rSt <= rSt + 1;
     84                             else rSt <= rSt;   end // 3 column
     85             default:  begin   oKey_Scan <= 4'b1110; rCnt <= rCnt+2'b1; 
     86                             if(rCnt == 3)  rSt <= rSt + 1;
     87                             else rSt <= rSt;  end // 4 column
     88         endcase
     89     end
     90 end
     91 
     92 // send column scan 
     93 always@(posedge wClk_1khz or negedge iRst_n) begin
     94     if(!iRst_n) begin
     95         oKey <= 0;
     96         rDval <= 0;
     97         rKeyCode <= 0;
     98         rPressKey <= 0;
     99     end
    100     else begin
    101         oKey <= oKey;
    102         //  read row
    103         case(iKey_Read)
    104             4'b0111:  begin     // 1 row
    105                     oKey[3:0] <= 0;
    106                     case(oKey_Scan)
    107                         4'b0111: begin rDval <= 1; rKeyCode <= 5'd1;  oKey[0] <= 1; end//'1'
    108                         4'b1011: begin rDval <= 1; rKeyCode <= 5'd2;  oKey[1] <= 1; end//'2'
    109                         4'b1101: begin rDval <= 1; rKeyCode <= 5'd3;  oKey[2] <= 1; end//'3'
    110                         4'b1110: begin rDval <= 1; rKeyCode <= 5'd10; oKey[3] <= 1; end//'A'
    111                         default: begin rDval <= 0; rKeyCode <= 5'd16; oKey[3:0] <= 0;end//'E'
    112                     endcase
    113                       end 
    114             4'b1011:  begin     // 2 row
    115                     oKey[7:4] <= 0;
    116                     case(oKey_Scan)
    117                         4'b0111: begin rDval <= 1; rKeyCode <= 5'd4;  oKey[4] <= 1;end//'4'
    118                         4'b1011: begin rDval <= 1; rKeyCode <= 5'd5;  oKey[5] <= 1;end//'5'
    119                         4'b1101: begin rDval <= 1; rKeyCode <= 5'd6;  oKey[6] <= 1;end//'6'
    120                         4'b1110: begin rDval <= 1; rKeyCode <= 5'd11; oKey[7] <= 1;end //'B'
    121                         default: begin rDval <= 0; rKeyCode <= 5'd16; oKey[7:4] <= 0;end //'E'
    122                     endcase
    123                       end 
    124             4'b1101:  begin     // 3 row
    125                     oKey[11:8] <= 0;
    126                     case(oKey_Scan)
    127                         4'b0111: begin rDval <= 1; rKeyCode <= 5'd7;  oKey[8] <= 1;end//'7'
    128                         4'b1011: begin rDval <= 1; rKeyCode <= 5'd8;  oKey[9] <= 1;end//'8'
    129                         4'b1101: begin rDval <= 1; rKeyCode <= 5'd9;  oKey[10] <= 1;end//'9'
    130                         4'b1110: begin rDval <= 1; rKeyCode <= 5'd12; oKey[11] <= 1;end//'C'
    131                         default: begin rDval <= 0; rKeyCode <= 5'd16; oKey[11:8] <= 0;end //'E'
    132                     endcase
    133                       end 
    134             4'b1110:  begin     // 4 row
    135                     oKey[15:12] <= 0;
    136                     case(oKey_Scan)
    137                         4'b0111: begin rDval <= 1;rKeyCode <= 5'd14;  oKey[12] <= 1; end//'*'
    138                         4'b1011: begin rDval <= 1;rKeyCode <= 5'd0;   oKey[13] <= 1;end//'0'
    139                         4'b1101: begin rDval <= 1;rKeyCode <= 5'd15;  oKey[14] <= 1;end//'#'
    140                         4'b1110: begin rDval <= 1;rKeyCode <= 5'd13;  oKey[15] <= 1;end//'D'
    141                         default: begin rDval <= 0;rKeyCode <= 5'd16;  oKey[15:12] <= 0;end//'E'
    142                     endcase
    143                       end
    144             4'b1111:  begin     // 4 row
    145                         rDval <= 0; rKeyCode <= 5'd16;   oKey <= oKey;
    146                         case(oKey_Scan)
    147                         4'b0111: begin rDval <= 1; rKeyCode <= 5'd1;  oKey[0] <= 0; 
    148                                        oKey[4] <= 0;oKey[8] <= 0;oKey[12] <= 0;end//'1'
    149                         4'b1011: begin rDval <= 1; rKeyCode <= 5'd2;  oKey[1] <= 0; 
    150                                        oKey[5] <= 0;oKey[9] <= 0;oKey[13] <= 0;end//'1'end//'2'
    151                         
    152                         4'b1101: begin rDval <= 1; rKeyCode <= 5'd3;  oKey[2] <= 0; 
    153                                        oKey[6] <= 0;oKey[10] <= 0;oKey[14] <= 0;end//'1'end//'3'
    154                         4'b1110: begin rDval <= 1; rKeyCode <= 5'd10; oKey[3] <= 0; 
    155                                        oKey[7] <= 0;oKey[11] <= 0;oKey[15] <= 0;end//'1'end//'A'
    156                         default: begin rDval <= 0; rKeyCode <= 5'd16; oKey <= oKey;end//'E'
    157                         endcase
    158  
    159 
    160                       end 
    161             default:  begin
    162                       rDval <= 0; rKeyCode <= 5'd16;  
    163                       oKey <= oKey;// No key press
    164                       end
    165         endcase
    166     end
    167 end
    168 
    169 
    170 
    171 // disbounce
    172 always@(posedge wClk_1khz or negedge iRst_n) begin
    173     if(!iRst_n) begin
    174         oDval <= 0;
    175         oKeyCode <= 5'd16;
    176     end
    177     else begin
    178         if( rDval ) begin
    179             oKeyCode <= rKeyCode;
    180             oDval <= 1;
    181         end
    182         else begin
    183             oKeyCode <= oKeyCode;
    184             oDval <= 0;
    185             
    186         end
    187     end
    188 end
    189 
    190 endmodule
  • 相关阅读:
    C#中Excel的导入和导出的几种基本方式
    关于XML与类型Class的映射
    关于模板的相关注意事项
    OGRE 2.1 Windows 编译
    R6010 -abort() has been called
    VS2012 编译 Assimp
    C++ 并发消息队列
    Debian 安装下载工具软件
    Oracle SQL语句追踪
    记录自己学习网址
  • 原文地址:https://www.cnblogs.com/lishyhan/p/7218783.html
Copyright © 2020-2023  润新知