[Code] [VHDL] Funktion Probleme *ungelöst*

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Xen0n, 19. Dezember 2009 .

  1. 19. Dezember 2009
    [VHDL] Funktion Probleme *ungelöst*

    Hi Leute.

    Ich beschäftige mich noch nicht lange mit VHDL. Ich habe zum Einstieg ein Programm geschrieben (mit VHDL und Xilinx ISE 10.1), welches auf einem FPGA-Board (Spartan 3E) auf einem 7 segment display bis 9 zählt. Hat sogar funktioniert. Jetzt wollte ich (da ich das "Projekt" ausbauen möchte) die Übersetzung des binären BCD Counters zur dezimalen Darstellung auf dem 7seg Display in eine Funktion auslagern.
    Leider bekomme ich 2 Fehler und weiß nicht was falsch ist.

    Hier der Code:
    Code:
    entity SekBCD is
     port(
     clk: in std_logic;
     ownClk :inout std_logic;
     segDis : inout std_logic_vector (7 downto 0);
     an : inout std_logic_vector (3 downto 0);
     anTmp : inout std_logic_vector (3 downto 0)
     );
    end SekBCD;
    
    
    architecture Behavioral of SekBCD is
    
     --function gets a binary number and translates it into a 
     --decimal number, displayable on a 7 seg display
     function printIt ([color=green]signal[/color] number : in std_logic_vector(3 downto 0)) 
     return std_logic_vector (7 downto 0) IS 
     begin
     [color=red]case number is --Fehler: "Undefined symbol 'number'." [/color]
     --DP a b c d e f g 
     when "0000" => return "10000001"; 
     when "0001" => return "11001111";
     when "0010" => return "10010010";
     when "0011" => return "10000110";
     when "0100" => return "11001100";
     when "0101" => return "10100100";
     when "0110" => return "10100000";
     when "0111" => return "10001111";
     when "1000" => return "10000000";
     when "1001" => return "10000100";
     when others => null; 
     end case; 
     return null;
     end printIt;
    
     signal divider : integer;
     signal bcd: std_logic_vector(3 downto 0); 
    
    begin
     
     --freq. divider: 50 MHz to 1 Hz
     process(clk)
     begin
     if (clk'event and clk='1') then
     divider <= divider + 1; 
     if divider = 25000000 then
     if ownClk = '1' then
     ownClk <= '0';
     else
     ownClk <= '1';
     end if;
     divider <= 0;
     end if;
     end if; 
     end process;
    
     --count +1, every second (1 Hz)
     process(ownClk) 
     begin 
     if (ownClk'event and ownClk='1') then
     bcd <= bcd + '1'; 
     if bcd = "1001" THEN
     bcd <= "0000"; 
     end if;
     end if;
     end process;
    
     --display bcd on 7 seg display
     process(bcd) 
     begin 
     an <= "1110";
     [color=red]segDis <= printIt(bcd); --Fehler: "Undefined symbol 'printIt'."[/color] 
     end process;
     
    end Behavioral;
    
    Ihr müsst euch nur das rot markierte angucken, die Fehlermeldung habe ich dahinter geschrieben.
    Im Prinzip hat ja schonmal alles funktioniert, nur der Function-Call funktioniert nicht und warum "number" undefined ist, versteh ich nicht.
    So benutzt man doch Funktionen, oder nicht?

    falls es interessiert:
    Spoiler
    process(clk) bricht einfach nur den 50 MHz Takt des Boards auf 1 Hz runter. "ownClk" ist dann mein "richtiger" Takt, der auch verwendet wird um "bcd" hochzuzählen, welcher bis 9 zählt.

    der port "an" aktiviert einfach nur das rechte Segment (von 4 stk.).

    und falls ihr euch wundert: die ganzen ports vom display und vom clk signal sind alle in einer .ucf-file definiert. aber daran stimmt alles.

    Achso und der Fehler kommt bei der Synthese.

    Mal gucken ob mir hier jemand helfen kann

    Danke im Voraus, bw gibts natürlich.

    edit: kleinigkeit geändert (mit grün markiert) - behebt das Problem aber nicht
     
  2. 19. Dezember 2009
    AW: [VHDL] Funktion Probleme

    Kenne VHDL zwar nicht versuch die aber mal zu Helfe. Die "Sprache" sieht ja mal nach nem billigem abklatsch von Delphi (Pascal) aus.

    Hab mal ein paar Funktionsdefinitionen angeschaut:
    Kann es sein das du anstatt end printIt; das schreiben musst end function printIt;

    Ansonsten sieht der Code in Ordnung aus.

    Mfg Rushh0ur
     
  3. 19. Dezember 2009
    AW: [VHDL] Funktion Probleme

    Falsch... wer keine Ahnung hat... VHDL ist eine Sprache zur Beschreibung logischer Schaltungen für FPGA's z.B.

    Code:
    entity SekBCD is
     port(
     clk: in std_logic;
     ownClk :inout std_logic;
     segDis : inout std_logic_vector (7 downto 0);
     an : inout std_logic_vector (3 downto 0);
     anTmp : inout std_logic_vector (3 downto 0)
     );
    end SekBCD;
    
    
    architecture Behavioral of SekBCD is
    [color=red]begin[/color]
    
     --function gets a binary number and translates it into a 
     --decimal number, displayable on a 7 seg display
     function printIt (number : in std_logic_vector(3 downto 0)) 
     return std_logic_vector (7 downto 0) IS 
     begin
     case number is --Fehler: "Undefined symbol 'number'." 
     --DP a b c d e f g 
     when "0000" => return "10000001"; 
     when "0001" => return "11001111";
     when "0010" => return "10010010";
     when "0011" => return "10000110";
     when "0100" => return "11001100";
     when "0101" => return "10100100";
     when "0110" => return "10100000";
     when "0111" => return "10001111";
     when "1000" => return "10000000";
     when "1001" => return "10000100";
     when others => null; 
     end case; 
     return null;
     end printIt;
    
     signal divider : integer;
     signal bcd: std_logic_vector(3 downto 0); 
    
     
     --freq. divider: 50 MHz to 1 Hz
     process(clk)
     begin
     if (clk'event and clk='1') then
     divider <= divider + 1; 
     if divider = 25000000 then
     if ownClk = '1' then
     ownClk <= '0';
     else
     ownClk <= '1';
     end if;
     divider <= 0;
     end if;
     end if; 
     end process;
    
     --count +1, every second (1 Hz)
     process(ownClk) 
     begin 
     if (ownClk'event and ownClk='1') then
     bcd <= bcd + '1'; 
     if bcd = "1001" THEN
     bcd <= "0000"; 
     end if;
     end if;
     end process;
    
     --display bcd on 7 seg display
     process(bcd) 
     begin 
     an <= "1110";
     segDis <= printIt(bcd); --Fehler: "Undefined symbol 'printIt'." 
     end process;
     
    end Behavioral;
    
    Ungetestete Vermutung (siehe änderung in rot)
    Das begin der architecture vor die function setzen.

    Greetz Jojo
     
  4. 19. Dezember 2009
    AW: [VHDL] Funktion Probleme

    Selbert Falsch... wer keine Ahnung hat...

    Nach dieser Dokumentation (Seite 5 [8]) ist die Funktionsdefinition / dekleration an der Position an der er es stehen hat richtig!

    Die Sprache VHDL zur Beschreibung logischer Schaltungen für FPGA's sieht sehr stark nach Delphi (Pascal) aus und meiner Meinung ne verunstalltung der "Sprache" (da blickt man ja gar nicht mehr durch), aber das ist ein anderes Thema.

    Mfg Rushh0ur
     
  5. 19. Dezember 2009
    AW: [VHDL] Funktion Probleme

    Ich danke euch beiden für die Bemühungen. Leider ist die Lösung des Problems nicht dabei

    Gibt es weitere Vorschläge?
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.