2016-04-26 7 views
0

Also versuche ich einen Zähler zu implementieren, der eine Eintaktzyklusaktivierung benötigt und von dort aus zu zählen beginnt. Er sendet einen Ein-Taktzyklus abgelaufen, sobald der Zähler fertig gezählt hat. Die Freigabe wird niemals erneut gesendet, bis der Zähler fertig gezählt ist und der Wert kontinuierlich ist.Wie starte ich einen Zähler mit einer Taktimpulsfreigabe

Ich dachte über die Verwendung einer Reg-Variable, die auf High geändert wird, wenn Enable = 1, und zu Low geändert wurde, sobald der Zähler beendet zu zählen. Ich fürchte, das könnte Laschen bedeuten, die ich nicht will ... Gibt es einen besseren Weg, dies zu tun?

aktuelle Code:

module Timer(
input [3:0] value, 
input start_timer, 
input clk, 
input rst, 
output reg expired 
); 

//counter var 
reg [3:0] count; 

//hold variable 
reg hold; 

//setting hold 
always @* 
begin 
    if (start_timer == 1'b1) 
     hold <= 1'b1; 
end 


//counter 
if (hold == 1'b1) 
begin 
always @ (posedge(clk)) 
begin 
    if(count == value - 1) 
    begin 
     expired <= 1'b1; 
     count <= 4'b0; 
     hold <= 1'b0; 
    end 
    else 
     count <= count + 1'b1; 
end 
end 

endmodule 

Antwort

0

Nun, Sie scheinen auf dem richtigen Weg zu sein, aber Sie sind richtig, dass Ihre aktuelle Design-Riegel bedeuten wird. Sie können dies beheben, indem Sie hold ein eigenes Flipflop machen und nur dann zählen, wenn es so eingestellt ist, wie Sie es getan haben, und es löschen, sobald Ihre Zählung abgeschlossen ist. Beachten Sie, dass dies Auswirkungen auf das Timing Ihres Systems hat. Sie müssen also sicherstellen, dass alles im richtigen Zyklus passiert. Es ist schwer aus Ihrer Beschreibung zu sagen, ob Sie wollen expired auf den "value" ten Zyklus oder "value + 1" ten Zyklus eingestellt werden. Um Ihnen zu zeigen, ein paar von dem, was youll muß, um Ihren Code zu tun, um es zu bekommen das richtige Timing zu kompilieren und haben, Im gehend, ein paar Dinge zu übernehmen:

  1. value bei einer konstanten Zahl gehalten und tat ändern sich nicht während
  2. expired Zählen auf dem value ten Taktimpuls nach start_timer gesetzt
  3. value nicht 4'h0 sein wird (obwohl dies leicht zu behandeln, da keine Zählung erforderlich basiert auf der Annahme 1)

So würde Ihr Modul wie folgt aussehen:

module Timer(
      input [3:0] value, 
      input start_timer, 
      input clk, 
      input rst, 
      output expired 
      ); 

//counter var 
reg [3:0] count; 

//hold variable 
reg hold; 

// Note you cannot assign hold from multiple blocks, so the other one has been removed 

// In order to meet the timing from assumption 2, we need to combinationally determine expired (be sure we only set it while we are counting; thus the dependence on hold) 
assign expired = (count == value - 4'd1) && (hold == 1'b1); 

//counter 
// Note, you cannot have logic outside of a procedural block! 
always @(posedge clk) begin 
    if ((hold == 1'b0) && (start_timer == 1'b1)) begin 
    hold <= 1'b1; // Hold is part of the register, making it its own flipflop 
    count <= 4'd0; 
    end 
    else if (hold == 1'b1) begin 
    if (count == value - 4'd1) begin 
     hold <= 1'b0; // Clear hold, we are done counting 
     // No need to clear count, it will be cleared at the start of the timer 
    end 
    else begin 
     count <= count + 4'd1; 
    end 
    end 
end 

endmodule