Circuit Design with VHDL (The MIT Press)

シフトレジスタを作る

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

符号つき整数加算器

pp.261-262 +演算子の場合、出力のビット幅は、複数ある入力のうち最大のビット幅と同じでなければならない。 VHDL 2008ではsignedとシングルビット値とが加算できるようになったらしいがQuartus Prime Liteはまだサポートしていないようなので、下のコード…

10.7 演算回路への取り組みかた / 非公式訳

pp.259-260 非公式訳: これは、コンカレントコードについて前に述べた2つの特殊なケースの2つめです。演算回路に関することです。演算回路を実装する場合にお奨めの手法を以下に示します。 演算回路は、セクション1.5、1.6で復習したように、符号が問題にな…

ハミング重み / VHDL

pp.257-258 内部信号を一種の変数として使う。 inp_vector = 0b11110011の場合: 1回目のループ: inp_vector[0]に1が立っているので internal[1]にinternal[0]+1 = 1を入れる。 2回目のループ: inp_vector[1]に1が立っているので internal[2]にinternal[1]+1 …

コンポーネント実体化

pp.255-256 前回と同じことを今度はcomponent実体化オプションで再現する。componentの実体化はarchitectureボディの宣言部でもよいしgenerateステートメントの宣言部でも良い。 architectureボディの宣言部でcomponentを実体化する場合: library ieee; use …

デザインエンティティの実体化 / for-generateステートメント

pp.254-255 Nビット(ここでは4ビット)のキャリーリップルアダーを作る。for-generateステートメントで全加算器をN個実体化する。 これがトップファイル: library ieee; use ieee.std_logic_1164.all; entity carry_ripple_adder is generic( NUM_BITS : natu…

条件に応じてどちらかを実体化する

pp.251-252 これがトップファイル: library ieee; use ieee.std_logic_1164.all; entity adder is generic( POLARITY : std_logic := '0'; -- この定数で.adder_unsigned、.adder_signedのどちらかを指定する。 NUM_BITS : natural := 4 ); port( a, b : in …

プライオリティエンコーダー

/インコウダ/ p.249 半分まで読んでようやく実際の回路設計に入る。 VHDL 2008を指定しても全部が全部Quartusに実装されているわけではなかった。 library ieee; use ieee.std_logic_1164.all; entity priority_encoder is port( inp : in std_logic_vector(…

latch inference

/カントゥレリ/ /インふァランス/ p.247 Contrary to that, the code on the right provides a full in-out mapping description (it ends in "else value"), so latch inference does not occur. 非公式訳: それとは逆に、右側のコードは入出力の関係が全部…

ユーザー定義属性

p.236 インバーターを4つ直列につないだ回路を作る。LEを4個消費した。 entity delay_line is port( x : in bit; y : out bit ); end entity; architecture rtl of delay_line is -- a, b, cという名前の信号を中間ノードの信号をとして宣言して、 signal a,…

1D × 1Dの排列型を定義する / マルチプレクサを作る

pp.204-206 4ビット×4本のなかから1本を選ぶマルチプレクサを作る。 /* user_defined_type_pkgという名前のパッケージを作る。 そのなかでbv_arrayという型(1D X 1D)を定義する。 range <>は範囲がunconstrainedであるということ。 */ package user_defined_…

don't care値を使う

pp.184-186 don't care値を利用するとブール式が簡単化されるためハードウェアが少なくて済む。 下のコードはLEを1個消費した。 library ieee; use ieee.std_logic_1164.all; entity circuit_with_dontcare is port( a : in std_logic_vector(2 downto 0); b…

トライステートバッファー

p.184 4ビット幅のトライステートバッファーを合成する。 library ieee; use ieee.std_logic_1164.all; entity tri_state_buffer is generic( /* naturalは自然数型(0~2^31-1)。 ほかにinteger、positiveなども。 stdライブラリーのstandardパッケージに含…

和と比較と / 出力をDFFに通す

pp.149-151 6.1 設計単位とコード構造と / 和と比較と -と同じ回路の出力を、今度はDFFに通す。 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity add_compare_registered is generic( NUM_BITS: natural := 8 ); port( clk: i…

非同期リセットDフリップフロップ

関連: プロセス文でポジティブエッジトリガー型Dフリップフロップを作る - pp.147-148 library ieee; use ieee.std_logic_1164.all; entity flip_flop is port( d, clk, arst: in std_logic; q : out std_logic ); end entity; architecture flip_flop of fl…

パリティディテクター / チェーンタイプ

ただしチェーンタイプにコンパイルされるとは限らない。 p.146 library ieee; use ieee.std_logic_1164.all; entity parity_detector_2 is port( byte: in std_logic_vector(7 downto 0); parity: out std_logic ); end entity; architecture chain_type of …

genericリストに定数を列挙する / それに意味のないとき

pp.135-137 genericリストを使って前回のコードを少し書き換える。 -- これがパッケージリスト library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; -- これがエンティティ宣言 entity add_compare_cell is generic( IN_WIDTH : natural …

6.1 設計単位とコード構造と / 和と比較と

p.131 a (0b000~0b111)とb (0b000~0b111)との和(0b0000~0b1110)を求める。 さらにa > bのときにcompフラグを立てる。 まだところどころわからない。 -- これがパッケージリスト library ieee; use ieee.std_logic_1164.all; -- ieeeがライブラリー名。std…

defer

/ディふァー/ p.130 If it contains a declaration of subprogram or deferred constant (a constant with unspecified value), the package body is required. 非公式訳: サブプログラムの宣言またはdeferred constant (値の指定されていない定数)をそこ(訳…

全加算器

p.116 ここまで読んでやっとVHDLの話に入る。 VHDLで全加算器を作る -のときとは違って、真理値表から導いた論理式をそのまま記述する。 -- entity宣言で入出力ポートを宣言する。 entity full_adder_unit is port( a, b, cin: in bit; sum, cout: out bit )…

infer

p.116 Upon compilation of this code, a circuit that complies with the full-adder unit functionalities is inferred. 非公式訳: このコードをコンパイルすると、全加算器の機能を持つ回路(記述したVHDLどおりの回路)が生成(導出)されます。

infer

/インふァー/ Circuit Design with VHDL, third edition (The MIT Press), p.75 In VHDL, forgetting to do that leads the compiler to infer latches, impairing the system speed and reliability. 非公式訳(参考: 動かしてわかる CPUの作り方10講, p.119…