MAX V, MAX10, and VHDLメモ
nビット加算器 / リップルキャリーアダー -の続き 今度はFPGAで実際にキャリーの遅延する様子を見る。8ビット加算器で試す。1111 1111 + 0000 0000 + キャリーインという計算をして全桁にキャリーアウトが立つようにする。入力xには1111 1111を、入力yには00…
今度は前回の全加算器を任意の個数だけ数珠つなぎにしてリップルキャリーアダーを作る。リップルする様子が確認できるよう、最終段だけでなく全段のキャリーアウトを外部端子に接続しておく。 ファイル一式: VHDL_for_Quartus_Prime/n_bits_adder_ripple at …
全加算器を再度試す。半加算器を2個連結するのではなく下の回路にした。 library ieee; use ieee.std_logic_1164.all; entity full_adder is port ( cin: in std_logic; x: in std_logic; y: in std_logic; cout: out std_logic; s: out std_logic ); end en…
library ieee; use ieee.std_logic_1164.all; entity sute_vhdl is port ( x1: in std_logic; x2: in std_logic; s: in std_logic; f: out std_logic ); end entity; architecture rtl of sute_vhdl is begin /*process(x1, x2, s) begin if s = '0' then f …
関連: コンパクトなDフリップフロップ - conditional assignmentを使ってconcurrent領域に記述する。シンプルに書けるがほかで目にしたことはない。/=は、割って代入ではなくnot equal。ここでは4ビットカウンターにした。 library ieee; use ieee.std_logic…
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フリップフロップ - 参考: 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信号のエッ…
「sin、cos を再帰的に求める / 加法定理による方法 & IIR フィルターによる方法 / Python / それに意味のないとき - Qiita」のときに計算手順だけ確かめておいたのを今度は実際にVHDLでFPGAに実装してみたい。まずは整数化して計算できることをPythonで確か…
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を動かす -のつづき 今度は前回のLEDの代わりにR-2R方式のDAコンバーターでDA変換する。Bourns社の4610X-R2R-103LFを使う。R = 10 kΩ、2R = 20 kΩである。8ビットぶんしかないので、1…
Digi-Key TechForum掲載のSPIマスターモジュール / ポテンショメーターAD8402ARZ50を動かす -のつづき 今度はADコンバーターMCP3001を動かす。逐次比較型、1チャンネル、10ビット、外部リファレンス、SPIのADコンバーターである。VDD = VREF = 2.7 Vのとき、…
Digi-Key TechForumに紹介されているSPIマスターモジュール / 非公式訳 -の続き 当該記事のコードがまだ全部は読み切れていないが、ディジタルポテンショメーターAD8402ARZ50を動かしてみる。50 kΩが2個入っている。チャンネル(0b00または0b01) + ワイパーの…
「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周期の真ん中に来る。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…
参考: SPI Master (VHDL) - Logic - Engineering and Component Solution Forum - TechForum │ Digi-Key 上のリンクに紹介されているSPIマスターを試してみる。 非公式訳: SPIマスター 特徴 (略) スレーブの個数が指定できる。 データ幅が指定できる。 極性…
今度はポケコンPC-G850VSのシリアルポートを使って負論理UARTの動作確認をする。PC-G850VSは5Vロジックなのでこのロジックレベル双方向変換モジュールでレベル変換をした。 今FPGAはG850ターミナルから受信した'q'をそのまま送り返している。これで、今回作…
今度は送受信をいっぺんに試す。受信したデータをそのまま何もせずに送り返す。シミュレーションではなく実際に回路を動かしてロジアナで確認した。 VHDL_for_Quartus_Prime/UART at main · ti-nspire/VHDL_for_Quartus_Prime · GitHub 今FPGAは'a'を受信し…
Interface (インターフェース) 2009年 09月号 [雑誌], pp.116-118 今度は受信。 シリアル通信用クロックはボーレートの16倍にする。シリアルラインがHからLに下がってそこから6クロック目(0から数えて6クロック目)がやはりLであったら確かにスタートビットで…
Interface (インターフェース) 2009年 09月号 [雑誌], pp.116-118 コードは下の2点を除いてほぼテキストのままである。 出力の極性を切り替えられるようにした(負論理にもできるようにした)。 コンポーネントとして呼び出しているシリアル通信クロック生成用…
以前double dabbleアルゴリズムでバイナリー→BCD変換函数を作ったが、今度はBCD→整数変換函数と一緒にパッケージにまとめておく。 slv_to_bcd()函数で0b10011010010100 (0d9876)を0x9876 (0d39030)に変換し、それをbcd_to_int()函数で元の0d9876に変換してみ…
参考: FPGA活用回路&サンプル記述集(2) ―― モータやLEDを駆動するパワー回路|Tech Village (テックビレッジ) / CQ出版株式会社 ちょうどnクロックで所望のpwm周期になるようなクロックを生成する。要するにソースクロックを(ソースクロック周波数/(pw…
今度は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 (のようなもの)をシ…