mikrocontroller.net

Forum: FPGA, VHDL & Co. Suche "elegantere" Schreibweise


Autor: Habe eine Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich suche eigentlich nur für folgenden Ausdruck eine elegantere 
Schreibweise:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
...
signal A : natural range 0 to 63;
signal B : std_logic;
...
-- A wird incrementiert wenn B = '1'. Ansonsten bleibt A gleich.
A <= A + to_integer(unsigned(std_logic_vector'('0' & B)));

Erstmal: Obiges funktioniert.
ABER: 3 Typenumwandlungen kommen mir etwas viel vor. Und mehr als 1 
Zeile sollte das auch nicht haben.
Wer hat eine "elegantere" Lösung?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe eine Frage schrieb:
> Hallo,
>
> ich suche eigentlich nur für folgenden Ausdruck eine elegantere
> Schreibweise:
>
> library ieee;
> use ieee.std_logic_1164.all;
> use ieee.numeric_std.all;
> ...
> signal A : natural range 0 to 63;
> signal B : std_logic;
> ...
> -- A wird incrementiert wenn B = '1'. Ansonsten bleibt A gleich.
> A <= A + to_integer(unsigned(std_logic_vector'('0' & B)));
>
> Erstmal: Obiges funktioniert.
> ABER: 3 Typenumwandlungen kommen mir etwas viel vor. Und mehr als 1
> Zeile sollte das auch nicht haben.
> Wer hat eine "elegantere" Lösung?
A <= A+1 when B = '1' else A;

oder halt in nem prozess
process (A, B)
begin
 if B = '1' then
  A <= A+1;
 end if;
end process;

Autor: Habe eine Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Läubi:
Danke erstmal.
Nur...
Bei deiner Lösung generiert mir die Synthese einen Addierer plus 6 
Multiplexer. Bei meiner Lösung sind es 5 Multiplexer weniger!
Ich denke, das kann bei größeren Bitbreiten schon entscheidend sein.
Gut, über einen ELSE-Zweig mit der Addition von 0 habe ich schon 
nachgedacht, aber ich wollte es halt "kompakter" haben.
Ach ja, ich habe das Konstrukt in einem Process zu stehen.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A <= A+1 when B = '1' else A;


Sieht mir doch schwer nach Latch aus oder ? Gewollt ?


Grüsse,
Stefan

Autor: Habe eine Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> A <= A+1 when B = '1' else A;
>
>
> Sieht mir doch schwer nach Latch aus oder ? Gewollt ?

Das gibt kein Latch.

Autor: 123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe eine Frage schrieb:
>> A <= A+1 when B = '1' else A;
>>
>>
>> Sieht mir doch schwer nach Latch aus oder ? Gewollt ?
>
> Das gibt kein Latch.

Was denn dann?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity test is
    Port ( A : inout  STD_LOGIC_VECTOR (5 downto 0);
           B : in  STD_LOGIC);
end test;

architecture Behavioral of test is
begin
  A <= A+1 when B = '1' else A;
end Behavioral;
Ergibt:
Synthesizing Unit <test>.
    Related source file is "C:/daten/VHDL/minilog/test.vhd".
    Found 6-bit adder for signal <A$add0000> created at line 38.
    Summary:
  inferred   1 Adder/Subtractor(s).
Unit <test> synthesized.


=========================================================================
HDL Synthesis Report

Macro Statistics
# Adders/Subtractors                                   : 1
 6-bit adder                                           : 1
# Latches                                              : 1
 6-bit latch     

Autor: Habe eine Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überzeugt!

Autor: nixda (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

a <= a+1 when b=1 else a;

ergibt wenigstens eine kombinatorische loop bei b=1 und etwas konstantes 
bei b!=0.

also ist es ein latch + eine komb. loop ... beides ist nicht der hit, 
oder?

mfg
/u

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nixda schrieb:
> also ist es ein latch + eine komb. loop ... beides ist nicht der hit,
> oder?
Kommt halt drauf an was erreicht werden soll...
Hier Beitrag "Re: 74LS573 und 74LS245 im CPLD nachbilden" wollte jemand 
nen Logikgatter nachbauen welches ein Latch enthält... dann kann man 
schon eins bauen... Da sich 'Habe eine Frage' aber nicht weiter 
äußert...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nixda schrieb:
> also ist es ein latch + eine komb. loop... beides ist nicht der hit, oder?

> Erstmal: Obiges funktioniert.
> ABER: 3 Typenumwandlungen kommen mir etwas viel vor.
Und du hast damit wie erwähnt eine kombinatorische Schleife. Oder einen 
essentiellen Teil des Codes (namentlich den Takt) nicht mitgepostet.
Das hier:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity ASTI is
    Port ( A : inout integer range 0 to 63;
           B : in  STD_LOGIC);
end ASTI;
architecture Behavioral of ASTI is
begin
   A <= A + to_integer(unsigned(std_logic_vector'('0' & B)));
end Behavioral;
ergibt nach der Synthese:
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<0>.
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<5>.
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<4>.
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<3>.
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<2>.
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<1>.

Und eine Kombinatorische Schleife ist i.A. nicht erwünscht:
http://www.lothar-miller.de/s9y/categories/36-Komb...

Wenn das Ganze also mal auf einen Takt bezogen wird (und nur das macht 
Sinn), dann sind diese drei Beschreibungen absolut gleichwertig:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity ASTI is
    Port ( clk : in STD_LOGIC;
           A : inout integer range 0 to 63;
           B : in  STD_LOGIC);
end ASTI;

architecture Behavioral of ASTI is
begin

   -- Variante 1
   process begin
      wait until rising_edge(clk);
      A <= A + to_integer(unsigned(std_logic_vector'('0' & B)));  
   end process;


   -- Variante 2
   process begin
      wait until rising_edge(clk);
      if B='1' then A<=A+1; end if; 
   end process;


   -- Variante 3
   A <= A+1 when rising_edge(clk) and B='1';  

end Behavioral;

Autor: Habe eine Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will doch gar kein Latch haben...
Da die Zuweisung sowieso in einem synchronen Process steht, werde ich 
auch kein Latch bekommen.
Ich wollte doch nur eine kürze schreibweise für die Typkonvertierung 
haben...

Autor: Habe eine Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar:

V1:
   process begin
      wait until rising_edge(clk);
      if B='1' then A<=A+1; end if;
   end process;

V2:
   process begin
      wait until rising_edge(clk);
      if B='1' then A<=A+1; else A<=A+0; end if;
   end process;

Bekommst du bei beiden Varianten die selben Syntheseergebnisse?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe eine Frage schrieb:
> Bekommst du bei beiden Varianten die selben Syntheseergebnisse?
Exakt das selbe. Exakt gleich schnell.

Autor: Habe eine Frage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar:

Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.