【自作量子コンピュータ NMRQCP】回路が同時に動くFPGAを学ぶ

 こんにちは!自作の地球磁場NMR(EFNMR)方式で量子コンピューターの開発に挑戦している高専生です。

これまでは「はんだ付け」などのアナログな回路や、PythonでのFFT解析についてお話ししてきましたが、今回は量子の世界を精密にコントロールするための「デジタルな脳みそ」のお話です。

原子核スピンを操るための正確なパルスを出すために、今回は「FPGA」と「ハードウェア記述言語(HDL)」という技術に挑みます!

全部の回路が同時に動く!?FPGAの世界

普通のパソコンのプログラムは、上から下へ順番(1行ずつ)に実行されます。しかし、FPGAという特殊なチップの中では、「全ての回路が常に同時に動いている」状態になります。

このFPGAをプログラミングするためには、普通のプログラミング言語ではなく、「回路の構造そのものを書く言語」であるHDL(Hardware Description Language:ハードウェア記述言語)を使います。

僕が今回使っているのは、C言語に少し似ていて世界中で最も使われている「Verilog HDL」です。このVerilogのコードの書き方を「RTL(Register Transfer Level)」と呼びます。

「同時」の世界で、どうやって順番を作るのか?

全部が同時に動いてしまうFPGAで、「Aの次にBをする」という順番を作るにはどうすればいいのでしょうか?

まず、時間経過の基準を作るために「分周器」を使います。これはカウンタの仕組みそのもので、元々の速いクロックを分割して、より遅いクロック(Hz)を作る役割を持っています。

そして、順番を作る唯一の方法が「ステートマシン(FSM:有限状態機械)」です。これは、「今の自分の状態を覚えておき、何かが起きたら次の状態に移る」という仕組みです。これによって、量子ビットにパルスを当てる複雑な手順を正確に実行できるようになります。

デジタルの数字を「波」に変える魔法

量子を操作するパルス波形を作るためにも、FPGAの中で計算を行います。

まず、「NCO(数値制御発振器)」という仕組みで角度を計算します(例えば360°を16bitの数字で表したりします)。

次に、「DDS(直接デジタル合成)」という技術を使って、NCOで計算した数字を「実際の電圧の波」へと変換します。これで、狙った周波数の波を自由に作り出せるわけです。

実際のコードと、絶対に忘れてはいけない「お約束」

Verilogのコードは、こんな感じでモジュールとして定義します。

module my_chip(
  input clk, //クロック
  input rst_n, //リセットボタン
  output led
);
endmodule

データを扱う「信号」には2種類あり、ただの物理的な針金と同じ役割の wire と、箱のように値を記録しておけるレジスタの reg を使い分けます。

値の代入も独特で、assign a = b; と書けば「常に連動(物理的に繋がっている状態)」になり、a <= b; と書けば「クロックのタイミングでbの値をaにコピーする」という意味になります。

⚠️ 最後に、最も重要な罠について。

FPGAは、電源を入れた直後は回路の中身がデタラメの値になっています。そのため、必ず if(!rst_n) のようにリセットの処理を書かないと、予期せぬ誤動作を引き起こしてしまいます。リセットの重要性はハードウェア開発の命ですね。

普通のプログラミングとは全く違う頭の使い方をするのでとても難しいです。しかし、量子コンピューターの信号処理においてはFPGAが使われることが多いので、今後頑張って使えるようにしていきます。


「本当に動くのか?」「どうやって波形を出すのか?」など、気になった方はぜひブログのブックマークやXのフォローをお願いします!

コメント

このブログの人気の投稿

【自作量子コンピュータ NMRQCP】いよいよ稼働かと思いきやデバッグ地獄