2016-04-03 126 views
0

我想在verilog中做一個計數器,我想知道如何拆分組合順序部分。如何拆分順序和組合verilog

我有這個模塊,它工作正常,但我不知道如何分割它?

module counter4bits(
    input clk_i, 
    input rst_n_i, 
    input enable_i, 
    input up_down_i, 
    output reg[3:0] val_o); 

    [email protected](posedge clk_i) begin 
     if (rst_n_i == 1) 
      val_o <= 0; 
     else if(enable_i == 1) 
      val_o <= val_o + 1; 
     end 

endmodule 

回答

4

的一種方法是使always @(*)塊使用阻塞賦值(=)的組合的部分,並且使always @(posedge clk_i)塊使用非阻塞賦值(<=),以簡單的REG順序部分。

即使使用明確的靈敏度列表行@(rst_n_i or enable_i or ...)而不是@(*),組合中的阻止賦值(=)也可以提供更快的仿真和可預測的行爲。順序邏輯中的非阻塞賦值(<=)給出了下一個值取決於先前值的預期觸發器行爲。然後

的代碼如下:

module counter4bits(
    ... input/output with no change 
    reg [3:0] val_nxt; // Not flip-flop but used in always @(*) thus reg 

    always @(*) begin 
     if (rst_n_i == 1) 
      val_nxt = 0; 
     else if(enable_i == 1) 
      val_nxt = val_o + 1; 
     end 

    always @(posedge clk_i) 
     val_o <= val_nxt; 

endmodule 
0

要拆分的組合和時序邏輯爲什麼。 您所寫的代碼對於功耗優化來說是很好的風格。 使用您的代碼風格,工具可以理解觸發器的值將在enable_i上發生變化,因此工具足夠智能,可以使用enable_i爲觸發器提供時鐘門,從而降低功耗。