查看: 3579|回复: 1

Verilog基础--ps/2键盘

[复制链接]
  • TA的每日心情
    开心
    2014-5-14 13:12
  • 签到天数: 180 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-4-23 22:04:02 | 显示全部楼层 |阅读模式
    分享到:
    在上一节多路数码管的基础上,适当修改,使之变成一个显示模块:
    1. module mutiSeg7
    2. (
    3.         CLK, RSTn, LED,select,data
    4. );

    5.         input CLK, RSTn;
    6.         output [7:0] LED;
    7.         output [5:0] select;
    8.                         input [7:0] data;//��Ҫ��ʾ��8λ����
    9.                         reg [3:0] rLowData;
    10.                         reg [3:0] rHighData;
    11.                

    12.                 reg [5:0]rEn = 6'b111_110;
    13.                 parameter T1ms = 16'd50_000;
    14.                 parameter         _0 = 8'b1100_0000,
    15.                                                 _1 = 8'b1111_1001,
    16.                                                 _2 = 8'b1010_0100,
    17.                                                 _3 = 8'b1011_0000,
    18.                                                 _4 = 8'b1001_1001,
    19.                                                 _5 = 8'b1001_0010,
    20.                                                 _6 = 8'b1000_0010,
    21.                                                 _7 = 8'b1111_1000,
    22.                                                 _8 = 8'b1000_0000,
    23.                                                 _9 = 8'b1001_0000,
    24.                                                 _a = 8'b1000_1000,
    25.                                                 _b = 8'b1000_0011,
    26.                                                 _c = 8'b1100_0110,
    27.                                                 _d = 8'b1010_0001,
    28.                                                 _e = 8'b1000_0110,
    29.                                                 _f = 8'b1000_1110;
    30.                 //1ms
    31.                 reg [31:0] count;
    32.                 always @(posedge CLK or negedge RSTn)
    33.                 if(!RSTn)
    34.                         count <= 0;
    35.                 else if (count == T1ms)
    36.                         count <= 26'b0;
    37.                 else count <= count + 26'b1;       

    38.       
    39.                 //��ȡ���ݵ�λ
    40.                 always @(posedge CLK or negedge RSTn)
    41.                 if(!RSTn)
    42.                                         begin
    43.                                                 rLowData  <= _0;
    44.                                         end
    45.                 else
    46.                   case(data[3:0])
    47.                                                 0: rLowData <= _0;
    48.                                                 1: rLowData <= _1;
    49.                                                 2: rLowData <= _2;
    50.                                                 3: rLowData <= _3;
    51.                                                 4: rLowData <= _4;
    52.                                                 5: rLowData <= _5;
    53.                                                 6: rLowData <= _6;
    54.                                                 7: rLowData <= _7;
    55.                                                 8: rLowData <= _8;
    56.                                                 9: rLowData <= _9;
    57.                                                 10: rLowData <= _a;
    58.                                                 11: rLowData <= _b;
    59.                                                 12: rLowData <= _c;
    60.                                                 13: rLowData <= _d;
    61.                                                 14: rLowData <= _e;
    62.                                                 15: rLowData <= _f;
    63.                                                 default: rLowData <= _0;
    64.                                         endcase
    65.                 //获取高四位
    66.                 always @(posedge CLK or negedge RSTn)
    67.                 if(!RSTn)
    68.                                         begin
    69.                                                 rHighData  <= _0;
    70.                                         end
    71.                 else
    72.                     case(data[7:4])
    73.                                                 0: rHighData <= _0;
    74.                                                 1: rHighData <= _1;
    75.                                                 2: rHighData <= _2;
    76.                                                 3: rHighData <= _3;
    77.                                                 4: rHighData <= _4;
    78.                                                 5: rHighData <= _5;
    79.                                                 6: rHighData <= _6;
    80.                                                 7: rHighData <= _7;
    81.                                                 8: rHighData <= _8;
    82.                                                 9: rHighData <= _9;
    83.                                                 10: rHighData <= _a;
    84.                                                 11: rHighData <= _b;
    85.                                                 12: rHighData <= _c;
    86.                                                 13: rHighData <= _d;
    87.                                                 14: rHighData <= _e;
    88.                                                 15: rHighData <= _f;
    89.                                                 default: rLowData <= _0;
    90.                                         endcase


    91.                 //获取低四位
    92.         reg[7:0] rLED;
    93.                 always @(posedge CLK or negedge RSTn)
    94.                         if(!RSTn)
    95.                                         rEn <= 6'b111_110;
    96.                 else if(count == T1ms)
    97.                                         case(rEn)
    98.                                                 6'b111_110:
    99.                                                         begin
    100.                                                                 rEn <= 6'b111_101;       
    101.                                                                 rLED <= rLowData;
    102.                                                         end
    103.                                                 6'b111_101:
    104.                                                         begin
    105.                                                                 rEn <= 6'b111_110;
    106.                                                                 rLED <= rHighData;
    107.                                                         end
    108.                                                 default:
    109.                                                         begin
    110.                                                                 rEn<= 6'b111_110;
    111.                                                                 rLED <= rHighData;
    112.                                                         end
    113.                                         endcase
    114.         assign LED = rLED;
    115.                 assign select = rEn;
    116. endmodule
    117.                
    复制代码
    PS2模块是参考某国外网站的,姑且可以认为是没问题的
    1. module ps(pclk,pdata,scan_code,parity_error,rdy);
    2. // Port declarations
    3. input pclk;              // PS_2 clock input
    4. input pdata;             // PS_2 pdata input
    5. output[7:0] scan_code;  // Scan_code output
    6. output parity_error;    // Parity output
    7. output rdy;             // pdata ready output
    8.   
    9. // Internal Variables  
    10. reg[9:0] register;
    11. reg[3:0] counter;
    12. reg parity_error, rdy;
    13.   
    14. assign scan_code = register[9:2];
    15. assign parity = register[1];
    16.   
    17. // PS/2 logic
    18. always @ (negedge pclk)
    19.   begin
    20.    register <= {register[8:0], pdata}; // receive pdata
    21.    if (counter == 4'b1011)
    22.      counter <= 4'b0000;
    23.    else
    24.      counter <= counter + 4'b1;
    25.   end
    26.   
    27. // PS/2 parity logic
    28. always @ (posedge pclk)
    29.   begin
    30.    if (counter == 4'b1011)
    31.      if (!parity == ^scan_code) // parity check (odd parity)
    32.       rdy <= 1'b1;
    33.      else
    34.       parity_error <= 1'b1;
    35.    else  // not all 10 bits receiverd yet
    36.     begin
    37.      rdy <= 1'b0;
    38.      parity_error <= 1'b0;
    39.     end
    40.   end
    41.   
    42. endmodule
    复制代码
    然后再写一个顶层模块
    1. module top(
    2.         pclk,
    3.         pdata,
    4.         parity_error,
    5.         rdy,CLK,
    6.         RSTn,
    7.         LED,
    8.         select
    9. );
    10.         input pclk;              // PS_2 clock input
    11.         input pdata;             // PS_2 pdata input
    12.         wire[7:0] scan_code;     // Scan_code output
    13.         output parity_error;    // Parity output
    14.         output rdy;             // pdata ready output

    15.         ps P(
    16.                 .pclk(pclk),
    17.                 .pdata(pdata),
    18.                 .scan_code(scan_code),
    19.                 .parity_error(parity_error),
    20.                 .rdy(rdy)
    21.         );
    22.        
    23.         input CLK, RSTn;
    24.         output [7:0] LED;
    25.         output [5:0] select;
    26.         //input [7:0] data;//��Ҫ��ʾ��8λ����

    27.         mutiSeg7 seg
    28.         (
    29.                 .CLK(CLK),
    30.                 .RSTn(RSTn),
    31.                 .LED(LED),
    32.                 .select(select),
    33.                 .data(scan_code)
    34.         );
    35.        
    36. endmodule
    复制代码
    现在显示结果并不符合ps/2协议,而且会显示H这种诡异的字母,正常按16进制显示只有0-9,a-f
    有高手的话帮忙分析,分析,看看是什么问题?


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-5-14 13:12
  • 签到天数: 180 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-4-23 22:05:42 | 显示全部楼层
    找了一晚上也没找出问题所在,真蛋碎
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-26 20:42 , Processed in 0.125339 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.