web-dev-qa-db-ja.com

合成可能な初期値をVerilogのregに割り当てます

私は、Verilogを学ぼうとしているFPGA初心者です。初期値または定数として、常にブロックのregに値を「割り当てる」方法はありますか。以下のコードでこのようなことをしようとしています。 8ビット定数が入力としてカウントされないため、エラーが発生します。また、常にオフクロックをトリガーしたくありません。レジスタを特定の値に割り当てたいだけです。合成可能にしたいので、最初のブロックは使用できません。どうもありがとう。

module top
(
    input wire clk,
    output wire [7:0] led   
 );


reg [7:0] data_reg ; 
always @*
begin
    data_reg = 8'b10101011;
end

assign led = data_reg;

endmodule
17
Frank Dejay

レジスタ宣言を初期化と組み合わせることができます。

reg [7:0] data_reg = 8'b10101011;

または、initialブロックを使用できます

reg [7:0] data_reg;
initial data_reg = 8'b10101011;
23

他の答えはすべて良いです。ザイリンクスFPGAデザインの場合、グローバルリセットラインを使用し、ほとんどのロジックのリセット条件にinitialブロックを使用することをお勧めしますnot。 Ken Chapman(Xilinx FPGAの第一人者)のホワイトペーパーを次に示します。

http://japan.xilinx.com/support/documentation/white_papers/wp272.pdf

6
Mark Lakata

右辺の引数が変更されないため、常に@ *はトリガーされません。 assignでワイヤを使用しないのはなぜですか?

module top (
    input wire clk,
    output wire [7:0] led   
);

wire [7:0] data_reg ; 
assign data_reg   = 8'b10101011;
assign led        = data_reg;

endmodule

値を変更できるフロップが実際に必要な場合、デフォルトはリセット句にあります。

module top
(
    input        clk,
    input        rst_n,
    input  [7:0] data,
    output [7:0] led   
 );

reg [7:0] data_reg ; 
always @(posedge clk or negedge rst_n) begin
  if (!rst_n)
    data_reg <= 8'b10101011;
  else
    data_reg <= data ; 
end

assign led = data_reg;

endmodule

お役に立てれば

4
Morgan

FPGAドキュメントで推奨されているものを使用する必要があります。リセットネットを使用する以外に、レジスタ値を初期化するポータブルな方法はありません。ほとんどの合成ターゲットでは、これに関連するハードウェアコストがあります。

4
user597225

チップに電力が供給されると、すべてのレジスタにランダムな値が含まれます。初期値を持つことはできません。常にランダムになります。

これが、レジスタを既知の値にリセットするためのリセット信号を持っている理由です。リセットはチップ外の何かによって制御され、それを使用するコードを記述します。

always @(posedge clk) begin
    if (reset == 1) begin // For an active high reset
        data_reg = 8'b10101011;
    end else begin
        data_reg = next_data_reg;
    end
end
3
Paul S