2015-06-05 47 views
0

我總是有2個塊,一個用於計數已經通過異步復位的時鐘週期數,另一個用於觸發某些輸入信號的復位信號。如何在Verilog中重置復位信號?

[email protected](posedge clock or posedge reset) 

begin: ClockCounter 

if(reset == 1) 
    begin 
    clock_cnt = 1; 
    end 
else 
    begin 
    clock_cnt = clock_cnt + 1; 
    end 
end 

[email protected](negedge pulse_in) 

begin: Receiver 

negedge_cnt = negedge_cnt + 1; 

reset = 1; 

.......Code goes on 

end 
end module 

我想要做的是設置復位信號爲0,一旦clock_cnt已經被重置爲1,因此可以繼續在接下來的時鐘週期計算的是什麼。如果我嘗試插入一個reset = 0;在clock_cnt = 1之後;對於同一信號,我遇到了多個驅動程序的問題。有誰知道如何做到這一點?

回答

0

除非有真正重要的原因這樣做,並且您保證了無故障的組合邏輯,否則不應該使用異步復位來清除寄存器。典型的方法是使用同步清除信號,而不是使用異步復位。

繼承人的代碼是什麼樣子:

always @(posedge clk or posedge reset) begin 
    if (reset) begin // Note that you need to separate the asynchronous reset and synchronous clear logic (ie, dont do 'if (reset | clr)') 
    counter <= 1; // Use non-blocking assignment for clocked blocks 
    end 
    else begin 
    if (clr) begin 
     counter <= 1; 
    end 
    else begin 
     counter <= counter + 1; 
    end 
    end 
end 

always @(posedge clk) begin // You need to synchronize your input pulse, Im assuming its synchronous to your clock, otherwise youll need a synchronizer 
    if (prev_pulse_in & ~pulse_in) begin 
    negedge_cnt <= negedge_cnt + 1; 
    clr <= 1; 
    end 
    else begin 
    clr <= 0; 
    end 
    prev_pulse_in <= pulse_in; 
end 
+0

謝謝你的信息響應。唯一的問題是輸入pulse_in完全獨立於系統時鐘。重置信號去了哪裏? –

+0

@fatballs復位信號仍然存在,但現在正在使用clr信號來重置計數器。如果你的輸入脈衝持續時間比你的時鐘週期短,你需要某種更高速度的時鐘來檢測它;如果它持續一個時鐘週期或更長的時間,可以使用時鐘對其進行採樣,但是您需要將其同步(請參閱此解釋,從我的快速掃描中看起來很好:https://www.doulos.com/knowhow/fpga/synchronization /) – Unn

0

我的解決辦法

[email protected](posedge clock or posedge reset) 

begin: ClockCounter 

if(reset == 1) 
    begin 
    clock_cnt = 1; 
    reset_flag = 1; 
    end 
else 
    begin 
    clock_cnt = clock_cnt + 1; 
    reset_flag = 0; 
    end 
end 

[email protected](negedge pulse_in or posedge reset_flag) 
begin 

reset = 1; 

if(reset_flag == 1) 
reset = 0; 
end