Suche "elegantere" Schreibweise

Gast #1404930
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?
Persönliche Seite #1405105
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;
Gast #1405122
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.
Persönliche Seite #1405941
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
Persönliche Seite #1407727
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...
Moderator (Firma: Titel) Persönliche Seite #1407826
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren