「HDL設計練習帳」のsupport
2007年6月16日更新

お知らせ
のぞき見
課題の解答例の入手
訂正および追加・解説
さらにやさしい解説
応用(CPUの設計)
誤問・愚問・難問・珍問
付属CD-ROMの使い方

大歓迎
この本に対する質問やご意見の受付


おしらせ

 Altera社ではC driveのvolume番号だけで使える無償のE+Maxの配布を2002/12/31で中止しました。なお,このlicenseの交付は2003/3/31で終了しました。
 E+MaxでVerilog-HDLの設計をしている方は,パソコンにNIC(LAN card)を用意して,無償のQuartus II Web Editon(付録CD-ROMか最新版をdownload)を使うようにしてください。
 HDLのassembler版あるいはCUPL/ABELの拡張版とも言えるMax+plus IIはまだそのまま使えます


HDL設計練習帳」の見本をのぞき見る
(CQ出版のsiteへ飛ぶ)

もくじ」をのぞき見る

まえがき」をのぞき見る
(pdf file)

第1章」をのぞき見る(pdf file)


課題の解答例

 猪飼さんの著書「HDL設計練習帳」には,多数の課題が用意されています。本来それらは同書の中で解法を解説すべきですが,紙面に限りがあるためにこのsiteでsupportします。
 なお課題の解答例はpdf fileになっていますが,直接のdown loadには対応していません。請求者のmail boxに添付fileとして送ります。なおpdf fileにはpassword lockが掛かっていますので,mailで送ったpasswordを保存しておいてください。なおこの解答例は直接に印刷することはできません。
 この本を買った人で解法の解説が欲しい人は著者までmailを送って請求してください。下記の項目をclickすればmail送信formが開きます。現在はserverが自動送付に対応していませんので,手動で送りますから出張などのときは,最長1週間程度かかることもあります。ご了承ください。

【送信依頼】(←ここをclick)

【送信事故】
 2005/1/17 に "レールシティ 301" というmail addressで4回も解答の要求をいただいておりますが,このaddressでは送れませんでした。なお,電話番号も書かれていますが,市外局番がないので連絡ができません。さらにpasswordが違っていますので,解答を送ることはできません。

第1章
 課題 1.1,1.2,1.3,1.4,1.5,1.6
第2章
 課題 2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,2.10,2.11,2.12
 2.13,2.14,2.15,2.16,2.17,2.18,2.19,2.20,2.21,2.22,2.23
第3章
 課題 3.1,3.2,3.3,3.4,3.5,3.6,3.7
第4章
 課題 4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,4.10,4.11
第5章
 課題 5.1,5.2,5.3,5.4

【課題の解答例の訂正】

☆ 2007/5/14以前に送付した解答例から以下の間違いが見つかりました。
訂正してご使用ください。(この訂正は読者からのご指摘によるものです。ご指摘頂いた読者に感謝いたします。)
・課題 2.3 解答例の右側下から2行目を以下のものと差し替えてください。
 assign Y = dec(S~nStb);
・課題 2.6 問題文から以下の部分を削除してください。(この項2007/6/16掲載)
 負論理のStrobe信号nStbの“1”に合せて

☆ 2003/6/27以前に送付した解答例から以下の間違いが見つかりました。
訂正してご使用ください。(この訂正は読者からのご指摘によるものです。ご指摘頂いた読者に感謝いたします。)
・課題 2.16 解答例の5行目を以下のものと差し替えてください。
 assign P = ~ps[0];
・課題 2.18 解答例の4番目の式,wire l, e; を削除してください。

☆ 2003/2/19以前に送付した解答例に違う問題の解答がまぎれ込んでいたことが読者からのご指摘で分かりました。
・課題2.19 解答例を以下のものと差し替えてください。
module BCDAdd (S, C4, A, B, Ci);
  input [3:0] A, B;
  input Ci;
  output [3:0] S;
  output C4;
  wire cry;
  wire [4:0] ps;
  function [4:0] plus;
    input [4:0] sum;
    input over9;
    if (over9 == 1'b1) plus = sum + 6;
    else plus = sum;
  endfunction
  assign ps = A + B + Ci;
  assign cry = ps[4] | ps[3] & (ps[2] | ps[1]);
  assign S[3:0] = plus(ps, cry);
  assign C4 = cry;
endmodule

☆ 2002/9/7以前に送付した解答例から以下の間違いが見つかりました。
訂正してご使用ください。
・課題3.5 右側の式
else if (Hold == 1'b0) Q <= 1,b0:
 → 「else if (Hold == 1'b0) Q <= 1'b0:」


HDL設計練習帳の訂正および追加・解説

 訂正箇所は太字で記載してあります。
 読者からのご指摘で訂正や追加した分については,ご指摘があった部分を色字にしてあります。ご指摘いただいた読者の方々に心から感謝いたします。

第1章
・p28 「図1.15」 7400型回路(b)の上の回路
右側に「= 00 ではない」を追加
同じく下の回路
AND記号の中に「00」,NOT記号の下に「04」を追加

・p36 見出し
「1.5 HDL によるDigita回路設計のForm」→「1.5 HDL によるDigital回路設計のForm」

第2章
・p54 [解] Verilog-HDLによる設計
output Y[3:0];」→「output [3:0] Y;

・p55[例題 2.6]の本文【これは読者からのご指摘によるものです】
「正論理のStrobe信号nStbの“1”に合せて,」→削除

・p56 「解」 要求どおりの設計例
Y3 = A2 # A2 & A1 & A0;」→ 「Y3 = A2 # A1 & A0;

・p57 [課題2.4]の表の上の段
3,11」→「11
 下の段
Y1」→「Y[1]」,「Y2」→「Y[2]」,「Y3」→「Y[3]」,
Y4」→「Y[4]」,「Y5」→「Y[5]」,「Y6」→「Y[6]

・p85 [解]
assign ps = adda(A)」→「assign ps = oneadd(A)

・p85 [課題2.15]の送付した解答例
【読者からのご指摘】
 A の添え字が5〜1になっていて、4〜0としなかった理由は何か。
【ご指摘に対しての回答】
 添え字は基本的にはbus dataについては0から振っています。独立したdataを区別するときは1から振っています。0番目の人という表現は変だからです。ここでは五つの独立した信号ですから,後者に従った訳です。信号の名称はA,B,C,D,E の五つでもよいわけです。

・p86 [解] Verilog-HDLによる設計
assign PE = A[8] | A[7] | A[6] | A[5] | A[4] | A[3] | A[2] | A[1];
→「assign PE = A[8] ^ A[7] ^ A[6] ^ A[5] ^ A[4] ^ A[3] ^ A[2] ^ A[1];
【読者からのご指摘】
 この解のPEはそのまま出力していますので,"1"の数が偶数のときには出力が"0"になりますが,これで偶数parityの出力になるのでしょうか。反転を出力とすべきではないでしょうか。
 そうしないと,課題2.16の[考え方]にある「和の最下位Bitをそのまま出力します。」という記述と矛盾します。
【ご指摘に対しての回答】
 課題2.16の記述を間違えています。→「和の最下位のBitを反転して出力します。」
 このご指摘で,偶数parityを取るという用語の解説が本書では不十分だったということが解りました。偶数parityはparity情報を含めて"1"の数が偶数個になるという概念です。ですから「8 bit dataの偶数parityを取る」ということは,8 bit全部のexclusively-orを取ってparity bitを創り出すという意味です。ですから "1"の数が偶数個ならPEは"0"になります。

・p98 [解] 8桁の乗算の設計例
【読者からのご指摘】
 掛け算の式をfunctionで呼び出さなくてもよいのではないでしょうか。
【ご指摘に対しての回答】
 掛け算の式はご指摘のとおりif文やcase文を含まない単純な論理式なので,直接assign文でassign P = A * B;と書くことができ,IC vender などが提供するlibraryで乗算回路が論理合成されます。
 この説明のあとに【注意点】として以下の一行を追加します。
  「多くのVerilog-HDLの処理系では,function文を使わずにassign文で直接記述してもかけ算回路の記述ができます。生成される回路は同じです。」
 本書ではfunction文を使わなければならない場合についての説明がなされていません。そこで難しい式はassign文で記述できないのではとの心配を抱く読者のためにfunction文で記述してあります。そのように記述する主義の人もかなりいるようです。

p100 [図2.17]の5行目
FA HA FA」→「FA FA FA

第3章
・P109 下から3行目
【読者からのご指摘】
  本文は,「設計例の論理式は回路図通りに書かれていますが,より簡単に,
assign Q = D & Ena | ~nq; assign nq = ~D & Ena | ~Q;
となっているが,さらに簡単に,Enaが"1"のときにDを、"0"のときにQを出すということで,
assign Q = Ena & D | ~Ena & Q;
と記述してもよいのではないか。
【ご指摘に対しての回答】
 RS型のflipflopからD-Latchが作られることを原理的に示したためにこのような書き方になったものです。したがって実際のICの素子が,上記の式と同じに作成されるようにしました。
 ここでは四つのNAND型素子と一つのinverterが使われています。図3.2に示したMIL記号の回路図を参考にしてください。ここではCompiler が論理式を勝手に簡素化しないようにnqという信号を宣言しています。
 ご指摘のように記述しても回路は生成されますし,動作もします。その回路は,


となります。この場合Qの反転出力をflipflopから直接取ることはできません。Q出力にnotを付けて,nQとします。

・p112 下から9行目
「ReadIn信号が"0"のときは」→「ReadIn信号が"1"のときは」

第4章
・p144 [解] 設計例
【読者からのご指摘】
 直並列データ変換回路で,外部からのDClockをレベル判定として使っていて,外部DClockと無関係に入力を行う回路となっていて,このedgeで動かすようになっていない説明がありません。
【ご指摘に対しての回答】
 この部分はたしかに説明が不足していて誤解が発生する可能性があります。以下の記述を【注意点】に追加します。
   「外部からのDClock はSystem clockに同期した1 Clock幅のTag信号であると仮定しています。
 ここのtag信号はdataの性質をあらわす一種の制御信号です。ですから,"0''→``1''→"0''と変化するようには考えていません。2 clock以上連続で"1''が出ていれば,二つのdataが到着したという考えです。
 System外部のclock非同期のdataではこれでは困りますが,system内部で直列伝送する場合にはこれで済ませています。

・p147 図4.9
「X5のexclusively-or回路の入力の内CR8の出力から接続されている線」→「CR0へ入力している線」
修正した図面は出版社で作成していますので再版時までお待ちください。

・p152 [解] 設計例,下から2行目
else if (Up == 1'b1) C <= C - 1;」→「else if (Down == 1'b1) C <= C - 1;

・p162 [注意点]の内容すべて(表4.1を含む)
すべての「cff[1]」→「cff[2]」,すべての「cff[2]」→「cff[1]

・p165 [解] FIFOのControl回路の設計例,18行目
assign Full = (dc ==4);」→「assign Full = (dc == 16);

・p167 [解] StackのControl回路の設計例
reg [4:0]SA;文以下のすべての「SA」→「sa」,endmodule文の前に「assign SA = sa[3:0];」を一行追加

第5章
・p170 例題5.1 4行目
「Count指令がくるたびに」→「Count指令Countがくるたびに」

・p174 図5.4 上側
S2からS1への制御の流れを示す下側の線に,「Set & D≠0」という遷移条件を追加する。

・p176 [解] Stateを個別のFlipflopで表わした設計例
上から15行目
else if (init & Set & ~(D == 0)) on_count <= 1;
 →「else if ((init| counted) & Set & ~(D == 0)) on_count <= 1;

【同じところで読者からのご指摘】
 不一致判定なら~(D == 0)ではなく,D != 0とするのが順当ではないでしょうか。
【ご指摘に対しての回答】
 この二つの表記法で出来上がる回路には大差はありません。本書ではなるべく使う記号の種類は少なくという姿勢で,HDLの種々の文法を駆使するという立場を取っていません。ですから一致検出の記号 == だけを使って回路を記述しています。この一致比較回路の否定論理は原理通り構成するとexclusively-nor回路とnand回路になります。
 これをご提案のように文法上の記号の種類をもう一つ導入して不一致検出にすると,exclusively-or回路とor回路の組合わせになるわけです。ためしにこの両者の回路を作成して Max+plus II上で配置配線を行った結果を出しておきます。回路規模的には同じ回路になります。

○ 不一致論理を使った場合の設計
module CoinTest (Uncoin, A, B);
  input [7:0] A, B;
  output Uncoin;
  assign Uncoin = A != B;
endmodule

○ 本書の回路
module CoinTest (Uncoin, A, B);
  input [7:0] A, B;
  output Uncoin;
  assign Uncoin = ~(A == B);
endmodule

 これらの設計をMax+plus IIで配置配線した結果は以下のようにまったく同じとなった。
Logic Array Block Logic Cells I/O Pins Expanders Interconnect
A: LC1 - LC16 0/16( 0%) 16/16(100%) 0/16( 0%) 0/36( 0%)
B: LC17 - LC32 1/16( 6%) 5/16( 31%) 16/16(100%) 16/36( 44%)

・p181 [解] 設計例,5行目
always @ (D or stbrise)|」→「always @ (D or stbrise)」 (文末の | を除去する)

・p190
【読者からのご指摘】
 調歩同期回路で,わざわざ回路規模のかさむ論理回路によるShift回路を採用しなくてもよいのではないでしょうか。その意図を説明してください。
【ご指摘に対しての回答】
 たしかに Shift Register で定義すれば,回路規模の点で有利です。ただDigital systemをどう捉えるかという考え方の点からは,このような設計もできるということへの理解が必要だと考え,例題4.6のAddressable latchの原理に基づいた設計でもShift機能が実現できることを示しました。なお,単なる論理回路でShiftをして代入する回路は,<<>>記号によるShift回路と回路規模は同じです。
 このWeb siteの中にZ80の設計する課題が上がっています。ここでのShift機能にはご指摘のようなShift registerの構成で実現しています。
 ところで,回路規模が嵩むといってもAltera社のICを使う上ではおおきな問題ではありません。以下実際に両者を設計して比べた例を出しておきます。

○ Shift registerの設計例(shift registerとaddreesable flipflop)
module ShiftTest(Y, Received, A, Start, Shift, Clock, nClear);
  input A, Start, Shift, Clock, nClear;
  output [7:0] Y;
  output Received;
  reg [7:0] Y;
  reg [2:0] C;
  always @ (posedge Clock or negedge nClear)
    if (~nClear) C <= 0;
    else if (Start) C <= 0;
    else if (Shift) C <= C + 1;
  assign Received = & C;
  always @ (posedge Clock or negedge nClear)
    if (~nClear) Y <= 0;
    else if (Shift) Y <= {A, Y[7:1]}; // shift register
endmodule


以下二つ目のalways文からcase文で書いた例
  always @ (posedge Clock or negedge nClear)
    if (~nClear) Y <= 0;
    else if (Shift)
      case(C) // Addessable flipflop
        0:Y[0] <= A;
        1:Y[1] <= A;
        2:Y[2] <= A;
        3:Y[3] <= A;
        4:Y[4] <= A;
        5:Y[5] <= A;
        6:Y[6] <= A;
        7:Y[7] <= A;
      endcase
endmodule


○ Max+plus IIで配置配線をした結果
 Shift register を使ったほうが微妙に回路規模が小さくなる。
【Shift register】
Total logic cells used: 14/32 ( 43%)
Average fan-in: 4.07
Total fan-in: 57
Total logic cells required: 14
Total flipflops required: 11
Total product terms required: 27
【Addressable flipflop】
Total logic cells used: 14/32 ( 43%)
Average fan-in: 6.35
Total fan-in: 89
Total logic cells required: 14
Total flipflops required: 11
Total product terms required: 35

・p191 [解] 調歩同期Dataの受信回路の設計例
else sclock <= sclock + 1;|」→「else sclock <= sclock + 1;」 (文末の |を除去する)

・p195 上から5行目
「無償で使える範囲が広いFLEX10K Series」→「無償で使える範囲が広いACEX1K Seriesあるいは」(ACEX1Kを追加)

・p195 上から6行目
「設計EDIF」→「設計EDIF」

・p195 [図5.14]
C0="1"」→「C[0]="1"」,「C="0"」→「C[0]="0"
「Write Mode」→「Write Config」,「Read Mode」→「Read Config」,丸の中に書かれた「AD」→「BAD

・p195 [表5.5]
DEVSEL」→「DEVSEL#

・p198
【読者からのご指摘】
 [解]の中に「PARtoPCI」という信号がありますが,説明をしてください。
【ご指摘に対しての解答】
 この信号はprity dataをPCI busに出す指示信号です。
じつはPCI busのparity信号に関しては1 bus cycle遅れてbusに出すように規定されています。そのため非常にややこしい制御が必要で,この事情を本書に記述することは紙面を取るだけでなく,その解説を理解する事も大変なので省略しました。
 また,現在PCI busの制御はIPを利用して,black boxとして使う人が多いので,この設計例ではさわりだけを解説しています。詳しくは参考図書の[3]をご覧ください。