Newsgroup: it.hobby.elettronica.digitale
Titolo: mistero VHDL (per me),(lunghino)

Ciao
con una cpld(smontata da un rottame ,come vuole la mia tradizione) sto 
cercando di programmare una flash 29LW a 48 pin(sempre presa dai rottami) 
attraverso la porta parallela del PC.
Il grande numero  di pin della cpld me l'ha fatta preferire a un 
microcontrollore,oltra alla voglia di riprendere un pň di VHDL
utilizzo3 pin di controllo per generare dei comandi che demultiplexeranno  e 
latcheranno gli 8 bit dati sui  controlli flash,OE/, CE/ ecc,
sui 21 pin di indirizzo,e su 8 dati flash,questi ultimi in modo 
bidirezionale
quando es i 3 pin di controllo sono "000" il dato uscente dalla parallela 
diventa controlli OE/, ecc
quando "001" diventa dato per flash,quando "011" dato per LSB indirizzo ecc
avviene che nel process il comando "110" mi viene "ignorato",non spegne 
nemmeno un led ,perchč??
Se qualcuno fosse cosě gentile riporto prima solo il process,poi tutta 
l'entity
grazie da Diego.
par_data_meaning : process(ds_strobe,ds_rst)
  begin
  --vengono creati dei Latches,perchč il dato venga mantenuto
  --sui pin della Flash dopo che č cambiato sulla parallela
   if ds_rst='1' then--occhio che ds_rst č attivo alto
    ds_datapar<="ZZZZZZZZ";
    dsf_dataflash<="ZZZZZZZZ";
    dsf_addrout(7 downto 0)<="ZZZZZZZZ";
    dsf_addrout(15 downto 8)<="ZZZZZZZZ";
    dsf_addrout(20 downto 16)<="ZZZZZ";
   elsif rising_edge(ds_strobe) then
    --*******---vengono gestiti solo i FF e non le 
direzioni-----********-----
    if  ds_ctrlin="000" then--Latch controlli Flash(CE/,OE/,WR/)--scrittura
     s_fctrl(3 downto 0)<=ds_datapar(3 downto 0);
    elsif ds_ctrlin="001" then--Latch dei dati da parallela a Flash
     s_datapar<=ds_datapar ;
     s_green_led<='0';
    elsif ds_ctrlin="010" then-- indirizzo,byte basso --scrittura e lettura
     s_fadd(7 downto 0)<=ds_datapar(7 downto 0);
    elsif ds_ctrlin="011" then-- indirizzo,byte medio --scrittura e lettura
     s_fadd(15 downto 8)<=ds_datapar(7 downto 0);
    elsif ds_ctrlin="100" then-- indirizzo,nibble alto --scrittura e lettura
     s_fadd(20 downto 16)<=ds_datapar(4 downto 0);
    elsif ds_ctrlin="101" then --s_dataflash latcha il dato letto da Flash
     s_dataflash(7 downto 0)<=dsf_dataflash(7 downto 0);
     s_green_led<='1';
    elsif ds_ctrlin="110" then
     s_green_led<='0';
    elsif  ds_ctrlin="111" then--controlli Flash(CE/,OE/,WR/)--lettura
      s_green_led<='0';
    end if;
    --****************************************************************************
   end if;
  end process par_data_meaning;
  --END PROCESS******END PROCESS******END PROCESS******END PROCESS******END 
PROCESS******END PROCESS**
 --**************************************************************************** --**************************************************************************** --****************************************************************************library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;--  Uncomment the following lines to use the declarations that are--  provided for instantiating Xilinx primitive components.--library UNISIM;--use UNISIM.VComponents.all;entity dataswitch is    Port ( ds_clock     : in std_logic;           ds_datapar   : inout std_logic_vector(7 downto 0);--inout     ds_ctrlin    : in std_logic_vector(2 downto 0);     ds_rst       : in std_logic;     ds_strobe    : in std_logic;     ds_rdbusyout : out std_logic;     ds_green_led : out std_logic;     dsf_dataflash : inout std_logic_vector(7 downto 0);--dsf=dsflash--inout           dsf_ctrlout   : out std_logic_vector(3 downto 0);     dsf_rdbusyin  : in std_logic;           dsf_addrout   : out std_logic_vector(20 downto 0));end dataswitch;architecture dataswitcher of dataswitch is    signal s_datapar   : std_logic_vector(7 downto 0);  signal s_fadd      : std_logic_vector(20 downto 0);  signal s_fctrl     : std_logic_vector(4 downto 0);  signal s_dataflash : std_logic_vector(7 downto 0);  signal s_green_led : std_logic;  --signal s_HiZ_Flash : std_logic;begin  dsf_ctrlout(3)<='0' when ds_rst='1'  else '1';--piedino  ds_rdbusyout<=dsf_rdbusyin;  dsf_addrout<=s_fadd;  dsf_ctrlout(2 downto 0)<=s_fctrl(2 downto 0);  ds_green_led<=s_green_led;  --a <= b when (dir='1' and oe='0') else (others => Z');  --b <= a when (dir='0' and oe='0') else (others => 'Z');  ds_datapar<=s_dataflash when(ds_ctrlin="111" )else("ZZZZZZZZ");  dsf_dataflash<=s_datapar when(ds_ctrlin="001"  )else("ZZZZZZZZ");  --PROCESS******PROCESS******PROCESS******PROCESS******PROCESS******PROCESS******PROCESS******  par_data_meaning : process(ds_strobe,ds_rst)  begin  --vengono creati dei Latches,perchč il dato venga mantenuto  --sui pin della Flash dopo che č cambiato sulla parallela   if ds_rst='1' then--occhio che ds_rst č attivo alto    ds_datapar<="ZZZZZZZZ";    dsf_dataflash<="ZZZZZZZZ";    dsf_addrout(7 downto 0)<="ZZZZZZZZ";    dsf_addrout(15 downto 8)<="ZZZZZZZZ";    dsf_addrout(20 downto 16)<="ZZZZZ";   elsif rising_edge(ds_strobe) then    --*******---vengono gestiti solo i FF e non ledirezioni-----********-----    if  ds_ctrlin="000" then--Latch controlli Flash(CE/,OE/,WR/)--scrittura     s_fctrl(3 downto 0)<=ds_datapar(3 downto 0);    elsif ds_ctrlin="001" then--Latch dei dati da parallela a Flash     s_datapar<=ds_datapar ;     s_green_led<='0';    elsif ds_ctrlin="010" then-- indirizzo,byte basso --scrittura e lettura     s_fadd(7 downto 0)<=ds_datapar(7 downto 0);    elsif ds_ctrlin="011" then-- indirizzo,byte medio --scrittura e lettura     s_fadd(15 downto 8)<=ds_datapar(7 downto 0);    elsif ds_ctrlin="100" then-- indirizzo,nibble alto --scrittura e lettura     s_fadd(20 downto 16)<=ds_datapar(4 downto 0);    elsif ds_ctrlin="101" then --s_dataflash latcha il dato letto da Flash     s_dataflash(7 downto 0)<=dsf_dataflash(7 downto 0);     s_green_led<='1';    elsif ds_ctrlin="110" then     s_green_led<='0';    elsif  ds_ctrlin="111" then--controlli Flash(CE/,OE/,WR/)--lettura      s_green_led<='0';    end if;    --****************************************************************************   end if;  end process par_data_meaning;  --END PROCESS******END PROCESS******END PROCESS******END PROCESS******ENDPROCESS******END PROCESS**end dataswitcher;


Ciao,
potresti ripostare il codice formattato meglio ? altrimenti cosi' non
capisco quanto codice e' commentato visto che vedo tutto sulla stessa
linea.
Cosa vuoi dire con "--*******---vengono gestiti solo i FF e non le
direzioni-----********-----" ??
In ogni caso due osservazioni:
- per la decodifica degli indirizzi usa un costrutto case e non delle
serie di if/else visto che invece di creare un mux, viene creata una
logica con priorita';
- rising_edge si usa per i clock, non so come venga fatta la sintesi
cosi', penso che usi dei FF con clock il segnale di strobe.
Matteo


Intanto ringrazio Teo
Ciao,
potresti ripostare il codice formattato meglio ? altrimenti cosi' non
capisco quanto codice e' commentato visto che vedo tutto sulla stessa
linea.
Purtroppo non so ancora come prevedere quando outluc o chi  decide di andare 
a capo...
adesso che vedo come è stato formattato mi spavento
come posso fare?ti invio il file  .vhd?
Cosa vuoi dire con "--*******---vengono gestiti solo i FF e non le
direzioni-----********-----" ??
intendevo dire che in quel process non vi sono interventi sulla 
bidirezionalità,vengono soltato Latchati(scusa l'inglesismo)
i segnali per e dalla flash sulle uscite dei FF,sono invece le righe 
dell'architecture prima del process
ds_datapar<=s_dataflash when(ds_ctrlin="111" )else("ZZZZZZZZ");
 dsf_dataflash<=s_datapar when(ds_ctrlin="001"  )else("ZZZZZZZZ");  --
a far si che sui d0..d7 flash o parallela  vi siano i dati scritti 
rispettivamente dal dispositivo o dal PC,o le uscite dei Latch che fanno 
vedere alla Flash il dato precedentemente mandatogli dal Pc e viceversa
In ogni caso due osservazioni:
- per la decodifica degli indirizzi usa un costrutto case e non delle
serie di if/else visto che invece di creare un mux, viene creata una
logica con priorita';
non capisco,perchè priorità?io voglio che sul  fronte di salita dello strobe 
, seconda del valore ds_ctrlin(2 downto 0) il dato venga fotografato dai 
latch
a parte l'eleganza come mai cambia tra case e if/elsif?
- rising_edge si usa per i clock, non so come venga fatta la sintesi
cosi', penso che usi dei FF con clock il segnale di strobe.
mah,pare che che guardando lo schema generato il clock dei DCEFF generati 
sia collegato allo strobe ,che infatti lavora..ma con "110" non so 
perchè,niente da fare,eppure dovrebbe essere una condizione come le altre (e 
pin della CPLD "110" arriva)  boh
grazie ancora per l'aiuto
'notte
diego