www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

VHDL-I/O bus

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> FPGA in CPLD programabilna vezja
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
dkone
Član
Član



Pridružen-a: Sre 07 Mar 2007 18:53
Prispevkov: 2104
Aktiv.: 10.13
Kraj: Krško

PrispevekObjavljeno: Ned Mar 14, 2010 11:38 am    Naslov sporočila:  VHDL-I/O bus Odgovori s citatom

Pozdravljeni!

Zanima me, kako v VHDLju berem I/O pin, ki je definiran kot vhod/izhod vektor? Namreč isti pin bi enkrat uporabil kot izhod, drugič kot vhod.

Prosim za kakšen primer kode...

_________________
Denis
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9406
Aktiv.: 42.36
Kraj: Kranj - struževo

PrispevekObjavljeno: Ned Mar 14, 2010 12:13 pm    Naslov sporočila:   Odgovori s citatom

Kot izhod mu lahko definiraš vrednosti '1' ali '0' ali 'Z'. Z = HiZ = tristate oziroma izklopljen izhodni driver in je pin vhod.

Ko hočeš prebrat vrednost, mu prirediš izhodno vrednost 'Z' in ga prebereš. Seveda pa mora bit pin in priključen signal definiran kot inout.

Delujoč primer kode lahko dobiš v ponedeljek. Sicer sta pa samo dve vrstici Smile

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
dkone
Član
Član



Pridružen-a: Sre 07 Mar 2007 18:53
Prispevkov: 2104
Aktiv.: 10.13
Kraj: Krško

PrispevekObjavljeno: Ned Mar 14, 2010 3:40 pm    Naslov sporočila:   Odgovori s citatom

Mišljeno je bilo nekako tako, da se nastavi vsem vhodom pull-up oziroma pull-down upore (preklop s pin7), nato pa se po en pin nastavi na '0' oziroma '1' in preverja stanje na ostalih vhodnih pinih.
Koda:
----- ----- -0   1   2   3   4   5   6   7
--0--   --   01   02   03   04   05   06   UU
--1--   10   --   12   13   14   15   16   UU
--2--   20   21   --   23   24   25   26   UU
--3--   30   31   32   --   34   35   36   UU
--4--   40   41   42   43   --   45   46   UU
--5--   50   51   52   53   54   --   56   UU
--6--   60   61   62   63   64   65   --   UU
--7--   DD   DD   DD   DD   DD   DD   DD   --   
-- pin7 preklaplja uporovno verigo med PULL-UP in PULL-DOWN
   TIPKOMAT: process (clk)   -- Bere TIPKE
--ioTipke : inout  STD_LOGIC_VECTOR (7 downto 0);   -- 42 Tipk na 8 io pinih      
   begin
   if clk'event and clk='1' then
-- PULL DOWN POLJE
      if (StanjeTipk   = "0001") and (CasCikla = "0010000000000") then
      ioTipke <= "0ZZZZZZ1"; -- pin7=pull-down , pin0='1', ostali so vhodi
         if ioTipke(1)='1' and Servo01 > "00000000" then
            Servo01   <=   Servo01   -   ServoH; -- zmanjša čas servo impulza
            ServoxxHd   <=   Servo01; -- Uravnava velikost ServoH, da Servo-- ne pade pod 000
            PrikazD <=   "00001"; -- Servo motor st.: 01
         elsif ioTipke(2)='1'  and Servo02 > "00000000" then
            Servo02   <=   Servo02   -   ServoH;
            ServoxxHd   <=   Servo02;
            PrikazD <=   "00010"; -- Servo motor st.: 02
         elsif ioTipke(3)='1'  and Servo03 > "00000000" then
            Servo03   <=   Servo03   -   ServoH;
            ServoxxHd   <=   Servo03;
            PrikazD <=   "00011"; -- Servo motor st.: 03
         elsif ioTipke(4)='1'  and Servo04 > "00000000" then
            Servo04   <=   Servo04   -   ServoH;
            ServoxxHd   <=   Servo04;
            PrikazD <=   "00100"; -- Servo motor st.: 04
         elsif ioTipke(5)='1'  and Servo05 > "00000000" then
            Servo05   <=   Servo05   -   ServoH;
            ServoxxHd   <=   Servo05;
            PrikazD <=   "00101"; -- Servo motor st.: 05
         elsif ioTipke(6)='1'  and Servo06 > "00000000" then
            Servo06   <=   Servo06   -   ServoH;
            ServoxxHd   <=   Servo06;
            PrikazD <=   "00110"; -- Servo motor st.: 06
         else --- Ostane nespremenjeno
            Servo01   <=   Servo01;
            Servo02   <=   Servo02;
            Servo03   <=   Servo03;
            Servo04   <=   Servo04;
            Servo05   <=   Servo05;
            Servo06   <=   Servo06;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;   
      end if;         
      if StanjeTipk   = "0010"  and (CasCikla = "0010000000000") then
      ioTipke <= "0ZZZZZ1Z"; -- pin7=pull-down , pin1='1', ostali so vhodi
         if ioTipke(2)='1'  and Servo07 > "00000000" then
            Servo07   <=   Servo07   -   ServoH;
            ServoxxHd   <=   Servo07;
            PrikazD <=   "00111";
         elsif ioTipke(3)='1'  and Servo08 > "00000000" then
            Servo08   <=   Servo08   -   ServoH;
            ServoxxHd   <=   Servo08;
            PrikazD <=   "01000";            
         elsif ioTipke(4)='1'  and Servo09 > "00000000" then
            Servo09   <=   Servo09   -   ServoH;
            ServoxxHd   <=   Servo09;
            PrikazD <=   "01001";
         elsif ioTipke(5)='1'  and Servo10 > "00000000" then
            Servo10   <=   Servo10   -   ServoH;
            ServoxxHd   <=   Servo10;
            PrikazD <=   "01010";
         elsif ioTipke(6)='1'  and Servo11 > "00000000" then
            Servo11   <=   Servo11   -   ServoH;
            ServoxxHd   <=   Servo11;
            PrikazD <=   "01011";
         else --- Ostane nespremenjeno
            Servo07   <=   Servo07;
            Servo08   <=   Servo08;
            Servo09   <=   Servo09;
            Servo10   <=   Servo10;
            Servo11   <=   Servo11;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;
      end if;
      if StanjeTipk   = "0011"  and (CasCikla = "0010000000000") then
      ioTipke <= "0ZZZZ1ZZ"; -- pin7=pull-down , pin2='1', ostali so vhodi
         if ioTipke(3)='1'  and Servo12 > "00000000" then
            Servo12   <=   Servo12   -   ServoH";
            ServoxxHd   <=   Servo12;
            PrikazD <=   "01100";
            elsif ioTipke(4)='1'  and Servo13 > "00000000" then
            Servo13   <=   Servo13   -   ServoH;
            ServoxxHd   <=   Servo13;
            PrikazD <=   "01101";
         elsif ioTipke(5)='1'  and Servo14 > "00000000" then
            Servo14   <=   Servo14   -   ServoH;
            ServoxxHd   <=   Servo14;
            PrikazD <=   "01110";
         elsif ioTipke(6)='1'  and Servo15 > "00000000" then
            Servo15   <=   Servo15   -   ServoH;
            ServoxxHd   <=   Servo15;
            PrikazD <=   "01111";   
         else --- Ostane nespremenjeno
            Servo12   <=   Servo12;
            Servo13   <=   Servo13;
            Servo14   <=   Servo14;
            Servo15   <=   Servo15;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;
      end if;
      if StanjeTipk   = "0100"  and (CasCikla = "0010000000000") then
      ioTipke <= "0ZZZ1ZZZ"; -- pin7=pull-down , pin3='1', ostali so vhodi
         if ioTipke(4)='1'  and Servo16 > "00000000" then
            Servo16   <=   Servo16   -   ServoH;
            ServoxxHd   <=   Servo16;
            PrikazD <=   "10000";   
         elsif ioTipke(5)='1'  and Servo17 > "00000000" then
            Servo17   <=   Servo17   -   ServoH;
            ServoxxHd   <=   Servo17;
            PrikazD <=   "10001";
         elsif ioTipke(6)='1'  and Servo18 > "00000000" then
            Servo18   <=   Servo18   -   ServoH
            ServoxxHd   <=   Servo18;
            PrikazD <=   "10010";
         else --- Ostane nespremenjeno
            Servo16   <=   Servo16;
            Servo17   <=   Servo17;
            Servo18   <=   Servo18;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;
         --- PULL DOWN POLJE ima še 3 proste tipke za ostale funkcije
---------------------------------------------------------------------
---------------------------------------------------------------------
-- PULL UP POLJE
      if (StanjeTipk   = "1001") and (CasCikla = "0010000000000") then
      ioTipke <= "1ZZZZZZ0"; -- pin7=pull-up , pin0='0', ostali so vhodi
         if ioTipke(1)='0' and Servo01 < "11111111" then
            Servo01   <=   Servo01   +   ServoH; -- poveča čas servo impulza
            ServoxxHd   <=   Servo01; -- Uravnava velikost ServoH, da Servo-- ne gre čez 255
            PrikazD <=   "00001"; -- Servo motor st.: 01
         elsif ioTipke(2)='0'  and Servo02 < "11111111" then
            Servo02   <=   Servo02   +   ServoH;
            ServoxxHd   <=   Servo02;
            PrikazD <=   "00010"; -- Servo motor st.: 02
         elsif ioTipke(3)='0'  and Servo03 < "11111111" then
            Servo03   <=   Servo03   -   ServoH;
            ServoxxHd   <=   Servo03;
            PrikazD <=   "00011"; -- Servo motor st.: 03
         elsif ioTipke(4)='0'  and Servo04 < "11111111" then
            Servo04   <=   Servo04   +   ServoH;
            ServoxxHd   <=   Servo04;
            PrikazD <=   "00100"; -- Servo motor st.: 04
         elsif ioTipke(5)='0'  and Servo05 < "11111111" then
            Servo05   <=   Servo05   +   ServoH;
            ServoxxHd   <=   Servo05;
            PrikazD <=   "00101"; -- Servo motor st.: 05
         elsif ioTipke(6)='0'  and Servo06 < "11111111" then
            Servo06   <=   Servo06   +   ServoH;
            ServoxxHd   <=   Servo06;
            PrikazD <=   "00110"; -- Servo motor st.: 06
         else --- Ostane nespremenjeno
            Servo01   <=   Servo01;
            Servo02   <=   Servo02;
            Servo03   <=   Servo03;
            Servo04   <=   Servo04;
            Servo05   <=   Servo05;
            Servo06   <=   Servo06;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;   
      end if;         
      elsif StanjeTipk   = "1010"  and (CasCikla = "0010000000000") then
      ioTipke <= "1ZZZZZ0Z"; -- pin7=pull-up , pin1='0', ostali so vhodi
         if ioTipke(2)='0'  and Servo07 < "11111111" then
            Servo07   <=   Servo07   +   ServoH;
            ServoxxHd   <=   Servo07;
            PrikazD <=   "00111";
         elsif ioTipke(3)='0'  and Servo08 < "11111111" then
            Servo08   <=   Servo08   +   ServoH;
            ServoxxHd   <=   Servo08;
            PrikazD <=   "01000";            
         elsif ioTipke(4)='0'  and Servo09 < "11111111" then
            Servo09   <=   Servo09   +   ServoH;
            ServoxxHd   <=   Servo09;
            PrikazD <=   "01001";
         elsif ioTipke(5)='0'  and Servo10 < "11111111" then
            Servo10   <=   Servo10   +   ServoH;
            ServoxxHd   <=   Servo10;
            PrikazD <=   "01010";
         elsif ioTipke(6)='0'  and Servo11 < "11111111" then
            Servo11   <=   Servo11   +   ServoH;
            ServoxxHd   <=   Servo11;
            PrikazD <=   "01011";
         else --- Ostane nespremenjeno
            Servo07   <=   Servo07;
            Servo08   <=   Servo08;
            Servo09   <=   Servo09;
            Servo10   <=   Servo10;
            Servo11   <=   Servo11;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;
      end if;
      elsif StanjeTipk   = "1011"  and (CasCikla = "0010000000000") then
      ioTipke <= "1ZZZZ0ZZ"; -- pin7=pull-up , pin2='0', ostali so vhodi
         if ioTipke(3)='0'  and Servo12 < "11111111" then
            Servo12   <=   Servo12   +   ServoH";
            ServoxxHd   <=   Servo12;
            PrikazD <=   "01100";
         elsif ioTipke(4)='0'  and Servo13 < "11111111" then
            Servo13   <=   Servo13   +   ServoH;
            ServoxxHd   <=   Servo13;
            PrikazD <=   "01101";
         elsif ioTipke(5)='0'  and Servo14 < "11111111" then
            Servo14   <=   Servo14   +   ServoH;
            ServoxxHd   <=   Servo14;
            PrikazD <=   "01110";
         elsif ioTipke(6)='0'  and Servo15 < "11111111" then
            Servo15   <=   Servo15   +   ServoH;
            ServoxxHd   <=   Servo15;
            PrikazD <=   "01111";   
         else --- Ostane nespremenjeno
            Servo12   <=   Servo12;
            Servo13   <=   Servo13;
            Servo14   <=   Servo14;
            Servo15   <=   Servo15;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;
      end if;
      elsif StanjeTipk   = "1100"  and (CasCikla = "0010000000000") then
      ioTipke <= "1ZZZ0ZZZ"; -- pin7=pull-up , pin3='0', ostali so vhodi
         if ioTipke(4)='1'  and Servo16 < "11111111" then
            Servo16   <=   Servo16   +   ServoH;
            ServoxxHd   <=   Servo16;
            PrikazD <=   "10000";   
         elsif ioTipke(5)='1'  and Servo17 < "11111111" then
            Servo17   <=   Servo17   +   ServoH;
            ServoxxHd   <=   Servo17;
            PrikazD <=   "10001";
         elsif ioTipke(6)='1'  and Servo18 < "11111111" then
            Servo18   <=   Servo18   +   ServoH
            ServoxxHd   <=   Servo18;
            PrikazD <=   "10010";
         else --- Ostane nespremenjeno
            Servo16   <=   Servo16;
            Servo17   <=   Servo17;
            Servo18   <=   Servo18;
            ServoxxHd   <=   ServoxxHq;
            NiTipk   <=   '1';
         end if;
         --- PULL UP POLJE ima še 3 proste tipke za ostale funkcije
      else
         ioTipke <= "00000000"; -- pin7=pull-down , ostali so izhodi
         ServoxxHd   <=   ServoxxHq;   -- Ostane
         NiTipk   <=   '0'; -- Nobena tipka ni pritisnjena
         PrikazD   <   PrikazQ   ; -- Ostane
      end if;      
   end process; 
Gre se za osnovni pristop do 'Z'. Je pravi?
Če bo to delalo, je možno priklopiti 42 tipk na 8 pinov. (56 na 9 , ... ; (n-1)*(n-2) na n pinov). PIC to zmore, a ne zmore 8-bitno (256 korakov od 1,5ms do 2,5ms) poganjati 18 modelarskih servomotorjev hkrati Neutral .

_________________
Denis
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9406
Aktiv.: 42.36
Kraj: Kranj - struževo

PrispevekObjavljeno: Ned Mar 14, 2010 6:30 pm    Naslov sporočila:   Odgovori s citatom

Koda:
 ioTipke <= "0ZZZZZ1Z"; -- pin7=pull-down , pin1='1', ostali so vhodi

To je za vhode v redu, ja. Na pinu 7 ni pull-down ampak je izhod in logična ničla.

Če hočeš krmiliti pull-up/-down upore, jih moraš zunaj zmontirat in krmilit z enim dodatnim pinom.

Upore se sicer definira pri definicijah, kater port gre na kater fizični pin čipa. Opcija je sicer tudi "Keeper" poleg uporov. Ampak to se definira pri prevajanju / programiranju in ne moreš spreminjat med samim delovanjem.

Ni mi sicer čisto jasno, kaj si skodiral tu (po pravici se tudi nisem prav dosti poglabljal), ampak za tipke moraš imeti tudi debounce rutino. Če imaš matrično tipkovnico, pa rabiš malo trikov, da ne delaš vseh 48 registrov Whistle

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
dkone
Član
Član



Pridružen-a: Sre 07 Mar 2007 18:53
Prispevkov: 2104
Aktiv.: 10.13
Kraj: Krško

PrispevekObjavljeno: Ned Mar 14, 2010 7:50 pm    Naslov sporočila:   Odgovori s citatom

aly je napisal/a:
Koda:
 ioTipke <= "0ZZZZZ1Z"; -- pin7=pull-down , pin1='1', ostali so vhodi

To je za vhode v redu, ja. Na pinu 7 ni pull-down ampak je izhod in logična ničla.

Če hočeš krmiliti pull-up/-down upore, jih moraš zunaj zmontirat in krmilit z enim dodatnim pinom.
Ja, saj tako je narejeno. Pin 7 je priklopljen na skupni pin od uporovne verige. Ko ga dam na '0', se upori v uporovni verigi obnašajo kot pull-down upori ostalim vhodom. Ko ga dam na '1', se obnašajo kot pull-up upori.

Citiram:
Ni mi sicer čisto jasno, kaj si skodiral tu (po pravici se tudi nisem prav dosti poglabljal), ampak za tipke moraš imeti tudi debounce rutino. Če imaš matrično tipkovnico, pa rabiš malo trikov, da ne delaš vseh 48 registrov Whistle
Gre za matrično tipkovnico 7x7, pri čemer so pini za vrstice skupni pinom za stolpce. Zato je možnih 42 tipk, saj ni možno preveriti istega stolpca in vrstice med seboj.
Vhode dam na pull-down, izmenoma po en stolpec na '1' in preverjam, na katerem vhodu je '1' (neaktivni stolpci so dolpovlečeni na '0').
Vhode dam na pull-up, izmenoma po en stolpec na '0' in preverjam, na katerem vhodu je '0' (neaktivni stolpci so gorpovlečeni na '1').
Debounce je sočasno rešen s tistim ServoH (ga izračunam drugje), ki je "00000000" če tipka ni dovolj dolgo pritisnjena. Funkcija tipk ni tako kritična, da to ne bi zadostovalo.

_________________
Denis
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> FPGA in CPLD programabilna vezja Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group