論理設計読本 - tok22 第1 章 はじめに...

102
L LDLabo 2004 7 17

Upload: others

Post on 10-Mar-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

論理設計読本

「L 言語説明書暫定版」

LDLabo

2004年 7月 17日

Page 2: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を
Page 3: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3

目次

第 1章 はじめに 1

1.1 論理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2 時間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.3 道具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

第 2章 設計方法 5

2.1 真理値表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.2 ブール式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.4 構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11

2.5 双方向信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12

2.6 論理変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

2.7 デバイス変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

2.8 実装設計 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16

2.9 論理設計の循環 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46

2.10 論理設計環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

2.11 LVの使い方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49

第 3章 簡単な設計例 53

3.1 足し算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53

3.2 比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

3.3 足し算の拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56

3.4 引用庫 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57

3.5 引き算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58

3.6 掛け算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60

3.7 割り算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70

3.8 シフトレジスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82

3.9 セットリセット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86

3.10 可変分周器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86

第 4章 拡張 89

4.1 目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89

4.2 メモリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89

4.3 順序実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90

Page 4: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を
Page 5: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

5

図目次

1.1 論理の機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.1 状態遷移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2 7セグメント LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.4 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.5 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.6 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12

2.7 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14

2.8 LDC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

2.9 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27

2.10 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33

2.11 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40

2.12 コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

2.13 エディタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

2.14 LV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49

2.15 頁移動棒 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49

2.16 LV小窓 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49

2.17 間隔変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

2.18 カーソル値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

2.19 画面移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

2.20 カーソル移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

2.21 集合信号値 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

2.22 頁移動棒 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

2.23 設定保存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

2.24 選択画面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51

2.25 拡大画面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51

2.26 色見本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52

2.27 代表名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52

3.1 足し算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53

3.2 真理値表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53

3.3 論理式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53

3.4 足し算の L 譜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53

Page 6: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

6 図目次

3.5 足し算の機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53

3.6 論理積 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

3.7 論理和 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

3.8 論理否定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

3.9 足し算の L 譜その 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

3.10 比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

3.11 真理値表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54

3.12 論理の機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55

3.13 VHDL譜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55

3.14 VHDLテストベンチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55

3.15 Verilog-HDL譜 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56

3.16 Verilog-HDLテストベンチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

3.17 真理値表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56

3.18 論理の機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56

3.19 足し算の L 譜その 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56

3.20 足し算の L 譜 2進 4桁 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57

3.21 論理の機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58

3.22 足し算の L 譜 2進 4桁その 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3.23 引き算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58

3.24 真理値表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58

3.25 真理値表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58

3.26 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58

3.27 引き算の L 譜 2進 4桁 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59

3.28 引き算の L 譜 2進 4桁その 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

3.29 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60

3.30 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60

3.31 2進 4桁掛け算まとめて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61

3.32 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62

3.33 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62

3.34 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63

3.35 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63

3.36 押し出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70

3.37 押し出しと引き算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70

3.38 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71

3.39 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73

3.40 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82

3.41 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82

3.42 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82

3.43 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82

3.44 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86

3.45 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87

3.46 機能実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88

Page 7: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

図目次 7

4.1 メモリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89

4.2 順序実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90

4.3 繰り返し 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91

4.4 繰り返し 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91

4.5 繰り返し 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91

4.6 繰り返し 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91

4.7 注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92

4.8 回避後 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92

Page 8: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を
Page 9: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

9

表目次

2.1 状態遷移表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.2 状態遷移表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13

2.4 変換出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

2.5 デバイス化比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

2.6 色指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52

Page 10: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を
Page 11: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

1

第 1章

はじめに

自分に成り代わって行動する装置の製作を行う場合に昔は全部分を機械的なもので作っていました。例え

ば茶運び人形*1は、人形の動作の手順を歯車の回転による時系列に組み込んで動かしています。世界最初の

バベッジ*2 の計算機械も歯車を組み合わせたカラクリによって実現されていました、計算手順は歯車の組み

合わせに内包されていたのでしょう。今日では、上記の機械が持っていた動作を決めていく手順は電気的な

もので実現されています。特に複雑な制御を必要とするものに措いてはコンピュータを多用しています。計

算機械は歯車の回転から生まれる規則正しい時系列に人の望む仕事を割り付けて計算を行わせました。コン

ピュータも歯車のように規則正しい時系列を持って動いています、プログラムは時系列に乗せられて、電子

的に作られた装置の動作を決定しています。現在の計算機は電卓やコンピュータなどの電子的な装置が主流

で機械的な部分は主要な機能には使われていません。しかし、時系列に手順をのせて機械の動きを、人の考

えたように動かそうと言う方法の原点は変わっていないようです。将来において電子的な装置の大半が他の

原理を用いた装置に置き換えられることがあっても、この原点は、その装置に引き継がれていくと思います。

図 1.1 論理の機能実行

さて、その様に装置の素材とは無関係

な動作の手順の組み立てをどのように

して、設計していくのかと言う問題を

解決することを論理設計と言います。

今日、使われている装置は「動作の手

順の組み立て」のほとんどを半導体の

上に実現しています。半導体は極度に

集積度の高い部品として複雑な「動作

の手順の組み立て」を持つ装置には欠

かせないものです。それらには、概ね

クロックと言う高い周波数の電気信号

をつないでおり、機械装置の歯車の様

な働きをしています。「動作の手順の

組み立て」を、これから「論理」と言うことにします。図 1.1を見れば論理も歯車の組み合わせを考えるように、

設計していることが分かるでしょう。人が大きな論理を作るときに、何を原理として積み重ねたらよいのかを

*1 からくり人形の中でも特に有名で、人形の茶托に茶碗をのせると動きだし客の所まで運んで行き、茶碗を取ると人形が止まります。そして再び茶碗を載せるともと居た場所にくるりと振り返って戻ってきます。茶運び人形の説明より引用

*2 チャールズ・バベッジは永いあいだ忘れられていた。何しろ彼がコンピュータを創ろうとしたのは江戸時代のことなのだ。1991年ロンドン科学博物館は、残されていたバベッジの設計図をもとに、バベッジの幻のコンピュータを復元した。いくつかの設計図上の間違いは見つかったものの、バベッジのコンピュータは正しく計算をしたのである。現在ではコンピュータの発想を得て設計した最初の人という評価が固まっている。チャールズ・バベッジはコンピュータの父と呼ばれるようになった。ちえの和WEBページより引用

Page 12: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2 第 1章 はじめに

明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

作ったのはライプニッツと言う人なのですが、ともに 17∼18世紀の人です。これらの原理はコンピュータを発

明した人たちに大きな手がかりと設計道具を与えましたが、コンピュータが広く普及して計算用途以外にも盛ん

に使われることで、コンピュータを実現した原理が計算以外でも複雑な「動作の手順の組み立て」が必要な装置

にとって有用なものであることが結果を持って証明される時代を迎えました。

1.1 論理

私たちの周りには、複雑な手順を内包した小さな装置が溢れています。それらの装置は、ほとんどが使用者の

用途に応じて、使用者自身が手順を変更可能に作ってあります。装置は変更のできない論理と変更の可能な論理

からなっていますが、通常は変更の可能な論理が、機能に対応したものになっていないと見るべき働きをしませ

ん。世界最初のコンピュータ、エニアック*4は「変更の可能な論理」を主にスイッチで実現していたようです。

コンピュータは最初から論理を固定部分と可変部分に分ける考え方を持って登場しました。そうした理由は高価

な装置を、ひとつの計算だけでなく、他の様々な計算に使いたいという要請があったからでしょう。さらに、途

中から開発に加わったノイマンが「変更の可能な論理」を記憶装置*5の容量を増やしてそこに納めるべきと主張

しました。「変更の可能な論理」は、どんどん拡大してスイッチからコアメモリ、半導体メモリに置かれるよう

になりました。これはプログラム内蔵方式コンピュータと呼ばれる、今日使われているコンピュータの基本と

なっているものでノイマン型とも呼ばれています。

さて、当初は大掛かりだったコンピュータに、いろいろの仕事をさせるために発案されたことが、今日のコン

ピュータの姿を形作りました。今日、コンピュータの方法や言葉使いが普及していますが、コンピュータの存立

する環境もまた変わりつつあります。例えば、ハードウェアとソフトウェアという言葉ですが、あくまで方便で

す、本質的なものを指した言葉ではありません。また、ハードウェアが将来も電気的、あるいは電子的なもので

ある必要も、その原理から言ってありません。ハードウェアが電気回路あるいは電子回路である必要は本質的に

ありません。機械的であれ、電気的であれ、論理を稼動させるために必要な媒体という理解が正しいと思いま

す。今日、以前には変更しない論理として半導体に配線されていたものをメモリに置くような半導体がありま

す、書き換えもできます。コンピュータのハードウェアもプログラムと同じくメモリに置かれる「変更の可能な

論理」になっています。今はまだ、コンピュータ的な手法、つまりプログラムに重きを置いて装置を設計するほ

うが容易だと考えられています、しかし現実的には論理がすべて「変更の可能な論理」になったのですから、基

本的に「変更しない論理」を前提に設計する「変更の可能な論理」で問題を解決する方法も唯一の選択肢から、

ひとつの選択肢になったと言えます。ノイマンが 2分した、論理装置の設計方法も、今は統合に向かっているよ

うです、本来、技術的な問題で分けただけなのですから、歯車のときから原理的には何も変わりありません。

*3 イギリスの小都市リンカーンに生まれた。職人の子として生まれたが、ブールは貧乏人の行く「ナショナルスクール」を出て、独学で数学を勉強する。彼は語学の才能にも恵まれていたようで、小学校の助教諭をし、数学の変分法についての論文を初めての仕事として書く。更に不変式論、微分方程式の演算子法にも貢献し、アイルランドのコーク大学の教授になる。何よりもブールの名を今日まで不滅にしたのは、ブール代数としてコンピュータ理論に適用されている記号論理学の創造である。彼は有名な書「思考の法則」を書いた。残念にも若くして 50才でなくなった。「F・ガレス・アシャースト. 10人の大数学者 -現代数学を築いた人々-. 講談社ブルーバックス, 1992.」より引用イギリスの貧しい階層で、ほとんど独学で数学を学び、産業革命の要求からそのころに生まれた初等公教育で、小学校の臨時講師をしていたのがブールである。その業績がアカデミズムに知られるようになってからも、彼の関心は初等教育とともにあり、ときに大学アカデミズムと対立した。彼の仲間には、バベッジやド・モルガンなどがいて、差分解析や計算機のような、あまりアカデミックでないことに関心があったが、それはコンピュータ科学のさきがけだったし、初等数学の代数的考察は現代数学の契機のひとつでもあった。イギリスの草の根アマチュアリズムの根強さを感ずる。日本評論社の「現代応用数学の基礎」[2] より引用

*4 1946年に、ジョン・プレスパー・エッカート・ジュニア、ジョン・ウィリアム・モークリーらによって開発されたコンピューター。世界最初の実用的なコンピューターといわれている。ENIACはおよそ 18000本の真空管を使用しており、1秒間に 5000回の演算を行うことができた。NHK「デジタル進化論」より引用

*5 エニアックの場合は真空管

Page 13: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

1.2 時間 3

1.2 時間

時間によって動きを決める様な装置を論理設計するには、時間が論理設計の原理で取り扱えないといけません

が、これを可能にするのが同期式の論理です。同期式の同期とは記憶素子の記憶時期を統一すると言う意味で

す。これだけの簡単な秩序を守るだけで論理設計の全工程にブール代数を始めとした論理設計の原則を適応して

の設計が可能になります。例えば同期式で設計された計数器は、論理式を全てクワイン・マクラスキーなどの論

理圧縮に掛けて簡単化できます。非同期の論理では時系列の実体をブール代数に捉えることができないので、論

理設計の基本則が使えません。

1.3 道具

論理設計の基本則を了解していれば、設計の道具を自分で作って整えることができます。基本則は明瞭なもの

ばかりなので、問題は道具を作る環境と設計方法をどうするかが重要になってくるでしょう。論理設計結果を実

体化するに当たってはプログラマブルロジックデバイスを前提にした、一般に文法などの公開された言語の論理

式で企業の開発ツールに引き渡すのが、将来に向けても安心な方法と思います。

論理設計の検証ではシミュレーションをして、その結果から動作を確認して論理の適否を判断します。シミュ

レーションでは論理に与える入力値を用意しておきます。これからシミュレーションを機能実行と言うことにし

ます。機能実行では長い時系列で動作する論理に適時に入力値を当てるのが大変です。機能実行の行程を把握し

て、適時に入力値を当てて人手の確認を無くするには、設計した論理を被検証論理として、それに対する検証論

理を並走させれば、自身の環境でも、企業の開発ツールでも検証できます。機能実行譜は被検証論理と検証論理

がつながっているだけで外からの入力がないのでテストベンチはとても簡単なものです。シミュレータは機能実

行譜にクロックを与えるだけで検証可能と言う訳です。

図 1.1を論理設計すると L 言語では LST04A15Aのような論理譜になります、これは機能実行の論理譜も加え

たものです。L 言語ではコンパイラ、シミュレータ、ビューワの 3種類のプログラムで論理設計を行います。コ

ンパイラとシミュレータはコマンドラインで使います、ビューワだけが、図 1.1のように GUIを使います。コン

パイラが企業の開発ツールに論理を引き渡すために出力する論理式の言語は ABEL,VHDL,Verolog-HDL,AHDL

を選べます、AHDL を除いてテストベンチも利用可能です。コンパイラはデバイスに直接書き込むデータを作

りませんので論理を実体化させるに当たってのメーカやデバイスの制約はありません。逆にメーカやデバイスを

限定しないと使えない特別な構造を言語仕様で対応するなどは現在 L 言語にはありません。3種類のプログラム

の合計容量は 710KBなのでフロッピー 1枚で運用可能でインストール作業も特にありませんが、すべてを同一

ディレクトリで行えば一切不要です。OS環境はWin95以上であれば問題ないと思います。3種類のプログラム

は http://www.geocities.jp/ldlabo/で配布します。

Page 14: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

4 第 1章 はじめに

LST04A15A

{============================================4ビット増減計数器 再設定付き

============================================}logicname sample

entity countinput Reset; { 初期化 }input ep; { 有効 1 }input et; { 有効 2 }input ld; { 再設定 }input ud; { 増減 }input data[4]; { 再設定値 }output q[4]; { 計数値 }output co; { 桁あふれ }short p; { 仮計数値 }

if (Reset)p=0;

elseif (ld)

p=data;else

if (ep)if (et)

if (ud)p=p+1;

elsep=p-1;

endifelse

p=p;endif

elsep=p;

endifendif

endif

if (et)if (ud)

if (p==15)co=1;

endifelse

if (p==0)co=1;

endifendif

endif

q=p;ende

{--------------------------------------------機能実行譜

--------------------------------------------}entity simoutput Reset,ep,et,ld,ud;output data[4];output q[4],co;bitr tc[8];

part count(Reset,ep,et,ld,ud,data,q,co)

tc=tc+1;

if (tc<3)Reset=1;

endif

if (tc>5)ep=1;et=1;

endif

if ((tc>5)&(tc<16))data=10;

endif

if (tc>0)if (tc<20)

ud=1;else

ud=0;endif

endif

if ((tc>10)&(tc<13))ld=1;

endif

ende

endlogic

Page 15: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

5

第 2章

設計方法

論理設計は条件付けの連鎖として考えることができます。時系列は連続して止められないものとして考えま

す、論理を時系列に乗せるときは、時系列を論理値に取り出して、それを条件付けに使うことで順序を取り扱う

論理を設計します。論理値は非記憶のものと、記憶のものがあります、記憶論理値は CLK の立ち上がりでのみ

値を変化させます。これらは、総じて真理値表として扱うことができます、とくに時系列を論理値に取り入れた

ものは状態遷移表と言われますが、同じものと考えます。

論理設計で考慮する物理的条件に論理素子の遅延の問題があります 2.8。多桁の論理値列では最終値に安定す

るまでの過渡的な状態で無数の値を取り得るので、論理設計の条件付けが成り立たなくなります。実デバイスの

この状態をなくすことはできませんが、論理設計で無効にすることはできます。

多桁の入力値は確定信号などで過渡的な状態を完全に避けられないのであれば順序を変える論理値として使う

べきでありません。記憶論理値では過渡状態の開始位置が CLK の立ち上がりなので CLK の周波数を過渡状態

が十分に納まる値に選べば過渡状態を無視できます。

図 2.1 状態遷移

OF F ON

24℃以下

26℃以上

例えば 1℃単位で温度情報が得られて、25℃を中心温度にして 24℃以下な

ら ON、26℃以上なら OFFにする加熱制御を行うとすると図 2.1のような状態

遷移図になります。温度情報を示す多桁論理値だけで条件付けを行うと 24℃

から 25℃の変化時には、その桁が表せる、あらゆる論理値が現れるので、短期

間に ON-OFFを繰り返す現象が起こります。温度情報がはっきりと 24℃と 25

℃の間を行き交うだけなら ONを継続して OFFになることはありません。これ

には、先に言ったような温度情報が確定していることを示す信号を使う必要が

あります。A/Dコンバータなどの変換終了信号などはこれに当たります。

この論理譜は LST04C10Bです。L 言語では出力は属性を持ちません、出口

を表す名前があるだけです、非記憶属性の場合は出口名をそのまま信号として

扱えますが、記憶信号は別途設けた内部の信号を代入して使います。出口名の qには内部記憶信号 pが代入され

ています。pは図 2.1の状態値で 1で ON、0で OFFを表しています。eocは温度確定の入力で 0で未確定、1

で確定です、pは eocが 1のときには温度情報 dで変化しますが、eocが 0のときは前値を維持します。状態遷

移図では矢印条件以外の現在値維持の条件は省略されています。他言語では示されない条件は現在値維持の条件

と見なされる場合が多いようです、L 言語では基本的に真になる条件はすべて書く必要があります、示されな

かった条件は偽の条件と見なされます。論理設計は条件付けられた代入で実現できます、これは真理値表表 2.1

と同等のものです。8桁の温度値の設定値との比較は演算子を使用して言語の提供する論理を展開しています。

算術演算子などの大きな論理を展開する演算子をまったく使わずに論理設計することもできます。

Page 16: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

6 第 2章 設計方法

表 2.1 状態遷移表

温度情報 確定 ON/OFF現在

ON/OFF遷移

– 0 – 前値

24℃以下 1 0 1

25℃ 1 0 0

26℃以上 1 1 0

25℃ 1 1 1

2.1 真理値表

真理値表そのまま使うような設計もできます。7

セグメント LED 表示器の図 2.2のための表 2.2の

真理値表を条件文で表した LST04C10Eを示しま

す。機能実行は図 2.4です。コンパイラの出力は論

理圧縮されています。

表 2.2 状態遷移表

入力 出力

d q0 q1 q2 q3 q4 q5 q6

0 1 1 1 1 1 1 0

1 0 1 1 0 0 0 0

2 1 1 0 1 1 0 1

3 1 1 1 1 0 0 1

4 0 1 1 0 0 1 1

5 1 0 1 1 0 1 1

6 1 0 1 1 1 1 1

7 1 1 1 0 0 0 0

8 1 1 1 1 1 1 1

9 1 1 1 1 0 1 1

10 1 1 1 0 1 1 1

11 0 0 1 1 1 1 1

12 1 0 0 1 1 1 0

13 0 1 1 1 1 0 1

14 1 0 0 1 1 1 1

15 1 0 0 0 1 1 1

2.2 ブール式

ブール式をそのまま書くこともできます、ブール

式が積和型でない場合はコンパイラの出力で積和型

に分解されます。また論理圧縮して式が変形される

場合もあります。

logicname sample

entity maininput a,b;output e;

e = a | !a&b;

endeendlogic

上の L 譜からはコンパイラが下の VHDL 譜

を出力します。

library IEEE;use IEEE.std_logic_1164.all;

entity main isport(e0 : out std_logic;

a0 : in std_logic;b0 : in std_logic);

end main;

architecture RTL of main isbegin

e0 <= (a0)or (b0) ;

end RTL;

図 2.2 7セグメント LED

q 0

q 1

q 2

q 3

q 4

q 5q 6

Page 17: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.2 ブール式 7

LST04C10B:温度調節器

logicname sample

entity main ←実効譜input eoc; ←温度確定input d[8]; ←温度情報output q; ←制御出力bitr p;

if (eoc) ←温度確定if (p) ←現状 ON

if (d>25) ← 26℃以上p=0; ← ONから OFF

elsep=p; ←変えない

endifelse ←現状 OFF

if (d<25) ← 24℃以下p=1; ← OFFから ON

elsep=p; ←変えない

endifendif

else ←温度未確定p=p; ←変えない

endif

q=p;ende

entity sim ←機能実行譜output eoc;output d[8];output q;bitn p;bitr tc[8];

part main(eoc,d,q)tc=tc+1;

if ((tc>=5)&(tc<=6)) p=1; endifif ((tc>=10)&(tc<=11)) p=1; endifif ((tc>=15)&(tc<=16)) p=1; endifif ((tc>=20)&(tc<=21)) p=1; endifif ((tc>=25)&(tc<=26)) p=1; endifif ((tc>=30)&(tc<=31)) p=1; endifif ((tc>=35)&(tc<=36)) p=1; endifif ((tc>=40)&(tc<=41)) p=1; endifif ((tc>=45)&(tc<=46)) p=1; endifeoc=!p;

if (tc<=5) d=28; endifif ((tc>=6)&(tc<=10)) d=27; endifif ((tc>=11)&(tc<=15)) d=26; endifif ((tc>=16)&(tc<=20)) d=25; endifif ((tc>=21)&(tc<=25)) d=24; endifif ((tc>=26)&(tc<=30)) d=23; endifif ((tc>=31)&(tc<=35)) d=24; endifif ((tc>=36)&(tc<=40)) d=25; endifif ((tc>=41)&(tc<=45)) d=26; endifif (tc>=46) d=27; endif

endeendlogic

図 2.3 機能実行

Page 18: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

8 第 2章 設計方法

図 2.4 機能実行

LST04C10E: 7セグメント LED表示器

logicname sample

entity maininput d[4];output q[7];

switch(d)case 0: q.0=1; q.1=1; q.2=1; q.3=1; q.4=1; q.5=1; q.6=0;case 1: q.0=0; q.1=1; q.2=1; q.3=0; q.4=0; q.5=0; q.6=0;case 2: q.0=1; q.1=1; q.2=0; q.3=1; q.4=1; q.5=0; q.6=1;case 3: q.0=1; q.1=1; q.2=1; q.3=1; q.4=0; q.5=0; q.6=1;case 4: q.0=0; q.1=1; q.2=1; q.3=0; q.4=0; q.5=1; q.6=1;case 5: q.0=1; q.1=0; q.2=1; q.3=1; q.4=0; q.5=1; q.6=1;case 6: q.0=1; q.1=0; q.2=1; q.3=1; q.4=1; q.5=1; q.6=1;case 7: q.0=1; q.1=1; q.2=1; q.3=0; q.4=0; q.5=0; q.6=0;case 8: q.0=1; q.1=1; q.2=1; q.3=1; q.4=1; q.5=1; q.6=1;case 9: q.0=1; q.1=1; q.2=1; q.3=0; q.4=0; q.5=1; q.6=1;case 10: q.0=1; q.1=1; q.2=1; q.3=0; q.4=1; q.5=1; q.6=1;case 11: q.0=0; q.1=0; q.2=0; q.3=1; q.4=1; q.5=1; q.6=1;case 12: q.0=0; q.1=0; q.2=0; q.3=1; q.4=1; q.5=1; q.6=0;case 13: q.0=0; q.1=1; q.2=1; q.3=1; q.4=0; q.5=0; q.6=1;case 14: q.0=1; q.1=0; q.2=0; q.3=1; q.4=1; q.5=1; q.6=1;case 15: q.0=1; q.1=0; q.2=0; q.3=0; q.4=1; q.5=1; q.6=1;

endswitchende

entity simoutput d[4];output q[7];bitr tc[5];

part main(d,q)tc=tc+1;

d=tc.0:3;endeendlogic

Page 19: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.3 機能実行 9

2.3 機能実行

論理設計と機能検証を同じように進められるような方法として、機能検証も論理設計で行うようにしていま

す。論理設計されたものを部品としてに引用して、検証のために設計された論理から部品の入力値を操作して部

品の出力を得ることができます。検証対象の論理を含んだ検証論理をシミュレーションすると検証対象の論理が

入力値に対して返した出力値を見ることができます。検証論理に出力値の検査も含めておけば、信号個々の妥当

性を人手をかけて確認する必要もなくなります。

簡単な計数器の例で示します。LST04C13Aは aが 1になると pをひとつ増やす計数器です。設計した論理を

L 言語では実効譜と呼んで entityに書きます。entityには名前をつけます、名前は sim以外なら、どんな名前も

付けられます。simは実効譜の機能動作を検証するための特別の実効譜だけに付けられる名前として L 言語で

使っています、機能実行譜と呼びます。実効譜の信号割り当ては、他の実効譜から引用されることを予想する場

合には、inputと outputを割り当ての最初に置きます、なぜなら、この順番で信号が引用されるからです。実効

譜の中で他の実効譜を引用するのには partを使います。引用する信号は、先に言った順番で同一属性、同一桁の

引用側で割り当てた信号を割り振ります。信号名は実効譜ごとに独立したものなので、引用元と引用側で同じ名

前でも違う名前でも問題ありません。

機能実行譜の設計は通常の論理設計と同じものですが、検証対象の引用した実効譜に入力値を供給するための

論理と、引用した実効譜の出力値を検査するための論理を作る設計になります。出力値の検査をすべて目視で行

う場合は入力の供給のみになります。1 CLK 単位の時系列位置を得るために tcを使っています。出力の検査で

は検査位置 tcで検査値 qが一致すれば gpを 1にします、一致しなければ epを 1にします、epが 1になったと

ころを異常として ecに記憶して chkに出力します。検査値がすべて正常なら chkには 0が残ります、実行譜で

は検査 3に 2とすべきところを 0にして、異常を検出するようにしています、結果は chkに 13が残っているの

で最終値のみ確認すれば検査 3で異常が起こったことが分かります、このような方法で検査行程の自動化が図れ

ます。機能実行譜の結果は図 2.5です。

図 2.5 機能実行

Page 20: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

10 第 2章 設計方法

LST04C13A:計数器

logicname sample

entity main ←実効譜input res; ←この順番で外から引用されますinput a;        〃output q[4];        〃bitr c[2]; ←内部信号名は inputや outputのbitr p[4];  後に続けます

if (res)p=0;

elseif (c.0)

p=p+1;else

p=p;endif

endif

if (a)switch(c)

case 0: c=1;case 1: c=2;case 2: c=2;

endswitchelse

c=0;endif

q=p;ende

entity sim ←機能実行譜output res; ←引用信号を出力に割り当てoutput a;      〃output q[4];      〃output chk[8]; ←異常情報output gp; ←検査正常output ep; ←検査異常bitr tc[8]; ←検査行程bitr ec[8]; ←検査情報bitn buf_q[4];bitn buf_ep;

part main(res,a,buf_q) ←実効譜引用tc=tc+1; ←検査行程増

{ 入力の供給 }buf_q.4=1; ←引用出力の確定桁を 1にするif (tc<3) res=1; endif ←初期化if (tc>5) a=tc.1; endif ←計数端緒

{ 出力の検査 }if (tc==5) ↓検査 1

if (buf_q==0) gp=1; else buf_ep=1; endifendif

if (tc==9) ↓検査 2if (buf_q==1) gp=1; else buf_ep=1; endif

endif

if (tc==13) ↓検査 3if (buf_q==0) gp=1; else buf_ep=1; endif

endif

if (tc==17) ↓検査 4if (buf_q==3) gp=1; else buf_ep=1; endif

endif

if (tc==21) ↓検査 5if (buf_q==4) gp=1; else buf_ep=1; endif

endif↓異常行程記録

if (buf_ep) ec=tc; else ec=ec; endif

chk=ec;q=buf_q;ep=buf_ep;

endeendlogic

Page 21: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.4 構造 11

2.4 構造

logicname name1

procedure name2

論理譜endp

entity name3

論理譜ende

entity name4

論理譜ende

entity sim

論理譜ende

endlogic

2.4.1 論理枠

procedure∼endpに書く手続き譜と entity∼endeに書く実効譜の 2種類の論理譜か

らなります。entity simは論理を検証するための実効譜で機能実行譜と言います、sim

はそれ専用の名前です。手続き譜の論理は引用庫に登録されます、実効譜はファイル

出力されます。引用庫に登録された論理は、すべての論理譜で引用できます、実効譜

は独立したものですが、他の実効譜でも部品として引用できますが手続き譜では引用

できません、機能実行譜が検証対象論理を引用するのはこの形式です。論理譜の種類

による配置の後先はありませんが、引用元は引用先よりも前に配置されている必要が

あります。具体的には c = a + bを求める LST04C13Fのようになります、機能実行

譜は aに 2、bに 3を与えて cが 5になれば論理譜の出来上がりです。

2.4.2 論理譜

論理譜は、はじめに信号割り当て、その次に論理文を書きます。

信号割り当て

信号割り当ては input/outputを前の位置に置きます。input/outputは信号の意味と、論理枠の入口と出口の意

味も兼用して、引用の際に使われるので、引用の無い場合でも慣用的に前に置くようにします。

LST04C13F:例

logicname sample

procedure add ←手続き譜input a[4],b[4];output c[4];

c=a+b;endp

entity test1 ←実効譜input a[4],b[4];output c[4];

c=add(a,b);← add手続き引用ende

entity test2 ←実効譜input a[4],b[4];output c[4];

part test1(a,b,c)← test1部品引用ende

entity sim ←機能実行譜output a[4],b[4];output c[4];

part test2(a,b,c)← test2部品引用a=2;b=3;

endeendlogic

その次に内部信号名を置きます、非記憶を bitnで記憶を bitr

で割り当てます。outputは信号名を論理枠の出口名に割り当て

ます、内部信号名のように記憶、非記憶の属性は持ちません。

信号割り当ては桁数を [ ] で指定します、[ ] のないときは 1桁

の指定とします。

論理文

論理文は式、条件文、引用文からなります、引用文は手続き

引用と部品引用があります、手続き引用は返値が 1個だけで式

の中で使えます、引数には式を置けます、部品引用の引数は信

号だけです。式は演算子と信号を組み合わせたものです。

条件文

条件文は if 文と switch文の 2種類があります。

if (条件式)真 論理文;

else偽 論理文;

endif

switch(条件式,条件式・・・)case 値,値・・・: 論理文;~~~~~~~~~~~~~~~~case 値,値・・・: 論理文;default: 論理文;

endswitch

条件文の条件式は通常の式と同じものですが代入式は置けま

せん、条件式の結果は if 文では最下位の桁が真偽の判定に使わ

Page 22: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

12 第 2章 設計方法

れます。switch文では case後の同位置の値と比較して同じなら真、違うなら偽で全部が真判定の case後の論理

文が実効になります。どの case文も実効にならないときに実効になる論理文を default以後に置くこともできま

す。if 文の elseと switch文の defaultは省略できます。switch文の例を LST04C13Gに示します。

LST04C13G:例

logicname sample

entity maininput a[4],b[4];output q[4];

switch(a,b)case 5,7: q=1;case 6,8: q=2;case 1,2: q=3;default: q=15;

endswitchende

entity simoutput a[4],b[4];output q[4];bitr tc[4];

part main(a,b,q)tc=tc+1;

switch(tc.1:3)case 0: a=5; b=7;case 1: a=6; b=8;case 2: a=1; b=2;case 3: a=9; b=10;default: a=0; b=0;

endswitchendeendlogic

演算子

論理演算、算術演算、桁送りなどの演算子と括弧を使って式を作ることが

できます。式中で使える演算子を表 2.3に示します。

式中の信号

inputあるいは outputに割り当てた aと言う名前の 1桁の信号を式で使う

場合は aで引用します。inputあるいは outputに割り当てた aと言う名前の

4桁の信号を式で aと引用する場合は全桁が対象になります。多桁の信号を

部分的に 1桁だけ引用するときは a.0などとします、0は最下位桁を指定す

る番号です、4桁の信号なら a.0,a.1,a.2,a.3まであります。連続した桁を部

分的に a.1,a.2,a.3と引用する場合は a.1:3のようにします。多桁の信号を桁

番号で引用する場合は昇順で行うのが順方向の引用になります、降順で行う

と桁の上下が逆になります。例えば aに 4を入れて b = a.3 : 0の代入を行

うと bは 2になります。b = aと同じにするには b = a.0 : 3とします。

2.5 双方向信号

実装では論理設計以外に電気設計が要求される場合があります。L 言語は

論理設計のためのものなので電気的な状態は基本的に取り扱いません。しか

し、例外としてデバイスの外に対しての入出力では絶縁と言う電気的な状態

を取り扱うことができます。

図 2.6 機能実行

双方向バス

出力

入力

出力制御

具体的には CPUのデータバスのようなものです。入力は常時接続

されていても問題ないのですが、出力は適時切り離さないと電気的

に問題がありますから出力の制御が必要です。上記を双方向信号と

言い inoutで割り当てます。双方向信号は名前を割り当てただけで

は有効ではありません、入力信号、出力信号、出力制御信号を enable

を使って関係付ける必要があります。

enable(双方向信号名,入力信号名,出力信号名,出力制御信号名)

入力信号、出力信号、出力制御信号はすべて内部信号の割り当てを

受けたものでなければなりません。出力制御は 1で接続、0で切り離しです。再設定付きの 4桁増減計数器で具

体例を LST04C17Bで示します。機能実行では双方向信号は扱いません、入力口と見なします。双方向信号に出

力される値は内部信号 pを見ないと分かりませんから仮の出力信号 sを作り、そこに pを代入して機能実行でも

双方向信号の出力値が確認できるようにしています。sは最終的には不要のものですから削除しますが、このま

ま PLDにしても余計な出力端子ができるだけで問題ありません。

Page 23: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.5 双方向信号 13

表 2.3 演算子

2項演算子 意味 優先順位

* 乗算 1

算術 / 除算 2

演算 % 剰余 3

+ 加算 15

- 減算 16

論理 & 論理積 4

演算 | 論理和 5

ˆ 排他的論理和 6

< 小 9

> 大 10

比較 <= 小か同じ 11

演算 >= 大か同じ 12

== 同じ 13

!= 異なる 14

桁送り << 左送り 7

>> 右送り 8

単項演算子 意味

論理 ! 論理否定

算術 - 符号反転

括弧

( 始め

) 終り

区切り

. 小数点

, 区切り点

; 文末

代入演算子

= 代入

Page 24: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

14 第 2章 設計方法

図 2.7 機能実行

LST04C17B:双方向例

logicname sample

entity udl4c ←実効譜inout q[4]; ←双方向割り当てinput ep,ud,rs,ld;output co;output s[4]; ←仮出力bitr p[4]; ←双方向出力bitn d[4]; ←双方向入力bitn nld; ←双方向出力制御

enable (q,d,p,nld) ←双方向関係付け

if (rs)p=0;

elseif (ld)

p=d;else

if (ep)if (ud)

p=p+1;else

p=p-1;endif

elsep=p;

endifendif

endif

if (ep)if (ud)

if (p==15)co=1;

endifelse

if (p==0)co=1;

endifendif

endif

nld=!ld;s=p; ←仮出力への代入

ende

entity sim ←機能実行譜output q[4];output ep,ud,rs,ld;output co;output s[4];bitr tc[8];

part udl4c(q,ep,ud,rs,ld,co,s)tc=tc+1;

if (tc<3)rs=1;

endif

if (tc>5)ep=1;

endif

if (tc>0)q=10;ud=1;

endif

if ((tc>10)&(tc<13))ld=1;

endifendeendlogic

Page 25: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.6 論理変換 15

表 2.4 変換出力

entity LSIM AHDL VHDL Verilog ABEL

main e0.sim e0.tdf e0.vhd e0.v e0.abl

sim t1.sim e1.tdf e1.vhd e1.v e1.abl

テストベンチ – なし s1.vhd s1.v e1.abv

2.6 論理変換

設計行程で論理譜を機能実行したり、実装する目的で他言語の形式に変換するときには LDC を使います。

GUIを持たない簡単なものなので、下のようにコマンドプロンプトで使います。

図 2.8 LDC

LDC ↵ とすると簡単な使い方が表示されます。論理譜の文法

的な間違いを確かめるだけなら LDC filename ↵ とします。論

理変換は必要なファイルに応じた選択機能を付けることで 5種類

が同時に出力可能です。-ls はシミュレータ LSIM 用の論理譜を

出力します。他の 4種類は論理設計言語の代表的なものです、通

常の論理譜に加えて AHDL を除いてテストベンチも出力します。

p.4: LST04A15Aを左のように 5 種類の選択機能で論理変換する

と表 2.4のファイルが得られます。各ファイルには entityが書かれ

た順番で番号が振られています。entity simの出力ファイルがシミュ

レーションの対象になります。設計論理と検証論理の一体になった

検証論理譜のシミュレーションを操作するのが、それぞれのテスト

ベンチです。entity sim以外の entityの出力ファイルが設計論理譜

です。

2.7 デバイス変換

設計した論理をデバイスとして実体化するにはデバイスメーカの設計環境に L 譜から論理変換した各種出力

ファイルの中の設計論理譜を渡すことで行います。デバイス化の単位は entityごとになります。最終的な検証は

デバイスメーカの設計環境でシミュレーションを行い確認します。このときに検証論理譜とテストベンチを使い

ます。

表 2.5 デバイス化比較

デバイスメーカ XILINX LATTICE ALTERA

設計環境 ISE ispLEVER MAX +plusII 10.2 QuartusII 3.0

AHDL × × ○ ○

ABEL ○ ○ × ×

VHDL ○ ○ × ○

Verilog ○ ○ × ○

テストベンチ ○ △ × ×

実例 p.27: XC9536 p.40: ispLSI2032 p.33: EPM7032

2004.3.18 試用版調査

Page 26: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

16 第 2章 設計方法

試用版に限っての話ですが ALTERA の設計環境ではテストベンチが全く使えません、GUIから clkと simres

を手で設定してテストベンチの代わりの操作を行います。MAX +plus�の試用版ではシミュレーションが操作

できなくなっています。Quartus�の試用版ではタイミングシミュレーションが 100nsに限定されているので

10nsのクロックなら 10個までしか見られません、ファンクションシミュレーションを選んでクロックも 1nsと

かにすれば機能は確認できます。LATTICE の ispLEVERの試用版ではテストベンチは ABEL のみ使用可能で

す、しかし、VHDL の論理譜に ABEL のテストベンチでシミュレーションすることもできます。XILINX の試

用版は最も制限が少なく普通の形態で VHDL や Verilogの論理譜にそれぞれのテストベンチが使えます。

LST04C18F:

entity simoutput Reset,ep,et,ld,ud;output data[4];output q[4],co;bitr tc[8];

part count(Reset,ep,et,ld,ud,data,q,co)tc=tc+1;

if (tc<3)Reset=1;

endif~~~~~~~~~~~~

省略~~~~~~~~~~~~if ((tc>10)&(tc<13))

ld=1;endif

ende

LST04C18G:

entity simoutput Reset,ep,et,ld,ud;output data[4];output q[4],co;bitr tc[8];input simres; ←追加

part count(Reset,ep,et,ld,ud,data,q,co)if (!simres) tc=tc+1; endif ←変更

if (tc<3)Reset=1;

endif~~~~~~~~~~~~

省略~~~~~~~~~~~~if ((tc>10)&(tc<13))

ld=1;endif

ende

LST04C18Fは p.4: LST04A15Aの entity simです。これを LSIM 以外のシミュレータに使うときは右の

LST04C18Gのように修正します。理由は LSIM ではシミュレーション開始前の記憶信号の値は 0に決めてい

ますので、初期化のない計数器 tcの値は 0で始まりますが、シミュレータによっては不定値になって機能動作

ができなくなるものがあります。entity simの中で simresは予約された信号名でテストベンチの中でシミュレー

ションの初めに 1 CLK 以上 1になるように書かれています。entity simは設計論理と検証論理を一体にしてあ

り、外部から CLK だけ入力すれば機能動作が確認できるようにしてある自己完結した論理なので本来は例外的

な処置です。simresが条件付けられた tcはシミュレーションの行程を計数する記憶信号でシミュレーション中

の時計の役目を果たしています。

2.8 実装設計

機能設計が正しくてもデバイスによっては動かない場合もあります。増計数器と言うものを考えてみると、次

の CLK が来る前に現在の値よりもひとつ多い値を記憶素子の入力に確定させているはずです。もし値の確定の

前に CLK を迎えてしまったら誤動作と言うことになります、しかし、他のデバイスや、もっと遅い CLK なら

動いているかも知れません。これは電子部品に論理をのせて電気現象の振る舞いとしての論理動作がどのような

電気動作になるかを考える必要があるためです。先の増計数器の場合で考えると現在の出力値よりひとつ多い値

を作る論理が電気的に動作する場合に、どのくらいの時間の経過が必要なのかを割り出すことです。この時間は

部品の電気的特性から求めるので使う部品によって違ってきます。それらによって使う部品や CLK の周波数を

決定します。大規模な論理では、このような問題がいろいろ起こりますが、全体の動作を遅くしてもよいのなら

CLK を下げて対処するのが一番良い方法です。

Page 27: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 17

LST04C18H:テストベンチ

library IEEE;

use IEEE.std_logic_1164.all;

entity TESTBENCH isend TESTBENCH ;

architecture behavior of TESTBENCH is

component simport(clk : in std_logic;

sim_data0 : out std_logic;sim_Reset0 : out std_logic;sim_ld0 : out std_logic;sim_ep0 : out std_logic;sim_et0 : out std_logic;sim_data1 : out std_logic;sim_ud0 : out std_logic;sim_data2 : out std_logic;sim_data3 : out std_logic;sim_co0 : out std_logic;sim_q0 : out std_logic;sim_q1 : out std_logic;sim_q2 : out std_logic;sim_q3 : out std_logic;simres0 : in std_logic);

end component ;

constant CLK_CYCLE : Time := 20 ns ;

signal clk : std_logic ;signal simres0 : std_logic ;signal sim_data0 : std_logic ;signal sim_Reset0 : std_logic ;signal sim_ld0 : std_logic ;signal sim_ep0 : std_logic ;signal sim_et0 : std_logic ;signal sim_data1 : std_logic ;signal sim_ud0 : std_logic ;signal sim_data2 : std_logic ;signal sim_data3 : std_logic ;signal sim_co0 : std_logic ;signal sim_q0 : std_logic ;signal sim_q1 : std_logic ;signal sim_q2 : std_logic ;signal sim_q3 : std_logic ;

begin

unit : sim port map (clk => clk,sim_data0 => sim_data0,sim_Reset0 => sim_Reset0,sim_ld0 => sim_ld0,sim_ep0 => sim_ep0,sim_et0 => sim_et0,sim_data1 => sim_data1,sim_ud0 => sim_ud0,sim_data2 => sim_data2,sim_data3 => sim_data3,sim_co0 => sim_co0,sim_q0 => sim_q0,sim_q1 => sim_q1,sim_q2 => sim_q2,

sim_q3 => sim_q3,simres0 => simres0);

process begin <-----------------clk <= ’1’;wait for CLK_CYCLE/2;

clk <= ’0’; CLK 供給wait for CLK_CYCLE/2;

end process; <-----------------

process beginsimres0 <= ’0’; <-----------------wait for CLK_CYCLE*2;simres0 <= ’1’; シミュレーションwait for CLK_CYCLE*5;初期化位置simres0 <= ’0’; <-----------------wait for CLK_CYCLE*30;

end process;end;

Page 28: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

18 第 2章 設計方法

LST04C17F: AHDL例 e0.tdf

SUBDESIGN count (clk : INPUT ;data0 : INPUT ;Reset0 : INPUT ;ld0 : INPUT ;ep0 : INPUT ;et0 : INPUT ;data1 : INPUT ;ud0 : INPUT ;data2 : INPUT ;data3 : INPUT ;co0 : OUTPUT ;q0 : OUTPUT ;q1 : OUTPUT ;q2 : OUTPUT ;q3 : OUTPUT ;)

VARIABLE_n16 : DFF ;_n17 : DFF ;_n18 : DFF ;_n19 : DFF ;_n33 : NODE ;_n41 : NODE ;_n34 : NODE ;_n42 : NODE ;_n57 : NODE ;_n60 : NODE ;_n63 : NODE ;_n82 : NODE ;_n76 : NODE ;_n79 : NODE ;

BEGIN

_n16.clk = clk ;_n17.clk = clk ;_n18.clk = clk ;_n19.clk = clk ;

_n16 = data0 & !Reset0 & ld0# _n16 & !Reset0 & !ld0 & ep0 & !et0# _n16 & !Reset0 & !ld0 & !ep0# !_n16 & !Reset0 & !ld0 & ep0 & et0 ;

_n17 = data1 & !Reset0 & ld0# !_n17 & !Reset0 & !ld0 & _n16 & ep0 & et0 & ud0# _n17 & !Reset0 & !ld0 & !_n16 & ep0 & et0 & ud0# !_n17 & !Reset0 & !ld0 & !_n16 & ep0 & et0 & !ud0# _n17 & !Reset0 & !ld0 & _n16 & ep0 & et0 & !ud0# _n17 & !Reset0 & !ld0 & ep0 & !et0# _n17 & !Reset0 & !ld0 & !ep0 ;

_n18 = data2 & !Reset0 & ld0# !_n18 & !Reset0 & !ld0 & _n17 & _n16 & ep0 & et0 & ud0# _n18 & !Reset0 & !ld0 & ep0 & et0 & ud0 & !_n33# !_n18 & !Reset0 & !ld0 & !_n17 & !_n16 & ep0 & et0 & !ud0# _n18 & !Reset0 & !ld0 & ep0 & et0 & !ud0 & !_n41# _n18 & !Reset0 & !ld0 & ep0 & !et0# _n18 & !Reset0 & !ld0 & !ep0 ;

_n19 = data3 & !Reset0 & ld0# !_n19 & !Reset0 & !ld0 & _n18 & _n17 & _n16 & ep0 & et0 & ud0

Page 29: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 19

# _n19 & !Reset0 & !ld0 & ep0 & et0 & ud0 & !_n34# !_n19 & !Reset0 & !ld0 & !_n18 & !_n17 & !_n16 & ep0 & et0 & !ud0# _n19 & !Reset0 & !ld0 & ep0 & et0 & !ud0 & !_n42# _n19 & !Reset0 & !ld0 & ep0 & !et0# _n19 & !Reset0 & !ld0 & !ep0 ;

_n33 = _n17 & _n16 & !Reset0 & !ld0 & ep0 & et0 & ud0 ;

_n34 = _n18 & _n17 & _n16 & !Reset0 & !ld0 & ep0 & et0 & ud0 ;

_n41 = !_n17 & !_n16 & !Reset0 & !ld0 & ep0 & et0 & !ud0 ;

_n42 = !_n18 & !_n17 & !_n16 & !Reset0 & !ld0 & ep0 & et0 & !ud0 ;

_n57 = _n19 & !_n18# !_n19 ;

_n60 = !_n57 & !_n17# _n57 ;

_n63 = !_n60 & !_n16# _n60 ;

co0 = et0 & ud0 & !_n63# et0 & !ud0 & !_n82 ;

_n76 = _n18# _n19 ;

_n79 = _n17# _n76 ;

_n82 = _n16# _n79 ;

q0 = _n16 ;

q1 = _n17 ;

q2 = _n18 ;

q3 = _n19 ;

END;

Page 30: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

20 第 2章 設計方法

LST04C17G: VHDL例 e0.vhd

library IEEE;

use IEEE.std_logic_1164.all;

entity count is

port(clk : in std_logic;data0 : in std_logic;Reset0 : in std_logic;ld0 : in std_logic;ep0 : in std_logic;et0 : in std_logic;data1 : in std_logic;ud0 : in std_logic;data2 : in std_logic;data3 : in std_logic;co0 : out std_logic;q0 : out std_logic;q1 : out std_logic;q2 : out std_logic;q3 : out std_logic);

end count;

architecture RTL of count issignal n_n16 : std_logic ;signal n_n17 : std_logic ;signal n_n18 : std_logic ;signal n_n19 : std_logic ;signal n_n33 : std_logic ;signal n_n41 : std_logic ;signal n_n34 : std_logic ;signal n_n42 : std_logic ;signal n_n57 : std_logic ;signal n_n60 : std_logic ;signal n_n63 : std_logic ;signal n_n82 : std_logic ;signal n_n76 : std_logic ;signal n_n79 : std_logic ;

begin

process(clk) beginif (clk’ event and clk=’1’) then

n_n16 <= (data0 and not Reset0 and ld0)or (n_n16 and not Reset0 and not ld0 and ep0 and not et0)or (n_n16 and not Reset0 and not ld0 and not ep0)or (not n_n16 and not Reset0 and not ld0 and ep0 and et0) ;

n_n17 <= (data1 and not Reset0 and ld0)or (not n_n17 and not Reset0 and not ld0 and n_n16 and ep0 and et0 and ud0)or (n_n17 and not Reset0 and not ld0 and not n_n16 and ep0 and et0 and ud0)or (not n_n17 and not Reset0 and not ld0 and not n_n16 and ep0 and et0 and not ud0)or (n_n17 and not Reset0 and not ld0 and n_n16 and ep0 and et0 and not ud0)or (n_n17 and not Reset0 and not ld0 and ep0 and not et0)or (n_n17 and not Reset0 and not ld0 and not ep0) ;

n_n18 <= (data2 and not Reset0 and ld0)or (not n_n18 and not Reset0 and not ld0 and n_n17 and n_n16 and ep0 and et0 and ud0)or (n_n18 and not Reset0 and not ld0 and ep0 and et0 and ud0 and not n_n33)or (not n_n18 and not Reset0 and not ld0 and not n_n17 and not n_n16 and ep0 and et0

and not ud0)or (n_n18 and not Reset0 and not ld0 and ep0 and et0 and not ud0 and not n_n41)

Page 31: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 21

or (n_n18 and not Reset0 and not ld0 and ep0 and not et0)or (n_n18 and not Reset0 and not ld0 and not ep0) ;

n_n19 <= (data3 and not Reset0 and ld0)or (not n_n19 and not Reset0 and not ld0 and n_n18 and n_n17 and n_n16 and ep0

and et0 and ud0)or (n_n19 and not Reset0 and not ld0 and ep0 and et0 and ud0 and not n_n34)or (not n_n19 and not Reset0 and not ld0 and not n_n18 and not n_n17

and not n_n16 and ep0 and et0 and not ud0)or (n_n19 and not Reset0 and not ld0 and ep0 and et0 and not ud0 and not n_n42)or (n_n19 and not Reset0 and not ld0 and ep0 and not et0)or (n_n19 and not Reset0 and not ld0 and not ep0) ;

end if;end process;

n_n33 <= (n_n17 and n_n16 and not Reset0 and not ld0 and ep0 and et0 and ud0) ;

n_n34 <= (n_n18 and n_n17 and n_n16 and not Reset0 and not ld0 and ep0 and et0 and ud0) ;

n_n41 <= (not n_n17 and not n_n16 and not Reset0 and not ld0 and ep0 and et0 and not ud0) ;

n_n42 <= (not n_n18 and not n_n17 and not n_n16 and not Reset0 and not ld0 and ep0 and et0and not ud0) ;

n_n57 <= (n_n19 and not n_n18)or (not n_n19) ;

n_n60 <= (not n_n57 and not n_n17)or (n_n57) ;

n_n63 <= (not n_n60 and not n_n16)or (n_n60) ;

co0 <= (et0 and ud0 and not n_n63)or (et0 and not ud0 and not n_n82) ;

n_n76 <= (n_n18)or (n_n19) ;

n_n79 <= (n_n17)or (n_n76) ;

n_n82 <= (n_n16)or (n_n79) ;

q0 <= (n_n16) ;

q1 <= (n_n17) ;

q2 <= (n_n18) ;

q3 <= (n_n19) ;

end RTL;

Page 32: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

22 第 2章 設計方法

LST04C17H: Verilog例 e0.v

module count (clk,n_n16 // reg,data0 // input,Reset0 // input,ld0 // input,ep0 // input,et0 // input,n_n17 // reg,data1 // input,ud0 // input,n_n18 // reg,data2 // input,n_n33 // wire,n_n41 // wire,n_n19 // reg,data3 // input,n_n34 // wire,n_n42 // wire,n_n57 // wire,n_n60 // wire,n_n63 // wire,co0 // output,n_n82 // wire,n_n76 // wire,n_n79 // wire,q0 // output,q1 // output,q2 // output,q3 // output);

input clk;input data0 ;input Reset0 ;input ld0 ;input ep0 ;input et0 ;input data1 ;input ud0 ;input data2 ;input data3 ;output co0 ;output q0 ;output q1 ;output q2 ;output q3 ;output n_n16 ;reg n_n16 ;output n_n17 ;reg n_n17 ;output n_n18 ;reg n_n18 ;output n_n19 ;reg n_n19 ;output n_n33 ;wire n_n33 ;output n_n41 ;wire n_n41 ;output n_n34 ;wire n_n34 ;output n_n42 ;wire n_n42 ;output n_n57 ;

Page 33: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 23

wire n_n57 ;output n_n60 ;wire n_n60 ;output n_n63 ;wire n_n63 ;output n_n82 ;wire n_n82 ;output n_n76 ;wire n_n76 ;output n_n79 ;wire n_n79 ;

// equations

always @ (posedge clk) beginn_n16 <= (data0 & ˜Reset0 & ld0)

| (n_n16 & ˜Reset0 & ˜ld0 & ep0 & ˜et0)| (n_n16 & ˜Reset0 & ˜ld0 & ˜ep0)| (˜n_n16 & ˜Reset0 & ˜ld0 & ep0 & et0) ;

n_n17 <= (data1 & ˜Reset0 & ld0)| (˜n_n17 & ˜Reset0 & ˜ld0 & n_n16 & ep0 & et0 & ud0)| (n_n17 & ˜Reset0 & ˜ld0 & ˜n_n16 & ep0 & et0 & ud0)| (˜n_n17 & ˜Reset0 & ˜ld0 & ˜n_n16 & ep0 & et0 & ˜ud0)| (n_n17 & ˜Reset0 & ˜ld0 & n_n16 & ep0 & et0 & ˜ud0)| (n_n17 & ˜Reset0 & ˜ld0 & ep0 & ˜et0)| (n_n17 & ˜Reset0 & ˜ld0 & ˜ep0) ;

n_n18 <= (data2 & ˜Reset0 & ld0)| (˜n_n18 & ˜Reset0 & ˜ld0 & n_n17 & n_n16 & ep0 & et0 & ud0)| (n_n18 & ˜Reset0 & ˜ld0 & ep0 & et0 & ud0 & ˜n_n33)| (˜n_n18 & ˜Reset0 & ˜ld0 & ˜n_n17 & ˜n_n16 & ep0 & et0 & ˜ud0)| (n_n18 & ˜Reset0 & ˜ld0 & ep0 & et0 & ˜ud0 & ˜n_n41)| (n_n18 & ˜Reset0 & ˜ld0 & ep0 & ˜et0)| (n_n18 & ˜Reset0 & ˜ld0 & ˜ep0) ;

n_n19 <= (data3 & ˜Reset0 & ld0)| (˜n_n19 & ˜Reset0 & ˜ld0 & n_n18 & n_n17 & n_n16 & ep0 & et0 & ud0)| (n_n19 & ˜Reset0 & ˜ld0 & ep0 & et0 & ud0 & ˜n_n34)| (˜n_n19 & ˜Reset0 & ˜ld0 & ˜n_n18 & ˜n_n17 & ˜n_n16 & ep0 & et0 & ˜ud0)| (n_n19 & ˜Reset0 & ˜ld0 & ep0 & et0 & ˜ud0 & ˜n_n42)| (n_n19 & ˜Reset0 & ˜ld0 & ep0 & ˜et0)| (n_n19 & ˜Reset0 & ˜ld0 & ˜ep0) ;

end

assign n_n33 = (n_n17 & n_n16 & ˜Reset0 & ˜ld0 & ep0 & et0 & ud0) ;

assign n_n34 = (n_n18 & n_n17 & n_n16 & ˜Reset0 & ˜ld0 & ep0 & et0 & ud0) ;

assign n_n41 = (˜n_n17 & ˜n_n16 & ˜Reset0 & ˜ld0 & ep0 & et0 & ˜ud0) ;

assign n_n42 = (˜n_n18 & ˜n_n17 & ˜n_n16 & ˜Reset0 & ˜ld0 & ep0 & et0 & ˜ud0) ;

assign n_n57 = (n_n19 & ˜n_n18)| (˜n_n19) ;

assign n_n60 = (˜n_n57 & ˜n_n17)| (n_n57) ;

assign n_n63 = (˜n_n60 & ˜n_n16)| (n_n60) ;

assign co0 = (et0 & ud0 & ˜n_n63)| (et0 & ˜ud0 & ˜n_n82) ;

Page 34: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

24 第 2章 設計方法

assign n_n76 = (n_n18)| (n_n19) ;

assign n_n79 = (n_n17)| (n_n76) ;

assign n_n82 = (n_n16)| (n_n79) ;

assign q0 = (n_n16) ;

assign q1 = (n_n17) ;

assign q2 = (n_n18) ;

assign q3 = (n_n19) ;

endmodule

Page 35: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 25

LST04C17J: Verilog例 e0.abl

module count

clk pin ;data0 pin ;Reset0 pin ;ld0 pin ;ep0 pin ;et0 pin ;data1 pin ;ud0 pin ;data2 pin ;data3 pin ;co0 pin ;q0 pin ;q1 pin ;q2 pin ;q3 pin ;n_n16 node istype ’reg’ ;n_n17 node istype ’reg’ ;n_n18 node istype ’reg’ ;n_n19 node istype ’reg’ ;n_n33 node istype ’com’ ;n_n41 node istype ’com’ ;n_n34 node istype ’com’ ;n_n42 node istype ’com’ ;n_n57 node istype ’com’ ;n_n60 node istype ’com’ ;n_n63 node istype ’com’ ;n_n82 node istype ’com’ ;n_n76 node istype ’com’ ;n_n79 node istype ’com’ ;

equations

n_n16.clk = clk ;n_n17.clk = clk ;n_n18.clk = clk ;n_n19.clk = clk ;

n_n16 := data0 & !Reset0 & ld0# n_n16 & !Reset0 & !ld0 & ep0 & !et0# n_n16 & !Reset0 & !ld0 & !ep0# !n_n16 & !Reset0 & !ld0 & ep0 & et0 ;

n_n17 := data1 & !Reset0 & ld0# !n_n17 & !Reset0 & !ld0 & n_n16 & ep0 & et0 & ud0# n_n17 & !Reset0 & !ld0 & !n_n16 & ep0 & et0 & ud0# !n_n17 & !Reset0 & !ld0 & !n_n16 & ep0 & et0 & !ud0# n_n17 & !Reset0 & !ld0 & n_n16 & ep0 & et0 & !ud0# n_n17 & !Reset0 & !ld0 & ep0 & !et0# n_n17 & !Reset0 & !ld0 & !ep0 ;

n_n18 := data2 & !Reset0 & ld0# !n_n18 & !Reset0 & !ld0 & n_n17 & n_n16 & ep0 & et0 & ud0# n_n18 & !Reset0 & !ld0 & ep0 & et0 & ud0 & !n_n33# !n_n18 & !Reset0 & !ld0 & !n_n17 & !n_n16 & ep0 & et0 & !ud0# n_n18 & !Reset0 & !ld0 & ep0 & et0 & !ud0 & !n_n41# n_n18 & !Reset0 & !ld0 & ep0 & !et0# n_n18 & !Reset0 & !ld0 & !ep0 ;

n_n19 := data3 & !Reset0 & ld0# !n_n19 & !Reset0 & !ld0 & n_n18 & n_n17 & n_n16 & ep0 & et0 & ud0# n_n19 & !Reset0 & !ld0 & ep0 & et0 & ud0 & !n_n34# !n_n19 & !Reset0 & !ld0 & !n_n18 & !n_n17 & !n_n16 & ep0 & et0 & !ud0

Page 36: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

26 第 2章 設計方法

# n_n19 & !Reset0 & !ld0 & ep0 & et0 & !ud0 & !n_n42# n_n19 & !Reset0 & !ld0 & ep0 & !et0# n_n19 & !Reset0 & !ld0 & !ep0 ;

n_n33 = n_n17 & n_n16 & !Reset0 & !ld0 & ep0 & et0 & ud0 ;

n_n34 = n_n18 & n_n17 & n_n16 & !Reset0 & !ld0 & ep0 & et0 & ud0 ;

n_n41 = !n_n17 & !n_n16 & !Reset0 & !ld0 & ep0 & et0 & !ud0 ;

n_n42 = !n_n18 & !n_n17 & !n_n16 & !Reset0 & !ld0 & ep0 & et0 & !ud0 ;

n_n57 = n_n19 & !n_n18# !n_n19 ;

n_n60 = !n_n57 & !n_n17# n_n57 ;

n_n63 = !n_n60 & !n_n16# n_n60 ;

co0 = et0 & ud0 & !n_n63# et0 & !ud0 & !n_n82 ;

n_n76 = n_n18# n_n19 ;

n_n79 = n_n17# n_n76 ;

n_n82 = n_n16# n_n79 ;

q0 = n_n16 ;

q1 = n_n17 ;

q2 = n_n18 ;

q3 = n_n19 ;

end

Page 37: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 27

図 2.9 機能実行

LST04C17L: count.rpt

cpldfit: version G.26 Xilinx Inc.Fitter Report

Design Name: count Date: 3-18-2004, 0:36AMDevice Used: XC9536-10-PC44Fitting Status: Successful

**************************** Resource Summary ****************************

Macrocells Product Terms Registers Pins Function BlockUsed Used Used Used Inputs Used5 /36 ( 14%) 21 /180 ( 12%) 4 /36 ( 11%) 15 /34 ( 44%) 20 /72 ( 28%)

PIN RESOURCES:

Signal Type Required Mapped | Pin Type Used Remaining------------------------------------|---------------------------------------Input : 9 9 | I/O : 14 14Output : 1 1 | GCK/IO : 1 2Bidirectional : 4 4 | GTS/IO : 0 2GCK : 1 1 | GSR/IO : 0 1GTS : 0 0 |GSR : 0 0 |

---- ----Total 15 15

MACROCELL RESOURCES:

Total Macrocells Available 36Registered Macrocells 4Non-registered Macrocell driving I/O 1

GLOBAL RESOURCES:

Signal ’clk’ mapped onto global clock net GCK1.Global output enable net(s) unused.Global set/reset net(s) unused.

Page 38: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

28 第 2章 設計方法

POWER DATA:

There are 5 macrocells in high performance mode (MCHP).There are 0 macrocells in low power mode (MCLP).There are a total of 5 macrocells used (MC).

End of Resource Summary

*************** Summary of Required Resources ******************

** LOGIC **Signal Total Signals Loc Pwr Slew Pin Pin Pin Reg InitName Pt Used Mode Rate # Type Use Stateco0 2 6 FB2_13 STD FAST 29 I/O Oq0 4 6 FB1_11 STD FAST 13 I/O I/O RESETq1 5 8 FB1_4 STD FAST 4 I/O I/O RESETq2 5 9 FB2_17 STD FAST 25 I/O I/O RESETq3 5 10 FB2_9 STD FAST 36 I/O I/O RESET

** INPUTS **Signal Loc Pin Pin PinName # Type UseReset0 FB1_6 8 I/O Iclk FB1_3 5 GCK/I/O GCKdata0 FB2_12 33 I/O Idata1 FB2_7 38 I/O Idata2 FB2_11 34 I/O Idata3 FB2_8 37 I/O Iep0 FB1_9 11 I/O Iet0 FB1_10 12 I/O Ild0 FB2_10 35 I/O Iud0 FB1_8 9 I/O I

End of Resources

*********************Function Block Resource Summary***********************Function # of FB Inputs Signals Total O/IO IOBlock Macrocells Used Used Pt Used Req AvailFB1 2 9 9 9 0/2 17FB2 3 11 11 12 1/2 17

---- ----- ----- -----5 21 1/4 34

*********************************** FB1 ***********************************Number of function block inputs used/remaining: 9/27Number of signals used by logic mapping into function block: 9Signal Total Imp Exp Unused Loc Pwr Pin Pin PinName Pt Pt Pt Pt Mode # Type Use(unused) 0 0 0 5 FB1_1 2 I/O(unused) 0 0 0 5 FB1_2 3 I/O(unused) 0 0 0 5 FB1_3 5 GCK/I/O GCKq1 5 0 0 0 FB1_4 STD 4 I/O I/O(unused) 0 0 0 5 FB1_5 6 GCK/I/O(unused) 0 0 0 5 FB1_6 8 I/O I(unused) 0 0 0 5 FB1_7 7 GCK/I/O(unused) 0 0 0 5 FB1_8 9 I/O I(unused) 0 0 0 5 FB1_9 11 I/O I(unused) 0 0 0 5 FB1_10 12 I/O Iq0 4 0 0 1 FB1_11 STD 13 I/O I/O(unused) 0 0 0 5 FB1_12 14 I/O(unused) 0 0 0 5 FB1_13 18 I/O(unused) 0 0 0 5 FB1_14 19 I/O(unused) 0 0 0 5 FB1_15 20 I/O(unused) 0 0 0 5 FB1_16 22 I/O

Page 39: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 29

(unused) 0 0 0 5 FB1_17 24 I/O(unused) 0 0 0 5 FB1_18 (b)

Signals Used by Logic in Function Block1: Reset0 4: ep0 7: q0.PIN2: data0 5: et0 8: q1.PIN3: data1 6: ld0 9: ud0

Signal 1 2 3 4 Signals FBName 0----+----0----+----0----+----0----+----0 Used Inputsq1 X.XXXXXXX............................... 8 8q0 XX.XXXX................................. 6 6

0----+----1----+----2----+----3----+----40 0 0 0

Legend:Total Pt - Total product terms used by the macrocell signalImp Pt - Product terms imported from other macrocellsExp Pt - Product terms exported to other macrocells

in direction shownUnused Pt - Unused local product terms remaining in macrocellLoc - Location where logic was mapped in devicePwr Mode - Macrocell power modePin Type/Use - I - Input GCK - Global Clock

O - Output GTS - Global Output Enable(b) - Buried macrocell GSR - Global Set/Reset

X(@) - Signal used as input (wire-AND input) to the macrocell logic.The number of Signals Used may exceed the number of FB Inputs Used dueto wire-ANDing in the switch matrix.

*********************************** FB2 ***********************************Number of function block inputs used/remaining: 11/25Number of signals used by logic mapping into function block: 11Signal Total Imp Exp Unused Loc Pwr Pin Pin PinName Pt Pt Pt Pt Mode # Type Use(unused) 0 0 0 5 FB2_1 1 I/O(unused) 0 0 0 5 FB2_2 44 I/O(unused) 0 0 0 5 FB2_3 42 GTS/I/O(unused) 0 0 0 5 FB2_4 43 I/O(unused) 0 0 0 5 FB2_5 40 GTS/I/O(unused) 0 0 0 5 FB2_6 39 GSR/I/O(unused) 0 0 0 5 FB2_7 38 I/O I(unused) 0 0 0 5 FB2_8 37 I/O Iq3 5 0 0 0 FB2_9 STD 36 I/O I/O(unused) 0 0 0 5 FB2_10 35 I/O I(unused) 0 0 0 5 FB2_11 34 I/O I(unused) 0 0 0 5 FB2_12 33 I/O Ico0 2 0 0 3 FB2_13 STD 29 I/O O(unused) 0 0 0 5 FB2_14 28 I/O(unused) 0 0 0 5 FB2_15 27 I/O(unused) 0 0 0 5 FB2_16 26 I/Oq2 5 0 0 0 FB2_17 STD 25 I/O I/O(unused) 0 0 0 5 FB2_18 (b)

Signals Used by Logic in Function Block1: Reset0 5: et0 9: q2.PIN2: data2 6: ld0 10: q3.PIN3: data3 7: q0.PIN 11: ud04: ep0 8: q1.PIN

Signal 1 2 3 4 Signals FBName 0----+----0----+----0----+----0----+----0 Used Inputsq3 X.XXXXXXXXX............................. 10 10co0 ....X.XXXXX............................. 6 6q2 XX.XXXXXX.X............................. 9 9

0----+----1----+----2----+----3----+----40 0 0 0

Page 40: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

30 第 2章 設計方法

Legend:Total Pt - Total product terms used by the macrocell signalImp Pt - Product terms imported from other macrocellsExp Pt - Product terms exported to other macrocells

in direction shownUnused Pt - Unused local product terms remaining in macrocellLoc - Location where logic was mapped in devicePwr Mode - Macrocell power modePin Type/Use - I - Input GCK - Global Clock

O - Output GTS - Global Output Enable(b) - Buried macrocell GSR - Global Set/Reset

X(@) - Signal used as input (wire-AND input) to the macrocell logic.The number of Signals Used may exceed the number of FB Inputs Used dueto wire-ANDing in the switch matrix.

;;-----------------------------------------------------------------;;; Implemented Equations.

co0 = ud0 & et0 & q0.PIN & q1.PIN & q2.PIN & q3.PIN# !ud0 & et0 & !q0.PIN & !q1.PIN & !q2.PIN & !q3.PIN;

q0.D = ld0 & !Reset0 & data0# !ep0 & !ld0 & !Reset0 & q0.PIN# !ld0 & !Reset0 & !et0 & q0.PIN# ep0 & !ld0 & !Reset0 & et0 & !q0.PIN;

q0.CLK = clk; // GCK

q1.T = Reset0 & q1.PIN# ld0 & !data1 & q1.PIN# ld0 & !Reset0 & data1 & !q1.PIN# ud0 & ep0 & !ld0 & !Reset0 & et0 & q0.PIN# !ud0 & ep0 & !ld0 & !Reset0 & et0 & !q0.PIN;

q1.CLK = clk; // GCK

q2.T = Reset0 & q2.PIN# ld0 & !data2 & q2.PIN# ld0 & !Reset0 & data2 & !q2.PIN# ud0 & ep0 & !ld0 & !Reset0 & et0 & q0.PIN &q1.PIN# !ud0 & ep0 & !ld0 & !Reset0 & et0 & !q0.PIN &!q1.PIN;

q2.CLK = clk; // GCK

q3.T = Reset0 & q3.PIN# ld0 & !data3 & q3.PIN# ld0 & !Reset0 & data3 & !q3.PIN# ud0 & ep0 & !ld0 & !Reset0 & et0 & q0.PIN &q1.PIN & q2.PIN# !ud0 & ep0 & !ld0 & !Reset0 & et0 & !q0.PIN &!q1.PIN & !q2.PIN;

q3.CLK = clk; // GCK

Legend: <signame>.COMB = combinational node mapped to the same physical macrocellas the FastInput "signal" (not logically related)

Page 41: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 31

**************************** Device Pin Out ****************************

Device : XC9536-10-PC44

--------------------------------/6 5 4 3 2 1 44 43 42 41 40 |

| 7 39 || 8 38 || 9 37 || 10 36 || 11 XC9536-10-PC44 35 || 12 34 || 13 33 || 14 32 || 15 31 || 16 30 || 17 29 |18 19 20 21 22 23 24 25 26 27 28 /--------------------------------

Pin Signal Pin SignalNo. Name No. Name

1 TIE 23 GND2 TIE 24 TIE3 TIE 25 q24 q1 26 TIE5 clk 27 TIE6 TIE 28 TIE7 TIE 29 co08 Reset0 30 TDO9 ud0 31 GND

10 GND 32 VCC11 ep0 33 data012 et0 34 data213 q0 35 ld014 TIE 36 q315 TDI 37 data316 TMS 38 data117 TCK 39 TIE18 TIE 40 TIE19 TIE 41 VCC20 TIE 42 TIE21 VCC 43 TIE22 TIE 44 TIE

Legend : NC = Not Connected, unbonded pinPGND = Unused I/O configured as additional Ground pinTIE = Unused I/O floating -- must tie to VCC, GND or other signalVCC = Dedicated Power PinGND = Dedicated Ground PinTDI = Test Data In, JTAG pinTDO = Test Data Out, JTAG pinTCK = Test Clock, JTAG pinTMS = Test Mode Select, JTAG pinPE = Port Enable pin

PROHIBITED = User reserved pin

**************************** Compiler Options ****************************

Following is a list of all global compiler options used by the fitter run.

Device(s) Specified : xc9536-10-PC44Optimization Method : SPEED

Page 42: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

32 第 2章 設計方法

Multi-Level Logic Optimization : ONIgnore Timing Specifications : OFFDefault Register Power Up Value : LOWKeep User Location Constraints : ONWhat-You-See-Is-What-You-Get : OFFExhaustive Fitting : OFFKeep Unused Inputs : OFFSlew Rate : FASTPower Mode : STDGround on Unused IOs : OFFGlobal Clock Optimization : ONGlobal Set/Reset Optimization : ONGlobal Ouput Enable Optimization : ONFASTConnect/UIM optimzation : ONLocal Feedback : ONPin Feedback : ONInput Limit : 36Pterm Limit : 25

Page 43: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 33

図 2.10 機能実行

LST04C18B: e0.rpt

Project Information d:/test altera e0.rpt

MAX+plus II Compiler Report FileVersion 10.2 07/10/2002Compiled: 03/18/2004 15:05:58

Copyright (C) 1988-2002 Altera CorporationAny megafunction design, and related net list (encrypted or decrypted),~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~needed under any third party’s intellectual property, are provided herein.

***** Project compilation was successful

Untitled

** DEVICE SUMMARY **

Chip/ Input Output Bidir ShareablePOF Device Pins Pins Pins LCs Expanders % Utilized

e0 EPM7032LC44-6 10 5 0 6 10 18 %

User Pins: 10 5 0

Project Information d:/test altera e0.rpt

Page 44: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

34 第 2章 設計方法

** AUTO GLOBAL SIGNALS **

INFO: Signal ’clk’ chosen for auto global Clock

Device-Specific Information: d:/test altera e0.rpte0

***** Logic for device ’e0’ compiled without errors.

Device: EPM7032LC44-6

Device Options:Turbo Bit = ONSecurity Bit = OFF

e e l V G G G c Gp t d C N N N l N q q0 0 0 C D D D k D 3 2

-----------------------------------/ 6 5 4 3 2 1 44 43 42 41 40 |

data3 | 7 39 | q1data2 | 8 38 | q0data1 | 9 37 | co0GND | 10 36 | RESERVED

data0 | 11 35 | VCCReset0 | 12 EPM7032LC44-6 34 | RESERVED

ud0 | 13 33 | RESERVEDRESERVED | 14 32 | RESERVED

VCC | 15 31 | RESERVEDRESERVED | 16 30 | GNDRESERVED | 17 29 | RESERVED

| 18 19 20 21 22 23 24 25 26 27 28 |------------------------------------

R R R R G V R R R R RE E E E N C E E E E ES S S S D C S S S S SE E E E E E E E ER R R R R R R R RV V V V V V V V VE E E E E E E E ED D D D D D D D D

N.C. = No Connect. This pin has no internal connection to the device.VCC = Dedicated power pin, which MUST be connected to VCC.GND = Dedicated ground pin or unused dedicated input, which MUST be connected to GND.RESERVED = Unused I/O pin, which MUST be left unconnected.

Device-Specific Information: d:/test altera e0.rpte0

** RESOURCE USAGE **Shareable External

Logic Array Block Logic Cells I/O Pins Expanders Interconnect

A: LC1 - LC16 0/16( 0%) 9/16( 56%) 0/16( 0%) 0/36( 0%)B: LC17 - LC32 6/16( 37%) 5/16( 31%) 13/16( 81%) 14/36( 38%)

Total dedicated input pins used: 1/4 ( 25%)Total I/O pins used: 14/32 ( 43%)Total logic cells used: 6/32 ( 18%)Total shareable expanders used: 10/32 ( 31%)

Page 45: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 35

Total Turbo logic cells used: 6/32 ( 18%)Total shareable expanders not available (n/a): 3/32 ( 9%)Average fan-in: 8.00Total fan-in: 48

Total input pins required: 10Total output pins required: 5Total bidirectional pins required: 0Total logic cells required: 6Total flipflops required: 4Total product terms required: 32Total logic cells lending parallel expanders: 0Total shareable expanders in database: 10

Synthesized logic cells: 1/ 32 ( 3%)

Device-Specific Information: d:/test altera e0.rpte0

** INPUTS **ShareableExpanders Fan-In Fan-Out

Pin LC LAB Primitive Code Total Shared n/a INP FBK OUT FBK Name43 - - INPUT G 0 0 0 0 0 0 0 clk11 (7) (A) INPUT 0 0 0 0 0 1 0 data09 (6) (A) INPUT 0 0 0 0 0 1 0 data18 (5) (A) INPUT 0 0 0 0 0 1 0 data27 (4) (A) INPUT 0 0 0 0 0 1 1 data36 (3) (A) INPUT 0 0 0 0 0 3 1 ep05 (2) (A) INPUT 0 0 0 0 0 4 1 et04 (1) (A) INPUT 0 0 0 0 0 4 1 ld0

12 (8) (A) INPUT 0 0 0 0 0 4 1 Reset013 (9) (A) INPUT 0 0 0 0 0 3 1 ud0

Code:

s = Synthesized pin or logic cellt = Turbo logic cell+ = Synchronous flipflop! = NOT gate push-backr = Fitter-inserted logic cellG = Global Source. Fan-out destinations counted here do not include destinationsthat are driven using global routing resources. Refer to the Auto Global Signals,Clock Signals, Clear Signals, Synchronous Load Signals, and Synchronous Clear SignalsSections of this Report File for information on which signals’ fan-outs are used asClock, Clear, Preset, Output Enable, and synchronous Load signals.

Device-Specific Information: d:/test altera e0.rpte0

** OUTPUTS **ShareableExpanders Fan-In Fan-Out

Pin LC LAB Primitive Code Total Shared n/a INP FBK OUT FBK Name37 21 B OUTPUT t 0 0 0 2 4 0 0 co038 20 B FF + t 0 0 0 5 1 4 1 q039 19 B FF + t 4 0 1 6 2 3 1 q140 18 B FF + t 6 0 1 6 3 2 1 q241 17 B FF + t 2 0 0 3 2 2 1 q3

Code:

Page 46: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

36 第 2章 設計方法

s = Synthesized pin or logic cellt = Turbo logic cell+ = Synchronous flipflop! = NOT gate push-backr = Fitter-inserted logic cell

Device-Specific Information: d:/test altera e0.rpte0

** BURIED LOGIC **ShareableExpanders Fan-In Fan-Out

Pin LC LAB Primitive Code Total Shared n/a INP FBK OUT FBK Name(36) 22 B SOFT s t 1 0 1 6 4 1 0 ˜272˜1

Code:

s = Synthesized pin or logic cellt = Turbo logic cell+ = Synchronous flipflop! = NOT gate push-backr = Fitter-inserted logic cell

Device-Specific Information: d:/test altera e0.rpte0

** LOGIC CELL INTERCONNECTIONS **

Logic Array Block ’B’:

Logic cells placed in LAB ’B’+----------- LC21 co0| +--------- LC20 q0| | +------- LC19 q1| | | +----- LC18 q2| | | | +--- LC17 q3| | | | | +- LC22 ˜272˜1| | | | | || | | | | | Other LABs fed by signals| | | | | | that feed LAB ’B’

LC | | | | | | | A B | Logic cells that feed LAB ’B’:LC20 -> * * * * - * | - * | <-- q0LC19 -> * - * * - * | - * | <-- q1LC18 -> * - - * - * | - * | <-- q2LC17 -> * - - - * * | - * | <-- q3LC22 -> - - - - * - | - * | <-- ˜272˜1

Pin43 -> - - - - - - | - - | <-- clk11 -> - * - - - - | - * | <-- data09 -> - - * - - - | - * | <-- data18 -> - - - * - - | - * | <-- data27 -> - - - - * * | - * | <-- data36 -> - * * * - * | - * | <-- ep05 -> * * * * - * | - * | <-- et04 -> - * * * * * | - * | <-- ld012 -> - * * * * * | - * | <-- Reset013 -> * - * * - * | - * | <-- ud0

* = The logic cell or pin is an input to the logic cell (or LAB) through the PIA.- = The logic cell or pin is not an input to the logic cell (or LAB).

Page 47: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 37

Device-Specific Information: d:/test altera e0.rpte0

** EQUATIONS **

clk : INPUT;data0 : INPUT;data1 : INPUT;data2 : INPUT;data3 : INPUT;ep0 : INPUT;et0 : INPUT;ld0 : INPUT;Reset0 : INPUT;ud0 : INPUT;

-- Node name is ’co0’-- Equation name is ’co0’, location is LC021, type is output.co0 = LCELL( EQ001 $ GND);EQ001 = et0 & q0 & q1 & q2 & q3 & ud0

# et0 & !q0 & !q1 & !q2 & !q3 & !ud0;

-- Node name is ’q0’ = ’ n16’ from file "e0.tdf" line 20, column 1-- Equation name is ’q0’, location is LC020, type is output.q0 = DFFE( EQ002 $ GND, GLOBAL( clk), VCC, VCC, VCC);EQ002 = ep0 & et0 & !ld0 & !q0 & !Reset0

# ep0 & !et0 & !ld0 & q0 & !Reset0# !ep0 & !ld0 & q0 & !Reset0# data0 & ld0 & !Reset0;

-- Node name is ’q1’ = ’ n17’ from file "e0.tdf" line 21, column 1-- Equation name is ’q1’, location is LC019, type is output.q1 = DFFE( EQ003 $ EQ004, GLOBAL( clk), VCC, VCC, VCC);EQ003 = ep0 & et0 & !ld0 & q0 & q1 & !Reset0 & ud0 & X001 & X002 &

X003# ep0 & et0 & !ld0 & !q0 & q1 & !Reset0 & !ud0 & X001 & X002 &

X003# !ld0 & q0 & !q1 & !Reset0 & !ud0 & X001 & X002 & X003# !ld0 & !q0 & !q1 & !Reset0 & ud0 & X001 & X002 & X003;

X001 = EXP(!ep0 & !ld0 & !q1);X002 = EXP(!et0 & !ld0 & !q1);X003 = EXP(!data1 & ld0);EQ004 = !Reset0 & X001 & X002 & X003;X001 = EXP(!ep0 & !ld0 & !q1);X002 = EXP(!et0 & !ld0 & !q1);X003 = EXP(!data1 & ld0);

-- Node name is ’q2’ = ’ n18’ from file "e0.tdf" line 22, column 1-- Equation name is ’q2’, location is LC018, type is output.q2 = DFFE( EQ005 $ EQ006, GLOBAL( clk), VCC, VCC, VCC);EQ005 = ep0 & et0 & !ld0 & q0 & q1 & q2 & !Reset0 & ud0 & X004 &

X005 & X006 & X007 & X008# ep0 & et0 & !ld0 & !q0 & !q1 & q2 & !Reset0 & !ud0 & X004 &

X005 & X006 & X007 & X008# !ld0 & q1 & !q2 & !Reset0 & !ud0 & X004 & X005 & X006 &

X007 & X008# !ld0 & q0 & !q1 & !q2 & !Reset0 & X004 & X005 & X006 &

X007 & X008;X004 = EXP(!ld0 & !q0 & q1 & !q2);X005 = EXP(!ld0 & !q1 & !q2 & ud0);X006 = EXP(!et0 & !ld0 & !q2);X007 = EXP(!ep0 & !ld0 & !q2);X008 = EXP(!data2 & ld0);

Page 48: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

38 第 2章 設計方法

EQ006 = !Reset0 & X004 & X005 & X006 & X007 & X008;X004 = EXP(!ld0 & !q0 & q1 & !q2);X005 = EXP(!ld0 & !q1 & !q2 & ud0);X006 = EXP(!et0 & !ld0 & !q2);X007 = EXP(!ep0 & !ld0 & !q2);X008 = EXP(!data2 & ld0);

-- Node name is ’q3’ = ’ n19’ from file "e0.tdf" line 23, column 1-- Equation name is ’q3’, location is LC017, type is output.q3 = TFFE(! EQ007, GLOBAL( clk), VCC, VCC, VCC);EQ007 = ! LC022 & X009 & X010;X009 = EXP(!data3 & ld0 & q3);X010 = EXP( q3 & Reset0);

-- Node name is ’˜272˜1’ from file "e0.tdf" line 69, column 4-- Equation name is ’˜272˜1’, location is LC022, type is buried.-- synthesized logic cellLC022 = LCELL( EQ008 $ GND);EQ008 = ep0 & et0 & !ld0 & q0 & q1 & q2 & !q3 & !Reset0 & ud0

# ep0 & et0 & !ld0 & !q0 & !q1 & !q2 & !q3 & !Reset0 & !ud0# ep0 & et0 & !ld0 & q0 & q1 & q2 & q3 & ud0# ep0 & et0 & !ld0 & !q0 & !q1 & !q2 & q3 & !ud0# data3 & ld0 & !q3 & !Reset0;

-- Shareable expanders that are duplicated in multiple LABs:-- (none)

Project Information d:/test altera e0.rpt

** COMPILATION SETTINGS & TIMES **

Processing Menu Commands------------------------

Design Doctor = off

Logic Synthesis:

Synthesis Type Used = Standard

Default Synthesis Style = NORMAL

Logic option settings in ’NORMAL’ style for ’MAX7000’ family

DECOMPOSE GATES = onDUPLICATE LOGIC EXTRACTION = onMINIMIZATION = fullMULTI LEVEL FACTORING = onNOT GATE PUSH BACK = onPARALLEL EXPANDERS = offREDUCE LOGIC = onREFACTORIZATION = onREGISTER OPTIMIZATION = onRESYNTHESIZE NETWORK = onSLOW SLEW RATE = offSOFT BUFFER INSERTION = onSUBFACTOR EXTRACTION = onTURBO BIT = onXOR SYNTHESIS = onIGNORE SOFT BUFFERS = offUSE LPM FOR AHDL OPERATORS = off

Other logic synthesis settings:

Page 49: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 39

Automatic Global Clock = onAutomatic Global Clear = onAutomatic Global Preset = onAutomatic Global Output Enable = onAutomatic Fast I/O = offAutomatic Register Packing = offAutomatic Open-Drain Pins = onAutomatic Implement in EAB = offOne-Hot State Machine Encoding = offOptimize = 5

Default Timing Specifications: None

Cut All Bidir Feedback Timing Paths = onCut All Clear & Preset Timing Paths = on

Ignore Timing Assignments = on

Functional SNF Extractor = off

Linked SNF Extractor = offTiming SNF Extractor = offOptimize Timing SNF = offGenerate AHDL TDO File = offFitter Settings = NORMALSmart Recompile = offTotal Recompile = off

Interfaces Menu Commands------------------------

EDIF Netlist Writer = offVerilog Netlist Writer = offVHDL Netlist Writer = offADT PALACE Compilation = off

Compilation Times-----------------

Compiler Netlist Extractor 00:00:01Database Builder 00:00:00Logic Synthesizer 00:00:00Partitioner 00:00:00Fitter 00:00:00Assembler 00:00:00-------------------------- --------Total Time 00:00:01

Memory Allocated-----------------

Peak memory allocated during compilation = 2,205K

Page 50: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

40 第 2章 設計方法

図 2.11 機能実行

LST04C18D: abc.rpt

ispEXPERT Compiler Release 3.1.00.38.44.03, May 20 2002 13:06:40

Design Parameters-----------------

EFFORT: MEDIUM (2)IGNORE FIXED PIN: OFFMAX GLB IN: 16MAX GLB OUT: 4OUTPUT FORM: VERILOG, VHDLOS VERSION: Windows NT 5.1PARAM FILE: ’d:/test lattice/ispxpert’PIN FILE: ’d:/test lattice/abc.xpn’STRATEGY: DELAYTIMING ANALYZER: ONUSE GLOBAL RESET: ON

Design Specification--------------------

Design: abcPart: ispLSI2032VE-110LJ44

ISP: ONISP EXCEPT Y2: OFFPULL: UPSECURITY: OFFY1 AS RESET: ON

Page 51: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 41

OPENDRAIN: OFFSLOWSLEW: OFF

Number of Critical Pins: 0Number of Free Pins: 15Number of Locked Pins: 0Number of Reserved Pins: 0

Input Pins

Pin Name Pin Attribute

CLK PULLUPDATA0 PULLUPDATA1 PULLUPDATA2 PULLUPDATA3 PULLUPEP0 PULLUPET0 PULLUPLD0 PULLUPRESET0 PULLUPUD0 PULLUP

Output Pins

Pin Name Pin Attribute

CO0 PULLUPQ0 PULLUPQ1 PULLUPQ2 PULLUPQ3 PULLUP

Pre-Route Design Statistics---------------------------

Number of Macrocells: 5Number of GLBs: 2Number of I/Os: 14Number of Nets: 14

Number of Free Inputs: 9Number of Free Outputs: 5Number of Free Three-States: 0Number of Free Bidi’s: 0

Number of Locked Input IOCs: 0Number of Locked DIs: 0Number of Locked Outputs: 0Number of Locked Three-States: 0Number of Locked Bidi’s: 0

Number of CRIT Outputs: 0Number of Global OEs: 0Number of External Clocks: 1

GLB Utilization (Out of 8): 25%I/O Utilization (Out of 32): 43%Net Utilization (Out of 64): 21%

Page 52: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

42 第 2章 設計方法

Nets with Fanout of 1: 6Nets with Fanout of 2: 7Nets with Fanout of 3: 1

Average Fanout per Net: 1.64

GLBs with 6 Input(s): 1GLBs with 12 Input(s): 1

Average Inputs per GLB: 9.00

GLBs with 1 Output(s): 1GLBs with 4 Output(s): 1

Average Outputs per GLB: 2.50

Number of GLB Registers: 4Number of IOC Registers: 0

Post-Route Design Implementation--------------------------------

Number of Macrocells: 5Number of GLBs: 2Number of IOCs: 14Number of DIs: 0Number of GLB Levels: 1

GLB glb00, A7

6 Input(s)(DATA0.O, DATA0X, I14), (EP0.O, EP0X, I9), (ET0.O, ET0X, I11),(LD0.O, LD0X, I13), (glb00.O0, INT Q0, I16), (RESET0.O,RESET0X, I4)

1 Output(s)(INT Q0, O0)

6 Product Term(s)

Output INT Q0

6 Input(s)RESET0X, INT Q0, DATA0X, LD0X, EP0X, ET0X

3 Fanout(s)glb01.I7, glb00.I16, Q0.IR

4 Product Term(s)1 GLB Level(s)

INT Q0.D = DATA0X & LD0X & !RESET0X# INT Q0 & !RESET0X & !LD0X & !EP0X# INT Q0 & !RESET0X & !LD0X & !ET0X# EP0X & ET0X & !RESET0X & !LD0X & !INT Q0

INT Q0.C = CLKXINT Q0.R =

GLB glb01, A6

12 Input(s)(DATA1.O, DATA1X, I3), (DATA2.O, DATA2X, I0), (DATA3.O,DATA3X, I2), (EP0.O, EP0X, I9), (ET0.O, ET0X, I11), (LD0.O,LD0X, I13), (glb00.O0, INT Q0, I7), (glb01.O3, INT Q1, I17),(glb01.O2, INT Q2, I16), (glb01.O1, INT Q3, I6), (RESET0.O,

Page 53: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 43

RESET0X, I4), (UD0.O, UD0X, I15)4 Output(s)

(OR 699, O0), (INT Q3, O1), (INT Q2, O2), (INT Q1, O3)14 Product Term(s)

Output OR 699

6 Input(s)INT Q1, INT Q0, UD0X, ET0X, INT Q3, INT Q2

1 Fanout(s)CO0.IR

2 Product Term(s)1 GLB Level(s)

OR 699 = ET0X & INT Q0 & INT Q1 & INT Q2 & INT Q3 & UD0X# ET0X & !INT Q0 & !UD0X & !INT Q1 & !INT Q2 & !INT Q3

Output INT Q3

10 Input(s)INT Q1, RESET0X, INT Q0, LD0X, DATA3X, UD0X, EP0X, ET0X,INT Q3, INT Q2

2 Fanout(s)glb01.I6, Q3.IR

4 Product Term(s)1 GLB Level(s)

INT Q3.D = (DATA3X & LD0X & !RESET0X# EP0X & ET0X & INT Q0 & INT Q1 & INT Q2 & UD0X & !RESET0X& !LD0X# EP0X & ET0X & !RESET0X & !LD0X & !INT Q0 & !UD0X & !INT Q1& !INT Q2)$ INT Q3 & !RESET0X & !LD0X

INT Q3.C = CLKXINT Q3.R =

Output INT Q2

9 Input(s)INT Q1, RESET0X, INT Q0, LD0X, UD0X, EP0X, ET0X, INT Q2,DATA2X

2 Fanout(s)glb01.I16, Q2.IR

4 Product Term(s)1 GLB Level(s)

INT Q2.D = (DATA2X & LD0X & !RESET0X# EP0X & ET0X & INT Q0 & INT Q1 & UD0X & !RESET0X & !LD0X# EP0X & ET0X & !RESET0X & !LD0X & !INT Q0 & !UD0X & !INT Q1)$ INT Q2 & !RESET0X & !LD0X

INT Q2.C = CLKXINT Q2.R =

Output INT Q1

8 Input(s)INT Q1, RESET0X, INT Q0, LD0X, UD0X, EP0X, ET0X, DATA1X

2 Fanout(s)glb01.I17, Q1.IR

4 Product Term(s)1 GLB Level(s)

INT Q1.D = (DATA1X & LD0X & !RESET0X# EP0X & ET0X & INT Q0 & UD0X & !RESET0X & !LD0X# EP0X & ET0X & !RESET0X & !LD0X & !INT Q0 & !UD0X)$ INT Q1 & !RESET0X & !LD0X

INT Q1.C = CLKX

Page 54: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

44 第 2章 設計方法

INT Q1.R =

Clock Input CLK, Y0

Output CLKX2 Fanout(s)

glb01.CLK0, glb00.CLK0

Output CO0, IO16

Input (glb01.O0, OR 699)

CO0 = OR 699

Input DATA0, IO1

Output DATA0X1 Fanout(s)

glb00.I14

Input DATA1, IO28

Output DATA1X1 Fanout(s)

glb01.I3

Input DATA2, IO31

Output DATA2X1 Fanout(s)

glb01.I0

Input DATA3, IO29

Output DATA3X1 Fanout(s)

glb01.I2

Input EP0, IO22

Output EP0X2 Fanout(s)

glb01.I9, glb00.I9

Input ET0, IO20

Output ET0X2 Fanout(s)

glb01.I11, glb00.I11

Input LD0, IO2

Output LD0X2 Fanout(s)

glb01.I13, glb00.I13

Output Q0, IO24

Page 55: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.8 実装設計 45

Input (glb00.O0, INT Q0)

Q0 = INT Q0

Output Q1, IO19

Input (glb01.O3, INT Q1)

Q1 = INT Q1

Output Q2, IO18

Input (glb01.O2, INT Q2)

Q2 = INT Q2

Output Q3, IO17

Input (glb01.O1, INT Q3)

Q3 = INT Q3

Input RESET0, IO27

Output RESET0X2 Fanout(s)

glb01.I4, glb00.I4

Input UD0, IO11

Output UD0X1 Fanout(s)

glb01.I15

Clock Assignments

Net Name Clock Assignment

CLKX External CLK0

GLB and GLB Output Statistics

GLB Name, Location GLB Statistics GLB Output StatisticsGLB Output Name Ins, Outs, PTs Ins, FOs, PTs, Levels, PTSABP

glb00, A7 6, 1, 6INT Q0 6, 3, 4, 1, 4PT

glb01, A6 12, 4, 14INT Q1 8, 2, 4, 1, -INT Q2 9, 2, 4, 1, -INT Q3 10, 2, 4, 1, -OR 699 6, 1, 2, 1, 4PT

Pin Assignments

Pin Name Pin Assignment Pin Type, Pin Attribute

Page 56: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

46 第 2章 設計方法

Q0 3 Output, PULLUPRESET0 6 Input, PULLUPDATA1 7 Input, PULLUPDATA3 8 Input, PULLUPDATA2 10 Input, PULLUPCLK 11 Clock Input, PULLUPDATA0 16 Input, PULLUPLD0 17 Input, PULLUPUD0 28 Input, PULLUPCO0 37 Output, PULLUPQ3 38 Output, PULLUPQ2 39 Output, PULLUPQ1 40 Output, PULLUPET0 41 Input, PULLUPEP0 43 Input, PULLUP

Design process management completed successfully

2.9 論理設計の循環

論理設計の完成を目指しての作業は、論理譜の作成と機能の確認を繰り返しながら、論理構造を組み立ててい

くことです。その中には論理を電子部品に実体化したときの制約も考慮されます、例えば 4桁の加算器なら答え

が 1 CLK で得られても 64桁なら得られないと考えて 16 CLK まで待って答えを取ったりする実装時の問題な

どです。論理設計の実装は必ずしも、あるとは限らないとも考えられます。設計者が機能提供者だけで実装者は

別の人と言うことも有り得るからです。実装時の難しい問題があることは、分かった上で設計情報の公開をもっ

て実装時の問題は論理設計の主な課題からは外す方が有益と考えて実装と実装後の検証は「論理設計の循環」の

外とします。

「論理設計の循環」が論理譜の作成と機能の確認の繰り返しとすれば実装までは、L 譜の作成→論理変換→シミュレーション→機能確認と言う作業になります。

L 譜の作成:

L 言語に限らず VHDL や Verilogなどを使い論理設計を言語にすると、その主体をパソコンのエディタと

いう、どにでもあるプログラムで行えるので大変に便利である上に、言語で行うことで専門知識も要らな

くなりました。

論理変換:

L 言語で設計した論理譜をシミュレータの受け付ける形式に LDCを使って変換します。L 譜が sample.l

ならコマンドプロンプトを開いて LDC sample -ls ↵ で必要ファイルが出力されます。

シミュレーション:

test.lの 2番目の entityが simなら t1.simから機能実行結果ファイルを作りますが、コマンドプロンプト

で sim t1.sim ↵ のようにします。

機能実行確認:

上記のコマンドが正常に終了しているならコマンドプロンプトで view ↵ とすれば結果を閲覧できます。

viewは GUIのプログラムなのでコマンドプロンプトの外の画面に出てきます。画面は p.1:図 1.1になり

ます。

作業はエディタ→コンパイラ→シミュレータ→ビューワを巡回して進みます。図 2.12のようになります。こ

の循環で機能が完成できたら、次の段階の実装に入ります、このときデバイスメーカの設計環境に移行します。

Page 57: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.10 論理設計環境 47

機能的な問題は既に解決されているべきで、ここでは主に実装上の問題を確認します。

図 2.12 コマンド

2.10 論理設計環境

すべてを言語で書いて解決できるように、次の 3点を 3種類のプログラムで提

供します。

• 論理記述と機能検証のための単純な言語• 操作不要のシミュレータ• シミュレータから切り離された閲覧のみの単純操作のビューワ• どのデバイスにも論理の実装が可能

論理記述と機能検証は合せて論理設計ですが、論理設計言語を Logic Design

Languageと名前を付けて略して L 言語または L と通称します。シミュレータは

Logic Simulatorから LSIM と通称します。ビューワは Logic Viewerから LV と

通称します。4点めは L で書かれた論理譜を他言語に変換するコンパイラが、そ

の役目を負います。Logic Design Compilerと名前を付けて略して LDCと通称し

ます。現在は L 言語から VHDL、Verilog、ABEL、AHDL への変換が可能です、

将来デバイスメーカの設計環境が、他の言語を使うようになった場合でも言語で

あるなら、簡単に追従可能と思っています。

図 2.13 エディタ

3種類のプログラムは単純なものなのでエディタが外部のプ

ログラムを実行可能なものなら、左のように 3種類のプログラ

ムを登録すれば統合開発環境のようにも使えます。

2.10.1 Logic Design Compiler

LDCは L 言語の書式で書かれた論理譜をブール式に論理変

換します。ブール式は選択機能指定に従って LSIM、VHDL、

Verilog、ABEL、AHDL の言語形式でファイル出力します。

-ls シミュレータ LSIM の対象になる論理譜

-ah ALTERAの設計環境の AHDL 言語の論理譜

-vh VHDL 言語の論理譜

-vr Verilog言語の論理譜

-ab ABEL言語の論理譜

これらは入力論理譜に対して出力論理譜の形式を指定するオプションで、ひとつでも、複数の同時指定でも、

ひとつも指定しないでも構いません。出力形式の選択機能が、ひとつも指定されない場合でも入力論理譜に対す

るブール式への変換は行われます。文法上のエラーがあった場合は報告もされます。コマンドの形式はコマンド

名 LDCに続けて入力論理譜の L 譜名を置き、次に選択機能を必要分並べます。

LDC L 譜名 選択機能列 ↵

L 譜のファイル拡張子は l (小文字のエル)にして下さい。L 譜名の拡張子が省略されたときは、l の拡張子が

付いたものと見なします。選択機能は無い場合もあります、選択機能は頭に–を付けます、複数ある場合は空白

で区切ります。LDC ↵ のときは簡単な図 2.8の紹介を表示します。

Page 58: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

48 第 2章 設計方法

ブール式への変換行程に関わる選択機能が 2個あります。この選択機能は数値設定を伴います、選択機能指定

と数値指定との間には空白を挟んで下さい。通常は使いませんがコンパイル時間を短くしたいときにはこれら

の設定値を初期値より小さくします。最適化は信号数を減らそうとします、圧縮は論理式を簡単にしようとし

ます。

-opt 数値 :最適化水準   初期値 4

0∼5までの設定が可能です、0設定のときは最適化は行いません。

-qm 数値 :圧縮水準    初期値 16

任意の数値で圧縮行程の上限を設定します、0設定のときは圧縮を行い

ません。

ABEL,VHDL,Verilog を出力に選択した場合の entity simはテストベンチも作られます、これに指定する実行

数を指定する選択機能があります。

-sp 数値 :機能実行数

procedure文の手続きを引用庫に固定したいときに、それを追加した新しい引用庫 new.libを出力する選択機能

です。実際に使用するには既存の std.libを削除して new.libを std.libに変えます。

-lib : new.lib作成

LSIM viewの信号リスト lsim.lblを出力する選択機能です。この選択機能がないときは lsim.lblがないときだ

け出力します、lsim.lblを更新したいときだけ使う選択機能です。LSIMX は LSIM の旧作の DOS用シミュレー

タです。

-lbl : LSIM view 用信号リスト更新

-lblx : LSIMX 用信号リスト更新

CLK の時間を素子遅延数で指定する選択機能です。初期値は 5です。手続きの消費時間を素子遅延数で指定

したときに、 CLK に換算するのに使われます、例えば time 20gの場合は 20÷ 5 = 4で 4 CLK を消費すると計

算します。

-gpc 数値 : 1CLKの素子遅延数 (gate/clock)   初期値 5

LDC開発のためのデバッグ用の選択機能です。行程記録は ldc.logの名前で出力されます。-dataは設計者に

は現在は無意味な選択機能です。

-log :行程記録

-data :内部結果

2.10.2 Logic SIMulator

LSIM は LDCが-lsの選択機能で出力した論理譜をシミュレーションして lsim.outに結果を出力します。実行

プログラムは sim.exeです。選択機能は実行数だけで初期値は 300です。

SIM lsim譜名 選択機能列 ↵

Page 59: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.11 LVの使い方 49

2.11 LVの使い方

LSIM View 略して LV は LSIM の出力した lsim.outの結果を見るだけの G UIプログラムです。入力ファイル

の指定や選択機能はありません。実行プログラムは view.exeです。信号表示に lsim.lblが必要です、LDCの-lbl

選択機能で出力されます。実行は VIEW ↵ とするだけです。GUIの使い方を説明します。GUIプログラムに

入ってからはファイルや信号を選ぶ操作はありません。

2.11.1 基本画面図 2.14 LV

画面の要素を図 2.14に赤丸の番号で示します。

➀ 信号名枠

➁ 信号値枠

➂ 縦移動棒

➃ 横移動棒

➄ 終了ボタン

➅ 読み込み中表示

➆ 信号値枠の CLK 範囲表示

➇ 信号値枠の表示倍率設定

➈ 赤線移動ボタン

➉ 青線移動ボタン

図 2.15 頁移動棒

➀と➁の間は赤線あるいは青線の位置の信号値が表示されます。➂を上下に

動かして全信号を閲覧できます。➃を左右に動かしてメモリ中にある全信号値

を閲覧できます。窓の大きさは自由に変えられます、その際に➆∼➉の文字が消

えることがありますが➁をクリックすると再描画されます。➂,➃,➄は TAB で

順番に有効になるので ← , → , PGUP , PGDN , HOME , END が使え

ます。➅はファイル読み取り中は赤になります、通常はメモリ中に全信号値があるときは緑、一部があるときは

青になります。青の時は➁の上に図 2.15の頁移動棒が表示されて、メモリ中にない他の頁を閲覧するときに使

います。➇は➁の画面の波形の大きさを変えます。➈は赤線を移動します。➉は青線を移動します。

図 2.16 LV 小窓

2.11.2 小窓

細かな設定や操作をしたいときには、➁の上で右クリックす

ると図 2.16の小窓が開きます。

1. 間隔変更 図 2.17

2. カーソル値 図 2.18

3. 画面移動 図 2.19

4. カーソル移動 図 2.20

5. 集合信号値 図 2.21

6. 頁移動棒 図 2.22

7. 設定保存 図 2.23

Page 60: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

50 第 2章 設計方法

さらに 1∼7の下位にも項目窓が開きます。小窓が開けば ← , → , ↑ , ↓ が使えます。

図 2.17 間隔変更 図 2.18 カーソル値 図 2.19 画面移動図 2.20 カーソル移動

図 2.21 集合信号値 図 2.22 頁移動棒 図 2.23 設定保存

• 間隔変更カーソル値の桁数が大きくなって➀と➁の間が狭いときに ×1 ∼ ×4の 4段階で広げることができます。

• カーソル値➀と➁の間の一番上 (CLK の右横)に表示されるカーソル値を

赤 赤線の位置

青 青線の位置

差 赤線の位置から青線の位置を引いた値 (線間の CLK )

位置 「差」を選んでいる場合に、「差」を選ぶまえの「赤」または「青」に戻す。

から選べます。

• 画面移動カーソル位置が表示開始位置になるように画面を移動します。

赤 赤線に合わせる。

青 青線に合わせる。

• カーソル移動画面の外にあるカーソルを画面内に戻したり、カーソルの進める数を選びます。

赤 赤線を戻す。

青 青線を戻す。

両方 赤青の両方を戻す。

進数 進み数を 1,2,5,10から選ぶ。

があります。

• 集合信号値➁の信号値の表示方法を選びます。

表示 表示する。(ただし➇倍率 2以上)

非表示 表示せず。

基数 表示するときの基数を 10進数と 16進数から選ぶ。

があります。

• 頁移動棒シミュレーション結果が大きいときはメモリの大きさで頁分割されて頁移動棒が➁の上に表示されます。

Page 61: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

2.11 LVの使い方 51

見たい位置が画面にもメモリにもないときは、頁移動棒でその位置を指定します。するとファイルの読み

出しが始まり、その間は➅が緑以外の色になり読み出し中を示します。頁移動棒は表示を選びます。

表示 表示する。

非表示 表示せず。

から選べます。

• 設定保存現在の LV の設定を保存することができます。小窓での設定値以外にも窓の大きさや表示位置を保存し

て、新規に起動したときに設定保存時の表示状態を再現します。

する 「今する」か「閉じるとき」かを選んで保存する。

しない 保存せず。

2.11.3 選択拡大

矢印カーソルで画面の一部を選択して拡大した画面で表示させることができます。選択画面の図 2.24からマ

ウスのボタンを離すと図 2.25の表示に変わります。

図 2.24 選択画面 図 2.25 拡大画面

2.11.4 信号名リスト

• 信号名の列順• 信号名の色• 表示の単独/集合の

選択

• 代表名の設置

LV の➀の信号の並びは LDC の出力した lsim.lblを参照して行われています、

参照内容は左のものがあります。LDCの出力では表示は単独のみで、代表名の設

置は使われません。LV は閲覧のみ可能な簡単なプログラムで設定の保存以外に

ファイルの出力もありませんので、複数を起動しても負担は軽いです。LV は起動

してしまうと lsim.lblを必要としませんので、編集しても、別の lsim.lblを用意し

ても、2番目の LV を起動することができます。シミュレーション結果をいくつも

の信号配置で、同時に閲覧することができます。lsim.lblは見易さを改善するため、あるいは閲覧の目的によっ

て何種類ものファイルが用意されるため使用者によって編集されと考えるので lsim.lblの仕様について説明を行

います。図 2.14の lsim.lblの後半を省略したのが LST04C24Lです。

Page 62: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

52 第 2章 設計方法

表 2.6 色指定

red 赤 navy 紺 silver 銀 aqua 空

green 緑 purple 紫 lime 淡緑 white 白

maroon 茶 teal 暗青緑 blue 青

olive 黄緑 gray 灰 fuchsia 赤紫

集合信号

L 譜で q[4] と割り当てた信号は論理変換後は q0,q1,q2,q3のように単独の信号にして扱われます。信号名が

q0,q1,q2,q3のように同じ英字に数字がついた名前なら q.0-3または q.3-0のように表記して集合信号にできま

す。1番目の指定が信号名、’.’ をはさんで最上位桁指定、’-’ をはさんで最下位桁を指定します。q.0-3の場合は

q0が最上位の桁、q3が最下位の桁に配置されます。

単独信号

L 譜で coと割り当てた信号名も論理変換後は co0と末尾に数字が付けられます。信号名の頭に’ ’ が付けられ

た信号は LDCが割り当てたものです、L 譜で割り当てた信号と明瞭に区別するために色をつけています。

LST04C24L: lsim.lbl

q.3-0 ←集合信号s.3-0co0 ←単独信号ld0ud0ep0rs0 ↓色指定_n19 : silver_n18 : silver_n17 : silver_n16 : silver_n87 : gray_n84 : gray_n81 : gray_n68 : gray_n65 : gray

LST04C25B: lsim.lbl

q3 : redq2 : greenq1 : maroonq0 : olives3 : navys2 : purples1 : teals0 : grayco0 : silverld0 : limeud0 : blueep0 : fuchsiars0 : aqua_n19 : white

図 2.26 色見本

色指定

表 2.6の 14色から選

べます。各色の実際は

LST04C25Bの lsim.lbl

による表 2.26を見て下

さい。色指定のないとき

は窓と同一色が割り当て

られます。LDC の出力

後の lsim.lblの信号の色

の指定は、L 譜で割り当

てた信号は無指定、記憶

信号は silver、非記憶信

号は grayです。L 譜の

entity simで LDCが割り当てた記憶信号は fuchsia、非記憶信号は oliveです。

LST04C25D: lsim.lbl

ABC[q.0-3,s.3-0] : aqua入力 q[q.3-0] : gray出力 q[s3,s2,s1,s0] : silverキャリ- co[co0] : gray再設定 ld[ld0] : silver増減 ud[ud0] : gray有効 ep[ep0] : silver初期化 rs[rs0] : grayreg3[_n19]reg2[_n18]reg1[_n17]reg0[_n16]_n87_n84 : gray_n81 : gray

図 2.27 代表名 代表名

論理譜中の信号に LST04C25D

のように代表名を割り当てて、そ

の名前で LV から図 2.27のように

閲覧することができます。書き方

は代表名をはじめに書き、代表名

を掲げる単独信号または集合信号、

または、それらの並びを [ ] 内に書

きます。単独信号と集合信号を混

用しても構いません。

Page 63: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

53

第 3章

簡単な設計例

3.1 足し算

2進数のひと桁の足し算をするものを設計してみます。図 3.1のように入力 2本、出力 1本を使います。

図 3.1 足し算

a + b = c

0 + 0 = 0

0 + 1 = 1

1 + 0 = 1

1 + 1 = 0

図 3.2 真理値表

a b c

0 0 0

0 1 1

1 0 1

1 1 0

図 3.3 論理式

c = (a · b) + (a · b)

真理値表は図 3.2のようになります、これから論理式を求めますが cが 1になっている行の入力 aと bを使いま

す。各行は論理積された項を表していますので、cが 1になっている項を論理和します、また入力が 0のものは

論理否定して論理積します、すると図 3.3の論理式になります。

図 3.4 足し算の L 譜

logicname sample

entity add1input a,b;output c;

c = (!a & b) | (a & !b) ;ende

entity simoutput a,b;output c;bitr tc[2];

part add1(a,b,c)tc=tc+1;a = tc.0;b = tc.1;

endeendlogic

図 3.5 足し算の機能実行

これを図 3.4の様な L 譜に書

いて機能実行すると

図 3.5のような結果になり

ます。さて、真理値表とは真

理値の表のことです、真理値

は真と偽のどちらかの値をと

ります。2進数と合わせて使

うとき、真を 1に偽を 0に割

り当てます。真理値表から論

理式を作るときに、論理積、

論理和、論理否定などの演算

を行う式として、表しました

が、この図 3.6、図 3.7、図 3.8

の 3種類の演算は論理演算と

言いブール代数の基本的な演算です。

Page 64: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

54 第 3章 簡単な設計例

図 3.6 論理積

• 0 · 0 = 0

• 0 · 1 = 0

• 1 · 0 = 0

• 1 · 1 = 1

図 3.7 論理和

• 0 + 0 = 0

• 0 + 1 = 1

• 1 + 0 = 1

• 1 + 1 = 1

図 3.8 論理否定

• 0 = 1

• 1 = 0

論理式図 3.3に真理値表図 3.2の真理

値を代入して図 3.6、図 3.7、図 3.8の論

理演算の基本則を適用してみると、その

結果は真理値表の cの真理値に合致して

います。真理値表の a,b,cは論理変数と

言います、論理設計とは解決すべき問題

から論理変数を取り出して、その関係を、どのようであるべきかを決定して真理値表を作り、真理値表から論理

式を導き出すところまでを言います。論理設計は基本則が明瞭なので真理値表ができてからすることは、コン

ピュータの仕事になっています。重要なのは真理値表を見定めるまでの、最適な論理変数を選り抜いて、最も都

合よく解決するための関係付けを見通すことです。今では真理値表も表から、例えば図 3.9のように言語的表現

で表すことが多いのですが本質は同じです。論理設計は電気特性を操るための方法ではありませんので、電気設

計とは無関係です、しかし装置まで作ることを念頭に置くと、論理式を実体化させる工程は機械的、あるいは電

気的 (電子的)な知識も必要です。しかし、あくまでも分けて考えるべきものです。

図 3.9 足し算の L 譜その 2

logicname sample

entity add1input a,b;output c;

switch(a,b)case 0,0: c=0;case 0,1: c=1;case 1,0: c=1;case 1,1: c=0;

endswitchende

entity simoutput a,b;output c;bitr tc[2];

part add1(a,b,c)tc=tc+1;a = tc.0;b = tc.1;

endeendlogic

さて、真理値表から論理式をつくる方法は 2種類あります、先の方法は論理

式の型が乗法標準型または標準積和型と言うものです。もうひとつの方法は c

が 0になる行について、その行の 0はそのまま、1は論理否定して論理和しま

す。それらの行を論理積すると c = (a + b) · (a + b)になります、この方法で求

めた論理式を加法標準型といいます。これに論理値を入れて演算してみると乗

法標準型と同じ結果になっています。論理式はどのようにも書けますが、元に

真理値表があることを考えれば標準型に帰結していくものです。

3.2 比較

論理変数 a,bを比較して cに結果を出すものを作ってみます。図 3.10の考え

方で図 3.11の真理値表ができます。この真理値表をよく見ると足し算の真理値

表の図 3.2の cを論理否定したものと同じになります。論理式は足し算のもの

を手直しすればよさそうです。ところで、足し算の真理値表は排他的論理和と

言われる論理演算の真理値表です、比較の真理値表は排他的論理和を論理否定

したものと言うことになります。排他的論理和は一般的に論理設計には必要不

可欠な演算なので、多くの場合は独立した演算子が当てられていますが見てき

たように論理積と論理和から構成されています。比較の論理式は足し算の論理

式と大差ありません、ここで他言語で表現した場合の比較をしてみます。

図 3.10 比較

0 と 0 同じ

0 と 1 違う

1 と 0 違う

1 と 1 同じ

図 3.11 真理値表

a b c

0 0 1

0 1 0

1 0 0

1 1 1

まずは、一般的な VHDL と Verilog-HDL です。

これら 2言語では論理譜と機能実行譜は別々のファ

イルに書きます。演算子などの差異はありますが、

ブール代数の論理式なら、ほぼ同じ形式で (VHDL

は図 3.13、Verilog-HDLは図 3.2)、同じ実行結果 (

図 3.12)になる論理譜が書けます。機能実行譜 (テ

ストベンチ) も、ほぼ同じ形式で書けます、VHDL

は図 3.14、Verilog-HDLは図 3.16です。

Page 65: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.2 比較 55

図 3.12 論理の機能実行

図 3.13 VHDL 譜

library IEEE;

use IEEE.std_logic_1164.all;

entity cmp1 is

port(c0 : out std_logic;a0 : in std_logic;b0 : in std_logic);

end cmp1;

architecture RTL of cmp1 is

begin

c0 <= (not a0 and not b0)or (a0 and b0) ;

end RTL;

図 3.14 VHDL テストベンチ

library IEEE;

use IEEE.std_logic_1164.all;

entity TESTBENCH isend TESTBENCH ;

architecture behavior of TESTBENCH is

component cmp1port(c0 : out std_logic;

a0 : in std_logic;b0 : in std_logic);

end component ;

constant step : Time := 20 ns ;

signal c0 : std_logic ;signal a0 : std_logic ;signal b0 : std_logic ;

begin

unit : cmp1 port map (c0 => c0,a0 => a0,b0 => b0);

process begina0 <= ’0’;b0 <= ’0’;wait for step;

a0 <= ’0’;b0 <= ’1’;wait for step;

a0 <= ’1’;b0 <= ’0’;wait for step;

a0 <= ’1’;b0 <= ’1’;wait for step;

end process;end;

Page 66: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

56 第 3章 簡単な設計例

図 3.15 Verilog-HDL譜

module cmp1 (c0,a0,b0);

output c0 ;input a0 ;input b0 ;

assign c0 = (˜a0 & ˜b0)| (a0 & b0) ;

endmodule

図 3.16 Verilog-HDLテストベンチ

‘timescale 1ps/1psmodule test_bench ;

wire c0 ;reg a0 ;reg b0 ;

cmp1 cmp1 (c0,a0,b0);parameter STEP = 10000 ;initial begin

a0=0;b0=0;#STEPa0=0;b0=1;#STEPa0=1;b0=0;#STEPa0=1;b0=1;#STEP

// $finish ;$stop ;

endendmodule

3.3 足し算の拡張

もっと大きな数を足し算するときは、先ほど作った 2進数の一桁の足し算に上位に送る桁上げを付けて、また

現桁に下位の桁上も含めて足し算すれば、桁数分をつなげて、より大きな数の足し算に対応できます。現桁の入

力を a,b、下位の桁上げを ci、上位への桁上げを cuとすると真理値表は図 3.17になります。

図 3.17 真理値表

ci a b cu d

0 0 0 0 0

0 0 1 0 1

0 1 0 0 1

0 1 1 1 0

1 0 0 0 1

1 0 1 1 0

1 1 0 1 0

1 1 1 1 1

図 3.18 論理の機能実行

図 3.19 足し算の L 譜その 3

logicname sampleentity addfinput a,b,ci;output cu,d;

switch(ci,a,b)case 0,0,0: cu=0; d=0;case 0,0,1: cu=0; d=1;case 0,1,0: cu=0; d=1;case 0,1,1: cu=1; d=0;case 1,0,0: cu=0; d=1;case 1,0,1: cu=1; d=0;case 1,1,0: cu=1; d=0;case 1,1,1: cu=1; d=1;

endswitchende

entity simoutput a,b,ci;output cu,d;bitr tc[3];

part addf(a,b,ci,cu,d)tc=tc+1;a = tc.0;b = tc.1;ci = tc.2;

endeendlogic

こんどは真理値表からブール代数の式をつくることはやめて、L 言語の論理譜に真理値表を表現して

Page 67: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.4 引用庫 57

図 3.19のようにします。図 3.18の機能実行は真理値表と同じ関係になっています。

図 3.20 足し算の L 譜 2進 4桁

logicname sample

procedure addf ←全加算器を手続きにするinput a,b,ci;output p[2];bitn cu,d;

switch(ci,a,b)case 0,0,0: cu=0; d=0;case 0,0,1: cu=0; d=1;case 0,1,0: cu=0; d=1;case 0,1,1: cu=1; d=0;case 1,0,0: cu=0; d=1;case 1,0,1: cu=1; d=0;case 1,1,0: cu=1; d=0;case 1,1,1: cu=1; d=1;

endswitch

p.0=d;p.1=cu;

endp

entity add4 ← 2進 4桁論理譜input a[4],b[4];output q[4];bitn qa[2],qb[2],qc[2],qd[2];

qa=addf(a.0,b.0,0); ←手続き引用 第 1桁qb=addf(a.1,b.1,qa.1); ←手続き引用 第 2桁qc=addf(a.2,b.2,qb.1); ←手続き引用 第 3桁qd=addf(a.3,b.3,qc.1); ←手続き引用 第 4桁

q.0=qa.0;q.1=qb.0;q.2=qc.0;q.3=qd.0;

ende

entity sim ←機能実行譜output a[4],b[4];output q[4];bitr tc[8];bitr tva[4];bitr tvb[4];

part add4(a,b,q) ←実行対象の論理譜を引用tc=tc+1;

if (b==15)tva=tva+1;

elsetva=tva;

endif

tvb=tvb+1;

a = tva-1;b = tvb-1;

endeendlogic

先ほど作ったものを全加算器といいま

す、これを使って 2進数 4桁の足し算ま

で使えるものを作ると図 3.20になりま

す。全加算器を手続きにして各桁で引用

します、機能実行譜では a,bに 0∼15の

値を代入しています、機能実行の部分閲

覧は図 3.21です。この全加算器は L 言

語の引用庫に登録されていて、演算子 +

で引用されます、引数の大きさに必要な

個数の全加算器を使って論理式を作りま

す。演算子 + を使った論理譜は図 3.22

のようになります。

3.4 引用庫

論理譜中に書かれた手続きは、すべて

メモリ中に読み込まれた引用庫に追加

登録されます。手続きをなにも書いてい

ない場合の引用庫には L 言語で使う演

算子の論理式と使用者がファイル登録

した手続きが置いてあります。使用者は

毎回、手続きを書かなくても、使用者が

書いた手続きを引用したいなら、引用庫

ファイルを更新することで、論理譜中に

書いた使用者の手続きを引用庫ファイル

に追加することができます。また、使用

者は演算子の解決用に置かれた標準手続

きを演算子を使わずに引用することも、

標準手続きを使用者の手続きに置き換え

て使用するこもできます。引用庫はテキ

ストファイルで加法標準型のブール式で

書かれています。

Page 68: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

58 第 3章 簡単な設計例

図 3.21 論理の機能実行

図 3.22 足し算の L 譜 2進 4桁その 2

logicname sample

entity add4input a[4],b[4];output q[4];

q=a+b; ←演算子 + を使う

endeendlogic

3.5 引き算

引き算についても足し算とほぼ同じように作ることができます。2進数 1桁の引き算は図 3.23のように考え

られます。真理値表は図 3.24のようになります。

図 3.23 引き算

a - b = c 桁借り

0 - 0 = 0 なし

0 - 1 = 1 あり

1 - 0 = 1 なし

1 - 1 = 0 なし

図 3.24 真理値表

a b c bu

0 0 0 0

0 1 1 1

1 0 1 0

1 1 0 0

これを足し算のときのように、さらに大きな数の

計算にも使えるように下位桁からの桁借りも含んで

計算する 2進 1桁の引き算の真理値表は図 3.25の

ようになります。論理譜は図 3.27です。機能実行

は図 3.26です。この引き算は L 言語の −演算子の手続きとして引用庫に登録されています。それを

使った論理譜は図 3.28です。

引き算の機能実行ですが赤線の位置で 8 − 3 = 5

になっています、これは合っています。青線の位置

で 9 − 13 = 12になっていますが、この意味は前もって答えが負数と判定されるなら 12は 2進 4桁の数値で

12+□ = 16になる数値です。これは 4ですから実際には 12は-4を示しており、結果は合っています。また、

a,bの数値を 0∼7までに制限したら、計算結果の符号は計算結果の最上位桁が 0なら正数値、1なら負数値と判

定できます。これは、さらに大きな桁を扱う場合にも適用できます、たとえば 2進 8桁なら、最上位を符号桁、

残りの 7桁を数値桁に制限すると −127∼ +127までの符号を持った数値を扱えます。

図 3.25 真理値表

bi a b bu c

0 0 0 0 0

0 0 1 1 1

0 1 0 0 1

0 1 1 0 0

1 0 0 1 1

1 0 1 1 0

1 1 0 0 0

1 1 1 1 1

図 3.26 機能実行

因みに、2進 4桁の −1は□ +1=16な

ので 15になります、なぜ足して 16にな

る数値を考えるかと言うと、2進 4桁で

は表現しうる最大値は 15までなので、

このとき 2進 4桁では全桁が 1になっ

ています、その次の 16では 2進 4桁で

は全桁は 0ですから、2進 4桁では 16

は 0と同じ意味になります。同じように

2進 8桁で表現しうる最大値は 255なの

で□ +1=256で 255が 2進 8桁での −1

になります。

Page 69: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.5 引き算 59

図 3.27 引き算の L 譜 2進 4桁

logicname sample

procedure subfinput a,b,bi;output p[2];bitn bu,d;

switch(bi,a,b)case 0,0,0: bu=0; d=0;case 0,0,1: bu=1; d=1;case 0,1,0: bu=0; d=1;case 0,1,1: bu=0; d=0;case 1,0,0: bu=1; d=1;case 1,0,1: bu=1; d=0;case 1,1,0: bu=0; d=0;case 1,1,1: bu=1; d=1;

endswitch

p.0=d;p.1=bu;

endp

entity sub4input a[4],b[4];output q[4];bitn qa[2],qb[2],qc[2],qd[2];

qa=subf(a.0,b.0,0);qb=subf(a.1,b.1,qa.1);qc=subf(a.2,b.2,qb.1);qd=subf(a.3,b.3,qc.1);

q.0=qa.0;q.1=qb.0;q.2=qc.0;q.3=qd.0;

ende

entity simoutput a[4],b[4];output q[4];bitr tc[8];bitr tva[4];bitr tvb[4];

part sub4(a,b,q)tc=tc+1;

if (b==15)tva=tva+1;

elsetva=tva;

endif

tvb=tvb+1;

a = 16-tva;b = tvb-1;

endeendlogic

図 3.28 引き算の L 譜 2進 4桁その 2

logicname sample

entity sub4input a[4],b[4];output q[4];

q=a-b; ←演算子-を使う

endeendlogic

Page 70: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

60 第 3章 簡単な設計例

3.6 掛け算

3.6.1 まとめて計算

掛け算は 2進 4桁の aと bを例にして筆算するとa3 a2 a1 a0

b3 b2 b1 b0

n0= a3×b0 a2×b0 a1×b0 a0×b0

n1= a3×b1 a2×b1 a1×b1 a0×b1

n2= a3×b2 a2×b2 a1×b2 a0×b2

n3= a3×b3 a2×b3 a1×b3 a0×b3

n0+n1+n2+n3

8桁の計算結果になります。n0は bの 0桁が 0なら 0です、n1∼n3も該当する bの桁が 0なら 0になります。

また b0が 1なら n0 = a、b1が 1なら n1 = a× 2、b2が 1なら n2 = a× 2、b3が 1なら n3 = a× 4です。これ

を L 言語の論理譜にすると図 3.31になります。足し算は演算子 +を使っています。

図 3.29 機能実行

機能実行は図 3.29になります。4桁の足し算を 4回行って結果を出し

ていますので、論理段数は 4× 4 = 16になります。実体化したときに一段

が 5nsだったら 16× 5 = 80nsの時間がかかることになります。デバイス

の基本クロックが 12.5MHzなら 1CLK で、ぎりぎり結果が出てきます。

同じ方法で 8桁に拡張すると論理段数は 8× 8 = 64になります。同じく

一段が 5nsだったら 64× 5 = 320nsの時間がかかることになります。デ

バイスの基本クロックが 3.125MHzなら 1CLK で、ぎりぎり結果が出て

きます。基本クロックが 100MHzなら 320÷ 10 = 32CLKまで結果を待

ちます。上記の方法は汎用性がありますが、論理式は大きくなり時間もか

かります。限定的な方法ですが数が 2、4、8、16・・・などの 2の倍数のときは桁をずらして代入すれば済みま

す。例えば 8桁の aを n = a× 8なら aを 3桁ずらして n3 = a0、n4 = a1、n5 = a2、n6 = a3として n2 ∼ n0と

n7には 0を代入すれば済みます、論理段数は 1段です。n = a× 10なら n = a× 8+ a× 2なので aを 3桁ずらし

たものと 2桁ずらしたものを足せば済みます、論理段数は 8段です。

3.6.2 順番に計算

図 3.30 機能実行

筆算の方法で n0∼n3を一度に計算していたものを 4回の手順に分けて

順番に足して結果を出す方法です。手順途中の計算値は記憶が必要なので

論理的な時計が作り出す時系列を前提にした論理譜になります。論理的な

時計のことを、これから CLK と表記することにします。値を記憶する論

理譜は CLK の時系列に作ります、前提として CLK は止めたり、動かし

たりはしません、常に 0から 1に 1から 0にと動き続けていると考えま

す。記憶する位置は CLK が 0から 1になるところだけです。そして、た

だひとつの CLK の作り出す、ただひとつの時系列が論理空間の時間作用

です。簡単な例を LST04A24Bに示します。論理譜中には CLK の定義が

ないことに注意して下さい、L 言語では記憶信号を使えば、すべての記憶

信号に上記の前提を作用させます。

Page 71: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.6 掛け算 61

図 3.31 2進 4桁掛け算まとめて

logicname sample

procedure mul4input a[4],b[4];output q[8];bitn n0[8],n1[8],n2[8],n3[8];

if (b.0) n0.0:3=a.0:3; endif ← bの第 0桁が 1なら aを n0に代入if (b.1) n1.1:4=a.0:3; endif ← bの第 1桁が 1なら aを 1桁ずらして n1に代入if (b.2) n2.2:5=a.0:3; endif ← bの第 2桁が 1なら aを 2桁ずらして n2に代入if (b.3) n3.3:6=a.0:3; endif ← bの第 3桁が 1なら aを 3桁ずらして n3に代入

n0.4:7=0; ← n0の使わない桁に 0を代入n1.0=0; ← n1の使わない桁に 0を代入n1.5:7=0;n2.0:1=0; ← n2の使わない桁に 0を代入n2.6:7=0;n3.0:2=0; ← n3の使わない桁に 0を代入n3.7=0;

q=n0+n1+n2+n3; ←足し算は演算子 +を使用endp

entity maininput a[4],b[4];output q[8];

q=mul4(a,b); ←手続きを引用

ende

entity sim ←足し算の機能実行譜を流用output a[4],b[4];output q[8];bitr tc[8];bitr tva[4];bitr tvb[4];

part main(a,b,q) ←機能実行の対象論理譜を引用tc=tc+1;

if (b==15)tva=tva+1;

elsetva=tva;

endif

tvb=tvb+1;

a = tva;b = tvb;

endeendlogic

Page 72: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

62 第 3章 簡単な設計例

図 3.32 機能実行

LST04A24Bで記憶する論理譜の基本的な動

作を示します。本譜の機能実行は図 3.32に

なります。記憶型の pに aが記憶される位

置は wpが 1のときの CLK が 0から 1に変

わるところです。wpが 0のときの CLK が

0から 1に変わるところでは、pに現 pの値

が記憶されます。L 言語では、記憶型の信号

はすべて、ひとつのだけの CLK の作用を前

提に考えます、この前提では pの論理式は

p = (a · wp) + (p · wp)になります。

LST04A24B:記憶

logicname sample

entity maininput a[4]; ←入力input wp; ←記憶端緒output q[4]; ←出力bitr p[4]; ←内部信号

if (wp)p=a; ←記憶端緒が 1なら pに aを代入

elsep=p; ←記憶端緒が 0なら前の値を続ける

endif

q=p; ← qに pを代入ende

entity simoutput a[4];output wp;output q[4];bitr tc[8];

part main(a,wp,q)tc=tc+1;

if ((tc>=3)&(tc<=6)) a=5; endifif (tc==5) wp=1; endif

if ((tc>=10)&(tc<=13)) a=10; endifif (tc==12) wp=1; endif

endeendlogic

手順方式の 2進 4桁掛け算の手順を作る基になる CLK の計数を行っているのが LST04A23Aの scです。ま

とめ方式の n0∼n3で別々に持っていた値は selに違う時間に持ちます。selが 1のとき raは n0の値と同じです、

scの進行に従って n0∼n3と同じ値が現れます。selは n0∼n3に scの計数値を条件付けして図 3.30のように時

間を分けて accに足し算します。accは記憶信号なので resが 1のときには 0にされ、resが 0になると 1 CLK

ごとに足し算が行われている点に留意して下さい。scが 5を計数したときには、計算手順は完了して結果が出

ています。scの計数が 7を超えると、0に戻って同じ手順を繰り返すので scが 7を計数したら resが 1になる

まで scが 7を維持し続けるように条件付けています。

記憶信号を使う論理譜は、記憶値の変化を操って機能を作るので、どの時間の記憶値も、はっきりと認識され

て操作されないと、思わぬ動きを目にすることになります、初期値が必要な場合など、時系列上の位置に値の変

化を把握する必要があります。

図 3.33 機能実行

手順方式の 2進 4桁掛け算の論理譜 LST04A23Aを手続き

にして、ほかの実効譜から引用して使ってみます。

q1 = a× b

q2 = q1× c

q3 = q2× d

上の計算をします、q1の計算が終わったら q2の計算、q2の

計算が終わったら q3の計算を行います。掛け算の計算時間が

6 CLK とすれば、q1の計算が終わる 6 CLK 後に q2の計算を

Page 73: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.6 掛け算 63

始めます、q2の計算の終わる 12 CLK 後に q3の計算を始めます、q3の計算は 18 CLK 後に出るので 20 CLK

で計算を止めて結果を固定します。図 3.33の経過で結果がでます、論理譜は LST04A25Bです。

先の論理譜では手続きを引用するときに手続きが消費する時間を承知している必要があり、そのために時間差

を付けて手続きを実行するような論理譜を書きました。L 言語では手続きに処理時間を定義することができるの

で手続きの返値の最上位の桁を処理前、あるいは処理中なら 0を処理後なら 1にします、これを使うと論理譜

を LST04A25Aのように書けます。計数器を使って時間差を付ける論理が不要になります。また手続きの引数

を確定付入力にすると手続き自身が入力確定を判定して実行の決定が行えるので論理譜を LST04A24Cのように

書けます。確定付入力の確定桁は有効桁の上に置かれますので、4桁の確定付入力信号の確定桁は 5桁目にあり

ます。

図 3.34 機能実行

LST04A24Cを 8桁に拡張すると LST04A22Aになります、

処理時間は 10 CLK にしてあります。機能実行は図 3.34です。

出力信号だけでなく、手続き内の信号の scと raと selの信号

も表示させましたので動作を見ておいて下さい。図 3.31は演

算子 * で使われる 4桁どうしの掛け算の手続きとして引用庫

に登録してあります。LST04A22Aは演算子 * で使われる 8桁

どうしの掛け算の手続きとして引用庫に登録してあります。こ

の演算子を使うと LST04A28Aのように論理譜を書けます。

この譜の q = a× b× c× dは a× bの結果を待って cを掛け

ます、その結果を待って dを掛けます、全計算結果は 3回の掛

け算時間の 30 CLK 後に出ます。しかし、a×bと c×dは同時

に行ってよい計算なので LST04A28Cのように書けば図 3.35

のように 20 CLK で済みます。

図 3.35 機能実行

Page 74: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

64 第 3章 簡単な設計例

LST04A23A: 2進 4桁掛け算順番

logicname sample

entity mul4s ←実効譜input res; ←初期化input a[4],b[4];output q[8];output dra[8]; ←内部信号 ra観察の信号output dsc[3]; ← 〃 sc 〃output dsel[8]; ← 〃 sel 〃bitr ra[8]; ←記憶信号byteu acc; ← 〃bitr sc[3]; ← 〃bitn sel[8];

if (!sc.0&!sc.1&!sc.2)ra.0:3=a.0:3; ← raに aを代入

elsera.0=0; --------------ra.1=ra.0; ひと桁ずらすra.2=ra.1;ra.3=ra.2;ra.4=ra.3;ra.5=ra.4;ra.6=ra.5;ra.7=ra.6; --------------

endif

if (!res)if (sc.0&sc.1&sc.2)

sc=sc; ←計数を止めるelse

sc=sc+1; ← CLK を計数するendif

endif手順を追って b桁に基づいた値を selに代入する

switch(sc) ↓case 1: if (b.0) sel.0:7=ra.0:7; endifcase 2: if (b.1) sel.0:7=ra.0:7; endifcase 3: if (b.2) sel.0:7=ra.0:7; endifcase 4: if (b.3) sel.0:7=ra.0:7; endif

endswitch

if (!res)acc=acc+sel; ←累算する

endif

q=acc;

dra=ra; ← ra 観察用に代入dsc=sc; ← sc 〃dsel=sel; ← sel 〃

ende

entity sim ←機能実行譜output res;output a[4],b[4];output q[8];output dra[8];output dsc[3];output dsel[8];bitr tc[8];↓機能実行の対象実効譜を引用part mul4s(res,a,b,q,dra,dsc,dsel)tc=tc+1;

↓最初の 3 CLK を初期化期間にするif (tc>3)

res=0;else

res=1;endif

a=2;b=5;

endeendlogic

Page 75: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.6 掛け算 65

LST04A25B: 2進 4桁掛け算手続きその 1

logicname sample

procedure mul4s ←実効譜input a[4],b[4];output q[8];bitr ra[8]; ←記憶信号byteu acc; ← 〃bitr sc[3]; ← 〃bitn sel[8];

if (!sc.0&!sc.1&!sc.2)ra.0:3=a.0:3; ← raに aを代入

elsera.0=0; --------------ra.1=ra.0; ひと桁ずらすra.2=ra.1;ra.3=ra.2;ra.4=ra.3;ra.5=ra.4;ra.6=ra.5;ra.7=ra.6; --------------

endif

if (sc.0&sc.1&sc.2)sc=sc; ←計数を止める

elsesc=sc+1; ← CLK を計数する

endif手順を追って b桁に基づいた値を selに代入する

switch(sc) ↓case 1: if (b.0) sel.0:7=ra.0:7; endifcase 2: if (b.1) sel.0:7=ra.0:7; endifcase 3: if (b.2) sel.0:7=ra.0:7; endifcase 4: if (b.3) sel.0:7=ra.0:7; endif

endswitch

acc=acc+sel; ←累算する

q=acc;endp

entity maininput res;input a[4],b[4],c[4],d[4];output q1[8],q2[8],q3[8];bitr ct[5];↓ resが 1の間は枠内の記憶信号は 0になるif (!res)

if (ct==20)

ct=ct; ← 20 CLK で計数を止めるelse

ct=ct+1; ← CLK を計数するendif↓すぐに計算を始めるif (ct>0) q1=mul4s(a,b); endif

↓ 6 CLK 後に計算を始めるif (ct>6) q2=mul4s(q1.0:3,c); endif

↓ 12 CLK 後に計算を始めるif (ct>12) q3=mul4s(q2.0:3,d); endif

endifende

entity sim ←機能実行譜

output res;output a[4],b[4],c[4],d[4];output q1[8],q2[8],q3[8];bitr tc[8];↓機能実行の対象実効譜を引用part main(res,a,b,c,d,q1,q2,q3)tc=tc+1;

↓最初の 3 CLK を初期化期間にするif (tc>3)

res=0;else

res=1;endif

a=1;b=2;c=3;d=4;

endeendlogic

Page 76: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

66 第 3章 簡単な設計例

LST04A25A: 2進 4桁掛け算手続きその 2

logicname sample

procedure mul4s ←実効譜time 6c ←処理時間input a[4],b[4];output q[8];bitr ra[8];byteu acc;bitr sc[3];bitn sel[8];

if (!sc.0&!sc.1&!sc.2)ra.0:3=a.0:3;

elsera.0=0;ra.1=ra.0;ra.2=ra.1;ra.3=ra.2;ra.4=ra.3;ra.5=ra.4;ra.6=ra.5;ra.7=ra.6;

endif

if (sc.0&sc.1&sc.2)sc=sc;

elsesc=sc+1;

endif

switch(sc)case 1: if (b.0) sel.0:7=ra.0:7; endifcase 2: if (b.1) sel.0:7=ra.0:7; endifcase 3: if (b.2) sel.0:7=ra.0:7; endifcase 4: if (b.3) sel.0:7=ra.0:7; endif

endswitch

acc=acc+sel;q=acc;

endp

entity maininput res;input a[4],b[4],c[4],d[4];output q1[8],q2[8],q3[8];output p;

if (!res)q1=mul4s(a,b);if (q1.8) q2=mul4s(q1.0:3,c); endifif (q2.8) q3=mul4s(q2.0:3,d); endif

endif ↑手続き値の確定桁で実行を決定する

p=q3.8;ende

entity sim ←機能実行譜output res;output a[4],b[4],c[4],d[4];output q1[8],q2[8],q3[8];output p;bitr tc[8];↓機能実行の対象実効譜を引用part main(res,a,b,c,d,q1,q2,q3,p)

tc=tc+1;

↓最初の 3 CLK を初期化期間にするif (tc>3)

res=0;else

res=1;endif

a=1;b=2;c=3;d=4;

endeendlogic

Page 77: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.6 掛け算 67

LST04A24C: 2進 4桁掛け算手続きその 3

logicname sample

procedure mul4s ←実効譜time 6cinputc a[4],b[4]; ←確定付入力output q[8];bitr ra[8];byteu acc;bitr sc[3];bitn sel[8];

if (!sc.0&!sc.1&!sc.2)ra.0:3=a.0:3;

elsera.0=0;ra.1=ra.0;ra.2=ra.1;ra.3=ra.2;ra.4=ra.3;ra.5=ra.4;ra.6=ra.5;ra.7=ra.6;

endif

if (a.4&b.4) ←入力確定待ちif (sc.0&sc.1&sc.2)

sc=sc;else

sc=sc+1;endif

endif

switch(sc)case 1: if (b.0) sel.0:7=ra.0:7; endifcase 2: if (b.1) sel.0:7=ra.0:7; endifcase 3: if (b.2) sel.0:7=ra.0:7; endifcase 4: if (b.3) sel.0:7=ra.0:7; endif

endswitch

if (a.4&b.4) ←入力確定待ちacc=acc+sel;

endif

q=acc;endp

entity maininput res;input a[4],b[4],c[4],d[4];output q1[8],q2[8],q3[8];output p;

if (!res)q1=mul4s(a,b);q2=mul4s(q1.0:3,c);← q1確定後に実行q3=mul4s(q2.0:3,d);← q2確定後に実行

endif

p=q3.8;ende

entity sim ←機能実行譜output res;output a[4],b[4],c[4],d[4];

output q1[8],q2[8],q3[8];output p;bitr tc[8];

part main(res,a,b,c,d,q1,q2,q3,p)tc=tc+1;

if (tc>3)res=0;

elseres=1;

endif

a=1;b=2;c=3;d=4;

endeendlogic

Page 78: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

68 第 3章 簡単な設計例

LST04A22A: 2進 8桁掛け算その 1

logicname sample

procedure mul8s ←手続きの始まりtime 10c ←処理時間inputc a[8],b[8]; ←確定付入力output q[16]; ←出力bitr ra[16]; ← 16桁記憶wordu acc; ← 16桁足し算bitr sc[4]; ←順序計数bitn sel[16]; ← 0選択↓ scが 0のときif (!sc.0&!sc.1&!sc.2&!sc.3)

ra.0:7=a;←初期値 aを下位の 7桁に代入else↓ scが 0以外のとき

ra.0 =0; ------------ra.1 =ra.0;ra.2 =ra.1;ra.3 =ra.2;ra.4 =ra.3;ra.5 =ra.4;ra.6 =ra.5;ra.7 =ra.6; ひと桁ずらすra.8 =ra.7;ra.9 =ra.8;ra.10=ra.9;ra.11=ra.10;ra.12=ra.11;ra.13=ra.12;ra.14=ra.13;ra.15=ra.14; ------------

endif↓入力確定を待つ

if (a.8&b.8) ↓ scが 15のときif (sc.0&sc.1&sc.2&sc.3)

sc=sc; ← scの計数を止めるelse↓ scが 15以外のとき

sc=sc+1; ← scを増すendif

endif

↓ scが 1から 8に進行することで bの桁を選ぶswitch(sc)

case 1: if (b.0) sel=ra.0:15; endifcase 2: if (b.1) sel=ra.0:15; endifcase 3: if (b.2) sel=ra.0:15; endifcase 4: if (b.3) sel=ra.0:15; endifcase 5: if (b.4) sel=ra.0:15; endifcase 6: if (b.5) sel=ra.0:15; endifcase 7: if (b.6) sel=ra.0:15; endifcase 8: if (b.7) sel=ra.0:15; endif

endswitch ↑該当する b桁が 1なら selに raを 0なら 0を代入

if (a.8&b.8) ←入力確定を待つacc=acc+sel;←選択値を足し算

endif

q=acc;←出力に足し算値を代入

endp←手続きの終わり

entity main ←実効譜の始まりinput a[8],b[8],res;output q[16];output p;

↓ resが 1のとき初期化if (!res)

q=mul8s(a,b); ←手続き引用endif

p=q.16; ←計算終了信号の代入ende ←実効譜の終わり

entity sim ←機能実行譜の始まりoutput a[8],b[8]; ←引用した信号の引き当てoutput res; 〃output q[16]; 〃output p; 〃bitr tc[8]; ←行程の計数↓実効譜 mainを引用part main(a,b,res,q,p)tc=tc+1; ←行程の計数を増す

a=12; ← aに 12を代入b=34; ← bに 34を代入

if (tc>3)res=0;← tcの計数が 3を超えたら resを 0

elseres=1;← tcの計数が 3になるまで resを 1

endif

ende ←機能実行譜の終わりendlogic

Page 79: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.6 掛け算 69

LST04A28A: 2進 8桁掛け算その 2

logicname sample

entity main ←実効譜input res;inputc a[2],b[8],c[8],d[8];output q[16],p;

if (!res)q=a*b*c*d;

endif

p=q.16;ende

entity sim ←機能実行譜output res;output a[2],b[8],c[8],d[8];output q[16],p;bitr tc[8];↓機能実行の対象実効譜を引用part main(res,a,b,c,d,q,p)tc=tc+1;

↓最初の 3 CLK を初期化期間にするif (tc>3)

res=0;else

res=1;endif

a=2;b=3;c=4;d=5;

endeendlogic

LST04A28C: 2進 8桁掛け算その 3

logicname sample

entity main ←実効譜input res;inputc a[2],b[8],c[8],d[8];output q1[16],q2[16],q3[16],p;

if (!res)q1=a*b;q2=c*d;q3=q1*q2;

endif

p=q3.16;ende

entity sim ←機能実行譜output res;output a[2],b[8],c[8],d[8];output q1[16],q2[16],q3[16],p;bitr tc[8];↓機能実行の対象実効譜を引用part main(res,a,b,c,d,q1,q2,q3,p)tc=tc+1;

↓最初の 3 CLK を初期化期間にするif (tc>3)

res=0;else

res=1;endif

a=2;b=3;c=4;d=5;

endeendlogic

Page 80: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

70 第 3章 簡単な設計例

3.7 割り算

割り算は引き算を繰り返すことで計算することができます。例えば 1000÷10は 1000から 10を 100回引くと

0になるので結果は 100です。しかし見ただけでも 1000は 10の 100倍になっていることが分かります、1000

の頭から 10を取り去れば、2桁の 0が残ります、2桁上の所で 10が 1回あったので結果が 100と分かります。

1回の引き算で結果がでました、上の桁から引き算すれば、引き算の回数を減らすことができます。

図 3.36 押し出し

ひと桁ずつ押し出す

- - - - 1 0 0 0

➀ - - - 1 0 0 0 -

➁ - - 1 0 0 0 - -

➂ - 1 0 0 0 - - -

➃ 1 0 0 0 - - - -

上の桁から引くためには、図 3.36のように桁を押し出していっ

て、押し出された数から割りたい数を図 3.37の上段のように引い

て、その引いた回数を記録しておいて、次の押し出しで引いた回数

も図 3.37の下段のように桁を上位にずらしていけば、割り算の結果

が求められます。図 3.36の➁は 10になっているので 10を引いて続

けると図 3.37の下段の➃に割り数が 100、上段の➃に余りが 0と出

ます。

例は 10進数を使いましたが 2進数でも同じように計算できます。

この方法で論理を作ると記憶された値を動かしながら手順を繰り返

して値を求めるので論理譜で記憶された値をどのように扱うのかの

よい見本になります。図 3.37 押し出しと引き算

押し出した数が 10以上なら

引けるだけ引く

- - - - 1 0 0 0

➀ - - - 1 0 0 0 -

➁ - - 0 0 0 0 - -

➂ - 0 0 0 0 - - -

➃ 0 0 0 0 - - - -

引けた回数も押し出す

- - - -

➀ - - - 0 引けなかった

➁ - - 0 1 1回引けた

➂ - 0 1 0 引けなかった

➃ 0 1 0 0 〃

2進数 4桁の割り算を行う論理譜を少しずつ組み立ててみます、

まず入力の名前を決めます、割られる数を a、割る数を bとします。

それと手順をはじめに戻すための入力を resとします。出力では

図 3.36の上 4桁を pに下 4桁 r にします。図 3.37の上段の上 4

桁を eに、下段の 4桁を mにします。pと r と mは記憶信号です

が、eは pから bを引き算したときの一時的結果なので非記憶とし

ます。

記憶信号の桁を 1桁ずつ、ずらすには LST04A30Aの論理譜を書

きます、これは図 3.38のように pの桁を 4個だけずらしたあとに止

めています。図 3.38で割られる数 aが 1→ 2→ 5→ 10と上位桁

から押し出されていますので、割る数 bより大きいか同じだったら、

押し出された数 pから割る数 bを引いたのが LST04A30Dの論理譜

です。引いたときには記憶信号 f を 1に引けなかったときには 0に

します。これを手順の推移と一緒に上位に桁移動すれば、結果が割

り数として残ります。これで割り数と余りが求まるので 2進 4桁の割り算の論理ができています。

図 3.39は 15÷4の割り算で割りは 3、余りは 3の結果が出ています、q1は内部信号 pの値ですが 1→ 3→ 7→ 6

となっています、rには 15が初期値に置かれるので、pの下位には 4個の 1が押し出されて来ます、この経過は

1→ 3はそのまま上位に桁移動、7のときは、一旦は 4を引いて 3になりますが、下位に 1が押し出されて桁上

がりするので 7になります、次の手順でまた 7から 4を引いて 3になりますが、今度は下位に 0が押し出され

て来るので 6になります。

この論理譜を LST04A30Eのように手続きにして使うこともできます、またこの手続きは演算子 /で引用する

ために引用庫に登録してあるので LST04A01Aのようにで使うこともできます。4桁の手続きを 8桁の手続きに

拡張したのが LST04A01Bです、使い方は 4桁と同じで LST04A01Cのように書きます。割り算の手続きの出

力値を変えた手続きを LST04A01Dに作ると余りを求められます。使い方は LST04A01Eです。8桁に拡張した

Page 81: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.7 割り算 71

ものが LST04A01Fです。使い方は LST04A01Gです。

LST04A30A:桁移動

logicname sample

entity main ←実効譜input res; ←初期化input a[4]; ←割られる数input b[4]; ←割る数output q[4];bitr p[4];bitr r[4];bitr sc[8]; ←手順の計数

if (res) ←手順を初めに戻すsc=0; ←手順の計数を 0にするp=0;r=a; ← rに aを代入

elseif (sc>=4) ←手順が 4になったら手順を止める

sc=sc;p=p; ←記憶値を維持するr=r; ←   〃

elsesc=sc+1; ←手順の計数を増すp.0=r.3; ← rの最上位桁を pの最下位桁に移すr.0=0; ← pの最下位桁を 0にするr.1:3=r.0:2; ← rを上位にひと桁ずらすp.1:3=p.0:2; ← pを上位にひと桁ずらす

endifendif

q=p;ende

entity sim 機能実行譜output res;output a[4],b[4];output q[4];bitr tc[8];

part main(res,a,b,q)tc=tc+1;

if (tc>2)res=0;

elseres=1;

endif

a=10;b=0;

endeendlogic

図 3.38 機能実行

Page 82: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

72 第 3章 簡単な設計例

LST04A30D: 2進 4桁割り算

logicname sample

entity main ←実効譜input res; ←初期化input a[4]; ←割られる数input b[4]; ←割る数output q1[4],q2[4],q3[4];bitr p[4];bitr r[4];bitr sc[8]; ←手順の計数bitn e[4]; ← pから bを引いた値bitr f[4]; ←割り数の内部値

if (res) ←手順を初めに戻すsc=0; ←手順の計数を 0にするp=0;r=a; ← rに aを代入f=0;

elseif (sc>=5)←手順が 5になったら手順を止める

sc=sc;p=p; ←記憶値を維持するr=r; ←   〃f=f; ←   〃

elsesc=sc+1; ←手順の計数を増すp.0=r.3; ← rの最上位桁を pの最下位桁に移すr.0=0; ← pの最下位桁を 0にするr.1:3=r.0:2; ← rを上位にひと桁ずらすf.1:3=f.0:2; ← f    〃

if (p>=b) ← pが b以上か同じf.0=1; ← pから bを引いたので 1にするp.1:3=e.0:2; ← eをひと桁ずらして pに代入

elsef.0=0; ← pより bが大きいので 0にするp.1:3=p.0:2; ← pを上位にひと桁ずらす

endifendif

endif

e=p-b; ← pから bを引いた値q1=p;q2=f; ←割り数の代入q3.3=0;q3.0:2=p.1:3; ← pを下位にひと桁ずらして余りとする

ende

entity sim ←機能実行譜output res;output a[4],b[4];output q1[4],q2[4],q3[4];bitr tc[8];bitr tca[5];bitr tcb[4];

part main(res,a,b,q1,q2,q3)tc=tc+1;

if (res) tcb=tcb+1; else tcb=tcb; endifif (tca.4==1) tca=0; else tca=tca+1; endif

if (tc>1)if (tca.4==1)

Page 83: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.7 割り算 73

res=1;else

res=0;endif

elseres=1;

endif

a=15;b=tcb;

endeendlogic

図 3.39 機能実行

LST04B01A: 2進 4桁割り算その 2

logicname test

entity maininput res;inputc a[4],b[4],c[4];output q[4],p;

if (!res)q=a/b/c;

endif

p=q.4;ende

entity simoutput res;output a[4],b[4],c[4];output q[4],p;bitr tc[5];

part main(res,a,b,c,q,p)tc=tc+1;

if (tc>2)res=0;

elseres=1;

endif

a=14;b=2;c=3;

endeendlogic

Page 84: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

74 第 3章 簡単な設計例

LST04A30E: 2進 4桁割り算手続き

logicname sample

procedure div4 ← 2進 4桁割り算手続きtime 8cinputc a[4]; ←割られる数inputc b[4]; ←割る数output q[4]; ←割り数bitr p[4];bitr r[4];bitr sc[4]; ←手順の計数bitn e[4]; ← pから bを引いた値bitr f[4]; ←割り数の内部値

if (a.4&b.4) ←手順を初めに戻すif (sc>=7) ←手順が 7になったら手順を止める

sc=sc;p=p; ←記憶値を維持するr=r; ←   〃f=f; ←   〃

elsesc=sc+1; ←手順の計数を増すif (sc!=1)

p.0=r.3; ← rの最上位桁を pの最下位桁に移すr.0=0; ← pの最下位桁を 0にするr.1:3=r.0:2; ← rを上位にひと桁ずらすf.1:3=f.0:2; ← f    〃

if (p>=b) ← pが b以上か同じf.0=1; ← pから bを引いたので 1にするp.1:3=e.0:2; ← eをひと桁ずらして pに代入

elsef.0=0; ← pより bが大きいので 0にするp.1:3=p.0:2; ← pを上位にひと桁ずらす

endifelse ←記憶値を初期化

p=0;r=a; ← rに aを代入f=0;

endifendif

endif

e=p-b; ← pから bを引いた値

q=f; ←割り数の代入endp

entity main ←実効譜input res;inputc a[4],b[4];output q[4],p;

if (!res)q=div4(a,b);

endif

p=q.4;ende

entity sim ←機能実行譜output res;output a[4],b[4];output q[4],p;bitr tc[8];

Page 85: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.7 割り算 75

bitr tca[5];bitr tcb[4];

part main(res,a,b,q,p)tc=tc+1;

if (res) tcb=tcb+1; else tcb=tcb; endifif (tca.4==1) tca=0; else tca=tca+1; endif

if (tc>1)if (tca.4==1)

res=1;else

res=0;endif

elseres=1;

endif

a=15;b=tcb;

endeendlogic

Page 86: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

76 第 3章 簡単な設計例

LST04B01B: 2進 8桁割り算手続き

logicname sample

procedure div8 ← 2進 8桁割り算手続きtime 12cinputc a[8]; ←割られる数inputc b[8]; ←割る数output q[8]; ←割り数bitr p[8];bitr r[8];bitr sc[4]; ←手順の計数bitn e[8]; ← pから bを引いた値bitr f[8]; ←割り数の内部値

if (a.8&b.8) ←手順を初めに戻すif (sc>=11) ←手順が 7になったら手順を止める

sc=sc;p=p; ←記憶値を維持するr=r; ←   〃f=f; ←   〃

elsesc=sc+1; ←手順の計数を増すif (sc!=1)

p.0=r.7; ← rの最上位桁を pの最下位桁に移すr.0=0; ← pの最下位桁を 0にするr.1:7=r.0:6; ← rを上位にひと桁ずらすf.1:7=f.0:6; ← f    〃

if (p>=b) ← pが b以上か同じf.0=1; ← pから bを引いたので 1にするp.1:7=e.0:6; ← eをひと桁ずらして pに代入

elsef.0=0; ← pより bが大きいので 0にするp.1:7=p.0:6; ← pを上位にひと桁ずらす

endifelse ←記憶値を初期化

p=0;r=a; ← rに aを代入f=0;

endifendif

endif

e=p-b; ← pから bを引いた値

q=f; ←割り数の代入endp

entity main ←実効譜input res;inputc a[8],b[8];output q[8],p;

if (!res)q=div8(a,b);

endif

p=q.8;ende

entity sim ←機能実行譜output res;output a[8],b[8];output q[8],p;bitr tc[8];

Page 87: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.7 割り算 77

bitr tca[5];bitr tcb[8];

part main(res,a,b,q,p)tc=tc+1;

if (res) tcb=tcb+1; else tcb=tcb; endifif (tca.4==1) tca=0; else tca=tca+1; endif

if (tc>1)if (tca.4==1)

res=1;else

res=0;endif

elseres=1;

endif

a=255;b=tcb;

endeendlogic

LST04B01C: 2進 8桁割り算

logicname test

entity maininput res;inputc a[8],b[8],c[8];output q[8],p;

if (!res)q=a/b/c;

endif

p=q.8;ende

entity simoutput res;output a[8],b[8],c[8];output q[8],p;bitr tc[8];

part main(res,a,b,c,q,p)tc=tc+1;

if (tc>2)res=0;

elseres=1;

endif

a=255;b=2;c=3;

endeendlogic

Page 88: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

78 第 3章 簡単な設計例

LST04B01D: 2進 4桁割り算余り

logicname sample

procedure mod4 ← 2進 4桁余り手続きtime 8cinputc a[4]; ←割られる数inputc b[4]; ←割る数output q[4]; ←割り数bitr p[4];bitr r[4];bitr sc[4]; ←手順の計数bitn e[4]; ← pから bを引いた値bitr f[4]; ←割り数の内部値

if (a.4&b.4) ←手順を初めに戻すif (sc>=7) ←手順が 7になったら手順を止める

sc=sc;p=p; ←記憶値を維持するr=r; ←   〃f=f; ←   〃

elsesc=sc+1; ←手順の計数を増すif (sc!=1)

p.0=r.3; ← rの最上位桁を pの最下位桁に移すr.0=0; ← pの最下位桁を 0にするr.1:3=r.0:2; ← rを上位にひと桁ずらすf.1:3=f.0:2; ← f    〃

if (p>=b) ← pが b以上か同じf.0=1; ← pから bを引いたので 1にするp.1:3=e.0:2; ← eをひと桁ずらして pに代入

elsef.0=0; ← pより bが大きいので 0にするp.1:3=p.0:2; ← pを上位にひと桁ずらす

endifelse ←記憶値を初期化

p=0;r=a; ← rに aを代入f=0;

endifendif

endif

e=p-b; ← pから bを引いた値

q.0:2=p.1:3; ←余りの代入q.3=0;

endp

entity main ←実効譜input res;inputc a[4],b[4];output q[4],p;

if (!res)q=mod4(a,b);

endif

p=q.4;ende

entity sim ←機能実行譜output res;output a[4],b[4];output q[4],p;

Page 89: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.7 割り算 79

bitr tc[8];bitr tca[5];bitr tcb[4];

part main(res,a,b,q,p)tc=tc+1;

if (res) tcb=tcb+1; else tcb=tcb; endifif (tca.4==1) tca=0; else tca=tca+1; endif

if (tc>1)if (tca.4==1)

res=1;else

res=0;endif

elseres=1;

endif

a=15;b=tcb;

endeendlogic

LST04B01E: 2進 4桁余り計算

logicname sample

entity maininput res;inputc a[4],b[4],c[4];output q[4],p;

if (!res)q=a%b%c;

endif

p=q.4;ende

entity simoutput res;output a[4],b[4],c[4];output q[4],p;bitr tc[5];

part main(res,a,b,c,q,p)tc=tc+1;

if (tc>2)res=0;

elseres=1;

endif

a=15;b=8;c=5;

endeendlogic

Page 90: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

80 第 3章 簡単な設計例

LST04B01F: 2進 8桁割り算余り

logicname sample

procedure mod8 ← 2進 8桁割り算手続きtime 12cinputc a[8]; ←割られる数inputc b[8]; ←割る数output q[8]; ←割り数bitr p[8];bitr r[8];bitr sc[4]; ←手順の計数bitn e[8]; ← pから bを引いた値bitr f[8]; ←割り数の内部値

if (a.8&b.8) ←手順を初めに戻すif (sc>=11) ←手順が 7になったら手順を止める

sc=sc;p=p; ←記憶値を維持するr=r; ←   〃f=f; ←   〃

elsesc=sc+1; ←手順の計数を増すif (sc!=1)

p.0=r.7; ← rの最上位桁を pの最下位桁に移すr.0=0; ← pの最下位桁を 0にするr.1:7=r.0:6; ← rを上位にひと桁ずらすf.1:7=f.0:6; ← f    〃

if (p>=b) ← pが b以上か同じf.0=1; ← pから bを引いたので 1にするp.1:7=e.0:6; ← eをひと桁ずらして pに代入

elsef.0=0; ← pより bが大きいので 0にするp.1:7=p.0:6; ← pを上位にひと桁ずらす

endifelse ←記憶値を初期化

p=0;r=a; ← rに aを代入f=0;

endifendif

endif

e=p-b; ← pから bを引いた値

q.0:6=p.1:7; ←余りの代入q.7=0;

endp

entity main ←実効譜input res;inputc a[8],b[8];output q[8],p;

if (!res)q=mod8(a,b);

endif

p=q.8;ende

entity sim ←機能実行譜output res;output a[8],b[8];output q[8],p;

Page 91: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.7 割り算 81

bitr tc[8];bitr tca[5];bitr tcb[8];

part main(res,a,b,q,p)tc=tc+1;

if (res) tcb=tcb+1; else tcb=tcb; endifif (tca.4==1) tca=0; else tca=tca+1; endif

if (tc>1)if (tca.4==1)

res=1;else

res=0;endif

elseres=1;

endif

a=255;b=tcb;

endeendlogic

LST04B01G: 2進 8桁余り計算

logicname sample

entity maininput res;inputc a[8],b[8],c[8];output q[8],p;

if (!res)q=a%b%c;

endif

p=q.8;ende

entity simoutput res;output a[8],b[8],c[8];output q[8],p;bitr tc[5];

part main(res,a,b,c,q,p)tc=tc+1;

if (tc>2)res=0;

elseres=1;

endif

a=255;b=37;c=7;

endeendlogic

Page 92: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

82 第 3章 簡単な設計例

3.8 シフトレジスタ 図 3.40 機能実行

図 3.41 機能実行

図 3.42 機能実行

図 3.43 機能実行

シフトレジスタは任意個数の記憶信号を連ねたも

のです。図 3.40のように有効信号 e0が 1になる

度に値が上位に移動していきます。詳しくは e0が

0から 1になったときの 2 CLK 目で値は移動しま

す。この論理譜は LST04B02Bです。

有効信号 e0が 1から 0になるときに動かす

図 3.41のときの論理譜は LST04B02Cです。

有効信号 e0の上げ、下げの両方で動かす図 3.42の

ときの論理譜は LST04B02Dです。

さらに dir 信号が 1 で下位移動、0 で上位移動す

る図 3.43のように変えられるようにした論理譜が

LST04B05Aです。

Page 93: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.8 シフトレジスタ 83

LST04B02B:シフトレジスタ↑駆動

logicname sample

entity main ←実効譜input res; ←初期化信号input a; ←入力input e; ←有効信号output q[8]; ←出力bitr p[8];bitr r[2];

if (res)p=0;

elseif (r.0) ← rが 1のときだけ上位移動

p.0=a;p.1:7=q.0:6;

else ← rが 1以外なら前の値p=p;

endifendif

if (res)r=0;

elseif (e) ← eが 1

if (r==0) ← rが 0r=1;

else ← rが 1か 2r=2;

endifelse ← eが 1以外

r=0; ← rを 0に戻すendif

endif

q=p;ende

entity sim ←機能実行譜output res;output a,e;output q[8];bitr tc[8];

part main(res,a,e,q)tc=tc+1;

if (tc>2) res=0; else res=1; endif

if (tc<30) a=1; endif

if ((tc>=5)&(tc<=8)) e=1; endifif ((tc>=15)&(tc<=18)) e=1; endifif ((tc>=25)&(tc<=28)) e=1; endifif ((tc>=35)&(tc<=38)) e=1; endifif ((tc>=45)&(tc<=48)) e=1; endifif ((tc>=55)&(tc<=58)) e=1; endif

ende

endlogic

LST04B02C:シフトレジスタ↓駆動

logicname sample

entity maininput res;input a;input e;output q[8];bitr p[8];bitr r[2];

if (res)p=0;

elseif (r.0)

p.0=a;p.1:7=q.0:6;

elsep=p;

endifendif

if (res)r=0;

elseif (!e) ←ここが違う

if (r==0)r=1;

elser=2;

endifelse

r=0;endif

endif

q=p;ende

entity sim ←機能実行譜output res;output a,e;output q[8];bitr tc[8];

part main(res,a,e,q)tc=tc+1;

if (tc>2) res=0; else res=1; endif

if ((tc>5)&(tc<30)) a=1; endif

if ((tc>=5)&(tc<=8)) e=1; endifif ((tc>=15)&(tc<=18)) e=1; endifif ((tc>=25)&(tc<=28)) e=1; endifif ((tc>=35)&(tc<=38)) e=1; endifif ((tc>=45)&(tc<=48)) e=1; endifif ((tc>=55)&(tc<=58)) e=1; endif

ende

endlogic

Page 94: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

84 第 3章 簡単な設計例

LST04B02D:シフトレジスタ↑↓駆動

logicname sample

entity main ←実効譜input res;input a;input e;output q[8];bitr p[8];bitr r[2];bitr s[2]; ←追加

if (res)p=0;

elseif (r.0|s.0) ←変更

p.0=a;p.1:7=q.0:6;

elsep=p;

endifendif

if (res)r=0;s=0; ←追加

elseif (e)

if (r==0)r=1;

elser=2;

endifelse

r=0;endif

if (!e) <----------if (s==0)

s=1;else

s=2; 追加endif

elses=0;

endif <----------endif

q=p;ende

entity sim ←機能実行譜output res;output a,e;output q[8];bitr tc[8];

part main(res,a,e,q)tc=tc+1;

if (tc>2) res=0; else res=1; endif

if ((tc>5)&(tc<30)) a=1; endif

if ((tc>=5)&(tc<=8)) e=1; endif

if ((tc>=15)&(tc<=18)) e=1; endifif ((tc>=25)&(tc<=28)) e=1; endifif ((tc>=35)&(tc<=38)) e=1; endifif ((tc>=45)&(tc<=48)) e=1; endifif ((tc>=55)&(tc<=58)) e=1; endif

ende

endlogic

Page 95: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.8 シフトレジスタ 85

LST04B05A:シフトレジスタ↑↓駆動方向指定

logicname sample

entity main ←実効譜input res;input dir; ←追加input a;input b; ←追加input e;output q[8];bitr p[8];bitr r[2];bitr s[2];

if (res)p=0;

elseif (r.0|s.0)

if (dir) ←下位に移動p.7=b;p.6:0=p.7:1;

else ←上位に移動p.0=a;p.1:7=q.0:6;

endifelse

p=p;endif

endif

if (res)r=0;s=0;

elseif (e)

if (r==0)r=1;

elser=2;

endifelse

r=0;endif

if (!e)if (s==0)

s=1;else

s=2;endif

elses=0;

endifendif

q=p;ende

entity sim ←機能実行譜output res;output dir;output a,b,e;output q[8];bitr tc[8];

part main(res,dir,a,b,e,q)tc=tc+1;

if (tc>2) res=0; else res=1; endif

if ((tc>5)&(tc<30)) a=1; endifb=0;

if ((tc>=5)&(tc<=8)) e=1; endifif ((tc>=15)&(tc<=18)) e=1; endifif ((tc>=25)&(tc<=28)) e=1; endifif ((tc>=35)&(tc<=38)) e=1; endifif ((tc>=45)&(tc<=48)) e=1; endifif ((tc>=55)&(tc<=58)) e=1; endif

if (tc>30) dir=1; endifende

endlogic

Page 96: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

86 第 3章 簡単な設計例

3.9 セットリセット

図 3.44 機能実行

LST04B06A:セットリセット

logicname sample

entity main ←実効譜input r;input s;output q;bitr p;

if (r)p=0; ← 0にする

elseif (s)

p=1; ← 1にするelse

p=p; ←維持するendif

endif

q=p;ende

entity sim ←機能実行譜output r;output s;output q;bitr tc[4];

part main(r,s,q)tc=tc+1;

if (tc==3) s=1; endifif (tc==8) r=1; endif

endeendlogic

図 3.44のように入力 sが 1で出力 qをセット 1、入力 rが 1でリセット

0にします。論理譜は LST04B06Aです。三端子のスイッチなどに使うと

機械的接点の持つチャタリングの影響を回避できます。

3.10 可変分周器

分周器は入力信号の立ち上がり、または立下りを捉えて、出力信号を変

化させるものです。入力信号のすべての変化点で出力信号を変化させると

同一周波数の出力になります。立ち上がり、または立下りで出力信号を変

化させると、入力信号の半分の周波数の出力信号が得られます。立ち上が

り、または立下りを計数して出力信号を変化させると可変分周することが

できます。分周入力は CLK の 3倍以上の周波数で有効です。

3.10.1 その 1

分周入力を多桁の計数器に計数させると後段の桁にゆくほど分周の重

ねられた出力が得られます、桁を分周値で選択すると LST04C09Aのよう

に可変の分周器が作れます。分周値を 1にしたときの機能実行は図 3.45

です。

3.10.2 その 2

分周入力を分周値と同じ桁数の減計数器に入力して計数器の値が 0に

なったときの分周入力の立ち上がりで、1桁記憶を反転させると分周値が

0で 2分周、1で 4分周、2で 6分周と 2ずつ増加して 15で 32分周まで

行えます。論理譜は LST04C09Cです。分周値を 2にしたときの機能実

行は図 3.46です。

Page 97: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

3.10 可変分周器 87

LST04C09A:可変分周器その 1

logicname sample

entity main ←実効譜input a[4]; ←分周値input d; ←分周入力output q; ←分周出力bitr r[2]; ←分周入力変化点bitr p[16]; ←分周本体

if (d) ←分周入力が 1のときswitch(r)

case 0: r=1; ← r.0が 0から 1case 1: r=2; ← r.0が 1から 0case 2: r=2; ← r.1を 0から 1

endswitchelse ←分周入力が 0のとき

r=0;endif

if (r.0) ← r.0が 1p=p+1; ←分周本体を増

else ← r.0が 0p=p; ←分周本体を維持

endif

switch(a) ← 分周値から分周本体の出力位置を選択する

case 0: q=d; 分周入力をそのままcase 1: q=p.0; 2分周case 2: q=p.1; 4分周case 3: q=p.2; 8分周case 4: q=p.3; 16分周case 5: q=p.4; 32分周case 6: q=p.5; 64分周case 7: q=p.6; 128分周case 9: q=p.7; 256分周case 10: q=p.8; 512分周case 11: q=p.9; 1024分周case 12: q=p.10; 2048分周case 13: q=p.11; 4096分周case 14: q=p.12; 8192分周case 15: q=p.13; 16384分周

endswitchende

entity sim ←機能実行譜output a[4];output d;output q;bitr tc[8];

part main(a,d,q)tc=tc+1;

a=1; 分周値を 1にして 2分周に設定

switch(tc.0:2)case 0: d=0;case 1: d=0;case 2: d=0;case 3: d=0;case 4: d=1;case 5: d=1;case 6: d=1;case 7: d=1;

endswitchendeendlogic

図 3.45 機能実行

Page 98: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

88 第 3章 簡単な設計例

LST04C09C:可変分周器その 2

logicname sample

entity maininput a[4]; ←分周値input d; ←分周入力output q; ←分周出力bitr r[2]; ←分周入力変化点bitr p[4]; ←分周本体bitr s; ←分周出力前値

if (d) ←分周入力が 1のときswitch(r)

case 0: r=1; ← r.0が 0から 1case 1: r=2; ← r.0が 1から 0case 2: r=2; ← r.1を 0から 1

endswitchelse ←分周入力が 0のとき

r=0;endif

if (r.0) ← r.0が 1if (p==0) ←分周本体が 0になった

p=a; ←分周本体に分周値を代入else ←分周本体が 0以外

p=p-1; ←分周本体を減endif

else ← r.0が 0p=p; ←現在値を維持

endif

if ((p==0)&r.0) ←分周本体が 0で変化点if (s)

s=0; ← sが 1なら 0else

s=1; ← sが 0なら 1endif

elses=s; ←現在値を維持する

endif

q=s;ende

entity sim ←機能実行譜output a[4];output d;output q;bitr tc[8];

part main(a,d,q)tc=tc+1;

a=2; 分周値を 2にして 6分周に設定

switch(tc.0:2)case 0: d=0;case 1: d=0;case 2: d=0;case 3: d=0;case 4: d=1;case 5: d=1;case 6: d=1;case 7: d=1;

endswitchendeendlogic

図 3.46 機能実行

Page 99: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

89

第 4章

拡張

4.1 目的

本章で説明する構造はなくても済むものですが、試験的に取り入れてみました。基本の文法を使っても同じ構

造を作ることができます。拡張の目的は論理譜でメモリを持つ事と手順を実行する事です。メモリは論理式で作

るのでコンパイラの負担も重くなり、デバイスの使用効率も悪くなると思われます。しかし、半導体メモリを当

てにする必要がなくなるので、メモリの必要量によっては有効かもしれません。論理式のメモリは記憶信号を固

定の桁で束ねて、それぞれに番地をつけたものです。半導体メモリのようにバス構造のない非常に簡単なもの

で、しかも、むき出しなので 1 CLK で書き込みと読み出しが同時にできます。書き込み番地はひとつだけです

が、読み出し番地はいくつでも指定して同時に読み出せます。論理を順番で動かしていくことは基本の文法でも

簡単に作れますが、時系列を管理する論理も設計しなければならず、プロセッサのあることを前提したプログラ

ムとは少し勝手が違います。そこで、コンパイラに時系列の論理を作らせて、設計者の書いた論理を上から下に

実行するようにしました。プロセッサなしで手順の実行ができますが、同じ機能を基本の文法を使って設計した

場合よりは、かなり大きい論理式になります、またコンパイラの負担も重いです。しかし基本の文法も信号もほ

ぼ同じように扱えて、並列動作の論理とも、他の独立した順序論理とも並走させることができます。デバイスの

使用効率は悪いですが、プロセッサを置かないで簡単に手順で設計したいときに使えます。

4.2 メモリ

図 4.1 メモリ

4 桁の 10個のメモリを書いた場合の例を LST04C29Aに示します。

shortで割り当てると 4桁のメモリを指定したことになります。[ ] の中は

メモリの個数を指定します。このメモリは CLK で動いています、メモ

リの操作は番地だけで行います、番地を変えると、変える前の番地は、そ

の時点の値を記憶します。メモリに書き込まないときの番地を 0にして使

わないようにすると、番地 2に書き込みたいときは番地を 0→2→0のする

と番地 2に書き込めます。連続書き込みをするときは 1→2→3→4→5→0

のようにすると 5 CLK で書き込めます。書き込み番地は式で書きます、

なお、書き込み代入文を 2個以上書いても文法違いにはなりませんが、書

き込み番地はひとつという構造に矛盾するので正しく論理変換できません。またメモリの書き込み代入文に条件

付けすることも、番地だけで操作する構造のため無意味です。メモリの読み出し代入文への条件付けは有効で

す。機能実行図 4.1は番地 1に 5を番地 2に 10を書き込んで、番地 1、番地 2と出力 qに読み出しています。

Page 100: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

90 第 4章 拡張

LST04C29A:メモリ

logicname sample

entity maininput waddr[4]; ←書き込み番地input raddr[4]; ←読み出し番地input wdata[4]; ←書き込み値input res; ←メモリ 0初期化output q[4]; ←読み出し値short p[10]; ← 4桁メモリを 10個

p[waddr]=wdata; ← RAMへの書き込み

q=p[raddr]; ← RAM読み出しende

entity simoutput waddr[4];output raddr[4];output wdata[4];output res;output q[4];bitr tc[4];

part main(waddr,raddr,wdata,res)tc=tc+1;

if (tc<2) res=1; endif

if (tc==5) waddr=1;wdata=5; endifif (tc==6) waddr=2;wdata=10; endif

if (tc==10) raddr=1; endifif (tc==11) raddr=2; endif

endeendlogic

LST04C30A:順序実行

logicname sample

entity maininput res;output q[4];output s[4];output u[4];output v[4];bitr raddr[4];bitr waddr[4];bitr wdata[4];short p[4];

p[waddr]=wdata;

q=p[raddr];

seq(!res) ←順序実行枠始まりraddr=1;waddr=1; wdata=3;waddr=2; wdata=2;waddr=3; wdata=1;waddr=0; wdata=0;raddr=raddr+1;raddr=raddr+1;

endseq ←順序実行枠終わり

s=raddr;u=waddr;v=wdata;

ende

entity simoutput res;output q[4];output s[4];output u[4];output v[4];bitr tc[4];

part main(res,q,s,u,v)tc=tc+1;

if (tc<2) res=1; endifendeendlogic

図 4.2 順序実行

4.3 順序実行

seq(実行条件式)∼endseqの中に順序実行文を書けます。実行文は実行

条件式が偽から真になったとき、真の間だけ、上から下に一回実行しま

す。メモリの番地 1,2,3に値を 3,2,1と書き込んで番地 1,2,3と順序実行論

理で読み出す図 4.2の論理譜を LST04C30Aに示します。順序実行枠の外

は並列実行枠で通常の論理文の置かれるところです。両枠で書き込まれる

信号あるいはメモリは、文法違いにはなりませんが正しく論理変換できま

せん、また、順序実行枠はいくつも持てますが、順序実行枠と順序実行枠

も並走しているので信号あるいはメモリを書き込みで共有すると、これも正しく論理変換できません。信号やメ

モリの共有は参照のみであれば、何の問題もありません。

Page 101: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

4.3 順序実行 91

図 4.3 繰り返し 1 図 4.4 繰り返し 2

図 4.5 繰り返し 3 図 4.6 繰り返し 4

順序実行文は上から下に実行されて、下まで行くと実行は終わりです。while(条件式)∼endwhileは順序実行枠

の中にだけ置ける文で条件が真の間は枠の中の順序実行文を繰り返します、実行が endwhileに達すると条件式

を検査して真なら while( )の次を偽なら endwhileの次を実行します。0→1を繰り返す図 4.3は LST04D02Aの

順序実行で動いています。順序実行枠に書かれたすべての文は CLK を消費して動いていますが時系列の操作

は LDCが作りだすので、qの 0や 1の期間を順序実行で規定することはできません。

LST04D02A:繰り返し 1

logicname sample

entity maininput res;input rp;output q;bitr c;

seq(!res)while(rp)

c=1;c=0;

endwhileendseq

q=c;ende

entity simoutput res;output rp;output q;bitr tc[8];

part main(res,rp,q)tc=tc+1;

if (tc<5) res=1; endifif ((tc>10)&(tc<30))

rp=1;endif

endeendlogic

LST04D02C:繰り返し 2

logicname sample

entity maininput res;input rp;output q;bitr c;

seq(!res)while(rp)

if (c)c=0;

elsec=1;

endifendwhile

endseq

q=c;ende

entity simLST04D02Aと同じ

endeendlogic

LST04D02E:繰り返し 3

logicname sample

entity maininput res;input rp;output q;bitr c;

seq(!res)while(rp)

switch(c)case 0: c=1;case 1: c=0;

endswitchendwhile

endseq

q=c;ende

entity simLST04D02Aと同じ

endeendlogic

Page 102: 論理設計読本 - TOK22 第1 章 はじめに 明らかにしてくれたのがブール*3と言う人で、その方法はブール代数として知られています、また、その端緒を

92 第 4章 拡張

図 4.7 注意 図 4.8 回避後

順序実行枠の中でも LST04D02C、LST04D02Eのように if 文や switch文を使うことができます。順序実行枠

の中でのこれらの文の機能は枠内の論理に条件付けすることから、条件分岐の機能に変わります。LST04D02A、

LST04D02C、LST04D02Eは論理的には同じ内容の文ですが LST04D02Cは図 4.4の機能実行、LST04D02E

は図 4.5の機能実行では順序は同じですが、先の理由により時系列は異なっています。繰り返し文をから出ると

きは LST04D02Gのように break文を使います。機能実行は図 4.6です。break文は例のように通常は条件分岐

文の中で使いますが、単独で LST04D02Jのように使うと breakの次の文をひとつ実行して枠を出てしまいます。

break文が LST04D02Jのように endwhileの直前にあると枠最初の文が図 4.7のように実行されてしまいます。

回避法は LST04D02Kのように break文を枠脱出直前の文のひとつ前に置いて実行位置を調整すると図 4.8のよ

うに回避できます。条件分岐を伴わない break文の配置は無意味なので、使う場面はないのですが、不合理な動

きをするので注意して下さい。

LST04D02G:繰り返し 4

logicname sample

entity maininput res;input rp;output q;bitr c;bitr d[4];

seq(!res)d=0;while(rp)

c=1;c=0;d=d+1;if (d==2)

break;endif

endwhileendseq

q=c;ende

entity simLST04D02Aと同じ

endeendlogic

LST04D02J:注意

logicname sample

entity maininput res;input rp;output q;bitr c;

seq(!res)while(rp)

c=1; ← break後c=0;  にも実行されbreak;  てしまう

endwhileendseq

q=c;ende

entity simLST04D02Aと同じ

endeendlogic

LST04D02K:回避法

logicname sample

entity maininput res;input rp;output q;bitr c;

seq(!res)while(rp)

c=1;break; ←脱出直前の文c=0;  のひとつ前に

endwhile  置くendseq

q=c;ende

entity simLST04D02Aと同じ

endeendlogic