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