k0b0's record.

Computer Engineering, Arts and Books

Error (16031): Current Internal Configuration mode does not support memory initialization or ROM. Select Internal Configuration mode with ERAM.

メモリの初期化をサポートできない。

Quartus Primeでメモリ(初期値あり)のコードをコンパイルしたら怒られた。
どうやら、初期値を設定する場合はメモリの内部構成モードを変更しないといけないみたい。

解決策

メニューバーの[Assignments] => [Device] => [Device and pin Options]を選択する。
Categoryの[Configuration]を選択し、Configuration modeを[Single Compressed Image with Memory Initialization]に設定する。

Raspberry Pi 4

 Raspberry Pi FoundationがRaspberry Pi 4を発表したみたい。

[主な仕様]
 ・プロセッサ:4コアARM Cortex A72(1.5GHz)(性能が先代の3倍以上)
 ・HDMIポート:type-Aからtype-Dの2ポートになり、60fpsの4K動画に対応。
 ・価格:RAMの容量により異なり、1GBが35ドル、2GBは45ドル、4GBは55ドル。
 ・ケース:通常は5ドル、USB Type-Cの電源は8ドル。

詳細は以下のページにて。
www.raspberrypi.org

宣言されていない信号線を幅1bitの信号線(wire)として暗黙的に解釈することを回避する

 VerilogHDLの言語仕様ではwireとして宣言されていない信号線は暗黙的に1bitのwireとして解釈される。一応、Warningとしてコンパイラが教えてくれるのだが、これが原因で何時間もデバッグする羽目になる事もある。。。

 そこで、"`default_nettype wire”宣言と"`default_nettype wire"宣言を用いて、暗黙的な解釈を回避する。
記述例は以下の通りである。

`default_nettype wire
module module_name();

(...回路記述...)

endmodule
`default_nettype wire

これで、暗黙的な解釈はされず、wireとして宣言されていない信号線はエラーとしてコンパイラが教えてくれる。

Quartus PrimeでMIF(Memory Initialization File)を作成してみる。

MIF(Memory Initialization File)を作成してみる。

 Quartus PrimeのIPcatalogから生成するメモリモジュールに初期値を設定するために、MIFを作成する。

[File] -> [New]よりMemory Initialization Fileを選択する。
f:id:k0b0:20190614162708j:plain

メモリのワード数とワード幅を設定する。
f:id:k0b0:20190614162723j:plain

初期値を10進数で設定する。
初期値の設定が完了したら、[File] -> [Save]で作成したMIFを保存する。
f:id:k0b0:20190614162736j:plain

Verilog/SystemVerilogでincludeするヘッダファイルの競合を回避する。

 複数のモジュール内で同じヘッダファイルをincludeしたSystemVerilog記述をQuartus Primeでコンパイルしたところ、競合が生じてエラーが出た。
 ModelSimでの論理シミュレーション時は大丈夫だったのだが、Quartus Primeのコンパイラは厳しいようである。

 と言うわけで、競合を回避するために以下の記述を各モジュールに追記し、競合を回避した。

`ifndef DEF_HEADDER
    `include "def.h"
    `define DEF_HEADDER
`endif

Quartus Prime のIP Catalogを使ってシングルポートRAM(同期書き込み、非同期読み出し)を生成してみる。@2019/06/14 追記

IP Catalogを使ってシングルポートRAM(同期書き込み、非同期読み出し)を生成してみる。

 FPGA(MAX10)でそこそこの容量のメモリを使いたいのだが、レジスタで構成すると、LEをかなり消費する。というわけで、IP Catalogで用意されている、シングルポートRAM(同期書き込み、同期読み出し)を生成してみる。

メニューバーの[Tools] -> [IP Catalog]を選択する。
[IP Catalog]の[On Chip Memory]から[RAM: 1-PORT]を選択する。
f:id:k0b0:20190605130354j:plain

生成するシングルポートRAMの名前と保存先を入力し、MegaWizardを立ち上げる。
(ここでは、名前を[ram1port_8]とし、生成するコードはVerilogHDLとした。)
注意:MegaWizardの画面表示が小さいと操作の途中でなぜかフリーズする。立ち上げてからまず、スクロールバーが消えるくらい画面を大きくするとフリーズせずスムーズに作業を進めることができる。
f:id:k0b0:20190605130427j:plain

データ幅、メモリ容量、メモリブロックタイプを指定する。
(ここでは、データ幅を8とし、メモリ容量を256、メモリブロックタイプをM9Kとした。)
f:id:k0b0:20190605130449j:plain

「Which ports should be registerd ?」の「'q' output port」のチェックマークを外す。
(チェックマークを外さない場合は同期書き込み・同期読み出しのシングルポートRAMを生成することとなる。)
f:id:k0b0:20190605130502j:plain

「Single Port Write During Read Option」を「New Data」に設定する。
f:id:k0b0:20190605130514j:plain

特に何も指定せず、「Next」を選択する。
f:id:k0b0:20190605131927j:plain

生成したいファイルにチェックマークをつけて「Finish」を選択する。
f:id:k0b0:20190605134118j:plain

「yes」を選択する。
(これで、シングルポートRAMの生成は完了。)
f:id:k0b0:20190605141520j:plain

参考サイト

www.lab3.kuis.kyoto-u.ac.jp