MAX V, MAX10, and VHDLメモ

process文を使わないカウンター

関連: コンパクトなDフリップフロップ - conditional assignmentを使ってconcurrent領域に記述する。シンプルに書けるがほかで目にしたことはない。/=は、割って代入ではなくnot equal。ここでは4ビットカウンターにした。 library ieee; use ieee.std_logic…

orderingを指定せずにstd_logic_vectorを宣言したとき

p.269 std_logic_vectorのインデックス型はnaturalであるため、orderingを指定せずにstd_logic_vectorを宣言したときは左端のインデックスが0。 library ieee; use ieee.std_logic_1164.all; entity sute is port( left_most : out std_logic; right_most : …

並び順が互いに逆のベクタからベクタへ値を代入するとき

pp.267-268 ascendingであろうとdescendingであろうと、とにかく左端は左端へ、右端は右端へ配線される。要するにインデックスとは無関係に位置だけで決まる。 library ieee; use ieee.std_logic_1164.all; entity sute is port( source : in std_logic_vect…

コンパクトなDフリップフロップ

関連: コンパクトなDフリップフロップ - 参考: Effective Coding with VHDL: Principles and Best Practice (The MIT Press), p.262 library ieee; use ieee.std_logic_1164.all; entity d_flip_flop is port( aclr_n : in std_logic; clk : in std_logic; d…

パルスエッジから指定遅延時間後に指定長さのワンショットパルスを出力する

パルスエッジを受けてから、指定した時間だけ待って、そのあと、指定した長さのワンショットパルスを出力する。 ここでは、trigger信号のHiレベルが必ずclkのrising edgeに1回は引っかかる程度に長く続くと想定している。そうでない場合はtrigger信号のエッ…

VHDLで二相発振器を実装する / IIRフィルターによる方法 / 整数化する

「sin、cos を再帰的に求める / 加法定理による方法 & IIR フィルターによる方法 / Python / それに意味のないとき - Qiita」のときに計算手順だけ確かめておいたのを今度は実際にVHDLでFPGAに実装してみたい。まずは整数化して計算できることをPythonで確か…

Digi-Key TechForum掲載のSPIマスターモジュール / DAコンバーターMCP4911を動かす

Digi-Key TechForum掲載のSPIマスターモジュール / ADコンバーターMCP3001で変換してR-2R DACで元に戻す -のつづき ファイル一式: VHDL_for_Quartus_Prime/da_converter_MCP4911_spi at main · ti-nspire/VHDL_for_Quartus_Prime · GitHub 今度はDAコンバー…

Digi-Key TechForum掲載のSPIマスターモジュール / ADコンバーターMCP3001で変換してR-2R DACで元に戻す

Digi-Key TechForum掲載のSPIマスターモジュール / ADコンバーターMCP3001を動かす -のつづき 今度は前回のLEDの代わりにR-2R方式のDAコンバーターでDA変換する。Bourns社の4610X-R2R-103LFを使う。R = 10 kΩ、2R = 20 kΩである。8ビットぶんしかないので、1…

Digi-Key TechForum掲載のSPIマスターモジュール / ADコンバーターMCP3001を動かす

Digi-Key TechForum掲載のSPIマスターモジュール / ポテンショメーターAD8402ARZ50を動かす -のつづき 今度はADコンバーターMCP3001を動かす。逐次比較型、1チャンネル、10ビット、外部リファレンス、SPIのADコンバーターである。VDD = VREF = 2.7 Vのとき、…

Digi-Key TechForum掲載のSPIマスターモジュール / ポテンショメーターAD8402ARZ50を動かす

Digi-Key TechForumに紹介されているSPIマスターモジュール / 非公式訳 -の続き 当該記事のコードがまだ全部は読み切れていないが、ディジタルポテンショメーターAD8402ARZ50を動かしてみる。50 kΩが2個入っている。チャンネル(0b00または0b01) + ワイパーの…

PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする / のこぎり波を使う

「PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする -」のとき作ったPWMモジュールについても、「PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする / 三角波を使う / PWMモジュールを複数実…

PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする / 三角波を使う / PWMモジュールを複数実体化する

PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする / 三角波を使う -の続き 今度はPWMモジュールを複数実体化する。サブモジュールにしておいたコンパレーターをfor-generateで複数実体化するだけでよい。 ファイル一式: VHDL…

PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする / 三角波を使う

PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする -のときは鋸歯状波を使ったが今度は三角波を使う。位相中心がPWM周期の真ん中に来る。Atmega328Pでも試したいわゆるPhase Correct PWM Modeである。ここでは下図のAtmega328…

アップカウンター

今度は、今まで何度も作った単なるアップカウンター。genericをベクタ型で宣言しておけば、対数を計算しなくても属性でビット幅が指定できる。 VHDL_for_Quartus_Prime/generic_counter_up at main · ti-nspire/VHDL_for_Quartus_Prime · GitHub library iee…

アップダウンカウンター / 上昇中フラグを立てる

アップダウンカウンターを作る -の続き VHDL_for_Quartus_Prime/generic_counter_updown_ver2 at main · ti-nspire/VHDL_for_Quartus_Prime · GitHub 上昇中フラグが立てられるようにした。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_st…

Digi-Key TechForum掲載のSPIマスターモジュール / 非公式訳

参考: SPI Master (VHDL) - Logic - Engineering and Component Solution Forum - TechForum │ Digi-Key 上のリンクに紹介されているSPIマスターを試してみる。 非公式訳: SPIマスター 特徴 (略) スレーブの個数が指定できる。 データ幅が指定できる。 極性…

非同期シリアルインターフェイス(UART)で送受信 / 負論理を試す

今度はポケコンPC-G850VSのシリアルポートを使って、負論理UARTの動作確認をする。PC-G850VSは5Vロジックなのでこのロジックレベル双方向変換モジュールでレベル変換をした。 今FPGAはG850ターミナルから受信した'q'をそのまま送り返している。これで、今回…

非同期シリアルインターフェイス(UART)で送受信

今度は送受信をいっぺんに試す。受信したデータをそのまま何もせずに送り返す。シミュレーションではなく実際に回路を動かしてロジアナで確認した。 VHDL_for_Quartus_Prime/UART at main · ti-nspire/VHDL_for_Quartus_Prime · GitHub 今FPGAは'a'を受信し…

非同期シリアルインターフェイス(UART)で受信できるようにする

Interface (インターフェース) 2009年 09月号 [雑誌], pp.116-118 今度は受信。 シリアル通信用クロックはボーレートの16倍にする。シリアルラインがHからLに下がってそこから6クロック目(0から数えて6クロック目)がやはりLであったら確かにスタートビットで…

非同期シリアルインターフェイス(UART)で送信できるようにする

Interface (インターフェース) 2009年 09月号 [雑誌], pp.116-118 コードは下の2点を除いてほぼテキストのままである。 出力の極性を切り替えられるようにした(負論理にもできるようにした)。 コンポーネントとして呼び出しているシリアル通信クロック生成用…

「バイナリー→BCD変換函数」「BCD→整数変換函数」をパッケージにまとめる

以前double dabbleアルゴリズムでバイナリー→BCD変換函数を作ったが、今度はBCD→整数変換函数と一緒にパッケージにまとめておく。 slv_to_bcd()函数で0b10011010010100 (0d9876)を0x9876 (0d39030)に変換し、それをbcd_to_int()函数で元の0d9876に変換してみ…

PWM波を生成する / デューティを(0/n)から(n/n)まで(1/n)刻み指定できるようにする

参考: FPGA活用回路&サンプル記述集(2) ―― モータやLEDを駆動するパワー回路|Tech Village (テックビレッジ) / CQ出版株式会社 ちょうどnクロックで所望のpwm周期になるようなクロックを生成する。要するにソースクロックを(ソースクロック周波数/(pw…

三角波生成器 / BCDで周波数を設定する

今度は4桁bcdで周波数が設定できるようにする。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity triangle_wave_gen_bcd is generic( F_CLK : positive := 48_000_000; F_OUT_MAX : positive := 9999; -- 最大出力周波数 NUM_…

三角波生成器

参考: CPLDでディジタル電子工作 (CQ文庫), pp.125ff. アップダウンカウンターの出力をAD変換して三角波を生成する。ADコンバーターは8ビットR-2R方式にした。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.math_real.al…

アップダウンカウンターを作る

トップ値とボトム値とをパラメタライズしたアップダウンカウンターを作る。 ↓ これが本体: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity generic_counter_updown is generic( TOP_VAL : natural := 10; BOTTOM_VAL: natura…

ごく簡単なテストベンチ / テストベンチのテンプレートを自動生成する

参考: シェフの気まぐれテストベンチ ~時間短縮のマル秘レシピ~ - 半導体事業 - マクニカ 前回は一からテストベンチを記述したが、今度は上のリンクを参考にして自動生成した。入力波形は自分で書く。このとき作った4ビット加算器74283 (のようなもの)をシ…

ごく簡単なテストベンチ

参考: 動かしてわかる 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…