Hodinovy signal zesilen pomoci CLKINT. SPI otestovano smer rpi->fpga (pomoci vystupu...
[fpga/rpi-motor-control.git] / pmsm-control / rpi_mc_simple_dc.vhdl
1 --
2 -- * LXPWR slave part *
3 --  common sioreg & common counter for several ADC&PWM blocks
4 --
5 -- part of LXPWR motion control board (c) PiKRON Ltd
6 -- idea by Pavel Pisa PiKRON Ltd <pisa@cmp.felk.cvut.cz>
7 -- code by Marek Peca <mp@duch.cz>
8 -- 01/2013
9 --
10 -- license: GNU GPLv3
11 --
12
13 library ieee;
14 use ieee.std_logic_1164.all;
15 use ieee.numeric_std.all;
16 use work.util.all;
17
18 entity rpi_mc_simple_dc is
19         port (
20                 gpio2: in std_logic; -- SDA
21                 gpio3: in std_logic; -- SCL
22                 gpio4: out std_logic; -- CLK
23                 gpio14: in std_logic; -- Tx
24                 gpio15: in std_logic; -- Rx
25                 gpio17: out std_logic; -- RTS
26                 gpio18: out std_logic; -- PWM0/PCMCLK
27                 gpio27: out std_logic; -- SD1DAT3
28                 gpio22: out std_logic; -- SD1CLK
29                 gpio23: out std_logic; -- SD1CMD
30                 gpio24: out std_logic; -- SD1DAT0
31                 gpio10: in std_logic; -- SPI0MOSI
32                 gpio9: in std_logic; -- SPI0MISO
33                 gpio25: out std_logic; -- SD1DAT1
34                 gpio11: in std_logic; -- SPI0SCLK
35                 gpio8: in std_logic; -- SPI0CE0
36                 gpio7: in std_logic; -- SPI0CE1
37                 gpio5: in std_logic; -- GPCLK1
38                 gpio6: in std_logic; -- GPCLK2
39                 gpio12: in std_logic; -- PWM0
40                 gpio13: in std_logic; -- PWM1
41                 gpio19: in std_logic; -- PWM1/SPI1MISO/PCMFS
42                 gpio16: in std_logic; -- SPI1CE2
43                 gpio26: in std_logic; -- SD1DAT2
44                 gpio20: in std_logic; -- SPI1MOSI/PCMDIN/GPCLK0
45                 gpio21: in std_logic; -- SPI1SCLK/PCMDOUT/GPCLK1
46                 --
47                 -- PWM
48                 -- Each PWM signal has cooresponding shutdown
49                 pwm: out std_logic_vector (1 to 3);
50                 shdn: out std_logic_vector (1 to 3);
51                 -- Fault/power stage status
52                 stat: in std_logic_vector (1 to 3);
53                 -- HAL inputs
54                 hal_in: in std_logic_vector (1 to 3);
55                 -- IRC inputs
56                 irc_a: in std_logic;
57                 irc_b: in std_logic;
58                 irc_i: in std_logic;
59                 -- Power status
60                 power_stat: in std_logic;
61                 -- ADC for current
62                 adc_miso: in std_logic;
63                 adc_mosi: in std_logic;
64                 adc_sclk: in std_logic;
65                 adc_scs: in std_logic;
66                 -- Extarnal SPI
67                 ext_miso: in std_logic; --master in slave out
68                 ext_mosi: in std_logic; --master out slave in
69                 ext_sclk: in std_logic;
70                 ext_scs0: in std_logic;
71                 ext_scs1: in std_logic;
72                 ext_scs2: in std_logic;
73                 -- RS-485 Transceiver
74                 rs485_rxd: in std_logic;
75                 rs485_txd: out std_logic;
76                 rs485_dir: out std_logic;
77                 -- CAN Transceiver
78                 can_rx: in std_logic;
79                 can_tx: in std_logic;
80                 -- DIP switch
81                 dip_sw: in std_logic_vector (1 to 3); --na desce je prohozene cislovanni
82                 -- Unused terminal to keep design tools silent
83                 dummy_unused : out std_logic
84         );
85 end rpi_mc_simple_dc;
86
87
88 architecture behavioral of rpi_mc_simple_dc is
89         attribute syn_noprune :boolean;
90         attribute syn_preserve :boolean;
91         attribute syn_keep :boolean;
92         attribute syn_hier :boolean;
93         -- Actel lib
94         -- component pll50to200
95         --   port (
96         --     powerdown, clka: in std_logic;
97         --     lock, gla: out std_logic
98         --   );
99         -- end component;
100         
101         component CLKINT
102                 port (A: in std_logic; Y: out std_logic);
103         end component;
104
105         signal pwm_in, pwm_dir_in: std_logic;
106         signal spi_clk: std_logic;
107         signal dat_reg : STD_LOGIC_VECTOR (7 downto 0); --registr pro SPI
108
109         --  attribute syn_noprune of gpio2 : signal is true;
110         --  attribute syn_preserve of gpio2 : signal is true;
111         --  attribute syn_keep of gpio2 : signal is true;
112         --  attribute syn_hier of gpio2 : signal is true;
113
114 begin
115         -- PLL as a reset generator
116         copyclk: CLKINT
117         port map (
118                 a => gpio11,
119                 y => spi_clk
120         );
121         --   pll: pll50to200
122         --     port map (
123         --       powerdown => '1',
124         --       clka => pll_clkin,
125         --       gla => pll_clkout,
126         --       lock => pll_lock);
127         -- --  reset <= not pll_lock;
128         --   reset <= '0';                         -- TODO: apply reset for good failsafe
129                                            -- upon power-on
130         --   clock <= clkm;
131
132         dummy_unused <= gpio2 and gpio3  and
133                 gpio5 and gpio6 and
134                 gpio12 and gpio13 and gpio14 and
135                 gpio15 and gpio16 and gpio19 and
136                 gpio20 and gpio21 and gpio26 and
137                 stat(1) and stat(2) and stat(3) and
138                 hal_in(1) and hal_in(2) and hal_in(3) and
139                 irc_i and power_stat and 
140                 adc_miso and adc_mosi and adc_sclk and adc_scs and
141                 rs485_rxd and
142                 can_rx and can_tx and
143                 dip_sw(1) and dip_sw(2) and dip_sw(3) and
144                 irc_a and irc_b and
145                 -- gpio17 and gpio18 and gpio27 and gpio22 and
146                 gpio8 and gpio9 and gpio11 and gpio7 and gpio10 and
147                 ext_scs1 and ext_scs2 and ext_miso and ext_mosi and ext_sclk and ext_scs0;
148                         
149         rs485_txd <= '1';
150         rs485_dir <= '0';
151
152  
153         --gpio24 <= dip_sw(1); --na desce je prohozene cislovani
154
155         shdn(1) <= '0';
156         shdn(2) <= '0';
157         shdn(3) <= '1';
158
159         pwm(1) <= '0';
160         pwm(2) <= '0';
161         pwm(3) <= '0';
162
163
164   
165         process (spi_clk) --nufunguje preo piny 11,17,27 funguje pro 4,18,22,ext_sclk,10
166         begin
167                 --if (gpio11'event and gpio11 = '1') then  -- rising edge of SCK
168                 if (rising_edge(spi_clk)) then 
169                         if (gpio7 = '0') then             -- SPI CS must be selected
170                                 -- shift serial data into dat_reg on each rising edge
171                                 -- of SCK, MSB first
172                                 dat_reg(7 downto 0) <= dat_reg(6 downto 0) & gpio10;
173                 
174                                 gpio4 <= dat_reg(7);
175                                 gpio17 <= dat_reg(6);
176                                 gpio18 <= dat_reg(5);
177                                 gpio27 <= dat_reg(4);
178                                 gpio22 <= dat_reg(3);
179                                 gpio23 <= dat_reg(2);
180                                 gpio24 <= dat_reg(1);
181                                 gpio25 <= dat_reg(0);
182         
183                         end if;
184                 end if;
185         end process;
186 end behavioral;