2013-03-16 44 views
0

我有以下代碼找不到爲什麼值不跳到期望在合適的時間

module POLY(CLK,RESET_n,IN_VALID,IN,OUT_VALID,OUT); 

input   CLK,RESET_n,IN_VALID; 
input [ 3:0] IN; 
output  OUT_VALID; 
output [12:0] OUT; 

reg  OUT_VALID; 
reg [12:0] OUT; 

reg  OUT_VALID_w; 
reg [12:0] OUT_w; 

reg [ 1:0] COUNT_IN, COUNT_IN_w; 
reg [ 2:0] COUNT_DO, COUNT_DO_w; 

always @(posedge CLK or negedge RESET_n) 
begin 
    if(!RESET_n) 
    begin 
     COUNT_IN <= 2'd0; 
     COUNT_DO <= 3'd0; 
    end 
    else 
    begin 
     COUNT_IN <= COUNT_IN_w; 
     COUNT_DO <= COUNT_DO_w; 
    end 
end 


always @(*) 
begin 
    if(IN_VALID == 1'b0) 
    begin 
     if(COUNT_DO == 3'd7) 
     begin 
      COUNT_DO_w = COUNT_DO; 
     end 
     else 
     begin 
      COUNT_DO_w = COUNT_DO + 1'b1; 
     end 
    end 
    else 
    begin 
     COUNT_DO_w = 3'd0; 
    end 
end 

我要問的是,爲什麼COUNT_DO沒有跳轉到1 14ns

我認爲,由於在第二總是塊敏感列表是COUNT_DOIN_VALID, 所以在啓動,重置信號觸發第一always塊,並設置COUNT_DO = 0,其改變從高阻態爲0的COUNT_DO值。所以,它會觸發第二個總是阻止COUNT_DO_w = 0 + 1 = 1。並且,在下一個正邊沿時鐘中,哪個觸發第一個總是阻止COUNT_DO <= COUNT_DO_w。但它似乎延遲一個時鐘來分配它(22ns)。我試圖找出它,但仍然不能,爲什麼它延遲一個時鐘?

Thx提前。

enter image description here

回答

4

在時間= 14ns,復位有效(RESET_N = 0),這意味着在第一總是阻止COUNT_DO = 0。在時間t = 20ns,你釋放重置和COUNT_DO保持在0.在時間= 22ns,你有你的第一個posedge CLK,它指定COUNT_DOCOUNT_DO_wCOUNT_DO更改的時間僅由第一個always塊控制,而不是第二個。

+0

但沒有negedge RESET_n是在10納秒,並立即觸發第一個塊? – 2013-03-16 19:24:45

+0

和第二塊中的敏感列表是右邊,它們是 IN_VALID和COUNT_DO? – 2013-03-16 19:26:27

+0

我的觀念不是很清楚,所以如果我錯了,請糾正我。 Thx – 2013-03-16 19:26:59

相關問題