Ich habe ein ganz einfaches Testprogramm mit einer Unter-Procedure. >>>>>>>>>>>>>>>>>>>>>>> library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity testprocedure is Port ( signal Clock : in STD_LOGIC; signal Command : in STD_LOGIC; signal Answer : out STD_LOGIC); end testprocedure; architecture Behavioral of testprocedure is procedure AA is begin if Command = '1' then Answer <= '1'; else Answer <= '0'; end if; end procedure AA; begin main: process(Clock,Command) is begin if rising_edge(Clock) then AA ; end if; end process; end Behavioral; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Altera Quartus kompiliert das wunderbar und erzeugt auch eine Logik dafür. Bei Xilinx ISE 13.1 bekomme ich folgende Fehlermeldung: HDLParsers:3426 -Line 16. Can not drive signal Answer in subprogram AA. Ich möchte aber nicht alle Signale, die ja Entity-Global sind, noch an die Procedure extra weiter geben müssen. Meiner Meinung nach müßte die Procedure so kompilieren. Denke ich falsch? Hat Xilinx eine Einschränkung? Kann ich Answer in der Procedure zuweisen, ohne es im Procedure-Kopf übergeben? Wenn Altera mehr kann, als die VHDL-Spec, wie muss das Programm nach der reinen VHDL-Spec aussehen?
Probier mal, die Prozedur in den Prozess zu packen:
1 | begin
|
2 | |
3 | main: process(Clock,Command) |
4 | procedure AA is |
5 | begin
|
6 | if Command = '1' then |
7 | Answer <= '1'; |
8 | else
|
9 | Answer <= '0'; |
10 | end if; |
11 | end procedure AA; |
12 | |
13 | begin
|
14 | if rising_edge(Clock) then |
15 | AA ; |
16 | end if; |
17 | |
18 | end process; |
VG, SuperWilly
was stoert es dich, wenn du die Signale bei der Prozedur definieren musst? Ich verwende Prozeduren oder Funktionen, wenn ich 'oft', aka mehr als einmal, etwas ausfuehren will, im Normalfall mit unterschiedlichen Parametern/Werten... Und wenn du die Parameter angibst, hast du auch noch ein checking bzgl. 'in', 'out', 'inout'; und das ist auch nicht zu verachten. Dass Altera das schluckt finde ich eher befremdlich...
Bernd L. schrieb: > Dass Altera das schluckt finde ich eher befremdlich... Lattice (Synplify) macht da auch irgendwas draus... Aber ich finde dieses Konstrukt mit den globalen Signalen auch ein wenig haarsträubend. Diese Prozedur kann ja sowieso nur von 1 Stelle aus aufgerufen werden, ich glaube nicht, dass der Synthesizer hier einen Aufruf aus 2 getrennten Prozessen packt...
Was hilft es, dass die Synthese-Tools diese Beschreibung z.T. schlucken, wenn wann sie nicht simulieren kann ? Modelsim schluckt die dubiose Beschreibung jedenfalls nicht! Also Prozedur rein in den Prozess. VG, SuperWilly
SuperWilly schrieb: > Modelsim schluckt die dubiose Beschreibung jedenfalls nicht! Also > Prozedur rein in den Prozess. Nein, eher raus mit der Verwendung von Signalen in der Prozedur, welche der Prozedur nicht explizit übergeben wurden!
>Nein, eher raus mit der Verwendung von Signalen in der Prozedur, welche >der Prozedur nicht explizit übergeben wurden! Diese Ansicht teile ich nicht. Es kann durchaus Sinn machen, gewisse Beschreibungsteile in Prozeduren auszulagern. Wieso soll man dann Prozess-Variablen und globale Signale explizit übergeben, wenn deren direkter Zugriff durch Einbindung der Prozedur in den Prozess geschenkt ist ? VG, SuperWilly
SuperWilly schrieb: > Diese Ansicht teile ich nicht. Es kann durchaus Sinn machen, gewisse > Beschreibungsteile in Prozeduren auszulagern. Wieso soll man dann > Prozess-Variablen und globale Signale explizit übergeben, wenn deren > direkter Zugriff durch Einbindung der Prozedur in den Prozess geschenkt > ist ? Gegenfrage: Wieso macht man bei herkömmlichen Programmiersprachen nicht alle Variablen global, wenn man auf die weiße den Zugriff auf alles ohne Parameterübergabe geschenkt bekommt?
Zeig mir ein kleines VHDL-Beispiel, bei dem der Gültigskeitraum von Variablen oder Signalen zu funktionalen Problemen führt, ohne dass der Compiler es einem um die Ohren haut. VG, SuperWilly
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.