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 - process

 
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
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1282
Aktiv.: 5.72
Kraj: glej fogl

PrispevekObjavljeno: Čet Jan 17, 2008 9:33 pm    Naslov sporočila:  vhdl - process Odgovori s citatom

Imam dva enostavna procesa:

Koda:

process (clock)
   begin
      if rising_edge(clock) then
         clk_div <= clk_div + 1;
      end if;
   end process;

process (clk_div(12))
   begin
      if rising_edge(clk_div(8)) then
...



Če v stavku "if rising_edge(clk_div(8-))" spreminjam vrednost clk_div(8-), jo npr. zmanjšam, se hitrost izvajanja kode znotraj procesa povečuje. Zakaj je tako, če pa je v definiciji procesa "process (clk_div(12))" določeno, da se proces izvede samo ob spremembi clk_div(12)?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



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

PrispevekObjavljeno: Čet Jan 17, 2008 10:19 pm    Naslov sporočila:   Odgovori s citatom

Tisto, kar je napisano znotraj oklepajev pri process stavku, je pomembno za asinhrone dizajne. Takšnih se izogibamo.

Za sinhron dizajn se v oklepaje vpiše samo asinhroni reset in clock.

Tvoja sintaksa je napačna, in tudi če se prevede, ima lahko nepričakovane rezultate.

Kot sem že večkrat poudaril, če je potrebno, se vhodno uro deli na enem števcu.
Iz tega števca vzameš en signal in samo tega uporabljaš za sinhrono uro v preostalem vezju. Vse ostalo lahko povzroča nepredvidene težave.

Pravilno in pregledno je tako:
Koda:

process (clock_in_100MHz)
   begin
      if rising_edge(clock_in_100MHz) then
         clk_div <= clk_div + 1;
      end if;
   end process;

   clock <= clk_div (15);  -- v celotnem vezju se uporablja samo signal CLOCK.

process (clock)
   begin
      if rising_edge(clock) then
     .............

process (reset, clock)
   begin
      if reset = '1' then stevec <= "00000";
      elsif rising_edge(clock) then
     .............

_________________
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
aly
Član
Član



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

PrispevekObjavljeno: Pon Jan 21, 2008 10:31 am    Naslov sporočila:   Odgovori s citatom

Še to sem pozabil napisati, zelo verjetno po prevajanju nisi pogledal v Transcript Window, ker vmes te je čakalo eno sporočilo v smislu:

Koda:
WARNING: Signal is missing in process sensitivity list: clk_div(8)


in je ISE sam dodal ta signal. Zato da je sploh delovalo.

_________________
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
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1282
Aktiv.: 5.72
Kraj: glej fogl

PrispevekObjavljeno: Čet Mar 06, 2008 11:44 pm    Naslov sporočila:   Odgovori s citatom

Se nekaj me zanima, kako pa sinhroniziram nek zunanji signal (npr. če hočem naredit števec)? Se to dela takole?

Koda:

signal stevec : std_logic_vector (7 downto 0) :="00000000";
signal stevec_temp : std_logic_vector (7 downto 0) :="00000000";

process (clk)
begin
  if rising_edge(clk)) then
    if not(stevec=stevec_temp) then
    -- naredi nekaj...
    end if;
    counts_temp <= counts;
  end if;
end process;
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



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

PrispevekObjavljeno: Pet Mar 07, 2008 12:16 am    Naslov sporočila:   Odgovori s citatom

Hm?
Kaj ti definiraš kot "zunanji signal"?
Nek signal, ki ga pripelješ na pine? Tega moraš obvezno najprej spreljati čez en D-FF, ki teče na sistemski uri.

Ne vem, kaj si sploh želel vprašati.. V tvoji kodi je 5 signalov in le za 2 se ve, kje jima je prirejena vrednost. Kakšen števec bi rad naredil? kakšno funkcijo? Od kod pridejo signali in s kakšnim timingom?

Tale tvoja koda od daleč spominja na "edge detector"...

_________________
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
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.66
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Mar 07, 2008 12:20 am    Naslov sporočila:   Odgovori s citatom

trot: odgovor na tvoje prvo vprašanje:

Citiram:
Če v stavku "if rising_edge(clk_div(Cool)" spreminjam vrednost clk_div(Cool, jo npr. zmanjšam, se hitrost izvajanja kode znotraj procesa povečuje. Zakaj je tako, če pa je v definiciji procesa "process (clk_div(12))" določeno, da se proces izvede samo ob spremembi clk_div(12)?


Sicer ne vem, v kaj ti je tole prevajalnik prevedel, lahko si pa predstavljaš, da si naredil gate za clock. Se pravi, ta proces se res izvede ob spremembi clk_div(12), vendar hkrati se mora zgoditi sprememba, določena v if stavku (kot je napisal aly, tukaj bi te prevajalnik verjetno res moral opozoriti, da tisti pogoj manjka v sensitivity seznamu). Očitno je, da če v if stavek daš npr. clk_div(4), se ta pogoj, skupaj z clk_div(12), pojavi večkrat kot clk_div(Cool. Zato se proces izvede večkrat oz. hitreje.

In, kot je napisal aly, izogobaj se takšnemu stilu pisanja.

Drugače z asinhronimi stavki ni nič narobe (običajno je, da se uporablja asinhrona kombinatorna logika, skupaj z registrirano sinhrono logiko), je pa stvar treba pravilno napisati.

Tudi več clockov lahko uporabljaš, če poskrbiš za pravilno sinhronizacijo med različnimi clock domenami.


Na tvoje zadnje vprašanje ti pa ne znam odgovoriti, ker manjka kar nekaj podatkov: iz kje pride counts, counts_temp, kje se povecuje stevec, kje dobis stevec_temp ...

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1282
Aktiv.: 5.72
Kraj: glej fogl

PrispevekObjavljeno: Pet Mar 07, 2008 11:14 am    Naslov sporočila:   Odgovori s citatom

Takole imam (zgoraj sem malo narobe napisal):

Imam en modul, ki ima funkcijo dekoderja
Koda:


entity decoder is
    Port ( clock : in  STD_LOGIC;
           phaseA : in  STD_LOGIC;
           phaseB : in  STD_LOGIC;
           counts : out  STD_LOGIC_VECTOR (7 downto 0));
end decoder;

architecture Behavioral of decoder is
   signal phaseA_delay : std_logic_vector (1 downto 0) :="00";
   signal phaseB_delay : std_logic_vector (1 downto 0) :="00";
   signal count : STD_LOGIC_VECTOR (7 downto 0) :="00000000";   
begin

   phaseA_delay(0) <= phaseA_delay(1);
   phaseB_delay(0) <= phaseB_delay(1);
   phaseA_delay(1) <= phaseA;
   phaseB_delay(1) <= phaseB;

process (clock)
begin
   if rising_edge(clock) then
      if phaseA_delay="11" and phaseB_delay="01" then count <= count+1; end if;
      if phaseA_delay="10" and phaseB_delay="11" then count <= count+1; end if;
      if phaseA_delay="00" and phaseB_delay="10" then count <= count+1; end if;
      if phaseA_delay="01" and phaseB_delay="00" then count <= count+1; end if;
      
      if phaseA_delay="01" and phaseB_delay="11" then count <= count-1; end if;
      if phaseA_delay="01" and phaseB_delay="10" then count <= count-1; end if;
      if phaseA_delay="10" and phaseB_delay="00" then count <= count-1; end if;
      if phaseA_delay="00" and phaseB_delay="01" then count <= count-1; end if;

      counts<=count;
   end if;   
end process;


Potem imam pa ta del, ki nekaj naredi, ko števec spremeni vrednost (counts od zgornjega modula sem zvezal na stevec)
Koda:

signal stevec : std_logic_vector (7 downto 0) :="00000000";
signal stevec_temp : std_logic_vector (7 downto 0) :="00000000";

process (clk)
begin
  if rising_edge(clk)) then
    if not(stevec=stevec_temp) then
    -- naredi nekaj...
    end if;
    stevec_temp <= stevec;
  end if;
end process;


Moje vprašanje pa je:
1. če se take zadeve dela tako (če je to običajna praksa) da narediš dva siglala (stevec_temp in stevec) in potem vsak clk gledaš, če se je zadeva spremenila.

2. a se bo ta koda od decoderja (vsi ti if stavki) dejansko izvedla v enem clk pulzu?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



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

PrispevekObjavljeno: Pet Mar 07, 2008 6:06 pm    Naslov sporočila:   Odgovori s citatom

na začetku zgornjega procesa lahko daš nek signal EN
Koda:
 EN <= '0';

tukaj na koncu tega stavka
Koda:
      if phaseA_delay="00" and phaseB_delay="01" then count <= count-1; end if;
lahko dodaš
Koda:
 EN <= '1';


in potem s tem EN signalom požiš izvajanje spodnjega procesa (kot Clock Enable)


Druga varianta pa je, da v zgornjem procesu dodaš še en signal in stavek:
Koda:
signal vz1, vz2 : std_logic;


in potem z uro shiftaš:
Koda:
vz2 <= vz1;
vz1 <= stevec (0);


in gledaš razliko:
Koda:
if vz1 <> vz2 then ..........


in tu izvedeš spodnji proces...

_________________
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
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: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group