Re: Pitanja...
> 2.sta da radim sa signalima koji mi trebaju da budu integer da bi mogla
> da ih koristim
> kao indexe ,a menjam ih u 2 procesa? (isti problem imam i sa
> flegovima...) Kompajler mi prijavljuje gresku: Signal "SampleCnt" has
> two sources, but is not resolved signal .isto i za SamplingF. Pokusala
> samo to da resim tako sto ta 2 procesa spojim u 1,i to prodje compile,
> medjutim u simulaciji kada SamplingF treba da dobije vrednost '1', on
> dobije X, i onda ne radi kako treba :( Sta da radim?
> evo definicije signala i tog jednog procesa:
> Signal SampleCnt: integer range 0 to 15 :=0;
> Signal SamplingF: std_logic := '0';
> StartAndSample:process(RxD,clk) is
> begin
> if RxE='1'then
> if falling_edge(RxD) and not(SamplingF='1') then
> SamplingF<='1';
> SampleCnt<=0;
> elsif (SamplingF='1') and rising_edge(clk) then
> SamplingReg(SampleCnt)<=RxD;
> SampleCnt<=SampleCnt+1;
> end if;
> end if;
> end process StartAndSample;
Ovo je mene svojevremeno izludjivalo do besvesti :(
Problem je u tome sto se procesi odvijaju paralelno, tako da se 'ne zna'
naredna vrednost signala posto se 'istovremeno' menja na dva razlicita
nacina.
Jedno resenje jesenje je da uvedes shared variable umesto signal, ali
odmah da ti kazem da to nije preporucljivo za sintezu (mislim uvodjenje
bilo kakvih shared ili ne-shared varijabli). Cini mi se da je neko na
listi pitao da li moze transmitter i receiver da se realizuje kao FSM i da
je odgovor bio da moze. Moj savet ti je da i ti uradis tako, jer je to
jedini put da imas vise procesa a sigurno znas sta se desava.
Generalna preporuka (za one za koje nije vec kasno :)) je da se behavioral
modeli pisu tako da budu leaf celije u dizajnu i da imaju samo jedan
proces koji njima upravlja. Ako mislite da to ne moze tako, onda pokusajte
da pronadjete nacin dekompozicije tako da se dobije nesto sto moze.
Drugo, kada sam vec pomenula sintezu (a ne bih volela da se neko zaglavi
tek u sintezi zbog ovoga), na primeru ovog dela koda:
1. Sigurno ce se pojaviti warning za to sto u okviru procesa ocitavas
signal koji nije u sensitivity listi (u okviru uslova if);
2. Mislim da sam o tome vec jednom nesto pisala, ali nije lose da ponovim:
gledajte da imate samo jedan takt u uredjaju. Za ovo rising_edge(clk) i
falling_edge(RxD) ce biti prijavljen error i simulacija nece moci da se
izvrsi. Ako malo bolje pogledas, ovaj proces (osim ako ovo nije samo deo
procesa) ce raditi isto i ako stavis samo if (RxD = '0'): RxD je u
sensitivity listi, kada padne na '0' - moze da se izvrsi samo taj deo
procesa.
Generalno: sve sto se desava asinhrono se ispituje kao sto sam opisala, a
sinhrono isto tako samo ugnezdeno u jedno if (rising_edge(clk)).
3. Ovaj kod bi mogao da inferira puno leceva, jer imas razgranat uslov kod
kojeg nisu pokrivene sve opcije.
Jedan elegantan nacin da se ovo resi (na primeru dva signala) je:
signal uslov : std_logic_vector(1 downto 0);
process (uslov)
begin
case (uslov) is
when "00" =>
dodela_vrednosti_signalima1;
when "11" =>
dodela_vrednosti_signalima2;
when others =>
nesto_sto_nema_uticaja;
end case;
end process;
uslov <= signal_od_interesa1 & signal_od_interesa2;
Ovde treba napomenuti jos da (na primer) jednobitan uslov (recimo za
mux2x1) nije pokriven ako se pokriju opcije '0' i '1', vec takodje mora da
se stavi nesto u 'others'. Razlog ovome je sto (kao sto sigurno znate)
std_logic moze imati i neke druge vrednosti osim '0' i '1'.
Sada kada sam sigurno sve ugusila, mogu da se povucem :)
Pozdrav,
Marija
- References:
- signali
- From: Ljiljana Momirovic <beolily@yahoo.com>
- vlsi-nastava] ACK signal - ekskluzivno za asistenta :)
- From: Ana Balevic <alegria@ikomline.net>
- Pitanja...
- From: Ana Balevic <alegria@ikomline.net>
- signali
Previous by date: RE: Pitanja...
Next by date: Re: Vezbe?
Previous by thread: RE: Pitanja... Next by thread: Vezbe?
Previous by thread: RE: Pitanja... Next by thread: Vezbe?