Circuit Design with VHDL

附録K: TMDSリンク / 非公式訳

pp.559-562 1. TMDSリンク TMDS (Transition Minimized Differential Signaling)は、ビデオ信号をシリアル伝送するためのラインコードのひとつです。1999年にSilicon Image社が発表しました。デスクトップコンピューターとLCDモニターとを相互接続するための…

附録J: DVIビデオインターフェイス / 非公式訳

pp.555-557 1. DVIインターフェイス DVI (Digital Visual Interface)は、コンピューターからLCDモニターへ非圧縮ビデオ信号を送信する手段としてDDWG (Digital Display Working Group)が1999年に開発したディジタルビデオインターフェイス規格です(図J.1a)。…

附録I: VGAビデオインターフェイス / 非公式訳

pp.551-554 1. VGAインターフェイス 最初のVGA (ビデオグラフィクスアレイ)インターフェイスは、コンピューターをアナログCRT (ブラウン管)ビデオモニターに接続する手段として1987年にIBMが発表しました。その後多くのバージョンが発表されました(図I.1b)。…

ディジタル時計 / VHDLでキャラクターLCD / 4ビットモード

テキストは8ビットモードで制御しているが今度は4ビットモードを試す。もっとスマートに書けると思うが今のところわからない。 library ieee; use ieee.std_logic_1164.all; entity digital_watch_with_LCD_display_4bit is generic( F_CLK: natural := 48_0…

附録H: キャラクターLCD / 非公式訳

pp.545-549 1. キャラクターLCD 一般的なキャラクターLCD (液晶ディスプレイ)を図H.1に示します(詳しくは図中のキャプションを見てください)。この種のディスプレイにはI2Cなどのシリアルインターフェイスを備えたものもありますが、コストを抑えたい場合はL…

ディジタル時計 / VHDLでキャラクターLCD / 8ビットモード

pp.447-454 3.3 Vで直接動かせるSC1602BBWB-XA-LB-Gを使った。 テキストはelsif rising_edge(E) thenにしてあるが、Quartus Prime LiteはVHDL2008を全部は実装していないようでoutポートが読めずにエラーが出る。しかたないので假のsignalを設けてelsif risi…

VHDLでSPI / ADコンバーターMAX1118 / CH1も読めるようにする

テキストはCH0だけを読んでいるがせっかくなのでCH1も読めるようにする。 !スレーブセレクトするとすぐにCH0の変換が始まるが、その変換の最中に!スレーブセレクトを解除してすぐにもう一度!スレーブセレクトするとCH1の変換が始まる。 library ieee; use ie…

VHDLでSPI / ADコンバーターMAX1118

2ch・シリアル8bitADコンバータ(MAX1118) DIP化モジュールキット: 組立キット 秋月電子通商-電子部品・ネット通販 pp.414-416 CH0をAD変換してみる。クロックはテキストどおりアイドル時Hiにしたが、データシートによればアイドル時Lo…

3.20.3 ADコンバーターのためのSPI / 非公式訳

pp.95-96 非公式和訳 3.20.3 ADコンバーターのためのSPI SPI (serial peripheral interface)のしくみについては巻末資料Fにまとめました。このセクション3.20.3では例としてADコンバーターのためのSPIを作ります。Maxim製のMAX1118は、2チャンネル、8ビット…

ステートマシン / ミーリー型 / "abc"の順に文字が入力されたらフラグを立てる

pp.407-409 今度は、ステートマシン / ムーア型 / "abc"の順に文字が入力されたらフラグを立てる -のミーリー型を試す。 ミーリー型のFSM(有限ステートマシン)とは、その入力が出力を直接左右する可能性のあるFSMのことである。言い換えると、出力はマシンの…

ステートマシン / ムーア型 / "abc"の順に文字が入力されたらフラグを立てる

pp.407-409 ムーア(Moore)型のFSM (有限ステートマシン)は、その出力が現在の状態にのみ依存するFSMのこと(p.68)。 "abc" (0x61, 0x62, 0x63)の順に文字が入力されたらフラグを立てる(入力をセットして、クロック、入力をセットして、クロック、......)。 li…

最小値、最大値を求めるprocedureを作る

pp.359-362 4個の4ビット値のなかから最小値、最大値を求める。procedureの書きかたがよく分からない。 subprograms_pkg.vhd library ieee; use ieee.numeric_std.all; package subprograms_pkg is type unsigned_array is array (natural range <>) of unsi…

バイナリー→BCD変換函数を作る / double dabbleアルゴリズム / VHDL

pp.358-359 unsigned 12ビット値(0~4095)を4桁BCD値 (0,0,0,0~4,0,9,5)に変換する。 subprograms_pkg.vhd library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; package subprograms_pkg is function binary_to_bcd (bin: std_logic_vec…

std_logic_vectorからintegerへ型変換する函数を作る / process内に

std_logic_vectorからintegerへ型変換する函数をprocess内に記述する。 pp.357-358 library ieee; use ieee.std_logic_1164.all; entity test_circuit is generic( WIDTH: natural := 8 ); port( clk: in std_logic; inp: in std_logic_vector(WIDTH-1 downt…

ceil(log2())を求める函数を作る / architecture内に

p.357 前回と同じ函数を今度はarchitectureの宣言部に記述する。reusabilityの観点からすると好ましくない。 entity test_circuit is generic( BITS: natural := 8 ); port( inp : in positive range 1 to 2**BITS-1; outp: out natural range 0 to BITS ); …

ceil(log2())を求める函数を作る / パッケージ内に

pp.355-356 パッケージ内に函数を作る。 subprograms_pkg.vhd package subprograms_pkg is -- 函数を宣言する。 -- function 函数名 (引数: 型) return 型; function ceil_log2 (input: positive) return natural; end package; package body subprograms_pk…

平方根を求める / 回路全体を試す

pp.322-325 今度は回路全体を試す。 条件は下のとおりとする。 startパルスの入力時に計算を開始する。 startもxもクロックには非同期。 startパルスの長さは決まっていないので、シンクロナイザーを通したあとにワンショットパルス化する(p.55、figure 2.27…

平方根を求める / 計算部分だけ試す

pp.322-325 Quartus PrimeのIPカタログにALTSQRTがあるがここでは使わない。 まずfigure 13.2の計算部分だけ試す。unsigned 8ビット値(0~255)の平方根(0~15)を求める。 unsigned 8ビット値xの平方根の計算手順: 4ビットダウンカウンターを0b1111からカウン…

FIRフィルターを作る

pp.320-322 入力4ビット幅、係数5個、よって出力11ビット幅のFIRフィルターを作る。単なる練習であって係数に意味はない。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; --use ieee.math_real.all; entity fir_filter is generic(…

「チャタリング除去回路1 / 安定期間がチャタリング想定期間よりも長く続いたらレベルを確定する」のVHDL版

pp.318-320 入力がHi、出力がLoの時間がチャタリング継続想定時間よりも長く続いたら出力をトグルする。 入力がLo、出力がHiの時間がチャタリング継続想定時間よりも長く続いたら出力をトグルする。 チャタリング除去回路1 / 安定期間がチャタリング想定期間…

ツリータイプ加算器のパラメタライズ

pp.315-318 絶対差の和(マンハッタン距離)を求める -でパラメタライズできていなかったツリータイプ加算器をパラメタライズする。 ここでは7ビット、10本を加算する。4レイヤーの加算が必要なので出力を7+4=11ビットにしてオーバーフローを防ぐ。 library ie…

シフトレジスタを作る

pp.311-312 4ビット幅、4段のシフトレジスタを作る。クロックのたびに入力値が次段へ順送りされる。 library ieee; use ieee.std_logic_1164.all; entity shift_register is generic( NUM_BITS : natural := 4; NUM_STAGES: natural := 4 ); port( clk : in …

BCD出力タイマー

pp.303-305 00秒から59秒までカウントするタイマーを作る。 バイナリーカウンターでカウントしてからBCDに変換するのではなく、10進1桁ごとに4ビットBCDカウンターを設けて出力する。ここではアノードコモン1桁を2個使った。ダイナミック点灯はせずに個別に…

最大値到達フラグつきカウンター / signalではなくvariableを使う

pp.298-301 前回と同じことを今度はvariableを使って実行してみる。 process内で宣言する。 常にローカル変数である。 processの外へは出られない。外へ出すときはsignalを経由する。 割り当てには :=を使う。 値は即座に更新されるため、更新後の値がすぐ次…

最大値到達フラグつきカウンター

pp.289-291 =は代入ではなくequal。 /=は割って代入ではなくnot equal。 クロックエッジの検出については下のどちらでも同じことだが、event属性で直接検出するよりもrising_edge()函数、falling_edge()函数のほうが望ましいとの由。 if clk'event and clk='…

正弦波の生成

pp.270-273 1象限ぶんだけのデータを排列として持っていてそれを順番に読み出す。ボード上の48 MHz発信器からPLLで36 kHzを合成し、それをモジュロ360のカウンターでカウントして順番にデータを読み出す。結果、100 Hzの正弦波が得られる。それをR-2R式DACで…

組み合わせ論理回路によるプログラマブルディレイライン

pp.268-270 notゲート2個で1段ぶんのディレイを生成する。精密に時間が制御できるわけではない。 まずテキストどおりにサブ回路にしておく。 library ieee; use ieee.std_logic_1164.all; entity delay_block is generic( BLOCK_LENGTH: natural -- not+not…

絶対差の和(マンハッタン距離)を求める

pp.265-267 a = {2ビットsigned値, 2ビットsigned値, 2ビットsigned値, 2ビットsigned値} b = {2ビットsigned値, 2ビットsigned値, 2ビットsigned値, 2ビットsigned値} という2ビットsigned値×4要素同士の差の絶対値の和を求める。4要素だと加算が2レイヤー…

1.6.5 浮動小数点数演算 / 非公式訳

浮動小数点数同士の加算は、指数部の小さいほうの浮動小数点数の假数部を右シフトして両者の指数部を同じにしてから假数部同士を加算する(参考: 現実的なCプログラミング (NUTSSHELL HANDBOOKS), pp.318-319)。 10進数の例: 1.23E10 + 1.23E12 = 1.230E10 + …

1.6.3 符号つき整数演算

要するにたとえば符号つき4ビット整数は範囲が7~-8なので、4+4=8 (0b1000)は範囲を超えるためオーバーフローが発生するがキャリーアウトは発生しない。6-2=4は範囲を超えないのでオーバーフローは起きないが0b0110+0b1110=0b10110なのでキャリーアウトが発…