5

ティック カウンター用の Verilog プログラムを作成する方法を知りたいと思っていました。高速入力がローの場合、出力ティックは 150 ミリ秒ごと (7500000 サイクルごと) に 1 サイクルハイになります。clk 周期は 20ns です。高速入力がハイの場合、ティックは 1 クロック サイクルおきに 1 サイクルハイになる必要があります。

clkサイクルをカウントし、サイクル数が満たされたときにカウントを使用してティックを高く出力する必要があると考えていますが、動作させることができないようです。

ここに私のコードがあります:

module tick_counter(
  input  clk,
  input  reset,
  input  fast,
  output reg tick
);

reg count;

always @(posedge clk) begin
  count <= count + 1;
  if((fast == 1)&&(count == 2)) begin
    tick <= 1;
  end
  else if(fast == 0)&&(count == 7500000)) begin
    tick <= 1;
  end
end
endmodule
4

2 に答える 2

4

カウンターの幅はわずか1ビットで、リセットは含まれていません。また、必要に応じてカウンターをゼロにすることもありません。== 2は、== 7500000の位相シフトになります。試してみてください:

module tick_counter(
  input  clk,
  input  reset,
  input  fast,
  output reg tick
);

reg [22:0] count;

always @(posedge clk or negedge reset) begin
  if (~reset) begin
    count <= 'd0;
    tick  <=   0;
  end
  else begin
    if((fast == 1)&&(count == 2)) begin
      tick  <= 1;
      count <= 'd0;
    end
    else if(fast == 0)&&(count == 7500000)) begin
      tick  <= 1;
      count <= 'd0;
    end
    else begin
      tick  <= 0;
      count <= count + 1;
    end
  end
end
endmodule

または、次のようなものはより小さく合成される可能性があります。

reg  [22:0] count;

wire [22:0] comp = (fast) ? 23'd2: 23'd7500000 ;
wire        done = count >= comp               ;

always @(posedge clk or negedge reset) begin
  if (~reset) begin
    count <= 'd0;
    tick  <=   0;
  end
  else begin
    if(done) begin
      tick  <= 1;
      count <= 'd0;
    end
    else begin
      tick  <= 0;
      count <= count + 1;
    end
  end
end
于 2012-09-06T09:40:55.327 に答える