Niepewność w obsłudze dwukierunkowych portów VHDL: Konflikt zdarzeń w danych inout?

RATUNKU problem z VHDL'em





Poprzedni Następny
Wiadomość
Spis treści
From: "Michał Anuszewski" <michala_at_nospam_gazeta.pl>
Subject: RATUNKU problem z VHDL'em
Date: Tue, 21 Mar 2000 13:50:21 +0100


właśnie sobie połamałem zęby na następujšcym problemie:
mam dwa dwukierunkowe porty zadeklarowane jak niżej:

dataVGA: inout UNSIGNED(3 downto 0); <<<<<<<<<
dataMEM: inout UNSIGNED(3 downto 0); <<<<<<<<<
dataLCD: out UNSIGNED(3 downto 0)

ma to działać tak: (warunki rozłšczne oczywiście)
warunek1 dataMEM<=dataVGA;
dataLCD<="0000";
warunek2 dataVGA<=dataMEM;
dataLCD<="0000";
warunek3 dataVGA<="ZZZZ";
dataLCD<=dataMEM;

zapisałem to tak:
dataMEM <= dataVGA when (warunek1);
dataVGA <= dataMEM when (warunek2) else
(others => 'Z');
dataLCD <= dataMEM when (warunek3) else
(others => '0');

i niestety kompilator 'przerobił' "dataMEM " na out !!!!

przy zapisie:
(dodam że "dataMEM" NIGDY nie może się znaleŸć w 3 stanie ...)
dataMEM <= dataVGA when (warunek1) else
(others => 'Z') when (coś co zawsz = 0);

"dataMEM" zostaje inout ale niestety całość dostaje lekkiego świra ...

GDZIE JEST BŁĽD/KRUCZEK/WIEDZATAJEMNA ????

Pozdrawiam
Michał Anuszewski




Poprzedni Następny
Wiadomość
Spis treści
From: w.zablocki_at_nospam_wonlok.com.pl (Wojtek)
Subject: Re: RATUNKU problem z VHDL'em
Date: 21 Mar 2000 15:17:23 +0100


VERILOG jest łatwiejszy
----- Original Message -----
From: Michał Anuszewski <michala_at_nospam_gazeta.pl>
To: <pl-misc-elektronika_at_nospam_newsgate.pl>
Sent: Tuesday, March 21, 2000 1:50 PM
Subject: RATUNKU problem z VHDL'em


właśnie sobie połamałem zęby na następujšcym problemie:
mam dwa dwukierunkowe porty zadeklarowane jak niżej:

dataVGA: inout UNSIGNED(3 downto 0); <<<<<<<<<
dataMEM: inout UNSIGNED(3 downto 0); <<<<<<<<<
dataLCD: out UNSIGNED(3 downto 0)

ma to działać tak: (warunki rozłšczne oczywiście)
warunek1 dataMEM<=dataVGA;
dataLCD<="0000";
warunek2 dataVGA<=dataMEM;
dataLCD<="0000";
warunek3 dataVGA<="ZZZZ";
dataLCD<=dataMEM;

zapisałem to tak:
dataMEM <= dataVGA when (warunek1);
dataVGA <= dataMEM when (warunek2) else
(others => 'Z');
dataLCD <= dataMEM when (warunek3) else
(others => '0');

i niestety kompilator 'przerobił' "dataMEM " na out !!!!

przy zapisie:
(dodam że "dataMEM" NIGDY nie może się znaleŸć w 3 stanie ...)
dataMEM <= dataVGA when (warunek1) else
(others => 'Z') when (coś co zawsz = 0);

"dataMEM" zostaje inout ale niestety całość dostaje lekkiego świra ...

GDZIE JEST BŁĽD/KRUCZEK/WIEDZATAJEMNA ????

Pozdrawiam
Michał Anuszewski




--
Archiwum listy dyskusyjnej pl-misc-elektronika
http://www.newsgate.pl/archiwum/pl-misc-elektronika/

Poprzedni Następny
Wiadomość
Spis treści
From: "Michał Anuszewski" <michala_at_nospam_gazeta.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 08:59:08 +0100


Dzięki ale nie zupełnie o takš odpowiedŸ mi chodziło ...

Pozdrawiam
Michał Anuszewski

Wojtek <w.zablocki_at_nospam_wonlok.com.pl> wrote in message
news:03b801bf9339$ca637d80$7aedf4d4_at_nospam_wonlok.com.pl...
VERILOG jest łatwiejszy
----- Original Message -----
From: Michał Anuszewski <michala_at_nospam_gazeta.pl>
To: <pl-misc-elektronika_at_nospam_newsgate.pl>
Sent: Tuesday, March 21, 2000 1:50 PM
Subject: RATUNKU problem z VHDL'em




Poprzedni Następny
Wiadomość
Spis treści
From: "Juliusz" <juliusz_at_nospam_multi-ip.com.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 00:30:09 GMT



"Michał Anuszewski" <michala_at_nospam_gazeta.pl> wrote in message
news:8b7ri3$o2c$1_at_nospam_leo.gazeta.pl...
właśnie sobie połamałem zęby na następujšcym problemie:
mam dwa dwukierunkowe porty zadeklarowane jak niżej:

To sa jakies bzdury :-) Trzeba zrobic maszybe stanow taktowana zegarem albo
nie rozumiem o co ci dokladnie chodzi.?

Usilujesz cos deklarowac unsigned a chcesz porownywac do mniejsze/rowne ? Na
dodatek masz zamiar zrobic multiplexer gdzie wyjscia beda sie gryzly z
wyjsciami. Co to ma robic ? Napisz w prostych slowach. I czym to kompilujesz
, na jakie kostki ?

Juliusz




Poprzedni Następny
Wiadomość
Spis treści
From: "Michał Anuszewski" <michala_at_nospam_gazeta.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 08:55:46 +0100


Po pierwsze nie rozumiem Twojej agresji ...
(choć z tego co zauważyłem na grupie to raczej standard, każdy może pytać o
co chce
a Ty nie MUSISZ odpowiadać choć NIESTETY możesz ...)
Po drugie w kodzie który przytoczyłem nie ma ani jednego porównania
"mniejsze/równe",
a to co w ten sposób potraktowałeś to PRZYPISANIE ...
Po trzecie nie usiłuję tylko to zrobiłem ...
Po czwarte operator "mniejsze/równe" dla UNSIGNED jest standardowo
zdefiniowany w bibliotekach VHDL'a ...
Po pište, jak wcześniej podałem porty sš typu "inout" więc nie rozumiem o co
chodzi z
"gryzieniem się" ...

Jeśli z kodu nie rozumiesz o co chodzi to napiszę po POLSKU:
-> sš dwa porty dwukierunkowe A wysyłasz do B i na odwyrtkę (przy
odpowiednich warunkach)
jeżeli żaden z tych warunków nie jest spełniony to A jest w wysokiej
impedancji a B ma przyjmować dane
czyli jest w stanie "in" niestety kompilator zmienia deklaracje "inout" na
"out" ...

Narzędzie i kostki NIE majš większego znaczenia ale jeśli Cię to interesuje
to podaję
-> ispLSI1032 Lattice, Synplify 5.3.1 + ispEXPERT Compiler v7.0 lub
Cypress Warp r4.0

Pozdrawiam
Michał Anuszewski


Juliusz <juliusz_at_nospam_multi-ip.com.pl> wrote in message
news:luUB4.18946$Ob.616127_at_nospam_news.tpnet.pl...

"Michał Anuszewski" <michala_at_nospam_gazeta.pl> wrote in message
news:8b7ri3$o2c$1_at_nospam_leo.gazeta.pl...
właśnie sobie połamałem zęby na następujšcym problemie:
mam dwa dwukierunkowe porty zadeklarowane jak niżej:

To sa jakies bzdury :-) Trzeba zrobic maszybe stanow taktowana zegarem
albo
nie rozumiem o co ci dokladnie chodzi.?

Usilujesz cos deklarowac unsigned a chcesz porownywac do mniejsze/rowne ?
Na
dodatek masz zamiar zrobic multiplexer gdzie wyjscia beda sie gryzly z
wyjsciami. Co to ma robic ? Napisz w prostych slowach. I czym to
kompilujesz
, na jakie kostki ?

Juliusz






Poprzedni Następny
Wiadomość
Spis treści
From: "Juliusz" <juliusz_at_nospam_multi-ip.com.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 17:28:33 GMT



Po pište, jak wcześniej podałem porty sš typu "inout" więc nie rozumiem o
co
chodzi z
"gryzieniem się" ...

Jak robisz A<=B i B<=A to nie wolno tego robic rownoczesnie. Mozesz jedynie
jedna z operacji wykonywac w jednej chwili. np

process (..)
...
case warunek is
when warunek1 => A<=B;
when warunek2 => B<=A;
when orhers => cos tam co chcesz zeby sie dzialo
end case;

te wszystkie warunek1,2,3..n zadeklarujesz sobie jako mozliwe stany dla
jakiejs zmiennej "warunek". Gdy sie zadna nie spelni to stawiasz sygnaly w
stan Z

Czeste przelaczanie tych warunkow i danych w obu kierunkach bedzie
powodowalo glicze wiec proponuje to postawic na zboczu zegara.

Juliusz





Poprzedni Następny
Wiadomość
Spis treści
From: "Henryk Cieslak" <hcentry_at_nospam_poczta.onet.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 08:31:50 GMT



Michał Anuszewski napisał(a) w wiadomości: <8b7ri3$o2c$1_at_nospam_leo.gazeta.pl>...
ma to działać tak: (warunki rozłšczne oczywiście)
warunek1 dataMEM<=dataVGA;
dataLCD<="0000";
warunek2 dataVGA<=dataMEM;
dataLCD<="0000";
warunek3 dataVGA<="ZZZZ";
dataLCD<=dataMEM;

zapisałem to tak:
dataMEM <= dataVGA when (warunek1);

to jest klasyczny "latch". O to Ci chodziło? Jakš wartość ma mieć dataMEM
gdy warunek nie jest spełniony?

dataVGA <= dataMEM when (warunek2) else
(others => 'Z');
dataLCD <= dataMEM when (warunek3) else
(others => '0');

i niestety kompilator 'przerobił' "dataMEM " na out !!!!

Jeżeli kompilator - weŸ inny. Jeżeli syntezator, to on po prostu
zoptymalizował to, co zrobiłeś - i chyba miał rację. Skoro dataMEM
zatrzaskuje dataVGA pewnie użył dataVGA zamiast dataMEM i wyszło mu, ze
dataMEM to wyjście. Czasem mozna wylaczyc niektore optymalizacje.


przy zapisie:
(dodam że "dataMEM" NIGDY nie może się znaleŸć w 3 stanie ...)

No, ale w jakimś powinno się znalezc.

dataMEM <= dataVGA when (warunek1) else
(others => 'Z') when (coś co zawsz = 0);



Czy (coś co zawsz = 0) jest wyliczane w czasie syntezy? Sadze, ze nie.
Dlatego jest roznica w wynikach. Wszystko zatem sprowadza sie do tego
nieszczesnego latcha.

"dataMEM" zostaje inout ale niestety całość dostaje lekkiego świra ...

GDZIE JEST BŁĽD/KRUCZEK/WIEDZATAJEMNA ????

Pomysl chwile, jak chcialbys to zrobic "na bramkach" - to czasem pomaga. Nie
wszystko, co napiszesz w VHDL ma sens. (Np. a <= not a).
Poza tym mam watpliwosci, czy do konca wiesz, co chcesz zrobic.


Pozdrawiam
Michał Anuszewski




Pozdr.
HC





Poprzedni Następny
Wiadomość
Spis treści
From: "Henryk Cieslak" <hcentry_at_nospam_poczta.onet.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 08:47:34 GMT



Chcesz zrobić coś takiego:

-> sš dwa porty dwukierunkowe A wysyłasz do B i na odwyrtkę (przy
odpowiednich warunkach)
jeżeli żaden z tych warunków nie jest spełniony to A jest w wysokiej
impedancji a B ma przyjmować dane
czyli jest w stanie "in" niestety kompilator zmienia deklaracje "inout" na
"out" ...

Spróbuj:

A <= B when warunek1 else (others => 'Z);
B <= A when warunek2 else (others => 'Z');

Nie ma czegoś takiego, jak stan "in", aby B (typu inout) mogło być wejściem
danych, trzeba je odstawić w 'Z'.

HC



Poprzedni Następny
Wiadomość
Spis treści
From: "Michał Anuszewski" <michala_at_nospam_gazeta.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 09:52:10 +0100


Prawie prawie...
Wysłałem chwilkę temu dokładny opis tego co chcę zrobić, podam jeszcze raz:
-> sš dwa porty dwukierunkowe A wysyłasz do B i na odwyrtkę (przy
odpowiednich warunkach)
jeżeli żaden z tych warunków nie jest spełniony to A jest w wysokiej
impedancji a B ma być wysyłane na C ...

Czy to co niżej napisałeś nadal uważasz za poprawne?

Henryk Cieslak <hcentry_at_nospam_poczta.onet.pl> wrote in message
news:GM%B4.19701$Ob.637672_at_nospam_news.tpnet.pl...

Chcesz zrobić coś takiego:

-> sš dwa porty dwukierunkowe A wysyłasz do B i na odwyrtkę (przy
odpowiednich warunkach)
jeżeli żaden z tych warunków nie jest spełniony to A jest w wysokiej
impedancji a B ma przyjmować dane
czyli jest w stanie "in" niestety kompilator zmienia deklaracje "inout" na
"out" ...

Spróbuj:

A <= B when warunek1 else (others => 'Z);
B <= A when warunek2 else (others => 'Z');

Nie ma czegoś takiego, jak stan "in", aby B (typu inout) mogło być
wejściem
danych, trzeba je odstawić w 'Z'.

Tego nie wiedziałem ...

HC





Poprzedni Następny
Wiadomość
Spis treści
From: "Michał Anuszewski" <michala_at_nospam_gazeta.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 11:39:43 +0100


OK. Działa poprawnie.
Wielkie dzięki!

Henryk Cieslak <hcentry_at_nospam_poczta.onet.pl> wrote in message
news:GM%B4.19701$Ob.637672_at_nospam_news.tpnet.pl...

Chcesz zrobić coś takiego:

-> sš dwa porty dwukierunkowe A wysyłasz do B i na odwyrtkę (przy
odpowiednich warunkach)
jeżeli żaden z tych warunków nie jest spełniony to A jest w wysokiej
impedancji a B ma przyjmować dane
czyli jest w stanie "in" niestety kompilator zmienia deklaracje "inout" na
"out" ...

Spróbuj:

A <= B when warunek1 else (others => 'Z);
B <= A when warunek2 else (others => 'Z');

Nie ma czegoś takiego, jak stan "in", aby B (typu inout) mogło być
wejściem
danych, trzeba je odstawić w 'Z'.

HC





Poprzedni Następny
Wiadomość
Spis treści
From: "Michał Anuszewski" <michala_at_nospam_gazeta.pl>
Subject: Re: RATUNKU problem z VHDL'em
Date: Wed, 22 Mar 2000 09:43:31 +0100


Dzięki za odpowiedŸ jeśli możesz to pogadałbym chwilkę ...

i niestety kompilator 'przerobił' "dataMEM " na out !!!!

Jeżeli kompilator - weŸ inny. Jeżeli syntezator, to on po prostu
zoptymalizował to, co zrobiłeś - i chyba miał rację. Skoro dataMEM

OK. Faktycznie wcześniej nie sprawdziłem syntezera tylko przyczepiłem się do
kompilatora...
Syntezer zmienił inout na out ...(i pewnie miał rację :( )

zatrzaskuje dataVGA pewnie użył dataVGA zamiast dataMEM i wyszło mu, ze
dataMEM to wyjście. Czasem mozna wylaczyc niektore optymalizacje.

Czy (coś co zawsz = 0) jest wyliczane w czasie syntezy? Sadze, ze nie.

Przepraszam Ÿle zapisałem ...
Uściślę -> syntezer o tym nie wie bo podałem to jako zewnętrzny sygnał o
ustalonej
wartości tutaj '1' a oczekuje '0' więc nie może optymalizować ...

Dlatego jest roznica w wynikach. Wszystko zatem sprowadza sie do tego
nieszczesnego latcha.

ANO tylko za mało wiem aby to rozwišzać ...

"dataMEM" zostaje inout ale niestety całość dostaje lekkiego świra ...

GDZIE JEST BŁĽD/KRUCZEK/WIEDZATAJEMNA ????

Pomysl chwile, jak chcialbys to zrobic "na bramkach" - to czasem pomaga.
Nie
wszystko, co napiszesz w VHDL ma sens. (Np. a <= not a).
Poza tym mam watpliwosci, czy do konca wiesz, co chcesz zrobic.

Może i tak być więc napiszę słownie abyś mógł sam ocenić:
-> sš dwa porty dwukierunkowe A wysyłasz do B i na odwyrtkę (przy
odpowiednich warunkach)
jeżeli żaden z tych warunków nie jest spełniony to A jest w wysokiej
impedancji a B ma być wysyłane na C ...
i to tyle

Uściślajšc sprawę nie jestem elektronikiem (choć próbowano mnie na studiach
przekonać że tak)
(ino programistš) więc wiele oczywistych prawd może mogło mi umknšć ...

Pozdrawiam
Michał Anuszewski