2016-05-03 115 views
0

所以,我正在研究一個簡單的寄存器,它需要一個同步輸入,並且一旦輸入被置位,就保持該狀態,直到復位被使能。使用reg輸出作爲輸入Verilog

我的代碼應該很自我解釋。這是否註冊輸出會導致任何問題?

module walk_reg(
     input Walk_Sync, //pedestrian set walk-request 
     input WR_Reset,  //FSM reset, for during the walk service 
     input clk,  //clock 
     output reg WR //output 
     ); 


    always @(posedge (clk)) 
    begin 
     if(WR_Reset) //if reset enables, output goes to 0 
      WR <= 1'b0; 
     else if (WR) //if WR is already on, keep it on 
      WR <= WR; 
     else 
      WR <= Walk_Sync; //if reset is not enabled and WR isn't already one, assign output to Walk_Sync 
    end 

    endmodule // walk_reg 

編輯變量的名稱變更,忘了改它的代碼

+0

如果WR_Reset未同步到clk,則可能有問題。 – toolic

+0

對不起,Walk_Sync和WR_Request是同一個變量,我已經重命名並忘記在代碼中實際更改它。這現在已經修復。此外,WR_Reset將同步 – qasddd

+0

然後我沒有看到任何問題。 – toolic

回答

2

沒有回答,但太多的評論。

always @(posedge (clk)) 
    begin 
     if(WR_Reset) //if reset enables, output goes to 0 
      WR <= 1'b0; 
     else if (WR) //if WR is already on, keep it on 
      WR <= WR; 
     else 
      WR <= Walk_Sync; //if reset is not enabled and WR isn't already one, assign output to Walk_Sync 
    end 

是一樣的:如果沒有條件滿足

always @(posedge clk) 
begin 
    if (WR_Reset) //if reset enables, output goes to 0 
    WR <= 1'b0; 
    else if (!WR)  
    WR <= Walk_Sync; 
end 

觸發器會保值。

從duskwuff甚至更好的建議:

always @(posedge clk) 
begin 
    if (WR_Reset) //if reset enables, output goes to 0 
    WR <= 1'b0; 
    else if (Walk_Sync)  
    WR <= 1'b1; 
end 
+1

或者,可能有點更清楚:'... else if(Walk_Sync)WR <= 1'b1'。 – duskwuff

0

一個側面說明,WR_Reset只會時才重新設置時鐘工作的失敗。 在大多數觸發器設計中,我們使用ASYNC復位沿檢測,然後是基於時鐘的復位檢測。

always @(posedge (clk)) VS always @(posedge (clk) or posedge(WR_Reset))

否則,在使用WR有條件的分配沒有問題。