第 3 章 鳥海 佳孝 とにします. はじめに またひととおりの記述を説明した後に される「7セグメント・デコーダ付きの10 進カウンタ」を作成することにします. は,これからの記述スタイルで重要にな これくらいの簡単なものでしたら,特 この章では,PC環境におけるHDL設 ると筆者は考えている,パラメタライズ にいろいろ仕様を説明することなく,ほ 計の実際を,手順にしたがって説明して ド記述についても紹介します (Appendix) . とんどの読者の皆さんに簡単にご理解い ただけるのではないかと思います.何を いきます.文法などの細かいことについ ては,多くの参考書がありますので,そ れらを参照してください. ●サンプルは簡単でわかりやすく ●二つの言語による記述を比較 作るのかわからない,あるいは理解する 言語としては最近のトレンドはどちら のにたいへんというのでは,本来の目的 かということもよくいわれるようですが, となるHDL 設計技術の修得に十分なパ 本稿ではVerilog-HDL とVHDL の両者 ワーをかけられません. いきなりASIC を作るくらいの規模を について取り扱っていきます.両方を使 想定してしまうと,そのすべての仕様か いこなせるようになっていただきたいと ら書き出さなければなりませんので, 思うからです. ●外部端子表をつくる まずここで取り上げる7 セグメント付 HDL設計とは別のところで苦労してしま はじめてHDL 言語に触れる人にとっ います.誌面の都合もありますので,誰 ては,二つの言語を同時に学ぶことは大 でも簡単に記述できるようなものを取り きな負担になりますし,簡単にはできな このように外部ピンにおける機能や特 上げることにします. きの10 進カウンタの外部ピン仕様を表1 に示します. いかもしれません.そんな方は,まず片 徴,属性(入力か出力かあるいは入出力 詳細は「設計仕様」を決めるところで 方を身につけてください.いずれかの記 か) を記述するのがいわゆる外部端子表で 扱いますが,テーマとして取り上げたの 述をマスタしておけば,別の言語で設計 す.通常のASIC の設計においても,仕 は, 「7 セグメント・デコーダ付きの10 進 することになっても,HDL設計を行った 様書には必ずもり込まれている内容です. カウンタ」です. 経験は生かされることになるでしょう. ●機能の特徴をまとめる ●ビヘイビア記述は行わない 設計仕様 にするならば,ビヘイビア・モデルを書く 必要があります.しかしここで紹介する まず何を作るか.学習するにあたって, 目的となるテーマは非常に重要です. ことから,あえてビヘイビア記述は行わ るわけではありませんが,規模が大きく なったり,完全にオリジナルな開発の際 には,ここで仕様をまとめておくことが ものは,その仕様が非常に簡単であるこ と,すでに世の中で数多く作られている 次に特徴をまとめていきます.今回の 例は,そんなにすぐれた機能が付いてい HDLを使ったトップダウン設計を前提 ●テーマは 7 セグメント・デコーダ 付き10 進カウンタ 重要になります. まず入力としては,リセット端子,ロ 本稿を執筆するにあたり,いろいろ考 ード端子,カウント・アップ/ダウンのコ 設計は,すでに仕様書があることを前 えましたが,レジスタ部分(順序回路)と ントロール端子があり,これらがカウン 提として,RTL設計からスタートするこ デコーダ部分(組み合わせ回路)から構成 タのコントロールを行います.また,カ ないことにしました. Design Wave Magazine No. 9 87 表1 7セグメント・デコーダ付き 10 進カウンタの外部端子表 端子名 CLK RESET LOAD DATA DOWN 属性 入力 入力 入力 入力 入力 ビット幅 1 1 1 4 1 アクティブ ー ー L ー L LED 出力 7 ー 機能説明 クロック入力端子 リセット入力端子 ロード入力端子 ロード・データ入力端子 カウント・アップ/ダウンのコントロール入力端子 L=カウント・ダウン H =カウント・アップ 10 進カウンタの7セグメント表示出力端子 コラム ビヘイビア記述の例 本文で説明している7セグメント・デコー ア記述のポイントです.つまりプロセッサの ダ付き10 進カウンタの設計では,ビヘイビ 処理の観点から記述したものがビヘイビア記 アの記述は行いませんでした. 述になります. そこで,ここではビヘイビア記述がどのよ うなものかについて,簡単に見ておきます. えます. ビヘイビア記述は,複雑になるほど効果 を発揮します.プロセッサのアーキテクチャ タスク分けがされていれば,CISC型の記 を変更可能なのか,またこの変更によりどの 述をRISC型の記述に変更するのは簡単です. くらいの性能が上昇または劣化を引き起こす のかといったことも細かく検討ができます. リストAは,非常に簡単なCPUのビヘイ CISC型のプロセッサが,タスクを入れ替え ビア記述です.処理ごとにタスク分けがされ るだけで,RISC型のプロセッサに変えられ ているのがわかります.これこそがビヘイビ ます.これがビヘイビア記述を行うよさとい リスト A CPU のビヘイビア記述例 `timescale 1 ns / 100 ps module CPU (ADR , D , AS_ , R_W , RST , clock); : 中略 : always @(posedge clock) RST_latch = #DELAY RST ; always @(posedge clock) RST_latch2 = #DELAY RST_latch ; always @(posedge clock) if(~RST && ~RST_latch && ~state_cnt_wait) state_cnt = #DELAY state_cnt + 1'b1 ; task reset ; fork gen_reg[PC_REG_No] = 32'h00000000; INST_REG = 32'h00000000; FLAG_REG = 32'h00000000; AS_ = 1'b1; R_W = 1'b1; state_cnt = 1'b0 ; branch_op_flag = 1'b0 ; call_op_flag = 1'b0 ; state_cnt_wait = 1'b0 ; Dout = 32'h00000000; state = "RESET"; #1 ADR = PC; join endtask 88 task fetch ; fork state = "FET"; R_W = 1'b1; AS_ = 1'b0; #1 if(branch_op_flag || call_op_flag) ADR = gen_reg[IMM_REG_No]; else ADR = PC; #CYCLE begin INST_REG = D; fork if(jump_op_flag || call_op_flag) gen_reg[PC_REG_No] = gen_reg[IMM_REG_No] ; branch_op_flag = 1'b0 ; call_op_flag = 1'b0 ; join end join endtask task move ; fork state = "MOVE"; case({smem_access,dmem_access}) : 以下略 : ※全コードは付属 CD-ROMに収録してあります Design Wave Magazine No. 9
© Copyright 2024 ExpyDoc