搜索
bottom↓
回复: 42

想用FPGA读PS2手柄,用串口模块改装是否可行?

[复制链接]

出0入0汤圆

发表于 2015-1-21 18:22:50 | 显示全部楼层 |阅读模式
前提:
1 PS2手柄宽接口的那种
           PS手柄针脚输出端(面对插头)

         ---------------------------------------------------------
            PIN 1->| o  o  o | o  o  o | o  o  o |
         \________________________________/

2 PS手柄信号
        PS手柄通讯都是8 bit串行数据最低有效位先行。在PS 手柄总线的所有时码在时钟下降沿都是同步的。传送一个字节的情况如下所示。
                       |BIT 0|BIT 1|BIT 2|BIT 3|BIT 4|BIT 5|BIT 6|BIT 7|
            CLOCK -----___---___---___---___---___---___---___---___-----------
            DATA  -----000000111111222222333333444444555555666666777777--------
                          *     *     *     *     *     *     *     *
            CMND  -----000000111111222222333333444444555555666666777777--------
        注:        CMND:FPGA端向手柄端发送指令
                DATA:手柄端向FPGA端发送信号

3 串口收发模块借用《verilog那些事》里串口收发模块

两者异同:
同:        都是8位有效位,低位先行。
        上升沿采集信号
        收发互不干扰
异:        收发模块时钟同频率,但是不一定同步。
        串口没有时钟线,PS2需要(FPGA端)提供时钟信号
       
正式问题:
        在《verilog那些事》里串口收发模块各自都有BPS模块,但是发送端只有在有数据要发送时BPS才开始计时。接受模块也是在接受到第一位信号时BPS才开始计时的。我想把这两个BPS模块从收发模块中独立出来。用这个模块输出PS2端口的时钟,同时送给两个收发模块。收发模块都有使能信号。不使能时应该不会影响。
        再加一个控制模块直接接受串口接收模块的8位数据,再发送另一个8位数据给串口发送模块。以实现解读PS2手柄信息。
       
想请教一下这种想法是否可行,如可行还有那些地方我要注意的也请多多指教。
另:本人基础薄弱,描述的不清楚请见谅。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-1-21 19:05:17 | 显示全部楼层
肯定可以,但是为什么要用串口模块改装,不如重新写

出0入0汤圆

 楼主| 发表于 2015-1-21 21:35:24 | 显示全部楼层
zkf0100007 发表于 2015-1-21 19:05
肯定可以,但是为什么要用串口模块改装,不如重新写

开始懒得重写,现在越来越发现好像该还不如重写。

出0入0汤圆

发表于 2015-1-22 09:11:31 来自手机 | 显示全部楼层
倒是可以参考PS键盘和鼠标的代码

出0入0汤圆

 楼主| 发表于 2015-1-22 18:54:22 | 显示全部楼层
zkf0100007 发表于 2015-1-22 09:11
倒是可以参考PS键盘和鼠标的代码

谢谢,两者很相似么?PS键盘没研究过

出0入0汤圆

发表于 2015-1-22 19:18:54 | 显示全部楼层
liyang53719 发表于 2015-1-22 18:54
谢谢,两者很相似么?PS键盘没研究过
  1. ------------------------------------------------------------------------
  2. --     Keyboard.vhd -- Demonstrate basic keyboard function
  3. ------------------------------------------------------------------------
  4. -- Author:  Ken Nelson
  5. --          Copyright 2004 Digilent, Inc.
  6. ------------------------------------------------------------------------
  7. -- DESCRIPTION
  8. ------------------------------------------------------------------------
  9. -- Revision History:
  10. --         06/14/04 (Created) KenN
  11. --  07/01/04 (Optomized) DanP
  12. ------------------------------------------------------------------------

  13. library IEEE;
  14. use IEEE.STD_LOGIC_1164.ALL;
  15. use IEEE.STD_LOGIC_ARITH.ALL;
  16. use IEEE.STD_LOGIC_UNSIGNED.ALL;


  17. entity Keyboard is
  18.         Port (        CLK, RST, KD, KC: in std_logic;
  19.                                 an: out std_logic_vector (3 downto 0);
  20.                                 ssg: out std_logic_vector (6 downto 0));
  21. end Keyboard;


  22. architecture Behavioral of Keyboard is

  23.         ------------------------------------------------------------------------
  24.         -- Component Declarations
  25.         ------------------------------------------------------------------------

  26.         ------------------------------------------------------------------------
  27.         -- Signal Declarations
  28.         ------------------------------------------------------------------------
  29.         signal clkDiv : std_logic_vector (12 downto 0);
  30.         signal pclk : std_logic;
  31.         signal sclk:std_logic_vector(1 downto 0);
  32.         signal KDI, KCI : std_logic;
  33.         signal DFF1, DFF2 : std_logic;
  34.         signal shiftRegSig1: std_logic_vector(10 downto 0);
  35.         signal shiftRegSig2: std_logic_vector(10 downto 1);
  36.         signal MUXOUT: std_logic_vector (3 downto 0);
  37.         signal WaitReg: std_logic_vector (7 downto 0);       
  38.         signal DisReg0,DisReg1,DisReg2,DisReg3:std_logic_vector (3 downto 0);
  39.         signal Dis:bit;
  40.         ------------------------------------------------------------------------
  41.         -- Module Implementation
  42.         ------------------------------------------------------------------------

  43.         begin
  44.         --Divide the master clock down to a lower frequency--
  45.         CLKDivider: Process (CLK)
  46.         begin
  47.                 if (CLK = '1' and CLK'Event) then
  48.                         clkDiv <= clkDiv +1;
  49.                 end if;       
  50.         end Process;

  51.         sclk <= clkDiv(11 downto 10);
  52.         pclk <= clkDiv(3);

  53.         --Flip Flops used to condition siglans coming from PS2--
  54.         Process (pclk, RST, KC, KD)
  55.         begin
  56.                 if(RST = '1') then
  57.                         DFF1 <= '0'; DFF2 <= '0'; KDI <= '0'; KCI <= '0';
  58.                 else                                                                                               
  59.                         if (pclk = '1' and pclk'Event) then
  60.                                 DFF1 <= KD; KDI <= DFF1; DFF2 <= KC; KCI <= DFF2;
  61.                         end if;
  62.                 end if;
  63.         end process;

  64.         --Shift Registers used to clock in scan codes from PS2--
  65.         Process(KDI, KCI, RST) --DFF2 carries KD and DFF4, and DFF4 carries KC
  66.         begin                                                                                                                                                                          
  67.                 if (RST = '1') then
  68.                         ShiftRegSig1 <= "00000000000";
  69.                         ShiftRegSig2 <= "0000000000";
  70.                 else
  71.                         if (KCI = '0' and KCI'Event) then
  72.                                 ShiftRegSig1(10 downto 0) <= KDI & ShiftRegSig1(10 downto 1);
  73.                                 ShiftRegSig2(10 downto 1) <= ShiftRegSig1(0) & ShiftRegSig2(10 downto 2);
  74.                         end if;
  75.                 end if;
  76.         end process;
  77.        
  78.         --Wait Register
  79.         process(ShiftRegSig1, ShiftRegSig2, RST, KCI)
  80.         begin
  81.                 if(RST = '1')then
  82.                         WaitReg <= "00000000";
  83.                 else
  84.                         if(KCI'event and KCI = '1' and ShiftRegSig2(8 downto 1) = "11110000")then
  85.                                 WaitReg <= ShiftRegSig1(8 downto 1);
  86.                                 --case WaitReg is
  87.                                         --when "01000101"=> DisReg<="0000";--0
  88.                                         --when "00010110"=> DisReg<="0001";--1
  89.                                         --when "00011110"=> DisReg<="0010";--2
  90.                                         --when "00100110"=> DisReg<="0011";--3
  91.                                         --when "00100101"=> DisReg<="0100";--4
  92.                                         --when "00101110"=> DisReg<="0101";--5
  93.                                         --when "00110110"=> DisReg<="0110";--6
  94.                                         --when "00111101"=> DisReg<="0111";--7
  95.                                         --when "00111110"=> DisReg<="1000";--8
  96.                                         --when "01000110"=> DisReg<="1001";--9
  97.                                         --when "00011100"=> DisReg<="1010";--A
  98.                                         --when "00110010"=> DisReg<="1011";--B
  99.                                         --when "00100001"=> DisReg<="1100";--C
  100.                                         --when "00100011"=> DisReg<="1101";--D
  101.                                         --when "00100100"=> DisReg<="1110";--E
  102.                                         --when "00101011"=> DisReg<="1111";--F
  103.                                         --when others=>null;
  104.                                 --end case;
  105.                                
  106.                                 DisReg1<=DisReg0;
  107.                                 DisReg2<=DisReg1;
  108.                                 DisReg3<=DisReg2;
  109.                         end if;                       
  110.                 end if;
  111.         end Process;

  112.         DisReg0<="0000" when WaitReg="01000101" else --45 0
  113.                    "0001"  when WaitReg="00010110" else --16 1
  114.                    "0010"  when WaitReg="00011110" else --1E 2
  115.                    "0011"  when WaitReg="00100110" else --26 3
  116.                    "0100"  when WaitReg="00100101" else --25 4
  117.                    "0101"  when WaitReg="00101110" else --2E 5
  118.                    "0110"  when WaitReg="00110110" else --36 6
  119.                    "0111"  when WaitReg="00111101" else --3D 7
  120.                    "1000"  when WaitReg="00111110" else --3E 8
  121.                    "1001"  when WaitReg="01000110" else --46 9
  122.                    "1010"  when WaitReg="00011100" else --1C A
  123.                    "1011"  when WaitReg="00110010" else --32 B
  124.                    "1100"  when WaitReg="00100001" else --21 C
  125.                    "1101"  when WaitReg="00100011" else --23 D
  126.                    "1110"  when WaitReg="00100100" else --24 E
  127.                    "1111"  when WaitReg="00101011" else --2B F
  128.                    "ZZZZ";

  129.         Dis<='1'  when WaitReg="01000101" else
  130.                 '1'  when WaitReg="00010110" else
  131.                 '1'  when WaitReg="00011110" else --1E 2
  132.                 '1'  when WaitReg="00100110" else --26 3
  133.                 '1'  when WaitReg="00100101" else --25 4
  134.                 '1'  when WaitReg="00101110" else --2E 5
  135.                 '1'  when WaitReg="00110110" else --36 6
  136.                 '1'  when WaitReg="00111101" else --3D 7
  137.                 '1'  when WaitReg="00111110" else --3E 8
  138.                 '1'  when WaitReg="01000110" else --46 9
  139.                 '1'  when WaitReg="00011100" else --1C A
  140.                 '1'  when WaitReg="00110010" else --32 B
  141.                 '1'  when WaitReg="00100001" else --21 C
  142.                 '1'  when WaitReg="00100011" else --23 D
  143.                 '1'  when WaitReg="00100100" else --24 E
  144.                 '1'  when WaitReg="00101011" else --2B F
  145.                 '0';  
  146.                   
  147.         --Multiplexer

  148.         MUXOUT <=DisReg0 when sclk = "00" else
  149.                     DisReg1 when sclk = "01" else
  150.                     DisReg2 when sclk = "10" else
  151.                     DisReg3 when sclk = "11";
  152.                   
  153.                                   

  154.         --Seven Segment Decoder--
  155.         ssg <=        "1000000" when MUXOUT = "0000" else
  156.                         "1111001" when MUXOUT = "0001" else
  157.                         "0100100" when MUXOUT = "0010" else
  158.                         "0110000" when MUXOUT = "0011" else
  159.                         "0011001" when MUXOUT = "0100" else
  160.                         "0010010" when MUXOUT = "0101" else
  161.                         "0000010" when MUXOUT = "0110" else
  162.                         "1111000" when MUXOUT = "0111" else
  163.                         "0000000" when MUXOUT = "1000" else
  164.                         "0010000" when MUXOUT = "1001" else
  165.                         "0001000" when MUXOUT = "1010" else
  166.                         "0000011" when MUXOUT = "1011" else
  167.                         "1000110" when MUXOUT = "1100" else
  168.                         "0100001" when MUXOUT = "1101" else
  169.                         "0000110" when MUXOUT = "1110" else
  170.                         "0001110" when MUXOUT = "1111" else
  171.                         "1111111";

  172.         --Anode Driver--
  173.         an<="1110" when sclk = "00" and Dis='1' else
  174.             "1101" when sclk = "01" and Dis='1' else
  175.             "1011" when sclk = "10" and Dis='1' else
  176.             "0111" when sclk = "11" and Dis='1' else
  177.             "1111";
  178.           
  179.                                
  180. end Behavioral;
复制代码

出0入0汤圆

发表于 2015-1-22 19:19:59 | 显示全部楼层
上面是PS键盘的代码,可以参考一下

出0入0汤圆

发表于 2015-1-23 10:00:01 | 显示全部楼层
想读PS2手柄的话,用SPI正好

出0入0汤圆

 楼主| 发表于 2015-1-23 15:23:59 | 显示全部楼层
zkf0100007 发表于 2015-1-22 19:19
上面是PS键盘的代码,可以参考一下

多谢多谢,我研究一下

出0入0汤圆

 楼主| 发表于 2015-1-23 15:25:32 | 显示全部楼层
putty 发表于 2015-1-23 10:00
想读PS2手柄的话,用SPI正好

SPI是接口还是个协议?协议听说过I2C。

出0入0汤圆

 楼主| 发表于 2015-1-23 16:58:37 | 显示全部楼层
本帖最后由 liyang53719 于 2015-1-23 17:45 编辑
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_arith.all;

  4. entity handset is
  5. generic(divdelay:integer :=99999);
  6.   port(busclk      :in std_logic;   --shizhong
  7.        sclk             :in std_logic;   --
  8.        reset        :in std_logic;
  9.        handdata        :in std_logic;
  10.        command        :out std_logic_vector(2 downto 0);
  11.        IDcheck1     :out std_logic_vector(7 downto 0);
  12.        IDcheck2     :out std_logic_vector(7 downto 0);
  13.        IDcheck3     :out std_logic_vector(7 downto 0);
  14.        recAnalogData1     :out std_logic_vector(7 downto 0);
  15.        recAnalogData2     :out std_logic_vector(7 downto 0);
  16.        recAnalogData3     :out std_logic_vector(7 downto 0);
  17.        recAnalogData4     :out std_logic_vector(7 downto 0);
  18.        recDigitalData1         :out std_logic_vector(7 downto 0);
  19.        recDigitalData2         :out std_logic_vector(7 downto 0));
  20. end  handset;
  21. architecture Behavioral of handset is
  22. signal count   :integer  range 0 to 8 := 0;
  23. signal comdcount   :integer  range 0 to 10 ;
  24. signal temp_data : std_logic_vector(7 downto 0) :="11111111";
  25. signal temp_command : std_logic_vector(2 downto 0) := "111";
  26. signal comdstate :std_logic := '0';
  27. signal comdstate1 :std_logic := '0';
  28. signal comdstate2 :std_logic := '0';
  29. signal comdstate3   :std_logic := '0';
  30. signal comdstate4   :std_logic := '0';
  31. signal delaystate   :std_logic := '0';
  32. signal delaystate1   :std_logic := '0';
  33. signal delaystate2   :std_logic := '0';
  34. signal result : std_logic_vector(8 downto 0) :="000000000";
  35. signal HandsetMode     :std_logic;
  36.         --signal comdstate1,comdstate2 : std_logic := '0';

  37. begin

  38. process(comdcount,temp_data(7 downto 0))
  39. begin
  40.         case comdcount is
  41.                 when 0 => temp_data(7 downto 0) <= "00000001";
  42.                 when 1 => temp_data(7 downto 0) <= "01000010";
  43.                 when 2 => temp_data(7 downto 0) <= "11111111";
  44.                 when 3 => temp_data(7 downto 0) <= "11111111";
  45.                 when 4 => temp_data(7 downto 0) <= "11111111";
  46.                 when 5 => temp_data(7 downto 0) <= "11111111";
  47.                 when 6 => temp_data(7 downto 0) <= "11111111";
  48.                 when 7 => temp_data(7 downto 0) <= "11111111";                                       
  49.                 when 8 => temp_data(7 downto 0) <= "11111111";
  50.                 when 9 => temp_data(7 downto 0) <= "11111111";       
  51.                 when        others => null;
  52.         end case;
  53. end process;
  54. command(2 downto 0) <= temp_command(2 downto 0);
  55. process(sclk,comdcount)
  56. begin
  57.         if(comdcount = 9) then
  58.                 temp_command(2) <= '1';  --拉高ATT
  59.                 comdstate <= '0';
  60.         elsif(sclk'EVENT and sclk = '1')then
  61.                 comdstate <= '1';
  62.                 temp_command(2) <= '0';  --拉低ATT
  63.         end if;               
  64. end process;

  65. process(busclk,temp_data(7 downto 0),comdstate,comdstate1,comdstate2,comdstate3,delaystate1,delaystate2,handdata,count,comdcount)
  66. variable tempcount :integer range 0 to 99999 :=0;
  67. variable count1 :integer range 0 to 9 :=0;
  68. begin
  69. --if(sclk'EVENT and sclk = '1')then
  70. --comdstate1 <= '1';
  71. --end if;

  72. if(busclk'EVENT and busclk = '1')then
  73.         if(comdstate = '1')then
  74.                 if(tempcount = 99999)then
  75.                         tempcount := 0;
  76.                         comdstate1 <= '1';
  77.                 else
  78.                         tempcount := tempcount + 1;
  79.                         if(count1 = 8)then
  80.                                 --count <= 0;
  81.                                 case comdcount is
  82.                                 when 0 => null;
  83.                                 IDcheck1(7 downto 0)<= result(7 downto 0);
  84.                                 when 1 => null;
  85.                                 IDcheck2(7 downto 0)<= result(7 downto 0);
  86.                                 when 2 => null;IDcheck3(7 downto 0)<= result(7 downto 0);
  87.                                 when 3 =>
  88.                                 recDigitalData1(7 downto 0)<= result(7 downto 0);
  89.                                 when 4 =>
  90.                                 recDigitalData2(7 downto 0)<= result(7 downto 0);
  91.                                 when 5 =>
  92.                                 recAnalogData1(7 downto 0)<= result(7 downto 0);
  93.                                 when 6 =>
  94.                                 recAnalogData2(7 downto 0)<= result(7 downto 0);
  95.                                 when 7 =>
  96.                                 recAnalogData3(7 downto 0)<= result(7 downto 0);               
  97.                                 when 8 =>  
  98.                                 recAnalogData4(7 downto 0)<= result(7 downto 0);
  99.                                 when        others => comdcount <= 0;
  100.                                 end case;
  101.                                 if (delaystate = '1')then
  102.                                         comdcount <= comdcount + 1;
  103.                                         comdstate1 <= '1';
  104.                                         comdstate4 <= '0';
  105.                                         count1 := 0;
  106.                                 end if;
  107.                         elsif(comdstate1 = '1')then
  108.                                 temp_command(0) <= temp_data(count);
  109.                                 temp_command(1) <= '1';
  110.                                 comdstate1 <= '0';
  111.                                 comdstate2 <= '1';
  112.                         elsif(delaystate1 = '1')then
  113.                                 temp_command(1) <= '0';
  114.                                 comdstate2 <= '0';
  115.                                 comdstate3 <= '1';
  116.                                 result(count) <= handdata;
  117.                         elsif(delaystate2 = '1')then
  118.                                 --result(count) <= handdata;
  119.                                 comdstate3 <= '0';
  120.                                 count1 := count1 + 1;
  121.                                 if (count1 = 8)        then
  122.                                         comdstate1 <= '0';
  123.                                         comdstate4 <= '1';
  124.                                         temp_command(1) <= '1';
  125.                                         count <= 0;
  126.                                 else
  127.                                         temp_command(1) <= '1';
  128.                                         comdstate1 <= '1';
  129.                                         count <= count1;
  130.                                 end if;
  131.                         end if;
  132.                 end if;
  133.         else
  134.                 comdcount <= 0;
  135.                 tempcount := 99999;
  136.                 comdstate1 <= '0';
  137.                 comdstate2 <= '0';
  138.                 comdstate3 <= '0';
  139.                 temp_command(1 downto 0) <= "11";
  140.         end if;
  141. end if;
  142. end process;

  143. --process(busclk,count,handdata)
  144. --begin
  145. --if(busclk'EVENT and busclk = '1')then
  146. --        result(count) <= handdata;
  147. --end if;
  148. --end process;

  149. process(busclk,comdstate2,comdstate3)
  150. variable delaycount: integer  range 0 to 3999 := 499;
  151. begin
  152.         if(busclk'EVENT and busclk = '1')then
  153.                 if(comdstate4 = '1') then
  154.                         delaycount := delaycount + 1;
  155.                         if(delaycount = 2*divdelay - 1)then
  156.                                 delaystate <= '1';
  157.                         elsif(delaycount = 2*divdelay)then
  158.                                 delaystate <= '0';
  159.                                 delaycount := 0;
  160.                         end if;
  161.                 elsif(comdstate2 = '1') then
  162.                         delaycount := delaycount + 1;
  163.                         if(delaycount = divdelay-1)then
  164.                                 delaystate1 <= '1';
  165.                         elsif(delaycount = divdelay)then
  166.                                 delaystate1 <= '0';
  167.                                 delaycount := 0;
  168.                         end if;
  169.                 elsif(comdstate3 = '1') then
  170.                         delaycount := delaycount + 1;
  171.                         if(delaycount = divdelay-1)then
  172.                                 delaystate2 <= '1';
  173.                         elsif(delaycount = divdelay )then
  174.                                 delaystate2 <= '0';
  175.                                 delaycount := 0;
  176.                         end if;
  177.                 else
  178.                         delaystate2 <= '0';
  179.                         delaystate1 <= '0';
  180.                         delaycount := 0;
  181.                 end if;
  182.         end if;
  183. end process;

  184. end Behavioral;
复制代码

出0入0汤圆

 楼主| 发表于 2015-1-23 16:59:52 | 显示全部楼层
找到一个VHDL写的程序,看起来有些吃力,大家一起来分析分析

出0入0汤圆

 楼主| 发表于 2015-1-23 17:41:51 | 显示全部楼层
本帖最后由 liyang53719 于 2015-1-23 22:50 编辑

经过测试这段程序完全可用!

  1. //-------------------------------------------------------------------
  2. //                                                         
  3. // PLAYSTATION CONTROLLER(DUALSHOCK TYPE) INTERFACE TOP         
  4. //                                                         
  5. // Version : 2.00                                          
  6. //                                                         
  7. // Copyright(c) 2003 - 2004 Katsumi Degawa , All rights reserved  
  8. //                                                         
  9. // Important !                                             
  10. //                                                         
  11. // This program is freeware for non-commercial use.         
  12. // An author does no guarantee about this program.         
  13. // You can use this under your own risk.                    
  14. //
  15. // 2003.10.30  It is optimized . by K Degawa
  16. //                                                        
  17. //-------------------------------------------------------------------
  18. `timescale 100ps/10ps               

  19. //--------- SIMULATION ----------------------------------------------
  20. //`define        SIMULATION_1       

  21. `ifdef SIMULATION_1
  22. `define Timer_siz 18  
  23. `else
  24. `define Timer_siz 12
  25. `endif
  26. //-------------------------------------------------------------------
  27. `define Dualshock

  28. module psPAD_top(

  29. I_CLK250K,       //  MAIN CLK 250KHz
  30. I_RSTn,          //  MAIN RESET
  31. O_psCLK,         //  psCLK CLK OUT
  32. O_psSEL,         //  psSEL OUT      
  33. O_psTXD,         //  psTXD OUT
  34. I_psRXD,         //  psRXD IN
  35. O_RXD_1,         //  RX DATA 1 (8bit)
  36. O_RXD_2,         //  RX DATA 2 (8bit)
  37. O_RXD_3,         //  RX DATA 3 (8bit)
  38. O_RXD_4,         //  RX DATA 4 (8bit)
  39. O_RXD_5,         //  RX DATA 5 (8bit)
  40. O_RXD_6,         //  RX DATA 6 (8bit)
  41. I_CONF_SW,       //  Dualshook Config  ACTIVE-HI
  42. I_MODE_SW,       //  Dualshook Mode Set DEGITAL PAD 0: ANALOG PAD 1:
  43. I_MODE_EN,       //  Dualshook Mode Control  OFF 0: ON 1:
  44. I_VIB_SW,        //  Vibration SW  VIB_SW[0] Small Moter OFF 0:ON  1:
  45.                  //                VIB_SW[1] Bic Moter   OFF 0:ON  1(Dualshook Only)
  46. I_VIB_DAT        //  Vibration(Bic Moter)Data   8'H00-8'HFF (Dualshook Only)

  47. );

  48. input  I_CLK250K,I_RSTn;
  49. input  I_CONF_SW;
  50. input  I_MODE_SW,I_MODE_EN;
  51. input  [1:0]I_VIB_SW;
  52. input  [7:0]I_VIB_DAT;
  53. input  I_psRXD;
  54. output O_psCLK;
  55. output O_psSEL;
  56. output O_psTXD;
  57. output [7:0]O_RXD_1;
  58. output [7:0]O_RXD_2;
  59. output [7:0]O_RXD_3;
  60. output [7:0]O_RXD_4;
  61. output [7:0]O_RXD_5;
  62. output [7:0]O_RXD_6;

  63. wire   W_scan_seq_pls;
  64. wire   W_type;
  65. wire   [3:0]W_byte_cnt;
  66. wire   W_RXWT;
  67. wire   W_TXWT;
  68. wire   W_TXSET;
  69. wire   W_TXEN;
  70. wire   [7:0]W_TXD_DAT;
  71. wire   [7:0]W_RXD_DAT;
  72. wire   W_conf_ent;

  73. ps_pls_gan pls(

  74. .I_CLK(I_CLK250K),
  75. .I_RSTn(I_RSTn),
  76. .I_TYPE(W_type),              // DEGITAL PAD 0: ANALOG PAD 1:

  77. .O_SCAN_SEQ_PLS(W_scan_seq_pls),
  78. .O_RXWT(W_RXWT),
  79. .O_TXWT(W_TXWT),
  80. .O_TXSET(W_TXSET),
  81. .O_TXEN(W_TXEN),
  82. .O_psCLK(O_psCLK),
  83. .O_psSEL(O_psSEL),
  84. .O_byte_cnt(W_byte_cnt),

  85. //.Timer(O_Timer)
  86. .Timer()

  87. );

  88. `ifdef Dualshock
  89. txd_commnd cmd(

  90. .I_CLK(W_TXSET),
  91. .I_RSTn(I_RSTn),
  92. .I_BYTE_CNT(W_byte_cnt),
  93. .I_MODE({I_CONF_SW,~I_MODE_EN,I_MODE_SW}),
  94. .I_VIB_SW(I_VIB_SW),
  95. .I_VIB_DAT(I_VIB_DAT),
  96. .I_RXD_DAT(W_RXD_DAT),
  97. .O_TXD_DAT(W_TXD_DAT),
  98. .O_TYPE(W_type),
  99. .O_CONF_ENT(W_conf_ent)

  100. );

  101. `else
  102. txd_commnd_EZ cmd(

  103. .I_CLK(W_TXSET),
  104. .I_RSTn(I_RSTn),
  105. .I_BYTE_CNT(W_byte_cnt),
  106. .I_MODE(),
  107. .I_VIB_SW(I_VIB_SW),
  108. .I_VIB_DAT(),
  109. .I_RXD_DAT(),
  110. .O_TXD_DAT(W_TXD_DAT),
  111. .O_TYPE(W_type),
  112. .O_CONF_ENT(W_conf_ent)

  113. );

  114. `endif

  115. ps_txd txd(

  116. .I_CLK(I_CLK250K),
  117. .I_RSTn(I_RSTn),
  118. .I_WT(W_TXWT),
  119. .I_EN(W_TXEN),
  120. .I_TXD_DAT(W_TXD_DAT),
  121. .O_psTXD(O_psTXD)

  122. );

  123. ps_rxd rxd(

  124. .I_CLK(O_psCLK),
  125. .I_RSTn(I_RSTn),       
  126. .I_WT(W_RXWT),
  127. .I_psRXD(I_psRXD),
  128. .O_RXD_DAT(W_RXD_DAT)

  129. );

  130. //----------   RXD DATA DEC  ----------------------------------------
  131. reg    [7:0]O_RXD_1;
  132. reg    [7:0]O_RXD_2;
  133. reg    [7:0]O_RXD_3;
  134. reg    [7:0]O_RXD_4;
  135. reg    [7:0]O_RXD_5;
  136. reg    [7:0]O_RXD_6;

  137. reg   W_rxd_mask;
  138. always@(posedge W_scan_seq_pls)
  139.    W_rxd_mask <= ~W_conf_ent;

  140. always@(negedge W_RXWT)
  141. begin
  142.    if(W_rxd_mask)begin
  143.       case(W_byte_cnt)
  144.             3: O_RXD_1 <= W_RXD_DAT;
  145.             4: O_RXD_2 <= W_RXD_DAT;
  146.             5: O_RXD_3 <= W_RXD_DAT;
  147.             6: O_RXD_4 <= W_RXD_DAT;
  148.             7: O_RXD_5 <= W_RXD_DAT;
  149.             8: O_RXD_6 <= W_RXD_DAT;
  150.        default:;
  151.       endcase
  152.    end
  153. end

  154. endmodule

  155. `ifdef Dualshock
  156. module txd_commnd_EZ(

  157. I_CLK,
  158. I_RSTn,
  159. I_BYTE_CNT,
  160. I_MODE,
  161. I_VIB_SW,
  162. I_VIB_DAT,
  163. I_RXD_DAT,
  164. O_TXD_DAT,
  165. O_TYPE,
  166. O_CONF_ENT

  167. );

  168. input  I_CLK,I_RSTn;
  169. input  [3:0]I_BYTE_CNT;
  170. input  [2:0]I_MODE;
  171. input  [1:0]I_VIB_SW;
  172. input  [7:0]I_VIB_DAT;
  173. input  [7:0]I_RXD_DAT;
  174. output [7:0]O_TXD_DAT;
  175. output O_TYPE;
  176. output O_CONF_ENT;

  177. reg    [7:0]O_TXD_DAT;

  178. assign O_TYPE = 1'b1;
  179. assign O_CONF_ENT = 1'b0;
  180. always@(posedge I_CLK or negedge I_RSTn)
  181. begin
  182.    if(! I_RSTn)begin
  183.       O_TXD_DAT <= 8'h00;
  184.    end
  185.    else begin
  186.       case(I_BYTE_CNT)
  187.          0:O_TXD_DAT <= 8'h01;
  188.          1:O_TXD_DAT <= 8'h42;
  189.          3:begin
  190.               if(I_VIB_SW) O_TXD_DAT <= 8'h40;
  191.               else         O_TXD_DAT <= 8'h00;
  192.            end
  193.          4:begin
  194.               if(I_VIB_SW) O_TXD_DAT <= 8'h01;
  195.               else         O_TXD_DAT <= 8'h00;
  196.            end
  197.        default: O_TXD_DAT <= 8'h00;
  198.       endcase
  199.    end
  200. end

  201. endmodule
  202. `endif

  203. module txd_commnd(

  204. I_CLK,
  205. I_RSTn,
  206. I_BYTE_CNT,
  207. I_MODE,
  208. I_VIB_SW,
  209. I_VIB_DAT,
  210. I_RXD_DAT,
  211. O_TXD_DAT,
  212. O_TYPE,
  213. O_CONF_ENT

  214. );

  215. input  I_CLK,I_RSTn;
  216. input  [3:0]I_BYTE_CNT;
  217. input  [2:0]I_MODE;
  218. input  [1:0]I_VIB_SW;
  219. input  [7:0]I_VIB_DAT;
  220. input  [7:0]I_RXD_DAT;
  221. output [7:0]O_TXD_DAT;
  222. output O_TYPE;
  223. output O_CONF_ENT;

  224. wire   [1:0]pad_mode = I_MODE[1:0];
  225. wire   ds_sw  = I_MODE[2];

  226. reg    [7:0]O_TXD_DAT;
  227. reg    [2:0]conf_state;
  228. reg    conf_entry;
  229. reg    conf_ent_reg;
  230. reg    conf_done;
  231. reg    pad_status;
  232. reg    pad_id;

  233. assign O_TYPE = pad_id;
  234. assign O_CONF_ENT = conf_entry;

  235. always@(posedge I_CLK or negedge I_RSTn)
  236. begin
  237.    if(! I_RSTn)    pad_id <= 1'b0;
  238.    else begin
  239.       if(I_BYTE_CNT==2)begin
  240.          case(I_RXD_DAT) //------  GET TYPE(Byte_SEQ)
  241.             8'h23: pad_id <= 1'b1;
  242.             8'h41: pad_id <= 1'b0;
  243.             8'h53: pad_id <= 1'b1;
  244.             8'h73: pad_id <= 1'b1;
  245.             8'hE3: pad_id <= 1'b1;
  246.             8'hF3: pad_id <= 1'b1;
  247.           default: pad_id <= 1'b0;
  248.          endcase
  249.       end
  250.    end
  251. end

  252. always@(posedge I_CLK or negedge I_RSTn)
  253. begin
  254.    if(! I_RSTn)begin
  255.       O_TXD_DAT    <= 8'h00;
  256.       conf_entry   <= 1'b0;
  257.       conf_ent_reg <= 1'b0;
  258.           conf_done    <= 1'b1;
  259.       conf_state   <= 0;
  260.       pad_status   <= 0;      
  261.    end
  262.    else begin
  263. //---------- nomal mode --------------------------------------------------------
  264. //----------------- read_data_and_vibrate_ex    01,42,00,WW,PP(,00,00,00,00)
  265. //                                              --,ID,SS,XX,XX(,XX,XX,XX,XX)
  266.       if(~conf_entry)begin
  267.          case(I_BYTE_CNT)
  268.             0:O_TXD_DAT <= 8'h01;
  269.             1:O_TXD_DAT <= 8'h42;
  270.             3:begin
  271.               if(I_RXD_DAT==8'h00) conf_ent_reg <= 1'b1;
  272.                  if(pad_status)begin
  273.                     if(I_VIB_SW[0]) O_TXD_DAT <= 8'h01;
  274.                     else            O_TXD_DAT <= 8'h00;
  275.                  end
  276.                              else begin
  277.                     if(I_VIB_SW[0] | I_VIB_SW[1]) O_TXD_DAT <= 8'h40;
  278.                     else            O_TXD_DAT <= 8'h00;                                
  279.                  end
  280.               end
  281.             4:begin
  282.                  if(pad_status)begin
  283.                     if(I_VIB_SW[1]) O_TXD_DAT <= I_VIB_DAT;
  284.                     else            O_TXD_DAT <= 8'h00;
  285.                  end
  286.                              else begin
  287.                     if(I_VIB_SW[0] | I_VIB_SW[1]) O_TXD_DAT <= 8'h01;
  288.                     else            O_TXD_DAT <= 8'h00;                                
  289.                  end
  290.                              if(pad_id==0)begin
  291.                     if(conf_state == 0 && ds_sw)
  292.                        conf_entry <= 1'b1;
  293.                     if(conf_state == 7 && (pad_status&conf_ent_reg))begin
  294.                        conf_state <= 0;
  295.                        conf_entry <= 1'b1;
  296.                     end
  297.                  end
  298.               end
  299.             8:begin
  300.                  O_TXD_DAT <= 8'h00;
  301.                  if(pad_id==1)begin
  302.                     if(conf_state == 0 && ds_sw)
  303.                        conf_entry <= 1'b1;
  304.                     if(conf_state == 7 && (pad_status&conf_ent_reg))begin
  305.                        conf_state <= 0;
  306.                        conf_entry <= 1'b1;
  307.                     end
  308.                  end
  309.               end      
  310.          default: O_TXD_DAT <= 8'h00;
  311.          endcase
  312.       end
  313. //---------- confg mode --------------------------------------------------------
  314.       else begin
  315.          case(conf_state)
  316.          //-------- config_mode_enter (43):     01,43,00,01,00(,00 x 4 or XX x 16)
  317.          //                                     --,ID,SS,XX,XX(,XX x 4 or XX x 16)  
  318.             0:begin
  319.                  case(I_BYTE_CNT)
  320.                     0:begin
  321.                          O_TXD_DAT <= 8'h01;
  322.                          conf_done <= 1'b0;
  323.                       end
  324.                     1:O_TXD_DAT <= 8'h43;
  325.                     3:O_TXD_DAT <= 8'h01;
  326.                     4:begin
  327.                          O_TXD_DAT <= 8'h00;
  328.                          if(pad_id==0)begin
  329.                             if(pad_status) conf_state <= 3;
  330.                             else           conf_state <= 1;   
  331.                          end
  332.                       end
  333.                     8:begin
  334.                          O_TXD_DAT <= 8'h00;
  335.                          if(pad_id==1)begin
  336.                             if(pad_status) conf_state <= 3;
  337.                             else           conf_state <= 1;   
  338.                          end
  339.                       end                                                                                                                                
  340.                   default:O_TXD_DAT <= 8'h00;
  341.                  endcase
  342.               end
  343.          //-------- query_model_and_mode (45):  01,45,00,5A,5A,5A,5A,5A,5A
  344.          //                                     FF,F3,5A,TT,02,MM,VV,01,00
  345.             1:begin
  346.                  case(I_BYTE_CNT)
  347.                     0:O_TXD_DAT <= 8'h01;
  348.                     1:O_TXD_DAT <= 8'h45;
  349.                     2:begin
  350.                          O_TXD_DAT <= 8'h00;
  351.                          conf_done <= (I_RXD_DAT == 8'hF3)? 1'b0:1'b1;
  352.                       end
  353.                     4:begin
  354.                          O_TXD_DAT <= 8'h00;
  355.                          if(I_RXD_DAT==8'h01 || I_RXD_DAT==8'h03) pad_status <= 1;
  356.                          if(pad_id==0 && conf_done==1'b1)begin
  357.                             conf_state <= 7;
  358.                             conf_entry <= 1'b0;
  359.                          end
  360.                       end
  361.                     8:begin
  362.                          O_TXD_DAT <= 8'h00;
  363.                          conf_state <= 2;
  364.                          if(pad_id==1 && conf_done==1'b1)begin
  365.                             conf_state <= 7;
  366.                             conf_entry <= 1'b0;
  367.                          end                                
  368.                       end                                                                                                         
  369.                   default:O_TXD_DAT <= 8'h00;
  370.                  endcase
  371.               end
  372.          //-------- set_mode_and_lock (44):     01,44,00,XX,YY,00,00,00,00
  373.          //                                     --,F3,5A,00,00,00,00,00,00
  374.             2:begin
  375.                  case(I_BYTE_CNT)
  376.                     0:O_TXD_DAT <= 8'h01;
  377.                     1:O_TXD_DAT <= 8'h44;
  378.                     3:O_TXD_DAT <= pad_mode[0] ? 8'h01:8'h00;
  379.                     4:O_TXD_DAT <= pad_mode[1] ? 8'h03:8'h00;
  380.                     8:begin
  381.                          O_TXD_DAT <= 8'h00;
  382.                          conf_state<= 3;
  383.                       end
  384.                   default:O_TXD_DAT <= 8'h00;
  385.                  endcase
  386.               end
  387.          //-------- vibration_enable (4D):      01,4D,00,00,01,FF,FF,FF,FF
  388.          //                                     --,F3,5A,XX,YY,FF,FF,FF,FF
  389.             3:begin
  390.                  case(I_BYTE_CNT)
  391.                     0:O_TXD_DAT <= 8'h01;
  392.                     1:O_TXD_DAT <= 8'h4D;
  393.                   2,3:O_TXD_DAT <= 8'h00;
  394.                     4:O_TXD_DAT <= 8'h01;
  395.                     8:begin
  396.                          O_TXD_DAT <= 8'hFF;
  397.                          conf_state<= 6;
  398.                       end
  399.                   default:O_TXD_DAT <= 8'hFF;
  400.                  endcase
  401.               end
  402.          //-------- config_mode_exit (43):      01,43,00,00,5A,5A,5A,5A,5A
  403.          //                                     --,F3,5A,00,00,00,00,00,00
  404.             6:begin
  405.                  case(I_BYTE_CNT)
  406.                     0:O_TXD_DAT <= 8'h01;
  407.                     1:O_TXD_DAT <= 8'h43;
  408.                   2,3:O_TXD_DAT <= 8'h00;
  409.                     8:begin
  410.                          O_TXD_DAT <= 8'h5A;
  411.                          conf_state<= 7;
  412.                          conf_entry<= 1'b0;
  413.                          conf_done <= 1'b1;
  414.                          conf_ent_reg<= 1'b0;                                                  
  415.                        end
  416.                   default:O_TXD_DAT <= 8'h5A;
  417.                  endcase
  418.               end
  419.           default:;
  420.          endcase
  421.       end
  422.    end
  423. end

  424. endmodule

  425. module ps_pls_gan(

  426. I_CLK,
  427. I_RSTn,
  428. I_TYPE,

  429. O_SCAN_SEQ_PLS,
  430. O_RXWT,
  431. O_TXWT,
  432. O_TXSET,
  433. O_TXEN,
  434. O_psCLK,
  435. O_psSEL,
  436. O_byte_cnt,

  437. Timer

  438. );

  439. parameter Timer_size = `Timer_siz;

  440. input  I_CLK,I_RSTn;
  441. input  I_TYPE;
  442. output O_SCAN_SEQ_PLS;
  443. output O_RXWT;
  444. output O_TXWT;
  445. output O_TXSET;
  446. output O_TXEN;
  447. output O_psCLK;
  448. output O_psSEL;
  449. output [3:0]O_byte_cnt;

  450. output [Timer_size-1:0]Timer;
  451. reg    [Timer_size-1:0]Timer;

  452. reg    O_SCAN_SEQ_PLS;
  453. reg    RXWT;
  454. reg    TXWT;
  455. reg    TXSET;
  456. reg    psCLK_gate;
  457. reg    psSEL;
  458. reg    [3:0]O_byte_cnt;

  459. always@(posedge I_CLK or negedge I_RSTn)
  460. begin
  461.    if(! I_RSTn) Timer <= 0;
  462.    else         Timer <= Timer+1;
  463. end

  464. always@(posedge I_CLK or negedge I_RSTn)
  465. begin
  466.    if(! I_RSTn)
  467.       O_SCAN_SEQ_PLS <= 0;
  468.    else begin
  469.       if(Timer == 0) O_SCAN_SEQ_PLS <= 1;
  470.           else           O_SCAN_SEQ_PLS <= 0;            
  471.    end
  472. end

  473. always@(posedge I_CLK or negedge I_RSTn)
  474. begin
  475.    if(! I_RSTn)
  476.    begin
  477.       psCLK_gate <= 1;
  478.       RXWT     <= 0;
  479.           TXWT     <= 0;
  480.           TXSET    <= 0;
  481.    end
  482.    else begin
  483.       case(Timer[4:0])
  484.           6: TXSET <= 1;
  485.           8: TXSET <= 0;
  486.           9: TXWT <= 1;
  487.          11: TXWT <= 0;
  488.          12: psCLK_gate <= 0;
  489.          20: psCLK_gate <= 1;
  490.          21: RXWT <= 1;
  491.          23: RXWT <= 0;
  492.       default:;
  493.       endcase
  494.    end
  495. end

  496. always@(posedge I_CLK or negedge I_RSTn)
  497. begin  
  498.    if(! I_RSTn)
  499.       psSEL <= 1;
  500.    else begin       
  501.       if(O_SCAN_SEQ_PLS == 1)
  502.          psSEL <= 0;
  503.       else if((I_TYPE == 0)&&(Timer == 158))
  504.          psSEL <= 1;
  505.       else if((I_TYPE == 1)&&(Timer == 286))
  506.          psSEL <= 1;
  507.    end
  508. end

  509. always@(posedge I_CLK or negedge I_RSTn)
  510. begin  
  511.    if(! I_RSTn)
  512.       O_byte_cnt <= 0;
  513.    else begin
  514.       if( O_SCAN_SEQ_PLS == 1)
  515.          O_byte_cnt <= 0;
  516.       else begin
  517.          if( Timer[4:0] == 5'b11111)begin
  518.             if(I_TYPE == 0 && O_byte_cnt == 5)
  519.                O_byte_cnt <= O_byte_cnt;
  520.             else if(I_TYPE == 1 && O_byte_cnt == 9)
  521.                O_byte_cnt <= O_byte_cnt;
  522.             else
  523.                O_byte_cnt <= O_byte_cnt+1;
  524.          end   
  525.       end
  526.    end
  527. end

  528. assign O_psCLK = psCLK_gate | I_CLK | psSEL;
  529. assign O_psSEL = psSEL;
  530. assign O_RXWT  = ~psSEL&RXWT;
  531. assign O_TXSET = ~psSEL&TXSET;
  532. assign O_TXWT  = ~psSEL&TXWT;
  533. assign O_TXEN  = ~psSEL&(~psCLK_gate);

  534. endmodule

  535. module ps_rxd(

  536. I_CLK,
  537. I_RSTn,       
  538. I_WT,
  539. I_psRXD,
  540. O_RXD_DAT

  541. );

  542. input        I_CLK,I_RSTn,I_WT;
  543. input        I_psRXD;
  544. output        [7:0]O_RXD_DAT;
  545. reg     [7:0]O_RXD_DAT;
  546. reg     [7:0]sp;

  547. always@(posedge I_CLK or negedge I_RSTn)
  548.    if(! I_RSTn) sp <= 1;
  549.    else         sp <= { I_psRXD, sp[7:1]};
  550. always@(posedge I_WT or negedge I_RSTn)
  551.    if(! I_RSTn) O_RXD_DAT <= 1;
  552.    else         O_RXD_DAT <= sp;

  553. endmodule

  554. module ps_txd(

  555. I_CLK,
  556. I_RSTn,
  557. I_WT,
  558. I_EN,
  559. I_TXD_DAT,
  560. O_psTXD

  561. );

  562. input        I_CLK,I_RSTn;
  563. input        I_WT,I_EN;
  564. input        [7:0]I_TXD_DAT;
  565. output        O_psTXD;
  566. reg     O_psTXD;
  567. reg     [7:0]ps;

  568. always@(negedge I_CLK or negedge I_RSTn)
  569. begin
  570.    if(! I_RSTn)begin
  571.       O_psTXD <= 1;
  572.       ps      <= 0;
  573.    end
  574.    else begin
  575.       if(I_WT)
  576.          ps  <= I_TXD_DAT;
  577.       else begin
  578.          if(I_EN)begin
  579.             O_psTXD <= ps[0];
  580.             ps      <= {1'b1, ps[7:1]};
  581.          end
  582.          else begin
  583.             O_psTXD <= 1'd1;
  584.             ps  <= ps;
  585.          end
  586.       end
  587.    end        
  588. end

  589. endmodule
复制代码

出0入0汤圆

 楼主| 发表于 2015-1-23 17:44:00 | 显示全部楼层
这是刚找到的另一个verilog的代码,光看引脚名称感觉这个更靠谱一点。这个应该是最核心的模块,我们分析分析吧!

出0入0汤圆

发表于 2015-3-11 19:25:33 | 显示全部楼层
liyang53719 发表于 2015-1-23 17:41
经过测试这段程序完全可用!

楼主,这个可以直接用吗,ps手柄与开发板如何连接呢,能详细说说具体测试过程吗, 测试结果如何呢

出0入0汤圆

发表于 2015-3-11 22:45:54 | 显示全部楼层
PS2手柄的接口比SPI多了一个ACK线,用SPI在加一根ACK线就可以了,具体的协议可以公布吗,我不知道啊

出0入0汤圆

 楼主| 发表于 2015-3-14 21:15:36 | 显示全部楼层
steinwai 发表于 2015-3-11 19:25
楼主,这个可以直接用吗,ps手柄与开发板如何连接呢,能详细说说具体测试过程吗, 测试结 ...

可以直接用 具体接口网上应该有 我现在不在学校了 东西都不在了

出0入0汤圆

 楼主| 发表于 2015-3-14 21:16:09 | 显示全部楼层
funnybow 发表于 2015-3-11 22:45
PS2手柄的接口比SPI多了一个ACK线,用SPI在加一根ACK线就可以了,具体的协议可以公布吗,我不知道啊 ...

网上可以搜到,搜PSX试试

出0入0汤圆

发表于 2015-3-15 22:50:17 | 显示全部楼层
liyang53719 发表于 2015-3-14 21:15
可以直接用 具体接口网上应该有 我现在不在学校了 东西都不在了

已经搜了好几天了,各种实在是搜不到 ,lz能给点线索吗,提示一下关键字也行啊

出0入0汤圆

 楼主| 发表于 2015-3-15 22:57:50 | 显示全部楼层
steinwai 发表于 2015-3-15 22:50
已经搜了好几天了,各种实在是搜不到 ,lz能给点线索吗,提示一下关键字也行啊 ...

PS2 PSX 接口时序 通信协议 之类的你试试。我记得有个英文的最全

出0入0汤圆

发表于 2015-3-16 21:16:44 | 显示全部楼层
steinwai 发表于 2015-3-15 22:50
已经搜了好几天了,各种实在是搜不到 ,lz能给点线索吗,提示一下关键字也行啊 ...

看这个
http://www.amobbs.com/thread-947324-1-1.html

出0入0汤圆

发表于 2015-3-16 23:39:06 | 显示全部楼层
十三楼的那几个IO和手柄的管脚如何对应呢?名字都不一样看起来好费力

出0入0汤圆

 楼主| 发表于 2015-3-18 15:23:52 | 显示全部楼层
steinwai 发表于 2015-3-16 23:39
十三楼的那几个IO和手柄的管脚如何对应呢?名字都不一样看起来好费力

DATA        -to I_psRXD
CLK                -to O_psCLK
COMMAND        -to O_psTXD
ATT                -to O_psSEL
原来的资料找不到了。这是我之前做的笔记。你们看看能否有帮助

出0入0汤圆

发表于 2015-3-18 23:12:37 | 显示全部楼层
本帖最后由 steinwai 于 2015-3-19 20:30 编辑

补充:用之前还得先分个250k的频给I_CLK250K

出0入0汤圆

发表于 2015-3-19 20:28:14 | 显示全部楼层
找到了完整的工程文件,来分享一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-20 20:36:20 | 显示全部楼层
att command clk 在示波器中显示都好,但data在按键时完全没图像

出0入0汤圆

 楼主| 发表于 2015-3-20 23:59:09 | 显示全部楼层
steinwai 发表于 2015-3-20 20:36
att command clk 在示波器中显示都好,但data在按键时完全没图像

有红灯模式绿灯模式,你按一下mode键试试,或者动摇干

出0入0汤圆

发表于 2015-4-3 21:07:09 | 显示全部楼层
lz能否共享一下你的工程呢?搞了好久都没成功

出0入0汤圆

发表于 2015-4-5 10:28:39 | 显示全部楼层
lz请求帮助,please

出0入0汤圆

 楼主| 发表于 2015-4-5 11:03:19 | 显示全部楼层
steinwai 发表于 2015-4-5 10:28
lz请求帮助,please

工程原文件都在学校了没带出来。我现在也只有13楼那个代码。
你先搞清楚PS2接口的定义,就是名字。然后用RTL视图找代码接口。
按照下面这种方法接
DATA        -to I_psRXD
CLK                -to O_psCLK
COMMAND        -to O_psTXD
ATT                -to O_psSEL
还有你需要给代码一个时钟信号,具体数值我忘了,10M,50M你都试一下。
手柄和FPGA接好之后,打开signaltap II监测每个输出引脚电平变化。然后上电。你要做的就是按下手柄上的一个键去Signaltap II里找电平变化的对应脚。高变低还是低变高我也忘了。总之会有变化(注意采样深度太大可能会有延时)。如果没反应,按下mode键再试,或者按两次再试。找到按键和对应脚记下来。将来可以做个顶层打包的东西用。
过程大概就是这样。这个代码是没问题的,我也抱着怀疑的心态试了很久。但是是可以用的。你要工程的话我这里是没有了,现在也没时间再弄这个了。
希望可以帮到你。

出0入0汤圆

发表于 2015-4-5 11:08:39 | 显示全部楼层
I_CLK250K,       //  MAIN CLK 250KH这句不是表示需要一个250khz的时钟给顶层吗,于是我就先写了个分频器给他,是直接用板子的50m时钟就好了 吗

出0入0汤圆

发表于 2015-4-5 11:35:32 | 显示全部楼层
非常感谢lz耐心指教

出0入0汤圆

发表于 2015-4-5 15:37:50 | 显示全部楼层
看了一篇文章解释的data与按键对应,还想再请教一下,如何在signaltap中让时间轴变长一点呢?得到第4和5byte才能判断按键呐

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-4-5 15:42:27 | 显示全部楼层
我的系统时钟是50m的,不会分10m,于是只好对半分了,也就是25m

出0入0汤圆

 楼主| 发表于 2015-4-5 22:28:03 | 显示全部楼层
steinwai 发表于 2015-4-5 11:08
I_CLK250K,       //  MAIN CLK 250KH这句不是表示需要一个250khz的时钟给顶层吗,于是我就先写了个分频器 ...

分个频是对的,可能是我记错了

出0入0汤圆

 楼主| 发表于 2015-4-5 22:29:52 | 显示全部楼层
steinwai 发表于 2015-4-5 15:37
看了一篇文章解释的data与按键对应,还想再请教一下,如何在signaltap中让时间轴变长一点呢?得到第4和5byt ...

让时间轴变长一点
这个没理解

出0入0汤圆

发表于 2015-4-6 16:05:02 | 显示全部楼层
liyang53719 发表于 2015-4-5 22:29
让时间轴变长一点
这个没理解

就是想让波形多显示一点,

出0入0汤圆

发表于 2015-4-6 19:16:11 来自手机 | 显示全部楼层
不然图像太短了显示不到第4,5个byte

出0入0汤圆

 楼主| 发表于 2015-4-6 21:14:49 | 显示全部楼层
steinwai 发表于 2015-4-6 19:16
不然图像太短了显示不到第4,5个byte

采样深度大一点。改成2k或以上试试

出0入0汤圆

发表于 2015-4-11 19:22:46 | 显示全部楼层
liyang53719 发表于 2015-4-6 21:14
采样深度大一点。改成2k或以上试试

4k都显示不到第四个byte,8k就没反应了

出0入0汤圆

 楼主| 发表于 2015-4-11 19:57:58 | 显示全部楼层
steinwai 发表于 2015-4-11 19:22
4k都显示不到第四个byte,8k就没反应了

8k好像因为采集的点太多,没法实时显示你可以采集一会停止应该就有了。但是明显不应该是8k这么大的。你可以试试换个采样时钟。用O_psCLK做采样时钟。或者自己分个频。25M、10M、1M的试一下。

出0入0汤圆

发表于 2015-4-14 19:50:37 | 显示全部楼层
直接接在板子的extra pin上面就可以了吗,对io的类型有要求吗?

出0入0汤圆

发表于 2015-4-14 20:37:51 | 显示全部楼层
终于可以显示完5个byte了,可是按键后没看出data有变化呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表