Proceduren: Unterschied Altera und Xilinx

Gast #2272401
Lesenswert?

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?
Angehängte Dateien:
Gast #2272718
Lesenswert?

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
#2272841
Lesenswert?

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...
Moderator (Firma: Titel) Persönliche Seite #2273151
Lesenswert?

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...
Gast #2273528
Lesenswert?

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
Gast #2273687
Lesenswert?

>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
Gast #2273870
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren