2

私はVerilogの学習とCPLDの操作に取り組んでいますが、行き詰まっています。私が書いたコードはLEDを切り替えますが、合成中に警告が表示され続けます。

//toggles LED on and off after 1000000 clock cycles

module LEDON(
LED,
clk
);

output LED;
reg LED;

input clk ;
wire clk;

reg [31:0] count;
wire count_max = 32'd1_000_000;

assign count_nxt = (count >= count_max) ? 32'd0 : count + 32'd1;
assign led_state_nxt = (count == count_max) ? ~LED : LED;

always @(posedge clk)

begin
    count <= count_nxt;
    LED <= led_state_nxt;

end

endmodule

次の警告が表示されます。

@W:MT420|周期1000.00nsの推定クロックLEDON|clkが見つかりました。オブジェクト「p:clk」でユーザー定義の時計を宣言してください
警告-マップ:C:/ Documents and Settings / belo / Desktop / LedOn2 / LedON2.lpf(4):FREQUENCY NET "clk"2.080000MHzのエラー。
警告-マップ:プリファレンス解析結果:1つのセマンティックエラーが検出されました
警告-マップ:プリファレンスファイル "C:/ Documents and Settings / belo / Desktop / LedOn2/LedON2.lpf"にエラーがあります。
警告-マップ:設定ファイル「C:/DocumentsandSettings/belo/Desktop/LedOn2/LedON2.prf」にセマンティックエラーがあります。

私のLPFファイルは次のようになります。

BLOCK RESETPATHS ;
BLOCK ASYNCPATHS ;
LOCATE COMP "LED" SITE "41" ;
FREQUENCY NET "clk" 2.08 MHz ;

それで、誰かがこれらの時計の警告を修正する方法を知っていますか?

4

2 に答える 2

1

この行が「wire count_max = 32'd1_000_000;」かどうかはわかりません。合成可能です。シミュレーション以外では無視される可能性があります (これはツール チェーンに依存する可能性があります。ASIC では合成できませんが、FPGA では合成できません... たぶん!!)。

count>= count_max という行は、count を 0 (count max ではない) と比較しているため、これは最適化されています (警告を参照)。これが、なんとか合成できたのに何もしなかった理由です。

複数の解決策があります。1) 代わりにパラメーターを使用します (C++ の const や C の #define のようなものです):

parameter count_max = 32'd1_000_000;

2) 小さいカウンターを使用し、オーバーフローしたときにトグルする

reg [16:0] count; // counts 131,072 cycles

assign led_next = (count == 0 ? ~LED : LED);
always @(posedge clk)
begin
    count <= count + 1;
    LED <= led_next;
end
于 2012-07-03T06:34:01.297 に答える