@blue_eagle

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Verilog初心者の質問

分周器である1.のプログラムと2.のプログラムで、同じ動きをしてほしいのですが、2.のプログラムがうまく動きません。教えてください。

1.

module ClockDivider(
    input CLK_IN,
    output reg CLK_OUT
    );

reg [24:0] count;     // カウンター

always @(posedge CLK_IN) begin
    // カウンターをインクリメント
    count <= count + 1'b1;
    // カウンターが250,000,000に達したら出力信号を反転
    if (count == 25'd249999999) begin
    CLK_OUT <= ~CLK_OUT;
    count <= 25'd0;
    end
end

endmodule

2.

module ClockDivider #(
    parameter frequency = 1 
)(
    input CLK_IN,
    output reg CLK_OUT
    );

reg [24:0] count;     // カウンター
wire COUNT_VALUE = frequency * (250000000 - 1);

always @(posedge CLK_IN) begin
    // カウンターをインクリメント
    count <= count + 1'b1;
    // カウンターがCOUNT_VALUEに達したら出力信号を反転
    if (count == COUNT_VALUE) begin
        CLK_OUT <= ~CLK_OUT;
        count <= 25'd0;
    end
end

endmodule
0 likes

2Answer

Verilogの仕様に詳しくありませんが,

25'd249999999

ってどうなるのでしょう? (その値,25bitで表せない気がするのですが…?)

2つ目のプログラムでは wire COUNT_VALUE のbit幅が明示されていませんがどうなるのか? → 仮に count と bit幅が異なる場合, == での比較ってどういう意味になるのか?

…みたいな辺りの事柄が大丈夫なのでしょうか?

0Like

250,000,000は、28ビット必要です。

25'd249999999と記述してもオーバーフローしていて、実際の数値としては25'd15118975となっていると思います。


ワーニングが出てませんか?
warning: Numeric constant truncated to 25 bits.

0Like

Your answer might help someone💌