mikrocontroller.net

Forum: FPGA, VHDL & Co. enable, wie richtig?


Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich muss gegen irgendeine goldene regel verstossen haben
der auskommentierte code funktioniert
und der nicht auskommentierte tut es nicht

der unterschied, den ich hier sehe ist, dass im funktionierenden
code die berechnung (die addition) unabhängig von enable
immer durchgeführt wird und erst die ausgabe durch enable
"geschützt" wird.
im nicht funktionierenden code, ist die ganze berechung
im if enable eingeschlossen, und die ausgabe dagegen nicht.

vielleicht habe ich auch etwas wichtiges übersehen
der code ist unten
entity adder is
  generic(n: natural := 4);
  port(enable: in std_logic;
  x,y: in std_logic_vector(n-1 downto 0);
  z: out std_logic_vector(n-1 downto 0);
  carry: out std_logic);
end adder;

architecture Behavioral of adder is
  signal a,b: unsigned(n downto 0);
  signal c: unsigned(n downto 0);
begin

  process(enable,x,y)
  begin
    if enable = '1' then
      a <= '0' & unsigned(x);
      b <= '0' & unsigned(y);
      c <= a + b;
    end if;
  end process;
  
  carry <= c(c'high);
  z <= std_logic_vector(c(n-1 downto 0));
  
  
--  a <= '0' & unsigned(x);
--  b <= '0' & unsigned(y);
--  c <= a + b;

--  carry <= c(c'high) when enable = '1' else '-';
--  z <= std_logic_vector(c(n-1 downto 0)) when enable = '1' else (others => '-');

end Behavioral;

Autor: spartanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beim kurz drüberschauen:

falsch ist auf alle Fälle dass du im process keine Zuweisungen hast wenn 
enable = '0' ist -> das gibt Latches (pfui!)

unschön ist, dass im process in der sensitivy-List a und b fehler 
(Fehler bei Simulation, für Synthese ok).

ansonsten hast du zwei verschiedene Verhaltensweisen für die Ausgabe 
beschrieben (undauch richtig erkannt). Einmal ist die Ausgabe 
enable-gesteuert, das andere mal nicht.

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

Bewertung
0 lesenswert
nicht lesenswert
>  dass im funktionierenden code
Was soll mit dem Code funktionieren?
Die Simulation?
Dann sollte die Sens-List (wie von  spartanne (Gast) schon gesagt)
um a und b erweitert werden.
Denn nachdem sich a oder b im Prozess geändert haben,
muß der ganze Prozess neu berechnet (simuliert) werden.

Also so
architecture Behavioral of adder is
  signal a,b: unsigned(n downto 0);
  signal c: unsigned(n downto 0);
begin

  process(enable,x,y,a,b)
  begin
    if enable = '1' then
      a <= '0' & unsigned(x);
      b <= '0' & unsigned(y);
      c <= a + b;
    end if;
  end process;
  :

Oder so
architecture Behavioral of adder is
  signal a,b: unsigned(n downto 0);
  signal c: unsigned(n downto 0);
begin

  process(enable,x,y)
  begin
    if enable = '1' then
      c <= '0' & unsigned(x) + '0' & unsigned(y);
    end if;
  end process;
  :

Oder so (mit Variablen, da sollte man aber genau wissen, was man tut)
architecture Behavioral of adder is
  signal c: unsigned(n downto 0);
begin

  process(enable,x,y)
  variable a,b: unsigned(n downto 0);
  begin
    if enable = '1' then
      a := '0' & unsigned(x);
      b := '0' & unsigned(y);
      c <= a + b;
    end if;
  end process;
  :



So eine High-transparente Zuweisung ergibt später in Hardware ein Latch.
Besser ist eine Defaultzuweisung im Prozess
  process(enable,x,y)
  begin
    c <= (others=>'0');
    if enable = '1' then
      c <= '0' & unsigned(x) + '0' & unsigned(y);
    end if;
  end process;
  :

Oder ein komplett auscodierter else-Pfad
  process(enable,x,y)
  begin
    if enable = '1' then
      c <= '0' & unsigned(x) + '0' & unsigned(y);
    else 
      c <= (others=>'0');
    end if;
  end process;
  :
Das gibt zum guten Ende dann "nur" Kombinatorik.

Und sowas
>> carry <= c(c'high) when enable = '1' else '-';
'-', 'h', 'l', 'x'...  kann die Synthese nicht in Hardware ausführen. 
Dort gibt es nur 1 und 0, und in den IO-Zellen noch 'z'. Das wars. Wenn 
du innerhalb eines FPGAs ein 'z' zuweist, dann wird das als Multiplexer 
realisiert.


BTW:
> ich muss gegen irgendeine goldene regel verstossen haben
Jep, Groß- und Kleinschreibung verwenden (Bedienungsanleitung Forum).

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> '-', 'h', 'l', 'x'...  kann die Synthese nicht in Hardware ausführen.
> Dort gibt es nur 1 und 0, und in den IO-Zellen noch 'z'. Das wars. Wenn
> du innerhalb eines FPGAs ein 'z' zuweist, dann wird das als Multiplexer
> realisiert.

Ältere FPGAs (z.B. Spartan 2) haben (noch) interne Tri-State Busse. 
Allerdings sollte man wissen was man da macht.

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.