查看: 4721|回复: 3

Verilog基础--ps/2键盘

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

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-4-23 23:49:48 | 显示全部楼层 |阅读模式
    分享到:
    看了看黑金的ps2程序,没看懂,决定使用特权同学的代码
    ps2模块
    1. `timescale 1ns / 1ps

    2. module ps2
    3. (
    4.         CLK,
    5.         RSTn,
    6.         iCe,
    7.         pclk,
    8.         pdata,
    9.         scan_code,
    10.         rdy
    11. );

    12. input CLK;                //50M时锟斤拷锟脚猴拷
    13. input RSTn;        //锟斤拷位锟脚猴拷
    14. input pclk;        //PS2锟接匡拷时锟斤拷锟脚猴拷
    15. input pdata;                //PS2锟接匡拷锟斤拷锟斤拷锟脚猴拷
    16. input iCe;
    17. wire wGatedClk;
    18. reg rCe;
    19. output reg[15:0] scan_code;        // 1byte锟斤拷值锟斤拷只锟斤拷锟津单的帮拷锟斤拷扫锟斤拷
    20. wire  oPsState;                //锟斤拷锟教碉拷前状态锟斤拷ps2_state=1锟斤拷示锟叫硷拷锟斤拷锟斤拷锟斤拷

    21. //------------------------------------------
    22. reg rPsClk0,rPsClk1,rPsClk2;        //ps2k_clk状态锟侥达拷锟斤拷

    23. //wire pos_ps2k_clk;         // ps2k_clk锟斤拷锟斤拷锟截憋拷志位
    24. wire neg_ps2k_clk;        // ps2k_clk锟铰斤拷锟截憋拷志位

    25. always @ (posedge CLK)
    26. begin
    27.         rCe <= iCe;
    28. end
    29. assign wGatedClk = rCe & CLK;

    30. always @ (posedge wGatedClk or negedge RSTn) begin
    31.         if(!RSTn) begin
    32.                         rPsClk0 <= 1'b0;
    33.                         rPsClk1 <= 1'b0;
    34.                         rPsClk2 <= 1'b0;
    35.                 end
    36.         else begin                                                                //锟斤拷锟斤拷状态锟斤拷锟斤拷锟斤拷锟剿诧拷
    37.                         rPsClk0 <= pclk;
    38.                         rPsClk1 <= rPsClk0;
    39.                         rPsClk2 <= rPsClk1;
    40.                 end
    41. end

    42. assign neg_ps2k_clk = ~rPsClk1 & rPsClk2;        //锟铰斤拷锟斤拷

    43. //------------------------------------------
    44. reg[7:0] ps2_byte_r;                //PC锟斤拷锟斤拷锟斤拷锟絇S2锟斤拷一锟斤拷锟街斤拷锟斤拷锟捷存储锟斤拷
    45. reg[7:0] temp_data;                        //锟斤拷前锟斤拷锟斤拷锟斤拷锟捷寄达拷锟斤拷
    46. reg[3:0] num;                                //锟斤拷锟斤拷锟侥达拷锟斤拷

    47. output rdy;
    48. reg rdy;
    49. always @ (posedge wGatedClk or negedge RSTn) begin
    50.         if(!RSTn) begin
    51.                         num <= 4'd0;
    52.                         temp_data <= 8'd0;
    53.                 end
    54.         else if(neg_ps2k_clk) begin        //锟斤拷锟解到ps2k_clk锟斤拷锟铰斤拷锟斤拷
    55.                         case (num)
    56.                                 4'd0:        num <= num+1'b1;
    57.                                 4'd1:        begin
    58.                                                         num <= num+1'b1;
    59.                                                         temp_data[0] <= pdata;        //bit0
    60.                                                 end
    61.                                 4'd2:        begin
    62.                                                         num <= num+1'b1;
    63.                                                         temp_data[1] <= pdata;        //bit1
    64.                                                 end
    65.                                 4'd3:        begin
    66.                                                         num <= num+1'b1;
    67.                                                         temp_data[2] <= pdata;        //bit2
    68.                                                 end
    69.                                 4'd4:        begin
    70.                                                         num <= num+1'b1;
    71.                                                         temp_data[3] <= pdata;        //bit3
    72.                                                 end
    73.                                 4'd5:        begin
    74.                                                         num <= num+1'b1;
    75.                                                         temp_data[4] <= pdata;        //bit4
    76.                                                 end
    77.                                 4'd6:        begin
    78.                                                         num <= num+1'b1;
    79.                                                         temp_data[5] <= pdata;        //bit5
    80.                                                 end
    81.                                 4'd7:        begin
    82.                                                         num <= num+1'b1;
    83.                                                         temp_data[6] <= pdata;        //bit6
    84.                                                 end
    85.                                 4'd8:        begin
    86.                                                         num <= num+1'b1;
    87.                                                         temp_data[7] <= pdata;        //bit7
    88.                                                 end
    89.                                 4'd9:        begin
    90.                                                         num <= num+1'b1;        //锟斤拷偶校锟斤拷位锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
    91.                                                 end
    92.                                 4'd10: begin
    93.                                                         num <= 4'd0;        // num锟斤拷锟斤拷       
    94.                                                 end
    95.                                 default: ;
    96.                                 endcase
    97.                 end       
    98. end

    99. always @ (posedge wGatedClk or negedge RSTn)
    100.         begin
    101.                 if(!RSTn)
    102.                         begin
    103.                                 rdy <= 1'b0;
    104.                         end
    105.                 else if(num == 4'd10)
    106.                         rdy <= 1'b1;
    107.                 else rdy <= 1'b0;
    108.         end
    109.        
    110.        
    111. reg key_f0;                //锟缴硷拷锟斤拷志位锟斤拷锟斤拷1锟斤拷示锟斤拷锟秸碉拷锟斤拷锟斤拷8'hf0锟斤拷锟劫斤拷锟秸碉拷锟斤拷一锟斤拷锟斤拷锟捷猴拷锟斤拷锟斤拷
    112. reg ps2_state_r;        //锟斤拷锟教碉拷前状态锟斤拷ps2_state_r=1锟斤拷示锟叫硷拷锟斤拷锟斤拷锟斤拷
    113. reg[20:0] k;
    114. always @ (posedge wGatedClk or negedge RSTn) begin        //锟斤拷锟斤拷锟斤拷锟捷碉拷锟斤拷应锟斤拷锟斤拷锟斤拷锟斤拷只锟斤拷1byte锟侥硷拷值锟斤拷锟叫达拷锟斤拷
    115.         if(!RSTn) begin
    116.                         key_f0 <= 1'b0;
    117.                         ps2_state_r <= 1'b0;
    118.                 end
    119.         else if(num==4'd9) begin        //锟秸达拷锟斤拷锟斤拷一锟斤拷锟街斤拷锟斤拷锟斤拷
    120.                         if(temp_data == 8'hf0) key_f0 <= 1'b1;
    121.                         else begin
    122.                                         if(!key_f0) begin        //说锟斤拷锟叫硷拷锟斤拷锟斤拷
    123.                                                 if(k>=4000)
    124.                                                 begin
    125.                                                         ps2_state_r <= 1'b1;
    126.                                                         ps2_byte_r <= temp_data;
    127.                                                 end        //锟斤拷锟芥当前锟斤拷值
    128.                                                 else
    129.                                                 k<=k+1'b1;
    130.                                                 end
    131.                                         else if(key_f0) begin
    132.                                                         ps2_state_r <= 1'b0;
    133.                                                         key_f0 <= 1'b0;
    134.                                                         k<=0;
    135.                                                 end
    136.                                 end
    137.                 end
    138. end

    139. reg[15:0] ps2_asci;        //锟斤拷锟斤拷锟斤拷锟捷碉拷锟斤拷应ASCII锟斤拷

    140. always @ (ps2_byte_r)
    141. begin
    142. /*case (ps2_byte_r)                //锟斤拷值转锟斤拷为ASCII锟诫,锟斤拷锟斤拷锟斤拷锟侥比较简单o拷只锟斤拷锟斤拷锟斤拷母
    143.                 8'h5a: ps2_asci <= 16'hfffe;       
    144.                 8'h71: ps2_asci <= 16'hfffd;       
    145.                 8'h70: ps2_asci <= 16'hfffb;       
    146.                 8'h66: ps2_asci <= 16'hfff7;       
    147.                 8'h79: ps2_asci <= 16'hffef;       
    148.                 8'h7a: ps2_asci <= 16'hffdf;       
    149.                 8'h72: ps2_asci <= 16'hffbf;       
    150.                 8'h69: ps2_asci <= 16'hff7f;       
    151.                 8'h74: ps2_asci <= 16'hfeff;       
    152.                 8'h73: ps2_asci <= 16'hfdff;                                         
    153.                 8'h6b: ps2_asci <= 16'hfbff;       
    154.                 8'h7d: ps2_asci <= 16'hf7ff;       
    155.                 8'h75: ps2_asci <= 16'hefff;       
    156.                 8'h6c: ps2_asci <= 16'hdfff;       
    157.                 8'h7b: ps2_asci <= 16'hbfff;       
    158.                 8'h7c: ps2_asci <= 16'h7fff;       
    159.                 default:ps2_asci<=16'hffff ;
    160.                 endcase*/
    161.                 ps2_asci <= {8'hff,ps2_byte_r[7:0]};
    162. end


    163. assign oPsState = ps2_state_r;
    164. //assign scan_code = ps2_asci;
    165. always@(posedge wGatedClk)
    166. begin
    167.         if(oPsState==1)
    168.         scan_code <= ps2_asci;
    169.         else
    170.         scan_code <=16'hffff;
    171. end
    172. endmodule
    复制代码
    写一个命令测试模块
    1. module cmd_control_module
    2. (
    3.     CLK, RSTn,
    4.          PS2_Done_Sig, PS2_Data,
    5.          Data_Out
    6. );

    7.     input CLK;
    8.          input RSTn;
    9.          input PS2_Done_Sig;
    10.          input [7:0]PS2_Data;
    11.          output [3:0]Data_Out;
    12.          
    13.          /*****************************/
    14.          
    15.          reg [3:0]rData;
    16.          
    17.          always @ ( posedge CLK or negedge RSTn )
    18.              if( !RSTn )
    19.                       begin
    20.                                     rData <= 4'b0001;
    21.                                 end
    22.          else if( PS2_Done_Sig )
    23.                            case( PS2_Data )
    24.                                     
    25.                                          8'h1d:
    26.                                          rData <= { rData[2:0], rData[3] };
    27.                                          
    28.                                          8'h22:
    29.                                          rData <= { rData[0], rData[3:1] };
    30.                                          
    31.                                          8'h14:
    32.                                          rData <= { rData[0], rData[1], rData[2], rData[3] };
    33.                                
    34.                                 endcase
    35.        
    36.     /***********************************/
    37.        
    38.     assign Data_Out = rData;
    39.        
    40.     /***********************************/       
    41.                        
    42. endmodule
    复制代码
    再写一个顶层模块:
    1. module top(
    2.         pclk,
    3.         pdata,
    4.         parity_error,
    5.         CLK,
    6.         RSTn,
    7.         LED
    8. );
    9.         input pclk;              // PS_2 clock input
    10.         input pdata;             // PS_2 pdata input
    11.         wire[7:0] scan_code;     // Scan_code output
    12.         output parity_error;    // Parity output
    13.         wire rdy;             // pdata ready output

    14.         // ps P(
    15.                 // .pclk(pclk),
    16.                 // .pdata(pdata),
    17.                 // .scan_code(scan_code),
    18.                 // .parity_error(parity_error),
    19.                 // .rdy(rdy)
    20.         // );
    21.         ps2 P(
    22.                 .CLK(CLK),
    23.                 .RSTn(RSTn),
    24.                 .iCe(1'b1),
    25.                 .pclk(pclk),
    26.                 .pdata(pdata),
    27.                 .scan_code(scan_code),
    28.                 .rdy(rdy)
    29.                 );

    30.         output [3:0] LED;
    31.         input CLK, RSTn;
    32.         cmd_control_module U2
    33.          (
    34.              .CLK( CLK ),
    35.                   .RSTn( RSTn ),
    36.                   .PS2_Done_Sig( rdy ), // input - from U1
    37.                   .PS2_Data( scan_code ),   // input - from U1
    38.                   .Data_Out( LED )           // output - to top
    39.          );
    40. endmodule
    复制代码
    按下W时,LED向右奔跑,X向走奔跑,按下ctrl时左右交换
    tcl文件
    1. #------------------GLOBAL--------------------#
    2. set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
    3. set_global_assignment -name ENABLE_INIT_DONE_OUTPUT OFF

    4. #复位引脚
    5. set_location_assignment        PIN_M1        -to RSTn

    6. #时钟引脚
    7. set_location_assignment        PIN_R9        -to CLK

    8. #数码管对应的引脚
    9. #LED对应的引脚
    10. set_location_assignment        PIN_J1        -to LED[0]
    11. set_location_assignment        PIN_J2        -to LED[1]
    12. set_location_assignment        PIN_K1        -to LED[2]
    13. set_location_assignment        PIN_K2        -to LED[3]


    14. #PS2对应的引脚
    15. set_location_assignment        PIN_E7        -to pdata
    16. set_location_assignment        PIN_D8        -to pclk
    复制代码
    Verilog写了两天了,明天把VGA、LCD、串口写出来,可以写几个综合的模块了


    回复

    使用道具 举报

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

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-4-23 23:50:36 | 显示全部楼层
    刚写Verilog时很不习惯,谢谢就好了了,不过真心感觉黑金动力社区的例程很磨叽~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2013-5-14 16:34
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-4-25 23:12:19 | 显示全部楼层
    lo楼主加油
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-5-5 23:06:57 | 显示全部楼层
    呵呵,非常感谢,很好很强大
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-5-13 07:31 , Processed in 0.135170 second(s), 23 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.