2016-03-27 16 views
1

Ich erstelle einen Downcounter auf ISE 14.7. Ich setze einen asynchronen Reset (rst_n), wenn er 0 wird, wird der Wert von counter auf init_value gesetzt.Xst: 3002 in Verilog

Aber wie ich den Code syntheize, erscheint eine Warnung: Xst3002

Code:

`timescale 1ns/1ps 

module downcounter(value, borrow, clk, rst_n, decrease, init_value, limit); 
    output reg [3:0]value;    //value of counter 
    output reg borrow;     //borrow indicator 
    input clk, rst_n, decrease;   //clock; active low reset; to decrease 
    input [3:0]init_value, limit;  //initial value; counter limit 

    reg [3:0]value_tmp, init_value_tmp; //for always block 

    //Combinational logic 
    always @(value or decrease or limit or borrow)begin 
     if(~decrease) begin value_tmp = value; borrow = 0; end  //if decrease is 0, the counter stops counting down. 
     else begin 
      if(value == 0)begin value_tmp = limit; borrow = 1; end //if the value is 0, the next value would be the limit. 
      else begin value_tmp = value + 4'b1111; borrow = 0; end //Ex: limit = 9, so that value(now) = 0, then value(next) = 9 in decimal. 
     end 
    end 
    //Sequentical logic 
    always @(posedge clk or negedge rst_n) begin 
     if(~rst_n) value <= init_value_tmp;    //asynchronous reset. set the value to initial value 
     else begin 
      value <= value_tmp; 
     end 
    end 
endmodule 

und die Meldung der Warnung:

ACHTUNG: Xst: 3002 - Diese Design enthält ein oder mehrere Register/Latches , die direkt mit der Spartan6-Architektur inkompatibel sind. Die beiden Hauptursachen hierfür sind entweder ein Register oder ein Latch beschrieben mit sowohl einem asynchronen als auch einem asynchronen Reset, oder ein Register oder Latch mit einem asynchronen Set oder Reset beschrieben, welches jedoch einen Initialisierungswert der entgegengesetzten Polarität (dh ) hat asynchroner Reset mit einem Initialisierungswert von 1). Während diese Schaltung gebaut werden kann, schafft sie eine suboptimale Implementierung in Bezug auf Fläche, Leistung und Leistung. Für eine optimale Umsetzung Xilinx empfehlen dringend, eine der folgende:

 1) Remove either the set or reset from all registers and latches 
     if not needed for required functionality 
     2) Modify the code in order to produce a synchronous set 
     and/or reset (both is preferred) 
     3) Ensure all registers have the same initialization value as the 
     described asynchronous set or reset polarity 
     4) Use the -async_to_sync option to transform the asynchronous 
     set/reset to synchronous operation 
     (timing simulation highly recommended when using this option) 

Bitte beachten Sie http://www.xilinx.com Suchbegriff „Spartan6 asynchroner Set/Reset“ für weitere Details.

Liste der Registerexemplare mit asynchronen Setz- und Rücksetz: VALUE_0 in Einheit value_1 in Einheit value_2 in Einheit VALUE_3 in Einheit

es scheint, dass die Warnung erscheint, weil der [3: 0] -Wert . Aber ich habe keine Ahnung davon. Ich habe versucht, den asynchronen Reset auf 0 zu ändern, die Warnung ist verschwunden. Aber das ist nicht was ich will.

+0

Nur ein Nebengedanke. Sie sollten beim Zurücksetzen einen Wert auf "borgen" legen. – sharvil111

+0

Bitte Code mit Kommentaren aktualisieren, was Sie eigentlich wollen und was das mögliche Verhalten Ihrer Schaltung ist –

Antwort

0

Es gibt ein paar Probleme hier mit diesem Design. Zunächst scheint init_value_tmp keinen Wert zu haben. Zweitens kann die Spartan-6-Architektur, da sie nicht konstant ist, unter Verwendung der eingebauten Rücksetzfunktionalität möglicherweise nicht auf diesen Wert zurückgesetzt werden. Ändern Sie value <= init_value_tmp;, so dass es value eine sinnvolle Konstante zuweist.

Wie für den Async-Reset scheint es gültig zu sein, aber da ich kein Spartan-6-Gerät besitze, müssten Sie es synthetisieren und es für sich selbst versuchen. Meine Sorge ist, dass jeder konstante Wert, den Sie verwenden, in die Polaritätswarnung geraten könnte, die Sie zuvor bekommen haben. Es ist wahrscheinlich, dass ein synchroner Reset "einfach funktioniert", da es einfach ein Mux im CLB ist, der in den Dateneingang geht.

Edit: In Bezug auf Ihr Ziel, einen nicht-ständigen Reset-Wert zu verwenden, würden Sie fast müssen unbedingt eine synchrone Reset (die als ein Reset mehr eine Zuweisung ist):

always @(posedge clk) begin 
    if(~rst_n) value <= init_value_tmp; 
    else begin 
     value <= value_tmp; 
    end 
end 
+0

Ich habe versucht, 'value <= init_value_tmp;' zu ändern und fügte hinzu: initial begin init_value_tmp = init_value; Ende oben. Aber die Warnung erschien noch. –

+0

Also kann ich eine nicht-Konstante nicht als Reset-Wert verwenden? –

+0

@JackyHuang Nicht asynchron. Synchron kann es sehr leicht gemacht werden. Die Nicht-Konstante wird in den Eingang des Flipflops gemultiplext, was in den meisten FPGA-Architekturen ziemlich einfach ist. Ich werde meine Antwort aktualisieren. – hexafraction