22

私は Verilog を学ぼうとしている FPGA 初心者です。初期値または定数として、always ブロックの 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
4

5 に答える 5

34

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

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

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

reg [7:0] data_reg;
initial data_reg = 8'b10101011;
于 2012-04-04T17:48:56.417 に答える
6

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

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

于 2014-03-18T17:32:53.633 に答える
5

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

于 2012-04-04T20:47:56.633 に答える
5

右辺の引数が変更されないため、常に @* がトリガーされることはありません。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

お役に立てれば

于 2012-04-04T07:05:51.747 に答える
3

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

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

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
于 2012-04-04T07:08:18.367 に答える