#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren