Muss ein Signal in einem getakteten Prozess registriert werden (VHDL)?

Ich verstehe, dass es am besten ist, die Ausgänge aller Module zu registrieren; also, das will ich machen. Ich bin mir jedoch nicht sicher, was genau es bedeutet, ein Ausgangssignal zu registrieren.

Dh muss ich das Signal in einen getakteten Prozess einbinden damit es registriert wird? Oder kann ich einfach eine gleichzeitige Anweisung verwenden?

Es könnte eine von zwei Möglichkeiten sein:

entity mgmt_regs is
  port map
  (
    -- Internal host bus interface
    clk             : in std_logic,
    in_signal       : in std_logic,
    out_signal      : out std_logic
  );
end mgmt_regs;

architecture RTL of mgmt_regs is
signal sIn_signal    : std_logic;
signal sOut_signal   : std_logic;

begin

sIn_signal <= in_signal;

-------------------- THIS ONE?? -------------
out_signal <= sOut_signal;-------------------

process(clk)
begin 
   if (rising_edge(clk)) then
       --do other stuff

       ------------------------- OR THIS ONE?? -----------
       out_signal <= sOut_signal; ------------------------
   end if;
end process;

end architecture RTL;

Außerdem habe ich mich über Fälle gewundert, in denen ich eine Top-Entität habe. Wenn meine Unterkomponenten ihre Signale haben, die mit dem Ausgangsteil meiner oberen Entität verbunden werden, und innerhalb dieser unteren Entitäten ihr Signal registriert ist, muss ich das Ausgangssignal immer noch im oberen Blatt registrieren oder kann ich es einfach mit dem verbinden Ausgangsport?

Antworten (2)

Im Allgemeinen (99 % der Zeit) benötigen Sie für jedes Register ein Taktsignal.

Bei verilog/VHDL müssen Sie jedoch nicht die genaue Registerimplementierung angeben.
Sagen Sie es einfach, dies ist ein Bitknoten, der entweder durch Pegel getriggert oder durch einige Signale ansteigende Flanken gesteuert wird.

Wenn Sie beispielsweise einen weniger gebräuchlichen Designstil wie MS-CMOS verwenden, benötigen Sie möglicherweise keine Uhr für jedes Register. In diesem Fall könnte das Register mit einem SR-Latch dargestellt werden, das keinen Takt benötigt. Aber selbst in diesem Fall wäre es üblich, den Ausgang des SR-Latch unter Verwendung eines regulären Flip-Flops (das einen Takt erfordert) zu "statischen". Es gibt andere Beispiele, aber sie würden sehr variieren.

Jedes Mal, wenn Sie einem seriellen Pfad ein Register hinzufügen, erstellen Sie eine Zyklusgrenze (ein System vom Typ Schleuse und Damm, das von der Uhr gesteuert wird). In Bezug auf Ihre letzte Frage hängt es also von der gewünschten Funktionalität ab. Aber ich denke dein Fall nein, du musst die Ausgänge nicht registrieren. Wenn die Eingaben alle von Registern kommen, wird die Ausgabe "in diesem Zyklus" sein. Wenn Sie am Ausgang ein Register hinzufügen, wird dieser Ausgang in den nächsten Zyklus verschoben.

Der Begriff „Register“ bezieht sich auf ein logisches Speicherelement, das fast immer ein Flip-Flop ist. Meistens werden Sie feststellen, dass es sich bei Designs um D-Typ-Flip-Flops oder DFF handelt.

Die Idee, dass alle Modulausgänge aus Registern stammen, wird manchmal als anzustrebende Faustregel rübergebracht. Allerdings ist es sehr subjektiv.

Es ist beispielsweise eine gute Idee, wenn Sie viele Module haben, die in verschiedenen Designs für FPGAs/ASICs mit vielen Registern wiederverwendet werden.

Es ist eine schlechte Idee, wenn Sie sich die Latenz, die durch die zusätzlichen Takte für die Signale zum Erreichen der Ziele verursacht wird, nicht leisten können oder keine Zeit damit verschwenden möchten. Oder wenn Sie ein kleines Gate-Gerät verwenden oder wenn Ihr Zielgerät sowieso sehr voll sein wird.

(Ich bin mir sicher, dass die Leute noch mehr Gründe nennen können, aber Sie verstehen schon. Ich bevorzuge das „Nein“-Lager, aber meine Umstände sind normalerweise die, die ich für „schlechte Idee“ aufgelistet habe. Meine Designs werden oft von mir allein von Grund auf neu produziert .)