1回答

0收藏

Verilog基础--ps/2键盘

FPGA/DSP FPGA/DSP 4032 人阅读 | 1 人回复 | 2013-04-23

在上一节多路数码管的基础上,适当修改,使之变成一个显示模块:
  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
有高手的话帮忙分析,分析,看看是什么问题?


国内的ubuntu的更新源还是上海交大最给力
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

libing64

发表于 2013-4-23 22:05:42 | 只看该作者

找了一晚上也没找出问题所在,真蛋碎
国内的ubuntu的更新源还是上海交大最给力
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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