Forum: FPGA, VHDL & Co. AND-Verknüpfung


von SvenB (Gast)


Lesenswert?

Hi Leute,

habe folgendes Problem:

1
signal a,b,c : std_logic;
2
3
type ty_ar is array (natural range <>) of std_logic;
4
signal d, e, f : ty_ar(1 downto 0);
5
6
begin
7
8
9
a <= (b and c) when rising_edge(clk);
10
11
-- Error message: No feasible entries for 'and'
12
d <= (e and f) when rising_edge(clk);

Wie bekommt man diese UND-Verknüpfung hin ?


vielen dank für eure hilfe.

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo Sven,

du musst die and Funktion überladen, so dass sie als Argumente ty_ar 
erwartet und einen ty_ar zurück gibt.

Thomas

von SvenB (Gast)


Lesenswert?

Hallo Thomas,

danke für deine hilfe.

gruß,
Sven

von Jan M. (mueschel)


Lesenswert?

Nebenbei bemerkt,

>a <= (b and c) when rising_edge(clk);

Dieses Konstrukt bewirkt sicher nicht das was du möchtest. a hat nur 
genau während der Flanke auf clk den Wert (b and c), zu allen anderen 
Zeiten ist es nicht definiert. Und die Flanke auf clk ist auch nur 
unendlich kurz...
Beim Synthetisieren bekommst du damit eine "warning: found latch" und in 
Hardware wird sich diese Zuweisung im Allgemeinen anders verhalten als 
in der Simulation.
Merke: Wenn du ein Flipflop beschreiben willst, dann brauchst du in VHDL 
einen Prozess der genau das macht, alle anderen Beschreibungen sind 
nicht für Hardware geeignet.

von SvenB (Gast)


Lesenswert?

>Dieses Konstrukt bewirkt sicher nicht das was du möchtest. a hat nur
>genau während der Flanke auf clk den Wert (b and c), zu allen anderen
>Zeiten ist es nicht definiert. Und die Flanke auf clk ist auch nur
>unendlich kurz...


Quatsch comedy club!

1
a <= (b and c) when rising_edge(clk);
2
3
4
-- alternativ
5
6
process
7
wait until rising_edge(clk);
8
9
a <= b and c;
10
end process;

Beide Beschreibungen sind einwandfrei.

>Beim Synthetisieren bekommst du damit eine "warning: found latch"
Ja ? Schon ausprobiert?

von SvenB (Gast)


Lesenswert?

>Merke: Wenn du ein Flipflop beschreiben willst, dann brauchst du in VHDL
>einen Prozess der genau das macht, alle anderen Beschreibungen sind
>nicht für Hardware geeignet.

Quatsch comedy club die 2.

von SvenB (Gast)


Angehängte Dateien:

Lesenswert?

siehe Anhang: Synthese mit SynplifyPro

von SvenB (Gast)


Lesenswert?

dargestellt ist:
1
c <= (a and b) when rising_edge(clk);

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

> Beim Synthetisieren bekommst du damit eine "warning: found latch" und in
> Hardware wird sich diese Zuweisung im Allgemeinen anders verhalten als
> in der Simulation.
Nein, das wird kein Latch, sondern durch die steigende Flanke ein 
Register...

> Merke: Wenn du ein Flipflop beschreiben willst, dann brauchst du in VHDL
> einen Prozess der genau das macht, alle anderen Beschreibungen sind
> nicht für Hardware geeignet.
Die Synthese kann schon einiges erkennen, aber ich würde die 
Beschreibung auch als grenzwertig einstufen. Man könnte es sogar noch 
weiter treiben und ein Reset und ein Enable einführen:
1
    a <= '0' when b='1' else c and d when e='1' and rising_edge(clk);
Daraus macht die Synthese dann die erwartete Funktion (Anhang).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Und falls jetzt noch jemand fragt: latürnich geht das auch mit einem 
Preset...
1
a <= '0' when r='1' else '1' when s='1' else b and c when e='1' and rising_edge(clk);

von SvenB (Gast)


Lesenswert?

eigentlich ging es ja gar nicht um die Frage, wie man nebenläufig ein 
Register beschreibt...

von Jan M. (mueschel)


Lesenswert?

SvenB schrieb:
>>Beim Synthetisieren bekommst du damit eine "warning: found latch"
> Ja ? Schon ausprobiert?

Ja, vor längerer Zeit. Inzwischen scheinen sowohl ISE als auch Synplify 
damit klarzukommen - ich würde aber definitiv bei den herkömmlichen 
Beschreibungen bleiben und nicht auf die (meistens ohnehin nicht 
vorhandene) Intelligenz der Tools vertrauen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.