www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Fehlermeldung mit unsigned


Autor: Andreas Hutstein (hutstein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche mit folgendem Codeausschnitt einen Dezimal zu 7 Segment 
Decoder zu bauen.
Es kommt jedoch folgende Fehlermeldung:

Error (10621): VHDL Use Clause error at SegmentDecoder.vhd(16): more 
than one Use Clause imports a declaration of simple name "unsigned" -- 
none of the declarations are directly visible

##################################################
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.std_logic_arith.all;
use IEEE.numeric_std.all;

ENTITY SegmentDecoder IS
  PORT (
    bit : in std_logic_vector(4 downto 0);
    seg1,seg2 : out std_logic_vector(6 downto 0));
END SegmentDecoder;

ARCHITECTURE Behavior OF SegmentDecoder IS
SIGNAL geteilt : unsigned(3 downto 0);
SIGNAL modrest : unsigned(3 downto 0);

COMPONENT Decoder
  PORT (
    binaer:IN STD_LOGIC_VECTOR(3 downto 0);
    segmente: OUT STD_LOGIC_VECTOR(6 downto 0)); --ausgangsports
END COMPONENT;

BEGIN
  dec1 : Decoder
    PORT MAP (geteilt,seg1);
  dec2 : Decoder
    PORT MAP (modrest,seg2);
PROCESS (bit)
BEGIN
  geteilt <= bit mod 10 ;
  modrest <= bit / 10 ;
END PROCESS;
END Behavior;

##################################################

Autor: Philip Kirchhoff (plip)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube Du darfst die beiden:

USE IEEE.std_logic_arith.all;
use IEEE.numeric_std.all;

nicht gleichzeitig benutzen, weil der Typ unsigned in beiden deklariert 
ist.

Autor: Andreas Hutstein (hutstein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Tipp... das hat soweit funktioniert...

jetzt kommt folgender Fehler:
Error (10327): VHDL error at SegmentDecoder.vhd(33): can't determine 
definition of operator ""mod"" -- found 0 possible definitions

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit std_logic_vector kann man nicht rechnen, verwende unsigned oder 
signed (siehe Rechnen in VHDL).

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Andreas Hutstein (hutstein)

>Error (10327): VHDL error at SegmentDecoder.vhd(33): can't determine
>definition of operator ""mod"" -- found 0 possible definitions

Den MOD Operator kannst du dir abschminken, der ist nicht 
synthetisierbar.

MFG
Falk

Autor: Philip Kirchhoff (plip)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht es denn eigentlich überhaupt Sinn, da wo bitvektoren als Zahlen 
interpretiert werden noch etwas anderes als signed und unsigned zu 
verwenden? Wenn ich das nur zum Rechnen mache muss ich ja ständig 
konvertieren.

Autor: Andreas Hutstein (hutstein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie komme ich dann von einer 5bit binär codierten Zahl zu zwei 7bit 
Ergebnissen für zwei 7 Segment Anzeigen?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind lookup-Tables eine Option? Bei der Größe sollte das noch nicht 
allzu weh tun.

Autor: Andreas Hutstein (hutstein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich wollte ich vermeiden das ganze statisch zu machen... auch 
wenn hier die zahlenwerte nur von 0-31 gehen... das ganze sollte evtl. 
auch größere Zahlen darstellen können

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FPGA/VHDL sind leider noch nicht meine Domäne.

Wenn es bei Zahlen zw. 0 und 99 bleibt, wäre mein Ansatz einen 
Dividierer mit einem festem Divisor von 10 zu erstellen. Der sollte sich 
extrem optimieren lassen. Denke aber, hier kennt jemand eine fertige 
Lösung zu.

Autor: Philip Kirchhoff (plip)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab da noch was für ein Spartan 3e Starter Kit. Passt vielleicht nicht 
genau zu Deiner Frage, aber so als Ansatz...
-- Ansteuerung der 7_SegmentAnzeige Xilinx-Board - Spartan3
--

-------------------------------------------------------
  -- Pinzuweisungen im Top-Level:
  --attribute LOC: string;
  --attribute LOC of anzeige: signal is "E14 G13 N15 P15 R16 F13 N16 P16";
  --attribute LOC of mux_u: signal is "E13 F14 G14 D14";
-------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all; 


package spartan3_anzeige_pack is
--Ausgabe von vier vier-bit Dualzahlen 
component dual4_7Segment 
  port(
    clk:      in std_logic;
    AN3:     in  std_logic_vector(3 downto 0);    --Anzeige links
    AN2:     in  std_logic_vector(3 downto 0);    --      .
    AN1:     in  std_logic_vector(3 downto 0);    --      .
    AN0:     in  std_logic_vector(3 downto 0);    --Anzeige rechts
    dps:     in  std_logic_vector(3 downto 0);  --Dezimalpunkte von links nach rechts
    seg_out: out std_logic_vector(7 downto 0);    --Ausgang zur Anzeige
    mux_u:   out std_logic_vector(3 downto 0)      --Auswahl/multiplexen der Anzeige
  );
end component;
end spartan3_anzeige_pack;
----------------------------------------------------------------------------------


library IEEE;
use IEEE.std_logic_1164.all; 
use work.freq_pack.all;

entity dual4_7Segment is
  port(
    clk:   in std_logic;
    AN3:     in  std_logic_vector(3 downto 0);
    AN2:     in  std_logic_vector(3 downto 0);
    AN1:     in  std_logic_vector(3 downto 0);
    AN0:     in  std_logic_vector(3 downto 0);
    dps:     in  std_logic_vector(3 downto 0); 
    seg_out: out std_logic_vector(7 downto 0);
    mux_u:   out std_logic_vector(3 downto 0)
   );
 
end dual4_7Segment;  

architecture  verhalten of dual4_7Segment is

signal Sieben_Segment_Ausgang    : std_logic_vector(7 downto 0);
signal sig_u                     : Std_logic_vector(3 downto 0);
signal mux_takt :  std_logic;

begin
  process(Sig_u)
  begin
    case sig_u is
      when "0000" => Sieben_segment_Ausgang(7 downto 1) <= "0000001";
      when "0001" => Sieben_segment_Ausgang(7 downto 1) <= "1001111";
      when "0010" => Sieben_segment_Ausgang(7 downto 1) <= "0010010";
      when "0011" => Sieben_segment_Ausgang(7 downto 1) <= "0000110";
      when "0100" => Sieben_segment_Ausgang(7 downto 1) <= "1001100";
      when "0101" => Sieben_segment_Ausgang(7 downto 1) <= "0100100";
      when "0110" => Sieben_segment_Ausgang(7 downto 1) <= "0100000";
      when "0111" => Sieben_segment_Ausgang(7 downto 1) <= "0001111";
      when "1000" => Sieben_segment_Ausgang(7 downto 1) <= "0000000"; 
      when "1001" => Sieben_segment_Ausgang(7 downto 1) <= "0000100";
      when "1010" => Sieben_segment_Ausgang(7 downto 1) <= "0001000";  
      when "1011" => Sieben_segment_Ausgang(7 downto 1) <= "1100000";
      when "1100" => Sieben_segment_Ausgang(7 downto 1) <= "0110001";  
      when "1101" => Sieben_segment_Ausgang(7 downto 1) <= "1000010";
      when "1110" => Sieben_segment_Ausgang(7 downto 1) <= "0110000";
      when "1111" => Sieben_segment_Ausgang(7 downto 1) <= "0111000";
      when others => Sieben_segment_Ausgang(7 downto 1) <= "0000000";     
    end case;

  end process;
  
  seg_out <= Sieben_Segment_ausgang;
    
  Takt: frequenzteiler generic map(25000)
        port map(clk, '0', '1', mux_takt);

  mux1:  Process(mux_takt) 
   variable mux: integer:=0;
   begin
     if (mux_takt'event and mux_takt = '1') then
       if mux = 0 then
         Sig_u <= AN3;
         mux := mux+1;
         mux_u <= "0111";   
      Sieben_segment_Ausgang(0) <= not dps(3); --Dezimalpunkt
       elsif mux = 1 then
         Sig_u <= AN2;
         mux := mux+1;
         mux_u <= "1011";
      Sieben_segment_Ausgang(0) <= not dps(2); --Dezimalpunkt
       elsif mux = 2 then
         Sig_u <= AN1;
         mux := mux+1;
         mux_u <= "1101";
      Sieben_segment_Ausgang(0) <= not dps(1); --Dezimalpunkt
       elsif mux = 3 then
         Sig_u <= AN0;
         mux := 0;
         mux_u <= "1110";   
      Sieben_segment_Ausgang(0) <= not dps(0); --Dezimalpunkt    
       end if;
     end if;
   end process;
   
end  verhalten;



Autor: Ralph N. (ralph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..einfach ein case, so wie Philip das schon postet! was willste da groß 
rumrechnen? dividieren ist doch immer scheiße, erzeugt einfach zu viel 
logic. das ist meine meinung! : D

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.