Page 1 of 1

CPLD come traslatore di livello

PostPosted: 31 Oct 2012, 00:44
by flz47655
Ciao a tutti,
Sto realizzando una sorta di "traslatore di livello 3.3v<->5v" per poter interfacciare un micro a 3.3v con un device a 5v.
La cosa particolare è che permette di impostare individualmente la direzione dei pin. La direzione è determinata dal segnale config che informa la CPLD se i vari segnali vanno dalla porta A alla porta B.
Il segnale config viene configurato tramite due pin (config_clk e config_serial) ma non è importante, supponiamo che sia inizializzato correttamente. Ecco il codice che ho scritto:

Code: Select all
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity LevelTranslator is
   generic
   (   -- Each pin use 2 global Output Enable, there are 6 so max 3 pin :(      
      IO_COUNT : natural := 10 -- 10 cause error
   );
   port (         
      rst     : in std_logic;
      config_clk       : in std_logic;
      config_serial    : in std_logic;
      portA     : inout std_logic_vector(IO_COUNT-1 downto 0);      
      portB     : inout std_logic_vector(IO_COUNT-1 downto 0));
end entity;
architecture rtl of LevelTranslator is
   -- Keep configuration for pin: 0 input, 1 output
   signal config : std_logic_vector(IO_COUNT-1 downto 0);   
begin
   -- Connect portA <-> portB with specified config
   process (config,portB,portA)
   begin                  
      for i in IO_COUNT-1 downto 0 loop
         if config(i) = '1' then
            -- Z must be set: http://www.alteraforum.com/forum/showthread.php?t=19594
            portB(i) <= 'Z';       -- B ouput
            portA(i) <= portB(i); -- A input, A <= B
         else
            portA(i) <= 'Z';       -- A ouput
            portB(i) <= portA(i); -- B input, B <= A
         end if;
      end loop;                  
   end process;      
   -- Serial Configuration
   process (rst, config_clk)   
   begin
      if (rst = '0') then      
         config <= (others => '1');   -- portA <= portB         
      elsif (rising_edge(config_clk)) then         
         -- Load new data into the first stage
         config(0) <= config_serial;
         
         -- Shift data by one stage; data from last stage is lost
         config(IO_COUNT-1 downto 1) <= config(IO_COUNT-2 downto 0);
      end if;         
   end process;   
end rtl;


Tutto funziona, il problema è che devo implementarlo su una CPLD EPM3064ALC44-10 per i suoi ingressi 5v tolerant.
La CPLD ha solamente 6 Output Enable (pag.5 datasheet http://www.altera.com/literature/ds/m3000a.pdf) e questo limita il numero di pin che può traslare di livello a 3 in quanto ogni pin sembra prendere due Output Enable (perché deve essere sia ingresso sia uscita dinamicamente in base alla configurazione) nonostante abbia macrocelle a sufficienza.

Potete consigliarmi qualche "trucco" per poter sintetizzare l'hardware evitando questa limitazione?
Ho provato e sintetizza correttamente su XC9536XL tramite ISE Design e grazie alla presenza di molti Output Enable sintetizza correttamente ma prima di passare dall'altro lato vorrei provare il tutto per tutto per rimanere sullo stack Altera. La XC9536XL inoltre non ha una sufficiente corrente di uscita sui pin e non andrebbe bene per la mia applicazione.

Ciao e grazie a tutti

Re: CPLD come traslatore di livello

PostPosted: 31 Oct 2012, 09:03
by Altero
flz,
scusa la mia ignoranza, ma non è esagerato l'uso di una cpld per fare un traslatore di livello? poi appunto non saprei.
non potresti mettere un 74_LVC_XXX sulle porte del micro?

ciao

Re: CPLD come traslatore di livello

PostPosted: 31 Oct 2012, 11:18
by flz47655
Diciamo che non è in tema con VHDL in quanto più soggettivo ma volendo traslare 20 pin avevo valutato anche l'utilizzo di traslatori di livello commerciali ma ho deciso di utilizzare la cpld perché:
- ho già in casa le CPLD (alla fine ne servirebbero due o in alternativa una sola in versione TQFP100 se risolvo questo problema)
- buon rapporto costo/pin traslati (2.2€*2=4.4€ o 3.2€ per un unica CPLD in TQFP100)
- coi pin rimanenti voglio svolgere anche altri compiti
- circuito semplificato e più compatto, due sole CPLD PLCC44 (o una in TQFP100)
- è stata una sfida divertente scrivere il codice VHDL (da raffinare ma il grosso è fatto)

Valutando le alternative avrei potuto utilizzare:

- x20 SN74LVC1T45DRLR
- sarebbero necessari IC traslatori di un solo pin per il pin DIR necessario per impostare la direzione
- per impostare i pin DIR servirebbero x20 pin o dei componenti aggiuntivi
- problemi di ordine e spazio sul PCB
- costo elevato (0.5€ / pin = 10€)
- mi servirebbe ugualmente la cpld per altri compiti

- x2 TXB0108 e x1 TXB0104
- ho letto che l'auto-riconoscimento della direzione non funziona molto bene (es. con I2C)
- costo elevato (2.42*2 + 1.76 = 6.6€)
- mi servirebbe ugualmente la cpld per altri compiti

Ciao

PS: Le CPLD 5v tolerant mi sembra che siano praticamente dismesse dai produttori, l'unica che ha nuovi modelli sembra Lattice con le ispMACH 4000ZE con costo e feature interessanti, però mi sembra che ci sia mooltoo poco supporto e che comunque siamo molto lontani dai 25mA sink/source delle vecchie Max3000 di Altera che mi sarebbero indispensabili.

Re: CPLD come traslatore di livello

PostPosted: 31 Oct 2012, 11:46
by legacy
mah :roll:

considerazioni a parte, cosa dovresti interfacciare di cosi' "esoso"

Re: CPLD come traslatore di livello

PostPosted: 31 Oct 2012, 12:28
by flz47655
In sostanza sarebbe un adattatore generico per rendere 5v tolerant una MCU (o una qualsiasi altra cosa) a 3.3v oltre che a fare altre cosette ma per il momento mi interessava vedere se era fattibile traslare diversi pin anche con le CPLD di Altera e per capire meglio la loro struttura, prima d'ora non avevo dato importanza agli Output Enable

Ciao