2016-04-02 12 views
0

Ich habe eine FSM erstellt, die Schritt für Schritt Teile einer Gleichung berechnet, dann die Eingabe aktualisiert und erneut ausführt viele Male. Jetzt möchte ich diese Ergebnisse bei jeder Iteration ansammeln.Ich möchte die resultierenden Werte akkumulieren, aber kann die Variablen nicht auf Null setzen, ohne in die verbotene Doppelbelegung zu fallen. VERILOG

Angenommen val ist der erzeugte Wert und Zval ist die sumatory der aufeinanderfolgenden Werte, ich ein Register wie dieses

always @ (sum_val) 
Zval = Zval + val; 

und initialisieren wie diese

always @ (enable) 
Zval = 0; 

Quartus-II zu verwenden versuchte, Beschwerden, die Mehrfachzuordnungen nicht auflösen können.

Wenn ich nicht initialisieren, während der Simulation, Zval bekommen ein egal von Anfang an, so Val + a egal, macht es auch egal.

Was soll ich tun? Jeder Rat würde sehr geschätzt werden.

+0

Können Sie es nicht initialisieren? – rahulcodesinverilog

+0

Meinst du den Reset-Status der FSM? Problem ist, dass ich mehrere Male bei jeder Iteration einen Reset durchführe. Wenn Sie die Summenvariable auf Null setzen, würde das vorherige Ergebnis gelöscht, während ich beabsichtige, diese Ergebnisse hinzuzufügen: S – sujeto1

Antwort

3

Ich denke, es ist sehr wichtig zu beachten, dass das, was Verilog in der Simulation tun kann, eine sehr große Obermenge von allem ist, was Sie tun können, wenn Sie Hardware beschreiben. Zum Beispiel erzeugt die Definition, die Sie für das Zval-Register bereitstellen, tatsächlich kein Register, sondern stattdessen eine Art von Flipflop an beiden Flanken von sum_val unabhängig von irgendeiner Art von Takt. Während solche Designs möglich sind, fallen sie in den Bereich des asynchronen Designs, das typischerweise aufgrund seiner Komplexität vermieden wird. Dies gilt in der Regel für das FPGA-Design, da FPGAs normalerweise davon ausgehen, dass Sie synchrone Designs erstellen und Asynchronsysteme nur sehr schlecht implementieren. Als solches kann Ihr Problem einfach durch den Aufbau eines Synchronregister gelöst werden, dass Quartus lieben und Sie werden leichter finden, mit zu arbeiten:

always @(posedge clk, negedge rst) begin 
    if (~rst) begin 
    Zval <= '0; 
    end 
    else begin 
    if (sum_val) begin 
     Zval <= Zval + val; 
    end 
    end 
end 

Dies ist die typische Form eines Synchronregister (auf clk) mit einem asynchronen Zurücksetzen rst. Wenn Sie diese Taste an der FPGA-Platine anschließen, können Sie das System jederzeit zurücksetzen, indem Sie Zval auf 0 setzen. Beachten Sie auch die separaten Klauseln für den asynchronen Teil (Zval <= '0;) und den synchronen Teil (den Rest); trennen Sie diese Klauseln immer oder das Synthesewerkzeug wird im Allgemeinen etwas Seltsames erzeugen.

+0

Das ist sehr interessant. Entschuldige meine Unwissenheit. Ich habe eine Frage. Ich habe sicherlich eine "Start" -Taste in meinem System implementiert, wäre dies die gleiche wie "zuerst", so dass dies jedes Mal, wenn ich Start-System drücken initialisieren Sie die Register und die FSM, um das Niveau zurückzusetzen. Oder ist das "erste" auch notwendig, um den Anfang zu realisieren? – sujeto1

+0

@ sujeto1 Es hängt davon ab, wie Sie Ihren 'Start' implementiert haben, ob synchron oder asynchron. Wenn es sich um einen synchronen Start handelt, müssen Sie es im obigen Beispiel zur else-Klausel hinzufügen, damit der Rumpf wie folgt aussieht: if (start) begin Zval <= '0; ende else if (sum_val) beginne Zval <= Zval + val; Ende. Wenn Ihr 'start' asynchron ist, dann wäre es im obigen Beispiel dasselbe wie 'first' und kann damit verbunden werden. Beachten Sie jedoch, dass "rst" im obigen Beispiel auf niedrig gesetzt ist, so dass ein Wert von "1'b0" das System zurücksetzt und ein Wert von "1'b1" das System laufen lässt. – Unn