第 3 章

第
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