MAX V, MAX10, and VHDLメモ

ごく簡単なテストベンチ

参考: 動かしてわかる CPUの作り方10講, pp.153ff. これまではすべて実際に回路を動かしてロジアナ、オシロ、LEDなどで動作を見てきたが、今度はModelSimでシミュレートしてみる。 ↓この回路の動作をシミュレートする。単なる2入力ANDである。 library ieee;…

フルコンパイルせずに.mifファイルのデータだけを入れ換える方法

参考: Intel:FPGA 内部 RAM を使用してデザイン中にメモリを実装しました。メモリの初期値は、メモリ初期値ファイルで行いました。その後、メモリの初期値ファイルのみを変更したのですが、この場合、再コンパイルが必要でしょうか? - 半導体事業 - マクニ…

N相クロックを作る その5 / 結局最初に戻る

「N相クロックを作る その4 / rol (左回転)演算子を使う -」の方法では、何かの拍子にノイズが乗ってmore-than-one-hot stateになってしまうとリセットしない限り二度とone-hot stateに復帰しない。結局最初の方法が一番いい。一周すれば必ずone-hot stateに…

VHDLの算術シフト

「9.1.4 Shift Operators / 非公式訳 -」でシフト演算子について見た。算術シフトだけ試してみる。 結局、x sla nはx sra -nと同じ、x sla -nはx sra nと同じということか。 entity sute_vhdl is port( outp_sla: out bit_vector(7 downto 0); outp_sra: out…

N相クロックを作る その4 / rol (左回転)演算子を使う

N相クロックをつくる - N相クロックをつくる その2 - N相クロックを作る その3 / それに意味のないとき - というわけでローテート演算子の存在を知ったのでrol演算子を使ってN相クロックを作る。最初からこうすべきであった。 VHDL_for_Quartus_Prime/one_ho…

32ビット値を16進8桁としてキャラクターLCDに表示する その2

というわけで、列挙型はインデックスから列挙子名が取得できるとともに列挙子名からインデックスの取得できることが分かった。インデックスであって、各列挙子名に割り当てられた番号ではない。「32ビット値を16進8桁としてキャラクターLCDに表示する -」で…

32ビット値を16進8桁としてキャラクターLCDに表示する

というわけでbufferポートの存在を知った。 VHDL-2008以降、エンティティの内部でもoutポートから値が読み出せるようになったのでbufferポートは用済みになった。だがまだQuartus Prime Liteには実装されていないようである。 「ディジタル時計 / VHDLでキャ…

N相クロックを作る その3 / それに意味のないとき

74175で作った回路をそのままVHDLで記述し直してみる。ただしインターフェイスはパラメタライズし、リセット回路も追加した。結局前回と同じことをしているのであって意味がなかった。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all…

N相クロックをつくる その2

よく考えたら、クロックに合わせてシフトするだけでいいのであって、カウンターは必要なかった。 https://github.com/ti-nspire/VHDL_for_Quartus_Prime/blob/main/one_hot_state_counter/one_hot_state_counter.vhd library ieee; use ieee.std_logic_1164.…

N相クロックをつくる

いわゆるone hot state counterである。「VHDLで4相クロックを作る -」「74シリーズで4相クロックを作る -」「4相クロックジェネレーターclk_genをシンボルで書き換える -」のときはテキストどおりに4相に限定していたが、今度は相数を一般化する。 ここでは…

バイナリー→BCD変換函数を作る(範囲を一般化) / double dabbleアルゴリズム / VHDL

VHDL_for_Quartus_Prime/example_slv_to_bcd at main · ti-nspire/VHDL_for_Quartus_Prime · GitHub 「バイナリー→BCD変換函数を作る / double dabbleアルゴリズム / VHDL -」のときはテキストどおりにunsigned 12ビット値(0d0000~0d4095)を4桁BCD値 (0x000…

任意桁数のBCDカウンターを作る

https://github.com/ti-nspire/VHDL_for_Quartus_Prime/tree/main/counter_bcd 下位VHDLとして10進カウンターを1個だけ作っておいてそれを上位VHDLで何個か実体化して同期連結する。10進カウンター自体はIPカタログで自動生成した。連結数はパラメタライズし…

IPカタログを使ってカウンターを自動生成する / 下位VHDLをentityで直接実体化する

(テキストとは無関係) 前回はcomponent宣言してから実体化したが、今回はentity work.コンポーネント名という形で直接実体化する。このほうがはるかに簡単に思えるが、それぞれ長所・短所があるとの由。動作は前回と同じ。 library ieee; use ieee.std_logic…

IPカタログを使ってカウンターを自動生成する / 下位VHDLをcompnent宣言してから実体化する

(テキストとは無関係) 前回はテキストどおりにカウンターを一から記述したが、今度はIPカタログを使って自動生成した。モジュロ48 M、モジュロ10の2つのカウンターを生成して、あとは接続するだけでよい。非常にスッキリ書ける。自前のint_to_seven_seg()函…

LPM_Counterのcnt_enとclk_enと

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/catalogs/lpm.pdf cnt_en: カウントイネーブル入力。0だとカウント禁止。ただしsload、sset、sclrには影響しない。デフォルトは1。(訳註: sload、sset、sclrのsはsynchronous) cl…

ハミング重み / Quartus回路図エディター

パラメタライズを考慮しないのであれば1ビットずつにバラしていっきに加算するのが簡単。

信号名、インデックスをつけかえる

動かない原因はldlとldhとにあったか。 修正前: ldl命令をシンボルで書き換える - ldh命令をシンボルで書き換える - 修正後: バッファーを挟まなくてもこれでいけた。 ldl: ldh: これでldlとldhは動いた。

RAM: 1-PORTの使いかた

練習として8ビット×16本のRAMを作ってみる。16本なのでアドレスは4ビット幅である。 作りかたは、ROM: 1-PORTの使いかた -とほとんど同じである。 リセット直後に下の手順で動作を確認する。 write enableをLoにした状態で下の手順を実行し、データが空であ…

.mifファイルを生成するアセンブラのようなものを作る

def generate_mif(file_name, width, depth, rom): f = open(file_name, 'w') f.write("WIDTH=%d;\n" % width) f.write("DEPTH=%d;\n" % depth) f.write("ADDRESS_RADIX=UNS;\n") f.write("DATA_RADIX=BIN;\n") f.write("CONTENT BEGIN\n") format_of_code =…

ROM: 1-PORTの使いかた

参考: 動かしてわかる CPUの作り方10講, pp.256ff. 練習として8ビット×16本のROMを作ってみる。16本なのでアドレスは4ビット。 まずROMの初期化データ(.mif)を作る。mifはmemory initialization file。 8ビット×16本。 こういうテーブルが表示されるので、こ…

PLLの使いかた

MAX10実験キットで学ぶFPGA&コンピュータ (トライアルシリーズ), pp.129ff. ALTPLLをダブルクリックする。 ファイル名を指定する。VHDLしかわからないのでVHDLを選んだ。 入力周波数を指定する。 全部オフにする。 デフォルトのまま。 デフォルトのまま。 デ…

LPM_COMPAREの使いかた

LPMはthe library of parameterized modules /パリャマタライズ/ megafunctions/arithmetic/lpm_compareを試す。8ビット幅同士を比較してみる。

BUSMUXの使いかた

megafunctions/gates/busmuxを試す。 ここでは、2本(size)×4ビット(width)のうちどちらかだけを選択してみる。

LPM_MUXの使いかた

megafunctions/gates/lpm_muxを試す。 ここでは、4本(size)×4ビット(width)のうち1本だけを0b00~0b11 (0~3)のセレクト信号(widths)で選択してみる。

MAX Vの内蔵オシレーターを試す

megafunctionsの中にあるaltufm_oscを選ぶ。 適当に配線する。oscenaのenaはenable。ALTUFMはAltera User Flash Memory。4.7 MHzであった。 https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/max-v/mv51002.pdf Internal Oscil…

VHDLで基本ゲートを作る

動かしてわかる CPUの作り方10講, pp.376ff. ファイルを作るときに[Block Diagram/Schematic File]ではなく[VHDL FIle]を選ぶのを除けば、書き込みまでの全体の手順は回路図エディタのときと同じであった。 -- ダブルハイフンでコメントアウト -- #include <stdio.h></stdio.h>…

CPU部の回路図を入力する

[Assignments]、[Device...]の順に選択して[Device]ウィンドウを開く。その中の[Device and Pin Options...]をクリックして[Device and Pin Options - プロジェクト名]ウィンドウを開く。その中の[Unused Pins]を選択し、[Reserve all unused pins:]を[As in…

とにかく74ロジックICの何かで何かをしてみる

参考: トランジスタ技術 2019年 12 月号, pp.66ff. ナビゲーション画面の[New Project Wizard]ボタンをクリックするか[File]→[New Project Wizard...]の順にクリックするかする。 適当にプロジェクトを作る。 デバイスを指定する。右上のペインで対象を絞り…