1

Verilogでカウンターを作り、ハードウェアで実現しました。しかし、私は動作を説明することはできませんコードは次のとおりです。

module clock_test(clk_in,led,rst);
input wire clk_in;
input wire rst;
output wire [7:0] led;

reg [23:0] counter = 24'b0;

assign led = counter[23:16];

always @(posedge clk_int)  begin
    if(rst) begin
     counter <= 0;
  end
else begin
     counter <= counter +1;
   end
 end
 endmodule // clock_test

ハードウェアでは、 をrst押すと、カウントしていた時点で LED がフリーズします。正確にゼロになるわけではありません。をアサートrstすると、 を解放しない限り変化しないゼロ以外のランダム パターンが表示されrstます。

私の質問は:if(rst) beginブロックが実行されると、counterが 0 に設定されます。LED は からコンボ ロジックとして割り当てられているためcounter、すぐに反映されるべきではありませんか?

4

2 に答える 2

4

同期リセットがあるため、リセット値は、リセットがアサートされた後の次のクロック エッジまで有効になりません。

リセットをアサートすると、クロックも停止しますか? それ以外の場合はコードが正しく見えるため、これが最も可能性の高い原因のようです (Greg が指摘した構文エラーを除く)。

于 2013-01-21T20:16:16.277 に答える
1

clk のタイプミスのようで、非同期ではなく同期リセットでした。

これを試して :

module clock_test(
  input        clk_in,
  input        rst,
  output [7:0] led
);

reg [23:0] counter;

assign led = counter[23:16];

always @(posedge clk_in or posedge rst)  begin
  if(rst) begin
    counter <= 0;
  end
  else begin
    counter <= counter +1;
  end
 end
 endmodule // clock_test

注意:アクティブハイリセットを使用しています(1はリセットを意味します)。実際にアクティブ ロー (0 はリセットを適用) を使用している場合は、次のように変更する必要があります。

always @(posedge clk_in or negedge rst)  begin
  if(~rst) begin
    counter <= 0;
于 2013-01-22T10:23:55.237 に答える