 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Čet Jan 17, 2008 9:33 pm Naslov sporočila: vhdl - process |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Čet Jan 17, 2008 10:19 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Pon Jan 21, 2008 10:31 am Naslov sporočila: |
|
|
Š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  |
|
Nazaj na vrh |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Čet Mar 06, 2008 11:44 pm Naslov sporočila: |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Pet Mar 07, 2008 12:16 am Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.66 Kraj: Zagorje ob Savi
|
Objavljeno: Pet Mar 07, 2008 12:20 am Naslov sporočila: |
|
|
trot: odgovor na tvoje prvo vprašanje:
Citiram: |
Če v stavku "if rising_edge(clk_div( )" spreminjam vrednost clk_div( , 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( . 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 |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Pet Mar 07, 2008 11:14 am Naslov sporočila: |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Pet Mar 07, 2008 6:06 pm Naslov sporočila: |
|
|
na začetku zgornjega procesa lahko daš nek signal EN
tukaj na koncu tega stavka
Koda: |
if phaseA_delay="00" and phaseB_delay="01" then count <= count-1; end if; |
lahko dodaš
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  |
|
Nazaj na vrh |
|
 |
|
|
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
|