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?
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; |
@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.
A <= A+1 when B = '1' else A; Sieht mir doch schwer nach Latch aus oder ? Gewollt ? Grüsse, Stefan
> A <= A+1 when B = '1' else A; > > > Sieht mir doch schwer nach Latch aus oder ? Gewollt ? Das gibt kein Latch.
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 |
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
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...
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; |
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...
@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?
Habe eine Frage schrieb:
> Bekommst du bei beiden Varianten die selben Syntheseergebnisse?
Exakt das selbe. Exakt gleich schnell.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.