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