在使用posege时如何使用组合逻辑?

时间:2019-11-26 01:36:27

标签: verilog

我是Verilog的初学者,我试图让逻辑出现在每个时钟正沿。但是,在同一块中,我需要组合逻辑,因为我正在使用for循环并在for循环中更改寄存器的值。当前,该寄存器的值始终显示为X。是否有办法在顺序块中处理此逻辑?谢谢!

代码:

output reg count;
// ...
always @(posedge clock) begin
    integer row;
    integer col;
    count <= 0;
    for (col = 0; col < 4; col = col + 1) begin
        if (col == 1)
            count <= count + 1;
        if (count == 1) begin
          //other logic that does not occur because count value = x
        end
    end
end

1 个答案:

答案 0 :(得分:3)

非阻塞分配工作不会立即将值分配给“计数”。取而代之的是,他们将作业推迟到模拟刻度线的结尾。因此,就您而言:

  1. count的初始值为x

  2. 在您的始终块count <= 0中,
  3. 会在将来的某个时间将其设置为零,但目前仍为x

  4. 在您的循环中您说count <= count + 1。但是count仍然是'x',而count + 1也是x。您要求它在将来的某个时间将x分配给计数,但是在您要求它分配'0'之后。因此,它将在模拟刻度结束时变为“ x”。结果,它将始终为“ x”。

  5. 您的if (count == 1)永远不会正确,因为count仍然是'x'。

例如,初始化计数的通常方法是产生一个复位信号

 always @(posedge clk) begin
    if (reset)
        count <= 0;
    else 
        for(...)
           if (col == 1) 
               count <= count + 1;
 end

您可以在Always块中添加if (count == 1),但请记住非阻塞分配的规则,在这种情况下,计数将在一个时钟周期后变为1。根据您的要求,您也许可以将其移动到单独的Always块中。

  always @* 
     if (count == 1) do something
     else do something else