OpenCores
URL https://opencores.org/ocsvn/iicmb/iicmb/trunk

Subversion Repositories iicmb

[/] [iicmb/] [trunk/] [src/] [conditioner_mux.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sshuv2
 
2
--==============================================================================
3
--                                                                             |
4
--    Project: IIC Multiple Bus Controller (IICMB)                             |
5
--                                                                             |
6
--    Module:  Multiplexer of I2C buses.                                       |
7
--    Version:                                                                 |
8
--             1.0,   April 29, 2016                                           |
9
--                                                                             |
10
--    Author:  Sergey Shuvalkin, (sshuv2@opencores.org)                        |
11
--                                                                             |
12
--==============================================================================
13
--==============================================================================
14
-- Copyright (c) 2016, Sergey Shuvalkin                                        |
15
-- All rights reserved.                                                        |
16
--                                                                             |
17
-- Redistribution and use in source and binary forms, with or without          |
18
-- modification, are permitted provided that the following conditions are met: |
19
--                                                                             |
20
-- 1. Redistributions of source code must retain the above copyright notice,   |
21
--    this list of conditions and the following disclaimer.                    |
22
-- 2. Redistributions in binary form must reproduce the above copyright        |
23
--    notice, this list of conditions and the following disclaimer in the      |
24
--    documentation and/or other materials provided with the distribution.     |
25
--                                                                             |
26
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
27
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE   |
28
-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  |
29
-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE    |
30
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR         |
31
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF        |
32
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    |
33
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN     |
34
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)     |
35
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  |
36
-- POSSIBILITY OF SUCH DAMAGE.                                                 |
37
--==============================================================================
38
 
39
 
40
library ieee;
41
use ieee.std_logic_1164.all;
42
 
43
 
44
--==============================================================================
45
entity conditioner_mux is
46
  generic
47
  (
48
    ------------------------------------
49
    g_bus_num :       positive range 1 to 16 := 1;          -- Number of separate I2C busses
50
    g_f_clk   :       real           := 100000.0;   -- Frequency of 'clk' clock (in kHz)
51
    g_f_scl_0 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #0 (in kHz)
52
    g_f_scl_1 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #1 (in kHz)
53
    g_f_scl_2 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #2 (in kHz)
54
    g_f_scl_3 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #3 (in kHz)
55
    g_f_scl_4 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #4 (in kHz)
56
    g_f_scl_5 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #5 (in kHz)
57
    g_f_scl_6 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #6 (in kHz)
58
    g_f_scl_7 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #7 (in kHz)
59
    g_f_scl_8 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #8 (in kHz)
60
    g_f_scl_9 :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #9 (in kHz)
61
    g_f_scl_a :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #10 (in kHz)
62
    g_f_scl_b :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #11 (in kHz)
63
    g_f_scl_c :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #12 (in kHz)
64
    g_f_scl_d :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #13 (in kHz)
65
    g_f_scl_e :       real           :=    100.0;   -- Frequency of 'SCL' clock of I2C bus #14 (in kHz)
66
    g_f_scl_f :       real           :=    100.0    -- Frequency of 'SCL' clock of I2C bus #15 (in kHz)
67
    ------------------------------------
68
  );
69
  port
70
  (
71
    ------------------------------------
72
    clk       : in    std_logic;                            -- Clock
73
    s_rst     : in    std_logic;                            -- Synchronous reset (active high)
74
    ------------------------------------
75
    ------------------------------------
76
    -- Interface to controller:
77
    bus_id    : in    natural range 0 to g_bus_num - 1;
78
    --
79
    busy      :   out std_logic := '0';                     -- Bus busy indication (busy = high)
80
    --
81
    scl_rx    :   out std_logic := '1';                     -- Conditioned I2C Clock
82
    sda_rx    :   out std_logic := '1';                     -- Conditioned I2C Data
83
    --
84
    scl_d_rx  :   out std_logic := '1';                     -- Conditioned I2C Clock delayed for 1 'clk' cycle
85
    --
86
    scl_tx    : in    std_logic;                            -- I2C Clock from bit controller
87
    sda_tx    : in    std_logic;                            -- I2C Data from bit controller
88
    ------------------------------------
89
    ------------------------------------
90
    -- I2C interfaces:
91
    scl_i     : in    std_logic_vector(0 to g_bus_num - 1); -- I2C Clock inputs
92
    sda_i     : in    std_logic_vector(0 to g_bus_num - 1); -- I2C Data inputs
93
    scl_o     :   out std_logic_vector(0 to g_bus_num - 1); -- I2C Clock outputs
94
    sda_o     :   out std_logic_vector(0 to g_bus_num - 1)  -- I2C Data outputs
95
    ------------------------------------
96
  );
97
end entity conditioner_mux;
98
--==============================================================================
99
 
100
--==============================================================================
101
architecture str of conditioner_mux is
102
 
103
  type real_array is array (natural range <>) of real;
104
  constant c_f_scl : real_array(0 to 15) := (g_f_scl_0, g_f_scl_1, g_f_scl_2, g_f_scl_3,
105
                                             g_f_scl_4, g_f_scl_5, g_f_scl_6, g_f_scl_7,
106
                                             g_f_scl_8, g_f_scl_9, g_f_scl_a, g_f_scl_b,
107
                                             g_f_scl_c, g_f_scl_d, g_f_scl_e, g_f_scl_f);
108
 
109
  ------------------------------------------------------------------------------
110
  component conditioner is
111
    generic
112
    (
113
      g_f_clk   :       real   := 100000.0;
114
      g_f_scl   :       real   :=    100.0
115
    );
116
    port
117
    (
118
      clk       : in    std_logic;
119
      s_rst     : in    std_logic;
120
      busy      :   out std_logic;
121
      scl_rx    :   out std_logic;
122
      sda_rx    :   out std_logic;
123
      scl_d_rx  :   out std_logic;
124
      scl_tx    : in    std_logic;
125
      sda_tx    : in    std_logic;
126
      scl_i     : in    std_logic;
127
      sda_i     : in    std_logic;
128
      scl_o     :   out std_logic;
129
      sda_o     :   out std_logic
130
    );
131
  end component conditioner;
132
  ------------------------------------------------------------------------------
133
 
134
  signal   scl_rx_y      : std_logic_vector(0 to g_bus_num - 1);
135
  signal   sda_rx_y      : std_logic_vector(0 to g_bus_num - 1);
136
  signal   scl_d_rx_y    : std_logic_vector(0 to g_bus_num - 1);
137
  signal   busy_y        : std_logic_vector(0 to g_bus_num - 1);
138
  signal   scl_tx_y      : std_logic_vector(0 to g_bus_num - 1) := (others => '1');
139
  signal   sda_tx_y      : std_logic_vector(0 to g_bus_num - 1) := (others => '1');
140
 
141
begin
142
 
143
  ------------------------------------------------------------------------------
144
  process(clk)
145
  begin
146
    if rising_edge(clk) then
147
      if (s_rst = '1') then
148
        busy     <= '0';
149
        scl_rx   <= '1';
150
        sda_rx   <= '1';
151
        scl_d_rx <= '1';
152
      else
153
        busy     <= busy_y(bus_id);
154
        scl_rx   <= scl_rx_y(bus_id);
155
        sda_rx   <= sda_rx_y(bus_id);
156
        scl_d_rx <= scl_d_rx_y(bus_id);
157
      end if;
158
    end if;
159
  end process;
160
  ------------------------------------------------------------------------------
161
 
162
  --****************************************************************************
163
  scl_sda_gen:
164
  for i in 0 to g_bus_num - 1 generate
165
    ----------------------------------------------------------------------------
166
    conditioner_inst0 : conditioner
167
      generic map
168
      (
169
        g_f_clk   => g_f_clk,
170
        g_f_scl   => c_f_scl(i)
171
      )
172
      port map
173
      (
174
        clk       => clk,
175
        s_rst     => s_rst,
176
        busy      => busy_y(i),
177
        scl_rx    => scl_rx_y(i),
178
        sda_rx    => sda_rx_y(i),
179
        scl_d_rx  => scl_d_rx_y(i),
180
        scl_tx    => scl_tx_y(i),
181
        sda_tx    => sda_tx_y(i),
182
        scl_i     => scl_i(i),
183
        sda_i     => sda_i(i),
184
        scl_o     => scl_o(i),
185
        sda_o     => sda_o(i)
186
      );
187
    ----------------------------------------------------------------------------
188
 
189
    ----------------------------------------------------------------------------
190
    process(clk)
191
    begin
192
      if rising_edge(clk) then
193
        if (s_rst = '1') then
194
          scl_tx_y(i) <= '1';
195
          sda_tx_y(i) <= '1';
196
        else
197
          if (i = bus_id) then
198
            scl_tx_y(i) <= scl_tx;
199
            sda_tx_y(i) <= sda_tx;
200
          else
201
            scl_tx_y(i) <= '1';
202
            sda_tx_y(i) <= '1';
203
          end if;
204
        end if;
205
      end if;
206
    end process;
207
    ----------------------------------------------------------------------------
208
  end generate scl_sda_gen;
209
  --****************************************************************************
210
 
211
end architecture str;
212
--==============================================================================
213
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.