www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Vergleichen mit std_logic_arith


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Duke Scarring (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Forum!

Hier ist mal ein Beispiel, warum man std_logic_arith nicht verwenden 
sollte:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- to avoid like the plague
--use ieee.numeric_std.all;

entity arith_test is
    port(
        value   : in  unsigned(2 downto 0);
        greater : out std_ulogic
    );
end entity arith_test;

architecture rtl of arith_test is

begin

    process( value)
    begin
        greater <= '0';

        if value > 8 then
            greater <= '1';
        end if;
    end process;

end architecture rtl;



library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- to avoid like the plague
--use ieee.numeric_std.all;

entity arith_test_tb is
end entity arith_test_tb;

architecture testbench of arith_test_tb is

    signal tb_value    : unsigned(2 downto 0);
    signal tb_greater  : std_ulogic;


begin

    dut: entity work.arith_test
        port map (
            value   => tb_value,
            greater => tb_greater
        );


    process
    begin
        tb_value <= "000";
        wait for 10 ns;
        report "--------> new value: 0";

        if tb_greater = '1' then
            report "YES: it's greater then 8";
        end if;

        tb_value <= "110"; 
        wait for 10 ns;
        report "--------> new value: 6";

        if tb_greater = '1' then
            report "YES: it's greater then 8";
        end if;

        wait; -- forever
    end process;

end architecture testbench;

Durch eine unsaubere Implementation des Vergleiches (innerhalb der 
std_logic_arith) liefert die Simulation flasche Ergebisse.
Immerhin gibt der Synthesizer (xst) eine - wenn auch nicht direkt 
ziehlführende - Warnung aus. Und er liefert das erwartete Ergebniss.

Mit numeric_std stimmt die Simulation und die Synthese (und die 
Mathematik) überein.

Das Beispiel hier mag simpel erscheinen, dafür ist es ein 
Minimalbeispiel. Man kann sich vorstellen wie lange man in einem 
größeren Projekt nach solchen Fehlern suchen kann...

Duke

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

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Immerhin gibt der Synthesizer (xst) eine - wenn auch nicht direkt
> ziehlführende - Warnung aus.
Synplify (Lattice) sagt:
@W: CL159 :"...\stdlogicarith.vhd":8:8:8:12 | Input value is unused
Klar, denn value kann mit seinen 3 Bits niemals größer als 8 
werden...



Und, falls einer fragt, das passiert auch hier, wenn man traditionsgemäß 
einen std_logic_vector übergibt und die std_logic_unsigned.all hernimmt:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- to avoid like the plague
use IEEE.std_logic_unsigned.all; -- to avoid like the plague

entity arith_test is
    port(
        value   : in  std_logic_vector(2 downto 0);
        greater : out std_ulogic
    );
end entity arith_test;

architecture rtl of arith_test is

begin

    process(value)
    begin
        greater <= '0';
        if value > 8 then
            greater <= '1';
        end if;
    end process;

end architecture rtl;



library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- to avoid like the plague
use IEEE.std_logic_unsigned.all; -- to avoid like the plague

entity arith_test_tb is
end entity arith_test_tb;

architecture testbench of arith_test_tb is

    signal tb_value    : std_logic_vector(2 downto 0);
    signal tb_greater  : std_ulogic;

begin

    dut: entity work.arith_test
        port map (
            value   => tb_value,
            greater => tb_greater
        );


    process
    begin
        tb_value <= "000";
        wait for 10 ns;
        report "--------> new value: 0";
        if tb_greater = '1' then
            report "YES: it's greater then 8";
        end if;

        tb_value <= "110"; 
        wait for 10 ns;
        report "--------> new value: 6";
        if tb_greater = '1' then
            report "YES: it's greater then 8";
        end if;

        wait; -- forever
    end process;

end architecture testbench;


Ja was passiert denn überhaupt, fragen jetzt die, die das nicht selber 
simulieren können oder wollen?
Das hier (Aldec Active-HDL):
# EXECUTION:: NOTE   : --------> new value: 0
# EXECUTION:: NOTE   : YES: it's greater then 8

# EXECUTION:: NOTE   : --------> new value: 6
# EXECUTION:: NOTE   : YES: it's greater then 8

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net