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


von Habe eine Frage (Gast)


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?

von Läubi .. (laeubi) Benutzerseite


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?
1
A <= A+1 when B = '1' else A;

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

von Habe eine Frage (Gast)


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.

von Stefan (Gast)


Lesenswert?

A <= A+1 when B = '1' else A;


Sieht mir doch schwer nach Latch aus oder ? Gewollt ?


Grüsse,
Stefan

von Habe eine Frage (Gast)


Lesenswert?

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

Das gibt kein Latch.

von 123 (Gast)


Lesenswert?


von Läubi .. (laeubi) Benutzerseite


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?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
entity test is
7
    Port ( A : inout  STD_LOGIC_VECTOR (5 downto 0);
8
           B : in  STD_LOGIC);
9
end test;
10
11
architecture Behavioral of test is
12
begin
13
  A <= A+1 when B = '1' else A;
14
end Behavioral;
Ergibt:
1
Synthesizing Unit <test>.
2
    Related source file is "C:/daten/VHDL/minilog/test.vhd".
3
    Found 6-bit adder for signal <A$add0000> created at line 38.
4
    Summary:
5
  inferred   1 Adder/Subtractor(s).
6
Unit <test> synthesized.
7
8
9
=========================================================================
10
HDL Synthesis Report
11
12
Macro Statistics
13
# Adders/Subtractors                                   : 1
14
 6-bit adder                                           : 1
15
# Latches                                              : 1
16
 6-bit latch

von Habe eine Frage (Gast)


Lesenswert?

Überzeugt!

von nixda (Gast)


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

von Läubi .. (laeubi) Benutzerseite


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...

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


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:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity ASTI is
6
    Port ( A : inout integer range 0 to 63;
7
           B : in  STD_LOGIC);
8
end ASTI;
9
architecture Behavioral of ASTI is
10
begin
11
   A <= A + to_integer(unsigned(std_logic_vector'('0' & B)));
12
end Behavioral;
ergibt nach der Synthese:
1
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<0>.
2
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<5>.
3
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<4>.
4
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<3>.
5
WARNING:Xst:2170 - Unit ASTI : the following signal(s) form a combinatorial loop: A<2>.
6
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-Kombinatorische-Schleife

Wenn das Ganze also mal auf einen Takt bezogen wird (und nur das macht 
Sinn), dann sind diese drei Beschreibungen absolut gleichwertig:
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity ASTI is
6
    Port ( clk : in STD_LOGIC;
7
           A : inout integer range 0 to 63;
8
           B : in  STD_LOGIC);
9
end ASTI;
10
11
architecture Behavioral of ASTI is
12
begin
13
14
   -- Variante 1
15
   process begin
16
      wait until rising_edge(clk);
17
      A <= A + to_integer(unsigned(std_logic_vector'('0' & B)));  
18
   end process;
19
20
21
   -- Variante 2
22
   process begin
23
      wait until rising_edge(clk);
24
      if B='1' then A<=A+1; end if; 
25
   end process;
26
27
28
   -- Variante 3
29
   A <= A+1 when rising_edge(clk) and B='1';  
30
31
end Behavioral;

von Habe eine Frage (Gast)


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...

von Habe eine Frage (Gast)


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?

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


Angehängte Dateien:

Lesenswert?

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

von Habe eine Frage (Gast)


Lesenswert?

@Lothar:

Danke!

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.