如何在verilog中拆分顺序和组合

时间:2016-04-03 14:20:34

标签: verilog counter clock

我试图在verilog中创建一个计数器,我想知道如何将顺序部分从组合部分中分离出来。

我有这个模块,它工作正常,但我不知道如何分割它?

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

    always@(posedge clk_i) begin
        if (rst_n_i == 1)
            val_o <= 0;
        else if(enable_i == 1)
            val_o <= val_o + 1;
        end

endmodule

2 个答案:

答案 0 :(得分:4)

一种方法是使用阻塞分配(always @(*))为组合部分创建=块,并使用非阻塞分配使always @(posedge clk_i)块用于连续部分({{1简单的注册。

组合中的阻止分配(<=)可以提供更快的模拟和可预测的行为,即使使用明确的敏感性列表行=而不是@(rst_n_i or enable_i or ...)。顺序逻辑中的非阻塞赋值(@(*))给出了预期的触发器行为,其中下一个值取决于先前的值。

然后代码如下:

<=

答案 1 :(得分:0)

为什么要拆分组合逻辑和顺序逻辑。 您编写的代码是优化功能的好方法。 根据您的代码风格,工具可以理解,触发器值将在enable_i上发生变化,因此工具足够智能,可以使用enable_i为触发器设置时钟门,从而降低功耗。