工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

Verilog スカラーおよびベクトル

Verilog では、個々のビットとビットのグループを表す必要があります。たとえば、単一ビットの順次要素はフリップフロップです。ただし、16 ビットのシーケンシャル エレメントは、16 ビットを保持できるレジスタです。この目的のために、Verilog には scalar があります。 そしてベクトル ネットと変数。

スカラーとベクトル

ネットまたは reg 範囲指定のない宣言は 1 ビット幅と見なされ、スカラーとなります .範囲が指定されている場合、net または reg ベクトルとして知られるマルチビットエンティティになります .


  
  
	wire 	    o_nor;           // single bit scalar net
	wire [7:0]  o_flop;          // 8-bit vector net
	reg         parity;          // single bit scalar variable
	reg  [31:0] addr;            // 32 bit vector variable to store address

  

この範囲により、ベクトル内の個々のビットをアドレス指定できます。ベクトルの最上位ビットは範囲の左側の値として指定する必要があり、ベクトルの最下位ビットは右側で指定する必要があります。

  
  
	wire  [msb:lsb]   name;
	integer           my_msb;
	
	wire [15:0]        priority;      // msb = 15, lsb = 0
	wire [my_msb: 2]   prior;         // illegal

  

上記の例では、priority と呼ばれる 16 ビット幅のネットが作成されます。 msblsb は定数式である必要があり、変数に置き換えることはできません。ただし、正、負、またはゼロなどの任意の整数値にすることができます。と lsb 値は、msb 値より大きい、等しい、または小さい場合があります。

ビット選択

以下に示すように、ベクトル化された変数の任意のビットを個別に選択し、新しい値を割り当てることができます。これは、ビット選択と呼ばれます .ビット選択が範囲外であるか、ビット選択が x の場合 または z の場合、返される値は x になります .

  
  
	reg [7:0]      addr;         // 8-bit reg variable [7, 6, 5, 4, 3, 2, 1, 0]
	
	addr [0] = 1;                // assign 1 to bit 0 of addr
	addr [3] = 0;                // assign 0 to bit 3 of addr
	addr [8] = 1;                // illegal : bit8  does not exist in addr

  

部分選択

連続したビットの範囲を選択することができ、部分選択として知られています。 .部分選択には 2 つのタイプがあり、1 つは定数部分選択、もう 1 つはインデックス付き部分選択です。

  
  
	reg [31:0]    addr;
	
	addr [23:16] = 8'h23;         // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select

  

可変部分選択を使用すると、ループ内で効果的に使用してベクトルの部分を選択できます。開始ビットは変更できますが、幅は一定でなければなりません。

[<start_bit> +: <width>]     // part-select increments from start-bit
[<start_bit> -: <width>]     // part-select decrements from start-bit
  
  
module des;
  reg [31:0]  data;
  int         i;
  
  initial begin
    data = 32'hFACE_CAFE;
    for (i = 0; i < 4; i++) begin
      $display ("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
    end
    
    $display ("data[7:0]   = 0x%0h", data[7:0]);
    $display ("data[15:8]  = 0x%0h", data[15:8]);
    $display ("data[23:16] = 0x%0h", data[23:16]);
    $display ("data[31:24] = 0x%0h", data[31:24]);
  end
  
endmodule

  
シミュレーションログ
ncsim> run
data[8*0 +: 8] = 0xfe              // ~ data [8*0+8 : 8*0]
data[8*1 +: 8] = 0xca              // ~ data [8*1+8 : 8*1]
data[8*2 +: 8] = 0xce              // ~ data [8*2+8 : 8*2]
data[8*3 +: 8] = 0xfa              // ~ data [8*3+8 : 8*3]

data[7:0]   = 0xfe
data[15:8]  = 0xca
data[23:16] = 0xce
data[31:24] = 0xfa
ncsim: *W,RNQUIE: Simulation is complete.

一般的なエラー

  
  
module tb;
   reg [15:0]    data;
   
   initial begin
      $display ("data[0:9] = 0x%0h", data[0:9]);   // Error : Reversed part-select index expression ordering
   end
endmodule

  

Verilog

  1. Verilog チュートリアル
  2. Verilog 連結
  3. Verilog 割り当て
  4. Verilog ブロッキング &ノンブロッキング
  5. Verilog 関数
  6. Verilog タスク
  7. Verilog インターおよびイントラ割り当て遅延
  8. Verilog クロック ジェネレーター
  9. Verilog 数学関数
  10. Verilog タイムフォーマット
  11. Verilog タイムスケール スコープ