Forum: FPGA, VHDL & Co. Countdown Zähler mit Abbruchbedingung, Initialisierungsproblem


von Marten V. (Gast)


Lesenswert?

Tach auch,

ich habe für ein Projekt einen Countdown-Timer mit Abbruchbedingung 
geschrieben, der noch eine kleine Macke hat. Jedesmal wenn der Counter 
eingeschaltet (EN='1') bzw. (RST_N='0') zurückgesetzt wird, gibt er 
zunächst ein RDY-Signal aus und fängt dann mit dem zählen an. Das 
RDY-Signal soll jedoch erst auf '1' gesetzt werden, wenn der Zähler auch 
wirklich bis 0000...0 heruntergezählt hat. Ich muss also irgendwie die 
Reset-Bedingungen umschreiben...
Hat jemand ne Idee wie ich das Problem lösen kann ? Ich habe gerade nen 
Brett vorm Kopf...

Hier mein Code:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_unsigned.all;
4
use ieee.std_logic_arith.all;
5
6
 
7
entity counter is
8
 generic( TAPS : integer := 11 );
9
 port(
10
  RST_N : in std_logic;
11
  EN  : in std_logic;
12
  CLK : in std_logic;
13
  D  : in std_logic_vector(TAPS downto 0);
14
  RDY  : out std_logic);
15
end entity counter;
16
17
architecture beh of counter is
18
19
signal d_int : std_logic_vector(TAPS downto 0);
20
21
begin
22
 
23
-- Counter  
24
  counter_p : process (CLK,RST_N,EN,D)
25
  variable zeros : std_logic_vector(TAPS downto 0) := (others => '0');
26
  begin
27
  if RST_N = '0' then
28
  d_int <= (others => '0');
29
  RDY <= '0';
30
  elsif (CLK='1' and CLK'event) then
31
  d_int <= D;-- Latch ?
32
  if (EN = '1') then 
33
    if ( d_int = zeros) then
34
      RDY <= '1';
35
    else
36
      d_int <= d_int -1;
37
      RDY <= '0';
38
    end if;
39
  elsif (EN ='0') then
40
    RDY <= '0';
41
    d_int <= (others => '0');
42
  end if;
43
  end if;
44
  end process;
45
  
46
 end architecture;

Viele Grüße
Marten

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


Lesenswert?

Herzlichen Glückwunsch!
Du hast das entdeckt, was sich "Latency" nennt.
Sowas passiert gern mal mit Signalen... :-o

Konkret:
Wenn RST_N = 0 war, dann ist d_int = 0.
Wenn jetzt RST_N = '1' inaktiv wird, ist d_int immer noch 0.
Wenn jetzt ein Takt kommt, ist für den gesamten Prozess d_int
immer noch 0.
Erst am Ende des Prozesses wird die letzte Zuweisung an d_int
tatsächlich an d_int zugewiesen.
1
  if RST_N = '0' then
2
    d_int <= (others => '0');
3
    RDY <= '0';
4
  elsif (CLK='1' and CLK'event) then
5
    d_int <= D;-- Latch ?
6
    if (EN = '1') then 
7
      if ( d_int = zeros) then   -- beim ersten Takt nach reset ist hier d_int = 0 !!!
8
        RDY <= '1';              -- --> RDY wird gesetzt.
9
      else
10
        d_int <= d_int -1;
11
        RDY <= '0';
12
      end if;
13
    elsif (EN ='0') then
14
      RDY <= '0';
15
      d_int <= (others => '0');
16
    end if;
17
  end if;

Marten V. schrieb:
> Hat jemand ne Idee wie ich das Problem lösen kann ?
Probier mal das:
1
  if RST_N = '0' then
2
    d_int <= D;
3
  :
4
  :


> d_int <= D;-- Latch ?
Nein, weil getaktet.

BTW:
Zum Sinn und Unsinn von asynchronen Resets wurde hier schon einiges 
geschrieben. Benutz mal die Suche hier im Forum zum Thema "Xilinx und 
die Resets" als Denkanstoss.

von Sym (Gast)


Lesenswert?

Ein Signal ist keine Variable! Egal wo du in einem synchronen Prozess 
dem Signal einen Wert zuweist, du kannst ihn erst im nächsten Taktzyklus 
lesen.

Beachte außerdem: In der sensitivity list eines synchronen processes 
steht nur clock und reset, sonst GAR NICHTS. Dein VHDL Stil ist sehr 
gewöhnungsbedürftig. Verwende für Konstanten constant nicht variable. 
Mein Tipp: Ein ordentlicher Editor a la Xemacs.

von Marten V. (Gast)


Lesenswert?

Guten Morgen,

und vielen Dank für eure nette Hilfe. Ich bin momentan dabei VHDL zu 
lernen, deswegen bin ich über jeder Kritik an meinem Code dankbar ;-) 
Xemacs habe ich mir angeschaut, fühle mich aber son bisschen vom 
Funktionsumfang erschlagen. Es hat aber deutlich mehr auf dem Kasten als 
Notepad++, blöd sind nur die ganzen neuen Shortcuts die man lernen muss. 
Und man muss sich das STRG+C, STRG+V abgewöhnen ;-) Ansonsten echt 
mächtig der Editor.
Mein Design funktioniert nun so wie ich es mir wünsche, besten Dank 
nochmal ;-)

Gruß
Marten

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


Lesenswert?

Marten V. schrieb:
> Mein Design funktioniert nun so wie ich es mir wünsche, besten Dank
> nochmal ;-)
Schön wäre, wenn du jetzt noch sagen würdest, was du gemacht hast. Das 
würde dann evtl. anderen helfen, die so ein Problem haben...

von Marten V. (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
Hier meine Lösung, die jedoch noch nicht entgültig richtig ist.
Ich bin bei der Simulation noch auf ein Problem gestoßen, zu beginn des 
Prozesses sind die Daten am Eingang noch nicht gültig und werden erst zu 
einem späteren Zeitpunkt angelegt. Daraus ergibt sich, dass wenn ich im 
Reset die anliegenden Daten übernehme, mein Design Daten vom Typ 'U' 
übernimmt.

Hier mein Code:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_unsigned.all;
4
use ieee.std_logic_arith.all;
5
-- numeric std für counter wert verwenden ???
6
-- 
7
-- 
8
9
entity counter is
10
  generic(TAPS : integer := 11);
11
  port(
12
    RST_N : in  std_logic;
13
    EN    : in  std_logic;
14
    CLK   : in  std_logic;
15
    D     : in  std_logic_vector(TAPS downto 0);
16
    RDY   : out std_logic);
17
end entity counter;
18
19
architecture beh of counter is
20
21
  signal d_int : std_logic_vector(TAPS downto 0);
22
23
begin
24
25
-- Counter  
26
  counter_p : process (CLK, D, RST_N)
27
    constant zeros : std_logic_vector(TAPS downto 0) := (others => '0');
28
  begin
29
    if RST_N = '0' then
30
      d_int <= D;
31
      RDY   <= '0';
32
    elsif (CLK = '1' and CLK'event) then
33
      d_int <= D;
34
      if (EN = '1') then
35
        if (d_int = zeros) then
36
          RDY <= '1';
37
        else
38
          d_int <= d_int -1;
39
          RDY   <= '0';
40
        end if;
41
      elsif (EN = '0') then
42
        RDY <= '0';
43
        d_int <= D;
44
      end if;
45
    end if;
46
  end process;
47
  
48
end architecture;

Im Anhang ein paar Waveforms aus der Simulation.

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


Lesenswert?

Marten V. schrieb:
> Ich bin bei der Simulation noch auf ein Problem gestoßen, zu beginn des
> Prozesses sind die Daten am Eingang noch nicht gültig und werden erst zu
> einem späteren Zeitpunkt angelegt. Daraus ergibt sich, dass wenn ich im
> Reset die anliegenden Daten übernehme, mein Design Daten vom Typ 'U'
> übernimmt.
Dieses D kommt aus deiner TB.
Dort sind offenbar bis zum ersten en='1' die Daten undefiniert.
Und dann wird natürlich auf einem undefinierten Zähler herumgezählt...
Zeig mal die TB.
Dort sollten für D einfach ein paar Defaultwerte angegeben werden.


Zum zeitlichen Ablauf:
es wäre besser, das en nicht genau mit dem Takt anzusteuern, denn sonst 
mußt du dich immer fragen: hat er jetzt bei der steigenden Taktflanke 
en='1' oder en='0' gesehen?
(Die Antwort daruf ist klar: er nimmt den vorhergehenden Wert, aber es 
sieht eben seltsam aus)
1
      d_int <= D;        
2
      if (EN = '1') then
3
        if (d_int = zeros) then
4
          RDY <= '1';    
5
        else
6
          d_int <= d_int -1;
7
          RDY   <= '0';  
8
        end if;
9
      elsif (EN = '0') then  -- *****
10
        RDY <= '0';
11
        d_int <= D;      
12
      end if;
13
    end if;
***** hier reicht ein einfache else, denn sonst bastelst du dir für die 
Simulation ein sehr seltsames Verhalten, wenn der 9-wertige std_logic EN 
mal nicht den Wert '0' oder '1' hat... :-o

Ich würde diese Zeilen so schreiben:
1
      d_int <= D;   -- Defaultzuweisungen
2
      RDY   <= '0'; -- werden später bei Bedarf überschrieben
3
      if (EN = '1') then
4
        if (d_int = zeros) then
5
          RDY <= '1';
6
        else
7
          d_int <= d_int -1;
8
        end if;
9
      end if;
10
    end if;

von Marten V. (marten-v)


Lesenswert?

Ich habe das in der Testbench absichtlich so vorgesehen, denn der 
Counter soll in einem größeren Projekt eingebunden werden. Der Zähler 
enthält von einer anderen Einheit die Daten, die er herunterzählen soll. 
Wann die Daten anliegen ist daher unbekannt. Deswegen hatte ich gedacht, 
nach einem initialen Reset die Daten im Register des Counters auf 
"000...0" zu setzen. Da beißt sich dann aber wieder die Katze in den 
Schwanz, denn dann wird ein RDY Signal ausgegeben...

Hier meine TB:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_unsigned.all;
4
5
entity counter_tb is
6
  generic(TAPS : integer := 11);
7
end entity counter_tb;
8
9
architecture rtl of counter_tb is
10
11
  component counter is
12
    generic(TAPS : integer := 11);
13
    port(
14
      RST_N : in  std_logic;
15
      EN    : in  std_logic;
16
      CLK   : in  std_logic;
17
      D     : in  std_logic_vector(TAPS downto 0);
18
      RDY   : out std_logic);
19
  end component counter;
20
21
  signal d_tb       : std_logic_vector(TAPS downto 0);
22
  signal clk_tb     : std_logic;
23
  signal en_tb      : std_logic;
24
  signal reset_n_tb : std_logic;
25
26
begin
27
28
-- Counter  
29
  dut_counter : counter
30
    port map(
31
      RST_N => reset_n_tb,
32
      EN    => en_tb,
33
      CLK   => clk_tb,
34
      D     => d_tb);
35
36
  clk_p : process
37
  begin
38
    clk_tb <= '1';
39
    wait for 50 ns;
40
    clk_tb <= '0';
41
    wait for 50 ns;
42
  end process;
43
44
  en_p : process
45
  begin
46
    en_tb      <= '0';
47
    reset_n_tb <= '0';
48
    wait for 100 ns;
49
    reset_n_tb <= '1';
50
    wait for 100 ns;
51
    reset_n_tb <= '0';
52
    wait for 100 ns;
53
    reset_n_tb <= '1';
54
    wait for 100 ns;
55
    en_tb      <= '1';
56
    d_tb       <= "000000001000";
57
    wait for 1600 ns;
58
    en_tb      <= '0';
59
    wait for 1400 ns;
60
    reset_n_tb <= '0';
61
    wait for 200 ns;
62
    reset_n_tb <= '1';
63
--      wait for 200 ns;
64
    en_tb      <= '1';
65
    wait for 400 ns;
66
    d_tb       <= "000001000000";
67
    wait for 500 ns;
68
69
    wait;
70
  end process;
71
  
72
end architecture;

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


Lesenswert?

Marten Vohrmann schrieb:
> Wann die Daten anliegen ist daher unbekannt.
Auf jeden Fall sollten sie aber (einen Takt) vor dem Enable anliegen, 
denn sonst ist es ja schnurzegal, was da heruntergezählt werden soll...

Wenn die Daten zusammen mit dem Enable kommen, dann kannst du sie nicht 
mehr übernehmen, denn der Enable ist ja für den Zählvorgang 
verantwortlich.

von Marten V. (marten-v)


Lesenswert?

Ja du hast recht, ich sollte das in der FSM der anderen Einheit 
berücksichtigen.
Wenn ich das enable jeweils immer einen Takt nach neuen Daten anlege, 
klappt alles wunderbar.
Gibt es dennoch eine Möglichkeit, den Counter so zu designen, dass Daten 
und EN-Signal gleichzeitig angelegt werden können ?
Mir fällt da momentan nichts besseres ein...
Vielen Dank für deine tolle Hilfe Lothar! :-)

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


Lesenswert?

Marten V. schrieb:
> Gibt es dennoch eine Möglichkeit, den Counter so zu designen, dass Daten
> und EN-Signal gleichzeitig angelegt werden können ?
Jein.
Du könntest sagen: wenn vorher en='0' war, und jetzt en='1' ist, dann 
soll nicht gezählt, sondern die Daten übernommen werden. Also eine 
Flankenerkennung basteln:
1
  signal last_en : std_logic;
2
:
3
:
4
  counter_p : process (CLK, D, RST_N)
5
    constant zeros : std_logic_vector(TAPS downto 0) := (others => '0');
6
  begin
7
    if RST_N = '0' then
8
      d_int <= D;    -- unnötig, denn erst bei Flanke von en werden die Daten validiert
9
      RDY   <= '0';
10
    elsif (CLK = '1' and CLK'event) then
11
      last_en <= EN; -- Merker
12
      d_int <= D;    -- unnötig, denn erst bei Flanke von en werden die Daten validiert
13
      RDY   <= '0';  
14
      if (EN = '1') then
15
        if (last_en='0') then -- steignede Flanke am en
16
          d_int <= D;         -- --> Daten übernehmen
17
        elsif (d_int = zeros) then
18
          RDY <= '1';
19
        else
20
          d_int <= d_int -1;
21
        end if;
22
      end if;
23
    end if;
24
  end process;
Aber ich würde das eher als eine Designschwäche ansehen denn du zählst 
dann eigentlich einen Takt falsch, weil der erste Takt ja für die 
Datenübernahme verwendet wird.

Es sei denn, du mogelst dich so raus:
1
      :
2
      if (EN = '1') then
3
        if (last_en='0') then
4
          d_int <= D-1;   
5
        elsif (d_int = zeros) then
6
        :
Aber Achtung: was machst du, wenn D = 0 ist?

> Vielen Dank für deine tolle Hilfe Lothar! :-)
De Nada... ;-)

von Marten V. (marten-v)


Lesenswert?

Du hast mal wieder recht, ganz so rosig ist das mit der Flankenerkennung 
nicht. Ich denke ich bleibe bei meinem Design und beachte bei der 
Verwendung einfach die Tatsache, dass die Daten einen Takt vor dem 
EN-Signal anliegen müssen.
Hier meine Lösung für einen Count-Down Zähler mit generischer 
Bit-Breite:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_unsigned.all;
4
use ieee.std_logic_arith.all;
5
6
entity counter is
7
  generic(TAPS : integer := 11);
8
  port(
9
    RST_N : in  std_logic;
10
    EN    : in  std_logic;
11
    CLK   : in  std_logic;
12
    D     : in  std_logic_vector(TAPS downto 0);
13
    RDY   : out std_logic);
14
end entity counter;
15
16
architecture beh of counter is
17
18
  signal d_int : std_logic_vector(TAPS downto 0);
19
20
begin
21
22
--Counter
23
  counter_p : process (CLK, D, RST_N)
24
    constant zeros : std_logic_vector(TAPS downto 0) := (others => '0');
25
  begin
26
    if RST_N = '0' then
27
      d_int <= (others => '0');
28
      RDY   <= '0';
29
    elsif (CLK = '1' and CLK'event) then
30
      d_int <= D;
31
      RDY <='0';
32
      if (EN = '1') then
33
        if (d_int = zeros) then
34
          RDY <= '1';
35
        else
36
          d_int <= d_int -1;
37
        end if;
38
      end if;
39
    end if;
40
  end process;
41
42
end architecture;

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


Lesenswert?

Und hier mein Konter-Vorschlag mit der numeric_std, synchronem Reset 
(wenn schon) und einem integer-Zähler... ;-)
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity counter is
6
  generic(TAPS : integer := 11);
7
  port(
8
    RST_N : in  std_logic;
9
    EN    : in  std_logic;
10
    CLK   : in  std_logic;
11
    D     : in  std_logic_vector(TAPS downto 0);
12
    RDY   : out std_logic);
13
end entity counter;
14
15
architecture beh of counter is
16
  signal d_int : integer range 0 to 2**TAPS-1 := 0;
17
begin
18
--Counter
19
  process begin
20
    wait until rising_edge(CLK);
21
    d_int <= to_integer(unsigned(D));
22
    RDY <='0';
23
    if (EN = '1') then
24
      if (d_int = 0) then
25
        RDY <= '1';
26
      else
27
        d_int <= d_int -1;
28
      end if;
29
    end if;
30
    if RST_N = '0' then
31
      d_int <= 0;
32
      RDY   <= '0';
33
    end if;
34
  end process;
35
end architecture;

von Marten V. (marten-v)


Lesenswert?

Hmm auch gut :-)
Kannst du mir vielleicht kurz erklären warum du Integer-Werte genommen 
hast? Wenn man sich die Hardware anschaut, was ändert sich durch die 
Verwendung von Integerwerten?

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


Lesenswert?

Marten V. schrieb:
> Kannst du mir vielleicht kurz erklären warum du Integer-Werte genommen
> hast?
Weil dann Vergleich und Zuweisungen einfach im Klartext gemacht werden 
können. Oder vergleich mal du deinen std_logic_vector und unsigned 
Zähler auf den Wert 12345.

> Wenn man sich die Hardware anschaut, was ändert sich durch die
> Verwendung von Integerwerten?
Wenn der richtige Range angegeben ist: Nichts.

von Marten V. (marten-v)


Lesenswert?

So, ich habe meinen Code nochmal überarbeitet. Die Daten sollen einfach 
übergeben werden und erst beim setzen des enable-Signals "en=1" soll der 
Zählvorgang beginnen.
In meiner letzten Beschreibung hatte ich eine Mischung aus 
kombinatorischen und sequentiellen Processen verwendet, die sich u.U. 
nicht auf einen FPGA abbilden lassen.
Über Feedback zu der neuen Beschreibung wäre ich euch dankbar :-)

1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_unsigned.all;
4
use ieee.std_logic_arith.all;
5
6
entity counter is
7
  generic(TAPS : integer := 11);
8
  port(
9
    RST_N : in  std_logic;
10
    EN    : in  std_logic;
11
    CLK   : in  std_logic;
12
    D     : in  std_logic_vector(TAPS downto 0);
13
    RDY   : out std_logic);
14
end entity counter;
15
16
architecture beh of counter is
17
18
  signal   d_int      : std_logic_vector(TAPS downto 0);
19
  signal   next_d_int : std_logic_vector(TAPS downto 0);
20
  constant zeros      : std_logic_vector(TAPS downto 0) := (others => '0');
21
22
begin
23
24
  RDY <= '1' when d_int = zeros else '0';
25
  
26
  -- Kombinatorik für Zähler
27
  counter_comb_p : process(D, EN, d_int)
28
  begin  -- process counter_comb_p
29
    if (EN = '1') and d_int /= 0 then
30
      next_d_int <= d_int-1;
31
    else
32
      next_d_int <= D;
33
    end if;
34
  end process counter_comb_p;
35
36
  --Zähler Register
37
  counter_reg : process (CLK, RST_N)
38
  begin
39
    if RST_N = '0' then
40
      d_int <= D;
41
    elsif (CLK = '1' and CLK'event) then
42
      d_int <= next_d_int;
43
    end if;
44
  end process;
45
46
end architecture;

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


Lesenswert?

Ja, gut, wird schon tun...

Aber warum nimmst du zum Zählen nicht einen Integer?

Sieh dir mal an, wie man das auch machen könnte:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity counter is
6
  generic(TAPS : integer := 11);
7
  port(
8
    RST_N : in  std_logic;
9
    EN    : in  std_logic;
10
    CLK   : in  std_logic;
11
    D     : in  std_logic_vector(TAPS downto 0);
12
    RDY   : out std_logic);
13
end entity counter;
14
15
architecture beh of counter is
16
  signal   cnt      : integer range 0 to 2**TAPS-1 := 0;
17
begin
18
19
  RDY <= '1' when cnt=0 else '0';
20
  
21
  process begin
22
     wait until rising_edge(clk);
23
     if (cnt/=0 and EN='1') then
24
        cnt <= cnt-1; 
25
     end if;               
26
     if (RST_N='0' or EN='0' or (EN='1' and cnt=0)) then 
27
        cnt <= to_integer(unsigned(D));
28
     end if;
29
  end process;
30
31
end architecture;

Marten V. schrieb:
> Die Daten sollen einfach übergeben werden und erst
> beim setzen des enable-Signals "en=1" soll der Zählvorgang beginnen.
Wenn das EN weiter gesetzt bleibt, wird dann aber auch sofort 
weitergezählt...

BTW: wozu eigentlich ein Reset?

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


Lesenswert?

Aber könnte man das nicht noch ein wenig abkürzen?
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity counter is
6
  generic(TAPS : integer := 11);
7
  port(
8
    EN    : in  std_logic;
9
    CLK   : in  std_logic;
10
    D     : in  std_logic_vector(TAPS downto 0);
11
    RDY   : out std_logic);
12
end entity counter;
13
14
architecture beh of counter is
15
  signal   cnt      : integer range 0 to 2**TAPS-1 := 0;
16
begin
17
  RDY <= ready;
18
19
  process begin
20
     wait until rising_edge(clk);
21
     if (EN='0') then
22
        cnt <= to_integer(unsigned(D));
23
        RDY <= '0';
24
     elsif (cnt/=0) then
25
        cnt <= cnt-1; 
26
     else
27
        RDY <= '1';
28
     end if;               
29
  end process;
30
31
end architecture;
Allerdings mußt du hier ein wenig mit Latency aufpassen: das 
READY-Signal kommt einen Takt später...

von Marten V. (marten-v)


Lesenswert?

Ich dachte ich verwende lieber std_logic da ich, was die Simulation und 
die Synthese angeht, auf der sicheren Seite bin. Std_logic hat ja die 
Zustände 'X', 'U', usw.

Ein Reset-Signal scheint nun wirklich überflüssig zu sein, da mein 
enable-Signal ja schon für ein Rücksetzen des Zählers sorgt.

Das Enable-Signal kommt aus einer FSM in einer höheren Hierarchie-Ebene. 
Die FSM wertet das RDY-Signal aus und setzt entsprechend nach einer 
positiven Flanke des RDY-Signals den Enable-Eingang auf 0 und setzt 
damit den Counter zurück.

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


Lesenswert?

Marten V. schrieb:
> Ich dachte ich verwende lieber std_logic da ich, was die Simulation und
> die Synthese angeht, auf der sicheren Seite bin.
Der Synthese ist das egal. Die Simulation liefe mit std_ulogic schneller 
ab (so heißt es), weil keine Auflösungstabellen (u=unresolved) 
durchforstet werden müssen...
Aber in der Praxis hat sich der std_logic durchgesetzt.

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.