CPLD come traslatore di livello

Sezione dedicata al linguaggio di descrizione hardware per logiche programmabili

CPLD come traslatore di livello

Postby flz47655 » 31 Oct 2012, 00:44

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
Last edited by flz47655 on 31 Oct 2012, 11:18, edited 1 time in total.
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: CPLD come traslatore di livello

Postby Altero » 31 Oct 2012, 09:03

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
Altero
 
Posts: 46
Joined: 20 Apr 2012, 09:33

Re: CPLD come traslatore di livello

Postby flz47655 » 31 Oct 2012, 11:18

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.
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: CPLD come traslatore di livello

Postby legacy » 31 Oct 2012, 11:46

mah :roll:

considerazioni a parte, cosa dovresti interfacciare di cosi' "esoso"
legacy
 
Posts: 862
Joined: 12 Mar 2012, 11:30

Re: CPLD come traslatore di livello

Postby flz47655 » 31 Oct 2012, 12:28

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
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16


Return to VHDL x FPGA

Who is online

Users browsing this forum: No registered users and 1 guest

cron