Guest User

Sindre The Ruthless

a guest
Feb 23rd, 2012
1,254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 17.53 KB | None | 0 0
  1. ---------------------------------------------------------------------------------
  2. -- GForce.vhd
  3. -- [email protected] 23 Feb 2012
  4. -- Simple I2C and G-sensor reader
  5. ---------------------------------------------------------------------------------
  6.  
  7. library IEEE;
  8. use IEEE.STD_LOGIC_1164.ALL;
  9. use IEEE.STD_LOGIC_ARITH.ALL;
  10. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  11.  
  12.  
  13. entity Gforce is
  14.     -- Port ----------------------------------------------------------------
  15.     -- Comes from other files or from the card
  16.     port (
  17.             CLOCK_50 : IN STD_LOGIC;
  18.             KEY        : IN STD_LOGIC_VECTOR(1 DOWNTO 0); -- KEY0 (reset) and KEY1 (begin)
  19.             LED         : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- LED0 to LED7
  20.            
  21.          
  22.             -- Accelerometer and EEPROM
  23.             G_SENSOR_CS_N : OUT STD_LOGIC;
  24.             G_SENSOR_INT  : IN STD_LOGIC; -- 0 on default
  25.             I2C_SCLK      : OUT STD_LOGIC;
  26.             I2C_SDAT      : INOUT STD_LOGIC; -- 1 on default
  27.    
  28.                 clk_st : OUT STD_LOGIC;
  29.                 data1  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
  30.         );
  31. end entity;
  32.    
  33. -- Architecture -------------------------------------------------------------
  34. -- This file only
  35. architecture synth of Gforce is
  36.  
  37.     -- Counter
  38.    SIGNAL a             : STD_LOGIC_VECTOR(30 DOWNTO 0);
  39.    SIGNAL b             : STD_LOGIC_VECTOR(30 DOWNTO 0);
  40.    SIGNAL clk           : STD_LOGIC;
  41.    SIGNAL clk_signaltap : STD_LOGIC;
  42.    SIGNAL q             : STD_LOGIC;
  43.    SIGNAL step          : STD_LOGIC_VECTOR(10 DOWNTO 0);
  44.    SIGNAL sl_ad         : STD_LOGIC_VECTOR(6 DOWNTO 0) := "0011101";
  45.    SIGNAL reg_ad        : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00101101";
  46.    SIGNAL sclk          : STD_LOGIC;
  47.    SIGNAL sdat          : STD_LOGIC;
  48.  
  49. begin    
  50.  
  51.    
  52.       step <= "00000000000";
  53.       q <= '0';
  54.  
  55.  
  56.    
  57.    
  58.    PROCESS (CLOCK_50)
  59.    BEGIN
  60.       IF (CLOCK_50'EVENT AND CLOCK_50 = '1') THEN
  61.          IF (a = "0000000000011110100001001000000") THEN -- Clock for Slave with sample 2a
  62.             clk <= NOT(clk);
  63.             a <= "0000000000000000000000000000001";
  64.          ELSE
  65.             a <= a + "0000000000000000000000000000001";
  66.          END IF;
  67.            
  68.             -- Signaltap begin
  69.          IF (b = "0000000000001111010000100100000") THEN -- Clock for Signaltap2
  70.             clk_signaltap <= NOT(clk_signaltap);
  71.             b <= "0000000000000000000000000000001";
  72.          ELSE
  73.             b <= b + "0000000000000000000000000000001";
  74.          END IF;
  75.       END IF;
  76.    END PROCESS;
  77.    
  78.  
  79.    -- Signaltap end
  80.    PROCESS (CLOCK_50, KEY(0), KEY(1))
  81.    BEGIN
  82.       IF (CLOCK_50'EVENT AND CLOCK_50 = '1') THEN -- Trigger Condition
  83.        
  84.             IF KEY(0) = '0' AND  KEY(1) = '0' THEN
  85.                 q <= q;
  86.             ELSE
  87.                 IF KEY(0) = '1' AND  KEY(1) = '0' THEN
  88.                     q <= '1'; -- Set
  89.                 ELSE
  90.                     IF KEY(0) = '0' AND  KEY(1) = '1' THEN
  91.                         q <= '0'; -- Reset
  92.                     END IF;
  93.                 END IF;
  94.             END IF;
  95.       END IF;
  96.    END PROCESS;
  97.    
  98.    
  99.  
  100.    PROCESS (clk) BEGIN
  101.       IF (clk'EVENT AND clk = '1') THEN
  102.          IF (q = '1') THEN
  103.             CASE step IS
  104.                WHEN "00000000000" => -- 0
  105.                         -- Initial
  106.                   sclk <= '1';
  107.                   sdat <= '1';
  108.                   step <= "00000000001";
  109.                WHEN "00000000001" => -- 1
  110.                         -- 1.Start
  111.                   sclk <= '1';
  112.                   sdat <= '0';
  113.                   step <= "00000000010";
  114.                WHEN "00000000010" => -- 2
  115.                   sclk <= '0';
  116.                   sdat <= '0';
  117.                   step <= "00000000011";
  118.                     WHEN "00000000011" => -- 3
  119.                         -- 2.Slave add
  120.                   sclk <= '0';
  121.                   sdat <= sl_ad(6);
  122.                   step <= "00000000100";
  123.                WHEN "00000000100" => -- 4
  124.                   sclk <= '1';
  125.                   sdat <= sl_ad(6);
  126.                   step <= "00000000101";
  127.                WHEN "00000000101" => -- 5
  128.                   sclk <= '0';
  129.                   sdat <= sl_ad(5);
  130.                   step <= "00000000110";
  131.                     WHEN "00000000110" => -- 6
  132.                   sclk <= '1';
  133.                   sdat <= sl_ad(5);
  134.                   step <= "00000000111";
  135.                WHEN "00000000111" => -- 7
  136.                   sclk <= '0';
  137.                   sdat <= sl_ad(4);
  138.                   step <= "00000001000";
  139.                WHEN "00000001000" => -- 8
  140.                   sclk <= '1';
  141.                   sdat <= sl_ad(4);
  142.                   step <= "00000001001";
  143.                WHEN "00000001001" => -- 9
  144.                   sclk <= '0';
  145.                   sdat <= sl_ad(3);
  146.                   step <= "00000001010";
  147.                WHEN "00000001010" => -- 10
  148.                   sclk <= '1';
  149.                   sdat <= sl_ad(3);
  150.                   step <= "00000001011";
  151.                     WHEN "00000001011" => -- 11
  152.                   sclk <= '0';
  153.                   sdat <= sl_ad(2);
  154.                   step <= "00000001100";
  155.                WHEN "00000001100" => -- 12
  156.                   sclk <= '1';
  157.                   sdat <= sl_ad(2);
  158.                   step <= "00000001101";
  159.                WHEN "00000001101" => -- 13
  160.                   sclk <= '0';
  161.                   sdat <= sl_ad(1);
  162.                   step <= "00000001110";
  163.                WHEN "00000001110" => -- 14
  164.                   sclk <= '1';
  165.                   sdat <= sl_ad(1);
  166.                   step <= "00000001111";
  167.                WHEN "00000001111" => -- 15
  168.                   sclk <= '0';
  169.                   sdat <= sl_ad(0);
  170.                   step <= "00000010000";
  171.                WHEN "00000010000" => -- 16
  172.                   sclk <= '1';
  173.                   sdat <= sl_ad(0);
  174.                   step <= "00000010001";
  175.                     WHEN "00000010001" => -- 17
  176.                         -- 3.sdat = 0
  177.                   sclk <= '0';
  178.                   sdat <= '0';
  179.                   step <= "00000010010";
  180.                WHEN "00000010010" => -- 18
  181.                   sclk <= '1';
  182.                   sdat <= '0';
  183.                   step <= "00000010011";
  184.                     WHEN "00000010011" => -- 19
  185.                         -- 4.Acknowledge
  186.                   sclk <= '0';
  187.                   sdat <= 'Z';
  188.                   step <= "00000010100";
  189.                WHEN "00000010100" => -- 20
  190.                   sclk <= '1';
  191.                   sdat <= 'Z';
  192.                   IF (I2C_SDAT = '1') THEN
  193.                      step <= "00000010100";
  194.                   ELSE
  195.                      step <= "00000010101";
  196.                   END IF;
  197.                     WHEN "00000010101" => -- 21
  198.                         -- 5.Reg add
  199.                   sclk <= '0';
  200.                   sdat <= reg_ad(7);
  201.                   step <= "00000010110";
  202.                WHEN "00000010110" => -- 22
  203.                   sclk <= '1';
  204.                   sdat <= reg_ad(7);
  205.                   step <= "00000010111";
  206.                WHEN "00000010111" => -- 23
  207.                   sclk <= '0';
  208.                   sdat <= reg_ad(6);
  209.                   step <= "00000011000";
  210.                WHEN "00000011000" => -- 24
  211.                   sclk <= '1';
  212.                   sdat <= reg_ad(6);
  213.                   step <= "00000011001";
  214.                WHEN "00000011001" => -- 25
  215.                   sclk <= '0';
  216.                   sdat <= reg_ad(5);
  217.                   step <= "00000011010";
  218.                WHEN "00000011010" => -- 26
  219.                   sclk <= '1';
  220.                   sdat <= reg_ad(5);
  221.                   step <= "00000011011";
  222.                     WHEN "00000011011" => -- 27
  223.                   sclk <= '0';
  224.                   sdat <= reg_ad(4);
  225.                   step <= "00000011100";
  226.                WHEN "00000011100" => -- 28
  227.                   sclk <= '1';
  228.                   sdat <= reg_ad(4);
  229.                   step <= "00000011101";
  230.                WHEN "00000011101" => -- 29
  231.                   sclk <= '0';
  232.                   sdat <= reg_ad(3);
  233.                   step <= "00000011110";
  234.                WHEN "00000011110" => -- 30
  235.                   sclk <= '1';
  236.                   sdat <= reg_ad(3);
  237.                   step <= "00000011111";
  238.                     WHEN "00000011111" => -- 31
  239.                   sclk <= '0';
  240.                   sdat <= reg_ad(2);
  241.                   step <= "00000100000";
  242.                WHEN "00000100000" => -- 32
  243.                   sclk <= '1';
  244.                   sdat <= reg_ad(2);
  245.                   step <= "00000100001";
  246.                WHEN "00000100001" => -- 33
  247.                   sclk <= '0';
  248.                   sdat <= reg_ad(1);
  249.                   step <= "00000100010";
  250.                WHEN "00000100010" => -- 34
  251.                   sclk <= '1';
  252.                   sdat <= reg_ad(1);
  253.                   step <= "00000100011";
  254.                WHEN "00000100011" => -- 35
  255.                   sclk <= '0';
  256.                   sdat <= reg_ad(0);
  257.                   step <= "00000100100";
  258.                WHEN "00000100100" => -- 36
  259.                   sclk <= '1';
  260.                   sdat <= reg_ad(0);
  261.                   step <= "00000100101";
  262.                     WHEN "00000100101" => -- 37
  263.                         -- 6.Acknowledge
  264.                   sclk <= '0';
  265.                   sdat <= 'Z';
  266.                   step <= "00000100110";
  267.                WHEN "00000100110" => -- 38
  268.                   sclk <= '1';
  269.                   sdat <= 'Z';
  270.                   IF (I2C_SDAT = '1') THEN
  271.                      step <= "00000100110";
  272.                   ELSE
  273.                      step <= "00000100111";
  274.                   END IF;
  275.                     WHEN "00000100111" => -- 39
  276.                         -- 7.Start
  277.                   sclk <= '0';
  278.                   sdat <= '0';
  279.                   step <= "00000101000";
  280.                WHEN "00000101000" => -- 40
  281.                   sclk <= '1';
  282.                   sdat <= '1';
  283.                   step <= "00000101001";
  284.                WHEN "00000101001" => -- 41
  285.                   sclk <= '1';
  286.                   sdat <= '0';
  287.                   step <= "00000101010";
  288.                WHEN "00000101010" => -- 42
  289.                   sclk <= '0';
  290.                   sdat <= '0';
  291.                   step <= "00000101101"; -- jum to step = 45
  292.                        
  293.                     WHEN "00000101101" => -- 45
  294.                         -- 8.Slave Add
  295.                   sclk <= '0';
  296.                   sdat <= sl_ad(6);
  297.                   step <= "00000101110";
  298.                WHEN "00000101110" => -- 46
  299.                   sclk <= '1';
  300.                   sdat <= sl_ad(6);
  301.                   step <= "00000101111";
  302.                WHEN "00000101111" => -- 47
  303.                   sclk <= '0';
  304.                   sdat <= sl_ad(5);
  305.                   step <= "00000110000";
  306.                WHEN "00000110000" => -- 48
  307.                   sclk <= '1';
  308.                   sdat <= sl_ad(5);
  309.                   step <= "00000110001";
  310.                WHEN "00000110001" => -- 49
  311.                   sclk <= '0';
  312.                   sdat <= sl_ad(4);
  313.                   step <= "00000110010";
  314.                WHEN "00000110010" => -- 50
  315.                   sclk <= '1';
  316.                   sdat <= sl_ad(4);
  317.                   step <= "00000110011";
  318.                WHEN "00000110011" => -- 51
  319.                   sclk <= '0';
  320.                   sdat <= sl_ad(3);
  321.                   step <= "00000110100";
  322.                WHEN "00000110100" => -- 52
  323.                   sclk <= '1';
  324.                   sdat <= sl_ad(3);
  325.                   step <= "00000110101";
  326.                WHEN "00000110101" => -- 53
  327.                   sclk <= '0';
  328.                   sdat <= sl_ad(2);
  329.                   step <= "00000110110";
  330.                WHEN "00000110110" => --54
  331.                   sclk <= '1';
  332.                   sdat <= sl_ad(2);
  333.                   step <= "00000110111";
  334.                     WHEN "00000110111" => -- 55
  335.                   sclk <= '0';
  336.                   sdat <= sl_ad(1);
  337.                   step <= "00000111000";
  338.                WHEN "00000111000" => -- 56
  339.                   sclk <= '1';
  340.                   sdat <= sl_ad(1);
  341.                   step <= "00000111001";
  342.                WHEN "00000111001" => -- 57
  343.                   sclk <= '0';
  344.                   sdat <= sl_ad(0);
  345.                   step <= "00000111010";
  346.                WHEN "00000111010" => -- 58
  347.                   sclk <= '1';
  348.                   sdat <= sl_ad(0);
  349.                   step <= "00000111011";
  350.                     WHEN "00000111011" => -- 59
  351.                         -- 9.sdat = 1
  352.                   sclk <= '0';
  353.                   sdat <= '1';
  354.                   step <= "00000111100";
  355.                WHEN "00000111100" => -- 60
  356.                   sclk <= '1';
  357.                   sdat <= '1';
  358.                   step <= "00000111101";
  359.                        
  360.                        
  361.                WHEN "00000111101" => -- 61
  362.                         -- 10.Acknowledge
  363.                   sclk <= '0';
  364.                   sdat <= 'Z';
  365.                   step <= "00000111110";
  366.                WHEN "00000111110" => -- 62
  367.                   sclk <= '1';
  368.                   sdat <= 'Z';
  369.                   IF (I2C_SDAT = '1') THEN
  370.                      step <= "00000111110";
  371.                   ELSE
  372.                      step <= "00000111111";
  373.                   END IF;
  374.                    
  375.                     WHEN "00000111111" => -- 63
  376.                         -- 11.Databyte#1
  377.                   sclk <= '0';
  378.                   sdat <= 'Z';
  379.                   step <= "00001000000";
  380.                WHEN "00001000000" => -- 64
  381.                   sclk <= '1';
  382.                   sdat <= 'Z';
  383.                   -- data1(7) <= I2C_sdat; -- SOMETHING WRONG HERE CANT RESOLVE MULTIPLE CONSTANT DRIVERS FRO NET "q" (line 54)
  384.                   step <= "00001000001";
  385.                      WHEN "00001000001" => -- 65
  386.                   sclk <= '0';
  387.                   sdat <= 'Z';
  388.                   step <= "00001000010";
  389.                WHEN "00001000010" => -- 66
  390.                   sclk <= '1';
  391.                   sdat <= 'Z';
  392.                   --data1(6) <= I2C_sdat; -- SOMETHING WRONG HERE
  393.                   step <= "00001000011";
  394.                WHEN "00001000011" => -- 67
  395.                   sclk <= '0';
  396.                   sdat <= 'Z';
  397.                   step <= "00001000100";
  398.                WHEN "00001000100" => -- 68
  399.                   sclk <= '1';
  400.                   sdat <= 'Z';
  401.                   --data1(5) <= I2C_sdat; -- SOMETHING WRONG HERE
  402.                   step <= "00001000101";
  403.                WHEN "00001000101" => -- 69
  404.                   sclk <= '0';
  405.                   sdat <= 'Z';
  406.                   step <= "00001000110";
  407.                     WHEN "00001000110" => -- 70
  408.                   sclk <= '1';
  409.                   sdat <= 'Z';
  410.                   --data1(4) <= I2C_sdat;-- SOMETHING WRONG HERE
  411.                   step <= "00001000111";
  412.                WHEN "00001000111" => -- 71
  413.                   sclk <= '0';
  414.                   sdat <= 'Z';
  415.                   step <= "00001001000";
  416.                WHEN "00001001000" => -- 72
  417.                   sclk <= '1';
  418.                   sdat <= 'Z';
  419.                   --data1(3) <= I2C_sdat;-- SOMETHING WRONG HERE
  420.                   step <= "00001001001";
  421.                WHEN "00001001001" => -- 73
  422.                   sclk <= '0';
  423.                   sdat <= 'Z';
  424.                   step <= "00001001010";
  425.                WHEN "00001001010" => -- 74
  426.                   sclk <= '1';
  427.                   sdat <= 'Z';
  428.                   --data1(2) <= I2C_sdat;-- SOMETHING WRONG HERE
  429.                   step <= "00001001011";
  430.                     WHEN "00001001011" => -- 75
  431.                   sclk <= '0';
  432.                   sdat <= 'Z';
  433.                   step <= "00001001100";
  434.                WHEN "00001001100" => -- 76
  435.                   sclk <= '1';
  436.                   sdat <= 'Z';
  437.                   --data1(1) <= I2C_sdat;- SOMETHING WRONG HERE
  438.                   step <= "00001001101";
  439.                WHEN "00001001101" => -- 77
  440.                   sclk <= '0';
  441.                   sdat <= 'Z';
  442.                   step <= "00001001110";
  443.                WHEN "00001001110" => -- 78
  444.                   sclk <= '1';
  445.                   sdat <= 'Z';
  446.                   --data1(0) <= I2C_sdat;- SOMETHING WRONG HERE
  447.                   step <= "00001001111";
  448.                        
  449.                     WHEN "00001001111" => -- 79
  450.                         -- 12.Acknowledge
  451.                   sclk <= '0';
  452.                   sdat <= 'Z';
  453.                   step <= "00001010000";
  454.                WHEN "00001010000" => -- 80
  455.                   sclk <= '1';
  456.                   sdat <= 'Z';
  457.                   IF (I2C_sdat = '1') THEN
  458.                      step <= "00001010000";
  459.                   ELSE
  460.                      step <= "00001010001";
  461.                   END IF;
  462.                WHEN "00001010001" => -- 81
  463.                         -- 13.Stop
  464.                   sclk <= '1';
  465.                   sdat <= '0';
  466.                   step <= "00001010010";
  467.                WHEN "00001010010" => -- 82
  468.                   sclk <= '1';
  469.                   sdat <= '1';
  470.                   step <= "00001010011";
  471.                WHEN "00001010011" => -- 83
  472.                   sclk <= '1';
  473.                   sdat <= '1';
  474.                     WHEN OTHERS =>
  475.             END CASE;
  476.          END IF;
  477.       END IF;
  478.    END PROCESS;
  479.  
  480.     --I2C_SCLK <= sclk;
  481.    --I2C_SDAT <= sdat;
  482.    --clk_st <= clk_signaltap;
  483.    
  484. end synth;
Advertisement
Add Comment
Please, Sign In to add comment