2016-04-26 37 views
0

因此,我試圖實現一個計數器,它需要一個時鐘週期使能並從那裏開始計數。一旦計數器完成計數,它將發送一個時鐘週期到期。在計數器完成計數之前,該啓用將不會再次發送,並且值輸入是連續的。如何使用一個時鐘脈衝啓動計數器啓用

我在考慮只使用一個reg變量,當enable = 1時變爲高電平,一旦計數器完成計數,變爲低電平。我擔心這可能意味着鎖定我不想要...有沒有更好的方法來做到這一點?

當前代碼:

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 

回答

0

嗯,你似乎是在正確的軌道上,但你是正確的,當前的設計將意味着鎖存器。你可以通過自己的觸發器來設置hold,並且只有當你完成設置後才能進行計數,一旦你的計數完成就清除它。請注意,這會影響系統的時間,因此您必須確保所有事情都在正確的週期內發生。從描述中很難說您是否想要在value「週期」或「value + 1」週期上設置expired。爲了向您展示一些什麼你會需要做的,你的代碼來獲得它來編譯,並有適當的時機,我要去承擔一些事情:

  1. value在恆定的數量和犯規舉行當計數
  2. expired將脈衝觸發value個時鐘後start_timer設置
  3. value不會4'h0(雖然這是容易對付的,基於以下假設:1,不需要計算)
沒有改變

所以,你的模塊應該是這樣的:

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