2

我在 Verilog 中编写一个典型的 count-to-n-then-reset-to-0 计数器。我的模块具有递增和重置计数器的逻辑。

我的问题是我不知道应该在哪里定义计数器本身。

我可以将计数器(作为 inout?)传递给模块。没关系,但是计数器仍然必须在某个地方定义,所以这对我没有任何好处。

除了这个模块之外,没有其他东西应该接触计数器,所以我想在这个模块中创建计数器,而不是传入或传出。

这是合理的标准吗?如果是这样,有人会指出如何实例化计数器的参考吗?

(我在 Verilog 的第 2 天,所以要害怕,呵呵)

编辑 - 这是代码。据我所知,它有效。我还没有实现DIR == REVERSE。几个有趣的陷阱。(现在已注释掉)STEPPER=0行导致原理图中出现错误;它认为 STEPPER 与地面以及其他逻辑有关。

另外,我在某些涉及的地方使用=而不是- 我遇到了时间问题(我想。)程序分配消除了(隐藏?)问题。<=counter

module cam(
    input [7:0] DIVISOR,
    input DIR,
    input SPINDLE,
    output reg STEPPER
    );

     parameter FORWARD = 1'b1;
     parameter REVERSE = !FORWARD;

     reg[7:0] counter = 0;

    always @(posedge SPINDLE) begin
    //  STEPPER = 0;
        if (DIR == FORWARD) begin
            counter = counter + 1;
            if (counter == DIVISOR) counter = 0;
            end
        else begin
        //  counter <= counter - 1;
        //  if (counter == (-1)) counter <= DIVISOR;
            end
    end

    always @(negedge SPINDLE) begin
        STEPPER = (counter == 0) ? 1 : 0;
    end

endmodule
4

1 回答 1

1

应该只定义为模块内的寄存器。这是我的一些代码中的一个示例。

module trigger(clk, rxReady, rxData, txBusy, txStart, txData);
input clk;
input [7:0] rxData;
input rxReady;
input txBusy;
output reg txStart;
output reg[7:0] txData;

integer count81; // Number of cells received over serial (start solving after 81)
reg[8:0] data[0:8][0:8];

integer state;

always @(posedge clk) begin
    case (state)
        read:
            if (rxReady) begin
                data[count81 % 9][count81 / 9] = rxData ? 1<<(rxData-1) : -1;
                if (count81 < 80) count81 <= count81 + 1;
                else begin
                    count81 <= 0;
                    state <= solving;
                end
            end
        etc....                 
    endcase
end
endmodule

恭喜你暂时离开了 Java 世界。FPGA 是唯一看起来令人兴奋的东西了。

于 2012-09-09T23:30:21.437 回答