2016-05-03 86 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有条件的分配没有问题。