2017-05-14 4 views
-1

Ich habe dieses Problem mit der VHDL-Synthese. Ich habe in mehreren Artikeln gelesen, dass die "wait" -Anweisung synthetisierbar ist, wenn ich nur einen "wait to" -Prozess verwende, also habe ich das gemacht. Also habe ich versucht, einen Zähler zu machen, der anzeigt, in welchem ​​Stockwerk ich bin (mein Projekt besteht aus einem Aufzug in Logic Design), und er sollte die Türen für 5 Sekunden auf Etagen öffnen, die bestellt wurden. Das Problem ist mit der Warteanweisung. Ich weiß nicht, was ich ersetzen soll, damit es auch in ISE funktioniert.Warteanweisung synthetisierbar sein

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use ieee.std_logic_arith.all; 

entity counter is 
port(clk1: in std_logic; 
enable2:in std_logic; 
input_mux: in std_logic; 
dir: in std_logic; 
reset,s_g,s_u: in std_logic; 
q_open: out std_logic; 
q: out std_logic_vector(3 downto 0)); 
end counter; 

architecture c1 of counter is 

signal flag: std_logic:='0'; 

component test 
port(clock: in std_logic; 
a: in std_logic_vector(3 downto 0); 
notify: out std_logic); 
end component;  



begin 
delay: test port map(clk1,"0101",flag); 
process 
variable temp:std_logic_vector(3 downto 0):="0000"; 
variable q_open_var:std_logic:='0'; 

begin 
    if (enable2='1') then 
    if (s_g='1' and s_u='1') then 


    if (RESET='1') then temp:="0000"; 
    else if (CLK1'EVENT and CLK1='1') then 
    if (DIR='1') then temp:=temp+1; 
    elsif(DIR='0') then temp:=temp-1; 
    end if; 
    end if; 
    end if; 
    end if; 
    end if; 
    if (input_mux='1') then q_open_var:='1'; 
     q_open<=q_open_var; 
     wait until (flag'event and flag='1'); 
     q_open_var:='0'; 
     end if; 
    q<=temp; 
    q_open<=q_open_var; 
wait on clk1, reset; 
end process; 
end c1; 
+1

XST.pdf, Ch. 14 XST VHDL-Sprachunterstützung, VHDL-Sequenzialkreise, [VHDL-Sequenzieller Prozess ohne eine Empfindlichkeitsliste] (https://i.stack.imgur.com/Ugyppl.jpg). Siehe auch [VHDL Multiple Wait Statements Beschreibungen] (https://i.stack.imgur.com/4eZ4i.jpg). Die Unterstützung kann sich je nach Gerätefamilie unterscheiden, Xilinx geht durch Werkzeugübergänge, die zu Vivaldo führen. Lesen Sie das Fine-Handbuch, zeigen Sie Ihre Fehlermeldungen an und geben Sie ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) an. – user1155120

+0

Vertrauen Sie keinem Artikel in Bezug darauf, was für die Synthese unterstützt wird. Sie können sich nur auf Dokumente des Herstellers Ihres Geräts verlassen. Lies was @ user1155120 zur Verfügung gestellt hat. – Staszek

Antwort

1

Obwohl diese Struktur unterstützt wird, haben Sie die Grenze überschritten, was unterstützt wird. Das Synthesewerkzeug muss aus dem, was Sie codieren, Register generieren. Ein Register hat einen Takt und einen Reset-Eingang, aber das Synthese-Tool kennt die Wörter clk1 und reset nicht. I.e. Schreiben Sie

wait on clk1, reset; 

Das Tool wird nicht wissen, was der Reset ist, noch was die Uhr ist. Tatsächlich werden beide Signale als Taktauslöser betrachtet.

Aber Sie Design ist problematischer, wie Sie If-Anweisungen vor dem asynchronen Reset und Clock-Trigger haben. Obwohl das Clock-Gating unterstützt wird, haben Sie es wahrscheinlich nicht beabsichtigt.

Dann gibt es eine/Sekunde/Clock-Trigger in dir Aussage: wait until (flag'event and flag='1');. Ich weiß nicht, was du da machst, aber wie würdest du dir das in Hardware vorstellen?

Sie sollten sich bei vorhersehbarem Verhalten wirklich an den Standard/empfohlenen Codierungsstil halten. I.e.

library ieee; 
use ieee.numeric_std.all; 

[...] 
    signal temp : unsigned(3 downto 0) := (others => '0'); 
begin 
    temp_proc: process(clk1, reset) 
     variable q_open_var : std_logic := '0'; 
    begin 
    if rising_edge(clk1) then 
     if enable2='1' and s_g='1' and s_u='1' then 
      if dir = '1' then 
       temp <= temp + 1; 
      elsif dir = '0' then 
       temp <= temp - 1; 
      end if; 
     end if; 
    end if; 
    if reset = '1' then 
     temp <= (others => '0'); 
    end if; 
end process; 

q <= std_logic_vector(temp); 

(ich ließ den q_open Teil, da unklar ist, was Sie wollen. Machen Sie einen separaten Prozess für das, da es nicht abhängig von reset ist)

P. S. Ich mag die fünf Zeilen von end if; die meisten;) Bitte verwenden Sie die richtige Einrückung beim nächsten Mal. Und benutz 'elsif' nicht 'sonst wenn'.

+0

Ja, Entschuldigung für diese "Ende wenn" Zeilen haha. Ich wollte q_open gleich "1" machen, wenn input_mux für 5 Taktimpulse "1" ist (natürlich synthetisierbar). Wie mache ich das? –

+0

@ AndreiBraşoveanu Zwei Optionen: 1) Einführung eines "Zählers", der von 4 bis 0 zählt: set 'q_open <= '1'; count <= 4; 'und dann' if count = 0 dann q_open <= '0''. 2) benutze Register in einer Reihe, um ein Signal 5 Taktimpulse zu übertragen und dieses mit einem Ser-Reset-Flip-Flop zu kombinieren. – JHBonarius

+0

Ich habe das gemacht, es funktioniert gut. Obwohl ich einen D Flip-Flop-Inhalt nicht bekommen kann, bevor er zurückgesetzt wird (wegen der Port-Karten habe ich die Signale verknüpft). Wie kann ich den Reset nur um sehr wenige ns verzögern, damit ich den Inhalt zuerst verwenden kann? (synthetisierbar) –