逢 甲 大 學 自動控制工程學系專題製作 專 題 論 文 · FPGA/CPLD is the product...

70
自動控制工程學系專題製作 CPLDFPGA介紹與VHDL之使用 INRODUTCTION OF CPLD/FPGA AND USED BY VHDL 指導教授:黃建立 老師 生:吳仲偉、吳允華 郭達利、郭昱廷 中華民國九十五年元月

Transcript of 逢 甲 大 學 自動控制工程學系專題製作 專 題 論 文 · FPGA/CPLD is the product...

逢 甲 大 學 自動控制工程學系專題製作

專 題 論 文 CPLDFPGA介紹與VHDL之使用

INRODUTCTION OF CPLDFPGA AND USED BY VHDL

指導教授黃建立 老師

學 生吳仲偉吳允華

郭達利郭昱廷

中 華 民 國 九 十 五 年 元 月

i

i

感謝

這次的專題首先必須要感的就是謝黃建立老師是他提供了這個機會設

備讓我們可以接觸並且摸索學習這個全新的領域

在專題進行的過程之中由於每個組員犧牲自己的空閒時間共同解決問

題尋求問題的解答以及做實驗時造成的摩擦與包容才能使得專題順利進行

最重要的是要感謝黃老師在我們遇到瓶頸的時候會給予適時的協助指引我們正

確的研究方向所以才能有今天的結果

在技術方面要感謝學長的基礎指導讓我們對於硬體以及軟體有初步的瞭

解在硬體方面橋高技術部門的工程師在百忙之中可以細心的回答我們的

疑問在此衷心感謝

ii

摘要

電子產品日益進步過去常使用的控制電路因體積價格等等因素正逐漸不

符合需求FPGACPLD 便是為追求簡化電路而問世之產品又因廣受好評使

得廠商大量生產與開發更新功能更強的產品因此在價格上並無太大負擔使用

VHDL可輕易的減輕與簡化系統模型到硬體結構的轉譯負擔以元件式技術為依

據再以元件之封裝性再用性及擴展性來提高轉譯效率

FPGACPLD 生產廠商也免費提供操作簡單的程式編譯軟體為另一優

點此次專題研究除了解 FPGACPLD內部構造外並學習如何使用其軟體

操作與程式撰寫將所需求之控制電路以 VHDL 做規劃在廠商提供的學習模

組練習下發展出不同的硬體控制電路

iii

Abstract

The electronic products are progressed day by day the control circuit that used to be

used is not conforming to the demand gradually because of the factors such as size

price etc FPGACPLD is the product that coming out to pursue these circuits simplified

and it is produced in a large amount and developed and upgraded the products with better

function by the favorable comment So it wouldnrsquot have too many problem in price

VHDL can mitigate and simplify the translation of the system module to the hardware

structure easily And using the component-based technique by the characters of

encapsulation reuse and expansion the efficiency of the translation would be

enhanced The manufactory of FPGACPLD provide the compiling software for free

is the other advantage Unless understand the structure of FPGACPLD learning how

to use these software and language to program the control circuits we need and

develop different hardware control circuits under the practice of studying modal in

this project

iv

目錄 感謝i 摘要ii Abstract iii 目錄iv 圖目錄 v 表目錄 vi 第一章 緒論 1

11 研究背景1 12 研究動機及方法 1

第二章 探討 CPLDFPGA3 21 何謂 CPLDFPGA3 22 CPLDFPGA之區別 3 23 CPLDFPGA之特性 4 24 CPLDFPGA之發展沿革 6 25 CPLDFPGA製造廠商 8 26 CPLDFPGA開發介面 11 27 CPLDFPGA未來趨勢 12

第三章 開發環境13 31 開發軟體13 32 MAX+plus II與 Quartus II13 33 程式編輯與軟體使用方法 17 34 VHDL概要 19 35 VHDL程式架構 21

第四章 馬達與 LCM模組應用 24 41 專題硬體概述 24 42 文字型 LCD 24 43 馬達簡介 35 44 實作簡介 39

第五章 數位類比轉換器 49 51 專題硬體概述 49 53 實作簡介 54

參考文獻 60 附錄61

v

圖目錄 圖 21 FPGA的內部基本架構 5 圖 22 型的 PLD部分結構 7 圖 23 邏輯電路的架構8 圖 24 FPGA硬體流程 12 圖 31 MAX+PLUS II之編輯頁面 15 圖 32 Max+Plus II的運作流程圖 15 圖 33 QuartusTM II的編輯頁面 16 圖 34 QuartusTM II的操作流程圖 17 圖 35 程式設計流程圖18 圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現19 圖 41 LCD控制方塊圖 25 圖 42 (A) 讀取時序規格 26 圖 42 (B) 讀取時序圖 26 圖 43 (A) 寫入時序規格 27 圖 43 (B) 寫入時序圖 27 圖 44 LCD控制流程圖 34 圖 45 LCD腳位電路圖 35 圖 46 直流馬達基本構造圖 36 圖 48 步進馬達種類37 圖 49 步進馬達輸入訊號 38 圖 410 步進馬達控制方塊圖 39 圖 411 步進馬達實作成品 40 圖 51 轉換器電路圖50 圖 52 連續近似法 ADC電路圖 51 圖 53 理想類比對數位轉換圖 52 圖 54 ADC0809類比對數位轉換器接腳圖53 圖 55 溫度顯示實作成品 54 圖 附-1 AD電路圖 61 圖 附-2 步進馬達電路圖鍵盤電路圖 62

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

i

i

感謝

這次的專題首先必須要感的就是謝黃建立老師是他提供了這個機會設

備讓我們可以接觸並且摸索學習這個全新的領域

在專題進行的過程之中由於每個組員犧牲自己的空閒時間共同解決問

題尋求問題的解答以及做實驗時造成的摩擦與包容才能使得專題順利進行

最重要的是要感謝黃老師在我們遇到瓶頸的時候會給予適時的協助指引我們正

確的研究方向所以才能有今天的結果

在技術方面要感謝學長的基礎指導讓我們對於硬體以及軟體有初步的瞭

解在硬體方面橋高技術部門的工程師在百忙之中可以細心的回答我們的

疑問在此衷心感謝

ii

摘要

電子產品日益進步過去常使用的控制電路因體積價格等等因素正逐漸不

符合需求FPGACPLD 便是為追求簡化電路而問世之產品又因廣受好評使

得廠商大量生產與開發更新功能更強的產品因此在價格上並無太大負擔使用

VHDL可輕易的減輕與簡化系統模型到硬體結構的轉譯負擔以元件式技術為依

據再以元件之封裝性再用性及擴展性來提高轉譯效率

FPGACPLD 生產廠商也免費提供操作簡單的程式編譯軟體為另一優

點此次專題研究除了解 FPGACPLD內部構造外並學習如何使用其軟體

操作與程式撰寫將所需求之控制電路以 VHDL 做規劃在廠商提供的學習模

組練習下發展出不同的硬體控制電路

iii

Abstract

The electronic products are progressed day by day the control circuit that used to be

used is not conforming to the demand gradually because of the factors such as size

price etc FPGACPLD is the product that coming out to pursue these circuits simplified

and it is produced in a large amount and developed and upgraded the products with better

function by the favorable comment So it wouldnrsquot have too many problem in price

VHDL can mitigate and simplify the translation of the system module to the hardware

structure easily And using the component-based technique by the characters of

encapsulation reuse and expansion the efficiency of the translation would be

enhanced The manufactory of FPGACPLD provide the compiling software for free

is the other advantage Unless understand the structure of FPGACPLD learning how

to use these software and language to program the control circuits we need and

develop different hardware control circuits under the practice of studying modal in

this project

iv

目錄 感謝i 摘要ii Abstract iii 目錄iv 圖目錄 v 表目錄 vi 第一章 緒論 1

11 研究背景1 12 研究動機及方法 1

第二章 探討 CPLDFPGA3 21 何謂 CPLDFPGA3 22 CPLDFPGA之區別 3 23 CPLDFPGA之特性 4 24 CPLDFPGA之發展沿革 6 25 CPLDFPGA製造廠商 8 26 CPLDFPGA開發介面 11 27 CPLDFPGA未來趨勢 12

第三章 開發環境13 31 開發軟體13 32 MAX+plus II與 Quartus II13 33 程式編輯與軟體使用方法 17 34 VHDL概要 19 35 VHDL程式架構 21

第四章 馬達與 LCM模組應用 24 41 專題硬體概述 24 42 文字型 LCD 24 43 馬達簡介 35 44 實作簡介 39

第五章 數位類比轉換器 49 51 專題硬體概述 49 53 實作簡介 54

參考文獻 60 附錄61

v

圖目錄 圖 21 FPGA的內部基本架構 5 圖 22 型的 PLD部分結構 7 圖 23 邏輯電路的架構8 圖 24 FPGA硬體流程 12 圖 31 MAX+PLUS II之編輯頁面 15 圖 32 Max+Plus II的運作流程圖 15 圖 33 QuartusTM II的編輯頁面 16 圖 34 QuartusTM II的操作流程圖 17 圖 35 程式設計流程圖18 圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現19 圖 41 LCD控制方塊圖 25 圖 42 (A) 讀取時序規格 26 圖 42 (B) 讀取時序圖 26 圖 43 (A) 寫入時序規格 27 圖 43 (B) 寫入時序圖 27 圖 44 LCD控制流程圖 34 圖 45 LCD腳位電路圖 35 圖 46 直流馬達基本構造圖 36 圖 48 步進馬達種類37 圖 49 步進馬達輸入訊號 38 圖 410 步進馬達控制方塊圖 39 圖 411 步進馬達實作成品 40 圖 51 轉換器電路圖50 圖 52 連續近似法 ADC電路圖 51 圖 53 理想類比對數位轉換圖 52 圖 54 ADC0809類比對數位轉換器接腳圖53 圖 55 溫度顯示實作成品 54 圖 附-1 AD電路圖 61 圖 附-2 步進馬達電路圖鍵盤電路圖 62

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

i

感謝

這次的專題首先必須要感的就是謝黃建立老師是他提供了這個機會設

備讓我們可以接觸並且摸索學習這個全新的領域

在專題進行的過程之中由於每個組員犧牲自己的空閒時間共同解決問

題尋求問題的解答以及做實驗時造成的摩擦與包容才能使得專題順利進行

最重要的是要感謝黃老師在我們遇到瓶頸的時候會給予適時的協助指引我們正

確的研究方向所以才能有今天的結果

在技術方面要感謝學長的基礎指導讓我們對於硬體以及軟體有初步的瞭

解在硬體方面橋高技術部門的工程師在百忙之中可以細心的回答我們的

疑問在此衷心感謝

ii

摘要

電子產品日益進步過去常使用的控制電路因體積價格等等因素正逐漸不

符合需求FPGACPLD 便是為追求簡化電路而問世之產品又因廣受好評使

得廠商大量生產與開發更新功能更強的產品因此在價格上並無太大負擔使用

VHDL可輕易的減輕與簡化系統模型到硬體結構的轉譯負擔以元件式技術為依

據再以元件之封裝性再用性及擴展性來提高轉譯效率

FPGACPLD 生產廠商也免費提供操作簡單的程式編譯軟體為另一優

點此次專題研究除了解 FPGACPLD內部構造外並學習如何使用其軟體

操作與程式撰寫將所需求之控制電路以 VHDL 做規劃在廠商提供的學習模

組練習下發展出不同的硬體控制電路

iii

Abstract

The electronic products are progressed day by day the control circuit that used to be

used is not conforming to the demand gradually because of the factors such as size

price etc FPGACPLD is the product that coming out to pursue these circuits simplified

and it is produced in a large amount and developed and upgraded the products with better

function by the favorable comment So it wouldnrsquot have too many problem in price

VHDL can mitigate and simplify the translation of the system module to the hardware

structure easily And using the component-based technique by the characters of

encapsulation reuse and expansion the efficiency of the translation would be

enhanced The manufactory of FPGACPLD provide the compiling software for free

is the other advantage Unless understand the structure of FPGACPLD learning how

to use these software and language to program the control circuits we need and

develop different hardware control circuits under the practice of studying modal in

this project

iv

目錄 感謝i 摘要ii Abstract iii 目錄iv 圖目錄 v 表目錄 vi 第一章 緒論 1

11 研究背景1 12 研究動機及方法 1

第二章 探討 CPLDFPGA3 21 何謂 CPLDFPGA3 22 CPLDFPGA之區別 3 23 CPLDFPGA之特性 4 24 CPLDFPGA之發展沿革 6 25 CPLDFPGA製造廠商 8 26 CPLDFPGA開發介面 11 27 CPLDFPGA未來趨勢 12

第三章 開發環境13 31 開發軟體13 32 MAX+plus II與 Quartus II13 33 程式編輯與軟體使用方法 17 34 VHDL概要 19 35 VHDL程式架構 21

第四章 馬達與 LCM模組應用 24 41 專題硬體概述 24 42 文字型 LCD 24 43 馬達簡介 35 44 實作簡介 39

第五章 數位類比轉換器 49 51 專題硬體概述 49 53 實作簡介 54

參考文獻 60 附錄61

v

圖目錄 圖 21 FPGA的內部基本架構 5 圖 22 型的 PLD部分結構 7 圖 23 邏輯電路的架構8 圖 24 FPGA硬體流程 12 圖 31 MAX+PLUS II之編輯頁面 15 圖 32 Max+Plus II的運作流程圖 15 圖 33 QuartusTM II的編輯頁面 16 圖 34 QuartusTM II的操作流程圖 17 圖 35 程式設計流程圖18 圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現19 圖 41 LCD控制方塊圖 25 圖 42 (A) 讀取時序規格 26 圖 42 (B) 讀取時序圖 26 圖 43 (A) 寫入時序規格 27 圖 43 (B) 寫入時序圖 27 圖 44 LCD控制流程圖 34 圖 45 LCD腳位電路圖 35 圖 46 直流馬達基本構造圖 36 圖 48 步進馬達種類37 圖 49 步進馬達輸入訊號 38 圖 410 步進馬達控制方塊圖 39 圖 411 步進馬達實作成品 40 圖 51 轉換器電路圖50 圖 52 連續近似法 ADC電路圖 51 圖 53 理想類比對數位轉換圖 52 圖 54 ADC0809類比對數位轉換器接腳圖53 圖 55 溫度顯示實作成品 54 圖 附-1 AD電路圖 61 圖 附-2 步進馬達電路圖鍵盤電路圖 62

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

ii

摘要

電子產品日益進步過去常使用的控制電路因體積價格等等因素正逐漸不

符合需求FPGACPLD 便是為追求簡化電路而問世之產品又因廣受好評使

得廠商大量生產與開發更新功能更強的產品因此在價格上並無太大負擔使用

VHDL可輕易的減輕與簡化系統模型到硬體結構的轉譯負擔以元件式技術為依

據再以元件之封裝性再用性及擴展性來提高轉譯效率

FPGACPLD 生產廠商也免費提供操作簡單的程式編譯軟體為另一優

點此次專題研究除了解 FPGACPLD內部構造外並學習如何使用其軟體

操作與程式撰寫將所需求之控制電路以 VHDL 做規劃在廠商提供的學習模

組練習下發展出不同的硬體控制電路

iii

Abstract

The electronic products are progressed day by day the control circuit that used to be

used is not conforming to the demand gradually because of the factors such as size

price etc FPGACPLD is the product that coming out to pursue these circuits simplified

and it is produced in a large amount and developed and upgraded the products with better

function by the favorable comment So it wouldnrsquot have too many problem in price

VHDL can mitigate and simplify the translation of the system module to the hardware

structure easily And using the component-based technique by the characters of

encapsulation reuse and expansion the efficiency of the translation would be

enhanced The manufactory of FPGACPLD provide the compiling software for free

is the other advantage Unless understand the structure of FPGACPLD learning how

to use these software and language to program the control circuits we need and

develop different hardware control circuits under the practice of studying modal in

this project

iv

目錄 感謝i 摘要ii Abstract iii 目錄iv 圖目錄 v 表目錄 vi 第一章 緒論 1

11 研究背景1 12 研究動機及方法 1

第二章 探討 CPLDFPGA3 21 何謂 CPLDFPGA3 22 CPLDFPGA之區別 3 23 CPLDFPGA之特性 4 24 CPLDFPGA之發展沿革 6 25 CPLDFPGA製造廠商 8 26 CPLDFPGA開發介面 11 27 CPLDFPGA未來趨勢 12

第三章 開發環境13 31 開發軟體13 32 MAX+plus II與 Quartus II13 33 程式編輯與軟體使用方法 17 34 VHDL概要 19 35 VHDL程式架構 21

第四章 馬達與 LCM模組應用 24 41 專題硬體概述 24 42 文字型 LCD 24 43 馬達簡介 35 44 實作簡介 39

第五章 數位類比轉換器 49 51 專題硬體概述 49 53 實作簡介 54

參考文獻 60 附錄61

v

圖目錄 圖 21 FPGA的內部基本架構 5 圖 22 型的 PLD部分結構 7 圖 23 邏輯電路的架構8 圖 24 FPGA硬體流程 12 圖 31 MAX+PLUS II之編輯頁面 15 圖 32 Max+Plus II的運作流程圖 15 圖 33 QuartusTM II的編輯頁面 16 圖 34 QuartusTM II的操作流程圖 17 圖 35 程式設計流程圖18 圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現19 圖 41 LCD控制方塊圖 25 圖 42 (A) 讀取時序規格 26 圖 42 (B) 讀取時序圖 26 圖 43 (A) 寫入時序規格 27 圖 43 (B) 寫入時序圖 27 圖 44 LCD控制流程圖 34 圖 45 LCD腳位電路圖 35 圖 46 直流馬達基本構造圖 36 圖 48 步進馬達種類37 圖 49 步進馬達輸入訊號 38 圖 410 步進馬達控制方塊圖 39 圖 411 步進馬達實作成品 40 圖 51 轉換器電路圖50 圖 52 連續近似法 ADC電路圖 51 圖 53 理想類比對數位轉換圖 52 圖 54 ADC0809類比對數位轉換器接腳圖53 圖 55 溫度顯示實作成品 54 圖 附-1 AD電路圖 61 圖 附-2 步進馬達電路圖鍵盤電路圖 62

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

iii

Abstract

The electronic products are progressed day by day the control circuit that used to be

used is not conforming to the demand gradually because of the factors such as size

price etc FPGACPLD is the product that coming out to pursue these circuits simplified

and it is produced in a large amount and developed and upgraded the products with better

function by the favorable comment So it wouldnrsquot have too many problem in price

VHDL can mitigate and simplify the translation of the system module to the hardware

structure easily And using the component-based technique by the characters of

encapsulation reuse and expansion the efficiency of the translation would be

enhanced The manufactory of FPGACPLD provide the compiling software for free

is the other advantage Unless understand the structure of FPGACPLD learning how

to use these software and language to program the control circuits we need and

develop different hardware control circuits under the practice of studying modal in

this project

iv

目錄 感謝i 摘要ii Abstract iii 目錄iv 圖目錄 v 表目錄 vi 第一章 緒論 1

11 研究背景1 12 研究動機及方法 1

第二章 探討 CPLDFPGA3 21 何謂 CPLDFPGA3 22 CPLDFPGA之區別 3 23 CPLDFPGA之特性 4 24 CPLDFPGA之發展沿革 6 25 CPLDFPGA製造廠商 8 26 CPLDFPGA開發介面 11 27 CPLDFPGA未來趨勢 12

第三章 開發環境13 31 開發軟體13 32 MAX+plus II與 Quartus II13 33 程式編輯與軟體使用方法 17 34 VHDL概要 19 35 VHDL程式架構 21

第四章 馬達與 LCM模組應用 24 41 專題硬體概述 24 42 文字型 LCD 24 43 馬達簡介 35 44 實作簡介 39

第五章 數位類比轉換器 49 51 專題硬體概述 49 53 實作簡介 54

參考文獻 60 附錄61

v

圖目錄 圖 21 FPGA的內部基本架構 5 圖 22 型的 PLD部分結構 7 圖 23 邏輯電路的架構8 圖 24 FPGA硬體流程 12 圖 31 MAX+PLUS II之編輯頁面 15 圖 32 Max+Plus II的運作流程圖 15 圖 33 QuartusTM II的編輯頁面 16 圖 34 QuartusTM II的操作流程圖 17 圖 35 程式設計流程圖18 圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現19 圖 41 LCD控制方塊圖 25 圖 42 (A) 讀取時序規格 26 圖 42 (B) 讀取時序圖 26 圖 43 (A) 寫入時序規格 27 圖 43 (B) 寫入時序圖 27 圖 44 LCD控制流程圖 34 圖 45 LCD腳位電路圖 35 圖 46 直流馬達基本構造圖 36 圖 48 步進馬達種類37 圖 49 步進馬達輸入訊號 38 圖 410 步進馬達控制方塊圖 39 圖 411 步進馬達實作成品 40 圖 51 轉換器電路圖50 圖 52 連續近似法 ADC電路圖 51 圖 53 理想類比對數位轉換圖 52 圖 54 ADC0809類比對數位轉換器接腳圖53 圖 55 溫度顯示實作成品 54 圖 附-1 AD電路圖 61 圖 附-2 步進馬達電路圖鍵盤電路圖 62

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

iv

目錄 感謝i 摘要ii Abstract iii 目錄iv 圖目錄 v 表目錄 vi 第一章 緒論 1

11 研究背景1 12 研究動機及方法 1

第二章 探討 CPLDFPGA3 21 何謂 CPLDFPGA3 22 CPLDFPGA之區別 3 23 CPLDFPGA之特性 4 24 CPLDFPGA之發展沿革 6 25 CPLDFPGA製造廠商 8 26 CPLDFPGA開發介面 11 27 CPLDFPGA未來趨勢 12

第三章 開發環境13 31 開發軟體13 32 MAX+plus II與 Quartus II13 33 程式編輯與軟體使用方法 17 34 VHDL概要 19 35 VHDL程式架構 21

第四章 馬達與 LCM模組應用 24 41 專題硬體概述 24 42 文字型 LCD 24 43 馬達簡介 35 44 實作簡介 39

第五章 數位類比轉換器 49 51 專題硬體概述 49 53 實作簡介 54

參考文獻 60 附錄61

v

圖目錄 圖 21 FPGA的內部基本架構 5 圖 22 型的 PLD部分結構 7 圖 23 邏輯電路的架構8 圖 24 FPGA硬體流程 12 圖 31 MAX+PLUS II之編輯頁面 15 圖 32 Max+Plus II的運作流程圖 15 圖 33 QuartusTM II的編輯頁面 16 圖 34 QuartusTM II的操作流程圖 17 圖 35 程式設計流程圖18 圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現19 圖 41 LCD控制方塊圖 25 圖 42 (A) 讀取時序規格 26 圖 42 (B) 讀取時序圖 26 圖 43 (A) 寫入時序規格 27 圖 43 (B) 寫入時序圖 27 圖 44 LCD控制流程圖 34 圖 45 LCD腳位電路圖 35 圖 46 直流馬達基本構造圖 36 圖 48 步進馬達種類37 圖 49 步進馬達輸入訊號 38 圖 410 步進馬達控制方塊圖 39 圖 411 步進馬達實作成品 40 圖 51 轉換器電路圖50 圖 52 連續近似法 ADC電路圖 51 圖 53 理想類比對數位轉換圖 52 圖 54 ADC0809類比對數位轉換器接腳圖53 圖 55 溫度顯示實作成品 54 圖 附-1 AD電路圖 61 圖 附-2 步進馬達電路圖鍵盤電路圖 62

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

v

圖目錄 圖 21 FPGA的內部基本架構 5 圖 22 型的 PLD部分結構 7 圖 23 邏輯電路的架構8 圖 24 FPGA硬體流程 12 圖 31 MAX+PLUS II之編輯頁面 15 圖 32 Max+Plus II的運作流程圖 15 圖 33 QuartusTM II的編輯頁面 16 圖 34 QuartusTM II的操作流程圖 17 圖 35 程式設計流程圖18 圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現19 圖 41 LCD控制方塊圖 25 圖 42 (A) 讀取時序規格 26 圖 42 (B) 讀取時序圖 26 圖 43 (A) 寫入時序規格 27 圖 43 (B) 寫入時序圖 27 圖 44 LCD控制流程圖 34 圖 45 LCD腳位電路圖 35 圖 46 直流馬達基本構造圖 36 圖 48 步進馬達種類37 圖 49 步進馬達輸入訊號 38 圖 410 步進馬達控制方塊圖 39 圖 411 步進馬達實作成品 40 圖 51 轉換器電路圖50 圖 52 連續近似法 ADC電路圖 51 圖 53 理想類比對數位轉換圖 52 圖 54 ADC0809類比對數位轉換器接腳圖53 圖 55 溫度顯示實作成品 54 圖 附-1 AD電路圖 61 圖 附-2 步進馬達電路圖鍵盤電路圖 62

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

vi

表目錄 表 21 FPGA公司銷售額9 表 22 CPLD及 FPGA元件特性 10 表 41 LCD接腳功能說明 25 表 42 LCD控制指令29 表 43 LCD輸入模式控制指令 30 表 44 LCD游標控制指令 31 表 45 LCD字型設定指令 31 表 46 控制指令表 33

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

1

第一章 緒論

11 研究背景

有鑑於單晶片在市場被廣泛的使用但是在設計的流程上往往需要配合著豐

富的電子電路經驗以及具備相當實力的程式語言撰寫能力才能達到設計上的需

求由於可程式邏輯(Programmable Logic Devices)的快速發展而使得有 FPGA

CPLD這類型的產品問世這種可程式邏輯的主要特色是可以大幅縮短電路的

複雜性也因為複雜性的減少而使得工作的效率以及流程時間可以較為縮短

又因為具有可重複抹除的特性所以造成了兩面的優缺點優點為因為使用內部

的 RAM作為儲存單位所以可以無限次重複抹寫不會有以往單晶片有壽命限

制的問題以及不需要昂貴的燒錄設備只需要一條下載線便可輕易的達成也

因為這種特性而使得這種晶片成本提高在一般的市場能見度降低但是這並

不會降低這種晶片未來的發展性許多製作晶片的廠商已經朝向廉價以及高規格

的方向發展我們這次所使用的晶片即為 Altera 公司所推出的低價晶片 ACEX

系列屬於 FPGA 的一種因為是實驗器材因此在 ACEX 裡面屬高級規格

最普通的一顆約新台幣 350圓整若採用 CPLD系列晶片最低的單價為新台幣

50 圓整雖然這種價格目前還不具競爭力但是如果在大量的採購以及晶片研

發公司的努力下未來的願景不可小覷

12 研究動機及方法

此次專題的出發點為對於 FPGA這類從未接觸過之單晶片元件欲予以進一

步的了解 FPGA 可接受多種不同的程式輸入方法我們是利用 VHDL(Very

High Speed Integrated Circuit Hardware Description Language)超高速硬體電路描

述語言來作為撰寫編輯 FPGA 的描述方法因此研究範圍包含了 FPGA 之發展

沿革工作原理開發介面操作流程以及將其應用在一些簡單的例子上面並

對於所使用之開發環境及語言 VHDL作介紹除了對於 FPGA及 VHDL做了詳

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

2

細的研究及介紹外在實作方面我們對於 AD溫度感測直流馬達與步進馬

達做了基本的功能設計都是以 VHDL編譯並以 FPGA下去實現的對象

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

3

第二章 探討 CPLDFPGA

21 何謂 CPLDFPGA

FPGA是英文 Field Programmable Gate Array的縮寫即現場可程式邏輯陣

列它是在 PALGALEPLD等可程式元件的基礎上進一步發展的產物它是

作為專用積體電路 ASIC(Application Specific IC)領域中的一種半定製電路而出

現的既解決了定製電路的不足又克服了原有可程式元件邏輯電路數有限的缺

點FPGA是在一顆超大型積體電路其採用了邏輯單元陣列 LCA(Logic Cell

Array)這樣一個新概念內部包括可程式邏輯模塊 CLB(Configurable Logic

Block)輸出輸入阜 IOB(Input Output Block)和內部連線(Interconnect)三

個部分均勻地配置了一大堆的 CLB而每個 CLB都擁有基本的組合邏輯和順

序邏輯在 CLB和 CLB之間也均勻配置了一大串的可程式配線(Routing)只

要控制這些配線就可將一個個單獨的 CLB整合成完整而複雜的大型電路最後

再利用分布於外圍的 IOB提供 FPGA和外部電路的介面關係FPGA元件中的

邏輯單元(CLB)輸入輸出阜(IOB)和配線(Routing)不但皆為可程式化

還是 RAM形式的可程式結構可重複抹寫達數萬次也不須從電路板中拆下燒

CPLD為 Complex Programmable Logic Devices的縮寫即複雜型可規劃邏

輯元件與 FPGA相同是由 PALGAL等邏輯器件基礎上所發展而來其晶片

特性大致與 FPGA相同唯記憶體採用 EEPROM架構晶片密度較 FPGA小

由於使用上及特性上並無太大不同故現今 CPLD常與 FPGA共稱並無刻意

區分

22 CPLDFPGA之區別

CPLD其內部的連接匯流排都市採用多重金屬線連接方式且每兩點間都有

預置的金屬線連接這種連接方式稱之為連續性內部連接(Continuous

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

4

Interconnect)這與 FPGA之片段性連接方式(Segmented Interconnect)不同

連續性內部的連接方式可依 LOGIC CELL的放置位置預測出繞線的延遲時間

因此可精準得模擬出電路的時序特性使工程師在元件燒錄前便可由模擬的環境

來準確觀測電路之時序特性

CPLD的形式內部架構為 EEPROM將電路燒路於其中後若將電源切斷

CPLD仍會保留原有的電路不必重新載入使用上較為方便但 CPLD的閘數

較少密度較低不適合作為記憶電路的設計而適合規劃為數位系統的控制電

路FPGA元件內部為 SRAM架構晶片之密度較高且含有獨立記憶元件

故可規劃成含有記憶體的大型電路

23 CPLDFPGA之特性

利用計算機輔助設計以電路原理圖VHDL布林運算真值表或狀態機

等格式輸入設計邏輯然後經一系列變換將輸入的邏輯轉換成適合於 FPGA

器件架構的圖形文件或文本形式此時不僅可以觀察整個設計在器件中實際布線

的結果了解各網路的延時特性進行人工修改或編輯從而可利用類比手段

對設計的輸入輸出及任意點信號進行類比仿真包括驗証設計功能是否正確的

功能類比以及確定最終設計是否滿足相位和延時要求的定時類比具有體系架

構和邏輯單元靈活集成度高以及適用範圍寬等特點

FPGA的基本特點主要有

l 採用FPGA設計ASIC電路使用者不需要請廠商生產便能得到符合需求的

晶片

l 可做為其它全定製或半定製ASIC電路的中測試晶片

l 內部有豐富的正反器和IO接腳

l 是ASIC電路中之設計週期最短開發費用最低風險最小的產品

l 採用高速CHMOS功耗低可以與CMOSTTL相容

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

5

因此可以說FPGA晶片是小批量系統提升系統集成度可靠性的最佳選擇之一

FPGA的內部基本架構如圖 21所示

圖 21 FPGA的內部基本架構

可規劃邏輯元件的內部有許多邏輯合成單元(Logic cell)每個合成單元間

有可供規劃的水平及垂直之繞線通道使 logic cell可以彼此互相連接

因為內部邏輯合成單元的布局及繞線資料量是一般個人電腦即可以掌握

的再加上 CPLDFPGA之製造商所提供之邏輯合成及晶片燒錄工具直接以

FPGA及 CPLD來完成專案晶片的設計已成為另一個熱門的產業即使是小型個

人工作室也可跨足 IC 設計的領域雖然 ASIC 合成後的電路特性(Electrical

Characteristic)及集積度(Integration)一般來說較佳但因 FPGACPLD內部

的硬體資源具有反覆清除及重新規劃的功能從修正電路原始硬體描述碼至實體

驗證的時間往往只需要數分鐘的時間且在個人電腦上就可以升任

然而最近的研究中發現SRAM 技術經中子轟擊測試易於遭受軟錯誤攻

擊不僅在高空環境中易於發生中子導致的配置損耗而且在地面級應用中也會

發生當高能量中子侵入儲存單元如以 SRAM為基礎可編程元件所用的那些

元件極有可能出現功能故障並且以無法預知的狀態運作這對於我們常用的系

統非常不利包括電話網路汽車安全氣袋醫療器材甚至軍事和太空設備等

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

6

24 CPLDFPGA之發展沿革

早期的可程式邏輯元件只有可程式唯讀記憶體(PROM)紫外線可抹除程

式化唯讀記憶體(EPROM)和電性可擦拭唯讀記憶體(EEPROM)三種由於

架構的限制它們僅能完成簡單的數字邏輯功能之後出現了一架構上稍微複

雜的可程式晶片即可程式邏輯器件(PLD)它能夠完成各種數字之邏輯功能

典型的 PLD由一個ldquoANDrdquo和一個ldquoORrdquo陣列組成而任意一個組合邏輯都可

以用ldquoAND-ORrdquo表達式來描述所以 PLD能以乘積和的形式完成大量的

組合邏輯功能這一階段的產品主要有 PAL(可程式陣列邏輯)和 GAL(通用

陣列邏輯) PAL由一個可程式的ldquoANDrdquo平面和一個固定的ldquoORrdquo平面所

構成OR的輸出可以透過正反器有選擇地被置為暫存狀態 PAL元件是現場

可程式的它有反熔絲技術EPROM技術和 EEPROM技術還有一類架構更

為靈活的邏輯元件是可程式邏輯陣列(PLA)它也由一個ldquoANDrdquo平面和一個

ldquoORrdquo平面構成但是這兩個平面的連接關係是可程式的在 PAL的基礎上

又發展了一種通用陣列邏輯 GAL(Generic Array Logic)如 GAL16V8

GAL22V10 等它採用了 EEPROM實現了電性可抹除電性可改寫其輸出

架構是可程式的邏輯單元它的設計具有很強的靈活性至今仍有許多人使用

這些早期的 PLD器件的一個共同特點是可以實現速度特性較好的邏輯功能但

其過於簡單的架構也使它們只能實現規模較小的電路圖 22為典型的 PLD部

分結構(實現組合邏輯部分)

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

7

圖 22 型的 PLD部分結構

隨著微電子技術的發展現已進入數位積體電路應用的社會數位積體電路

本身在不斷地進行更新換代由早期的電子管晶體管小中規模積體電路迅

速發展到超大型積體電路(VLSIC)以及許多具有特定功能的專用積體電路現

代電子產品的複雜度日益加深一個電子系統可能由數萬個中小規模積體電路構

成這就帶來了體積大功耗大可靠性差的問題解決這一問題的有效方法就

是採用ASIC晶片進行設計ASIC按照設計方法的不同可分為全定製ASIC半

定製ASIC可程式ASIC設計全定製ASIC晶片時設計師要定義晶片上所有晶

體管的幾何圖形和規則最後將設計結果交由IC廠商製造完成而快速進步的數

位時代設計與製造積體電路的任務已不完全由半導體廠商來獨立承擔設計工

程師們更願意自己設計專用積體電路(ASIC)晶片而且希望ASIC的設計週期

儘可能短最好是在實驗室裡就能設計出合適的ASIC晶片並且立即投入實際

應用之中為了彌補此一缺陷20世紀80年代中期Altera和Xilinx分別推出了類

似於PAL架構的擴展型CPLD和與標準邏輯陣列類似的FPGA這兩種器件兼具了

PLD和GAL的優點可實現較大規模的電路程式編輯也很靈活極閘陣列等其

它ASIC相比它們又具有設計開發週期短設計製造成本低開發工具先進

標準產品無需測試質量穩定等優點因此被廣泛應用於產品的原型設計和產品

生產(一般在10000件以下)之中幾乎所有應用邏輯陣列PLD和中小規模通

用數位積體電路的場合均可應用FPGA和CPLD元件下圖23便清楚的顯示邏輯

電路的架構區分

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

8

圖 23 邏輯電路的架構

25 CPLDFPGA製造廠商

經過了十幾年的發展許多公司都開發出了多種可程式邏輯元件提供設計

的主要有 ActelAltera以及 Xilinx三家公司它們開發較早佔用了較大的

PLD市場通常來說在歐洲用 Xilinx 的人多在日本和亞太地區用 ALTERA

的人多在美國則是平分秋色全球 PLDFPGA 產品 60以上是由 Altera 和

Xilinx所提供可以說 Altera和 Xilinx 共同決定了 PLD技術的發展方向當然

還有許多其它類型元件如LatticeVantisQuicklogicLucent 等1999 年

Lattice收購了 Vantis成為第三大 PLD供應商同年 Xilinx收購了 Philips的 PLD

部門下表 21 為 2004 年世界五大 PLD 公司之營運概況(資料來源日經 BP

社)

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

9

表 21 FPGA公司銷售額

公司名稱 銷售額(美元)

美商 Xilinx 3億 5540萬

美商 Altera 2億 2990萬

美商 Lattice 4850萬

美商 Actel 4030萬

美商 QuickLogic 1110萬

本專題採用的發展系統為 ALTERA公司所生產之 ACEX1K系列產品晶片

代碼 EPF1K100Q-C208-3故針對 ALTERA 公司所生產之系列作簡要介紹下

表 22即為該公司所提供之一些具有代表性的 CPLD及 FPGA元件特性

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

10

表 22 CPLD及 FPGA元件特性 1

系列名稱 MAX3000

A

MAX7000 FLEX 10K ACEX 1K APEX 20K

元件類別 CPLD CPLD FPGA FPGA FPGA

代表晶片 EPM3032A

EPM3064A

EPM3128A

EPM3256A

EPM3512A

EPM7032B

EPM7064B

EPM7128B

EPM7256B

EPM7512B

EPF10K10

EPF10K20

EPF10K30

EPF10K40

EPF10K50

EPF10K70

EP1K10

EP1K30

EP1K50

EP1K100

EP20K200C

EP20K400C

EP20K600C

EP20K1000C

EP20K30E

EP20K60E

EP20K100E

EP20K200E

EP20K1500E

內部架構 EEPROM EEPROM SRAM SRAM SRAM

內部容量 閘數

600~10000

暫存器數

32~512

閘數

600~10000

暫存器數

32~512

閘數

10000~25000

0

可規劃 RAM

的容量

6K~64Kbits

閘數

56000~250000

可規劃 RAM

的容量

6K~48Kbits

閘數

200000~1500000

可規劃 RAM的

容量

104K~432Kbits

最高操

作頻率

1163~2273

MHZ

1639~3030

MHZ

204

MHZ

93~285

MHZ

840

MHZ

電源規格 33 V 5 V 33 V 或 5 V 25 V 18 V 或 25 V

其中MAX系列近來更已發展出功能更強之MAX II系列晶片為 CPLD開發史

上成本最低之產品提供所有 CPLD 系列中單個 IO 管腳最低成本及最小功

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

11

耗並通過採用低功耗處理技術MAX II和前一代MAX相比成本減半功

耗卻只有十分之一與MAX 3000系列相比具四倍的速度和兩倍的性能而內

部採用 FLASH暫存器可避免上述所提之中子導致的配置損耗

26 CPLDFPGA開發介面

CPLDFPGA 的另一項特色就是多元的開發介面不同的軟體不同的語

言不同的描述方式皆可以不須經過更改直接套用至不同的廠牌不同的型號

之晶片當中互通性與完整的模組性大幅降低研究成本以及加速了硬體的開發

速度因此也是迅速成為數位邏輯設計的產業主流原因之一又因 FPGA製造廠

商為加速打入市場許多都提供了免費的開發軟體如 ALTERA 所提供之

MAX+plus II 以及 Quartus II或者 Xilinx公司所提供之 Foundation皆可於該

公司之網站免費下載使用這些軟體整合了硬體描述語言編輯邏輯合成電路

功能及時序模擬及晶片燒錄的功能只要具備符合軟體所需求之個人電腦及可使

用進行晶片電路系統的設計及驗證工作這些軟體所支援的開發方式包括程式

語言(Text Editor)圖形編輯器(Graphic Editor)波形編輯器(Waveform Editor)

或者邏輯閘編輯器(Symbol Editor)程式語言的開發上較常用者為 VHDL之

後會有針對我們所使用之軟體及語言做詳細的介紹

硬體方面則僅需一台個人電腦及可供燒錄的發展系統搭配模組即可使用將

設計好之程式設定好腳位後便可透過發展系統將所撰寫的程式反映到模組上

不僅快速且便利短時間內就知道程式的架構應用在硬體上是否有瑕疵下圖

24為硬體之流程概況

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

12

圖 24 FPGA硬體流程

27 CPLDFPGA未來趨勢

在晶片產量日漸增大以及對於電路特性有越趨嚴格要求的設計條件下

ASIC 比 CPLDFPGA 更能容易滿足規格要求因此許多廠商致力將一些複雜

的系統整合至一個 ASIC晶片中這種做法稱為 SYSTEM ON CHIP簡稱 SOC

但在 CPLDFPGA的密度及特性逐漸提升且價錢一再降低的影響下未來的趨

勢不僅僅是 SOC而勢必走向 SYSTEM ON A PROGRAMMABLE CHIP簡稱

SOPC即將複雜的系統實現在一顆可供任意規劃之 FPGA 或 CPLD 晶片中

以達到立即商品化之目的再加上上述所提及之各種優點因此 CPLDFPGA

之應用無疑的將在 ASIC的市場上享有一定的地位

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

13

第三章 開發環境

31 開發軟體

此次專題採用了兩套 ALTERA公司所提供之 FPGA開發軟體MAX+plus II

以及 Quartus II故針對這兩套軟體之特性作基本介紹

MAX+plus II開發較早屬於早期的電路合成器因此在程式撰寫的限制及

晶片支援較少現今已開發至 1023版相對於MAX+plus IIQuartus II則有更

完善的功能支援的語法及晶片種類都更為完善現今最新版本為 51這兩套

軟體皆可在網路上免費下載使用只要下載後並在網站上申請認證檔填入資料

後該公司會以電子郵件方式寄認證檔 LICENSE DAT完成認證後即可擁有該設

計環境

32 MAX+plus II與 Quartus II

Max+Plus II reg可支援設計者從設計圖硬體描述語言的輸入一直到規劃連

接的燒錄檔燒錄以及模擬作業換句話說設計者的所有動作都可以在同一個軟體

上完成無須再借助其他軟體(Third Party)當然亦可彈性的搭配輔助合成軟體

另外透過Max+Plus II的韌體元件庫可輔助設計師在面對相同功能的邏輯方塊

時電路不必重複設計其產品特色如下

1 支援WINDOWS 9598ME2000XP之作業系統

2 可接受四種設計方式(繪圖編輯模式符號編輯模式文字編輯模式

波形編輯模式)

3 文字編輯模式可容許三種語言輸入(AHDLVHDLVerilog HDL)

4 提供時間分析輸入輸出模擬功能

5 提供 ISP 在系統燒錄功能

6 內建數位 IC資料庫可於繪圖編輯模式下使用

7 Compiler程式提供偵錯及警告功能

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

14

8 新增ACEX EP1K系列之晶片組最大可支援ACEX EP1K100共 100000

個的 Gate Count

Max+PlusⅡ的編輯環境又有以下五項優點

1 整合性高

在Max+PlusⅡ的環境整合內從呼叫輸入設計程式在視窗環境下完成電路

圖的製作或是編輯VHDL 檔案到呼叫編譯模擬平面規劃程式一直到進

行燒錄下載程式使用者不需切換工作環境可省去不少麻煩

2 完整的模擬觀測功能

在進行觀測CPLD 模擬方面Max+PlusⅡ提供了一個Simulator 和Waveform

Editor 程式來協助使用者快速而精準的設定與觀察數位邏輯電路的特性

另外也提供了軟體量測的功能可以量測出各數位信號轉態的發生時間與

發生的相對時間等等數據讓使用者能夠輕易且快速的判斷出電路是否符合要

3 模組化和階層化設計

隨著電路日益複雜電路的設計也趨向於模組化和階層化亦即將電路的特性及

需使用的元件切割成子電路也就是說分別設計與模擬每一個子電路後待相關

的子電路完成後再將他們組合起來完成整體電路設計

4 元件庫擴充功能

Max+PlusⅡ已經內建很多常見的電子元件符號及其對應模組也針對CPLD 的

應用提供了許多有用的元件符號但是隨著製程技術的進步和新的電子元件不斷

問世這時我們可以利用符號編輯程式新建或修改現有元件的特性以作出合於我

們要求的新元件

5 支援CPLDFPGA 作為描述電路硬體架構的語言

由於VHDL已成為IEEE 的標準以及FPGA系統在業界越趨流行的情況下學習

VHDL成為硬體工程師所必須具備的技能之一圖31為MAX+PLUS II之編輯頁

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

15

圖 31 MAX+PLUS II之編輯頁面

Max+Plus II的運作流程如圖 32所示

圖 Max+Plus II的運作流程圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

16

QuartusTM II 第五代開發工具軟體在設計上是針對數百萬閘 PLD內的系統

級整合不僅保留 Altera 之 Max+Plus II reg的特色更整合了 NativeLink

SynopsysViewlogic 及 CadencenStep 編譯以縮短設計編譯時間編譯增強

技術使得設計人員在合成和佈局佈線時能夠將設計分成實體和邏輯部份其特

性支援以模組為主的設計設計人員能夠保持專用模組性能不變而只對其它模

組進行最佳化在設計出現更動時只需要對更改部份進行編譯而無需像過去

一樣全部進行重新編譯顯著提高了時序逼近效率這也使得 FPGA設計越來越

接近 ASIC的設計方法

除了編譯增強功能新的 IO接腳規劃器簡化了高密度和大接腳數量設計

接腳分配和確認過程SoPC builder軟體可以自動完成嵌入式系統建構和合成處

理為採用 PCI外部記憶體介面(EMIF)和定製處理器介面的外部處理器提

供簡便介面支援多處理器系統內的處理器間通訊和資源安全共享圖 33 為

QuartusTM II的編輯頁面

圖 33 QuartusTM II的編輯頁面

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

17

而現今多以 QuartusTM II 作為設計主流更開發不少將 Max+Plus II 轉移至

Quartus II的技術在使用方法上與Max+Plus II大同小異QuartusTM II的操作

流程如下圖 34

圖 34 QuartusTM II的操作流程圖

這兩套軟體皆是以專案(Project)來作為系統單位即每個專案底下可有多

個不同的程式檔透過程式的編輯將其合併避免單個程式過於龐大以及降低錯

誤的發生

33 程式編輯與軟體使用方法

以MAX+plus II或是 Quartus II為主軸的程式設計流程如下圖 35所示

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

18

圖 35 程式設計流程圖

首先構想系統的主體架構包括了欲設計的項目為何設計的可行性相關

的硬體元件以及成本問題接著細部思考系統所使用的各個元件的特性為何

所需要求的時脈延遲電路以及如何作動等的資料蒐集程式中所設計的電路規

劃此時架構算是建立完成可經由編譯器(COMPILER)來確認是否無誤由

於軟體皆有錯誤警告訊息而且清楚的顯示出錯誤的位置以及錯誤的原因因此

可以相當快速的除錯

時序的驗證及模擬(TIMING SIMULATION)延遲程式的確認(DELAY

MATRIX)是接下來的步驟因為各個元件需求的工作頻率不同須由除頻電

路來獲得需要的頻率或是順序控制上的需要而設置的延遲電路可利用這兩個

功能來做確認

設定硬體的輸出輸入腳位(PIN ASSIGN)使模組與 FPGA相連結腳位並

無特別限制可由使用者任意編排須注意的是軟體必須與硬體所選用的腳位一

致再次 COMPILE此時已有軟體及硬體的電路規劃已屬於一個完整的系統

即可將程式碼燒錄或下載至 FPGA晶片上(DEVICE PROGRAMMING)經由發

展系統則快速的輸出到各模組中例如七節顯示器LCM或是馬達等等下

圖 33-2即清楚的顯示出從程式的編寫及規劃到與硬體的配合和實現

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

19

圖 36 FPGA程式的編寫及規劃到與硬體的配合和實現

34 VHDL概要

VHDL為Very High Speed Integrated Circuit Hardware Description Language之

縮寫其發展原由為1980年代美國國防部為開發高速戰機中的積體電路委託

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

20

IBMTexas InstrumentIntermetrics負責發展此一計畫因而制定的硬體描述語

言期間的計畫稱為Very High Speed Integrated Circuit Program簡稱VHSIC而

所開發出來的硬體描述語言便叫做VHSIC Hardware Description Language故此

種語言便被簡稱為VHDL

一般而言軍用規格皆較嚴格於商用及工業用規格因此VHDL毫無疑問的

適用於商業使用也因此VHDL逐漸被廣泛的使用在一般用途的積體電路設計上

的標準語言之一於1987年由電機電子工程學會(Institute of Electrical and

Electronics EngineeringIEEE)國際組織正式制定為IEEE 1076標準並於1993

年由IEEE組織再度修正為IEEE 1164標準習慣上則以VHDLrsquo87以及VHDLrsquo93來

區分兩者的差別1996年IEEE將電路合成的程式標準與規格加入到VHDL

電路設計語言之中因此在歐洲已成為電子電路設計的統一語言在美國及其他

地區則在快速的發展之中

VHDL既為硬體描述語言即是針對硬體需求為主體的程式語言因此編寫

程式前必須先了解硬體規格包括外部介面訊號定義還有內部特性外部介面

及訊號定義與電路描述有關內部特性則與制定工作環境有關例如工作頻率等

等因此種語言包含了電路之描述電路之合成與模擬等三大電路設計工作所

以學習VHDL前必須先對硬體實驗有相當的了解再對系統模擬有所概念方能順

利進行

以下根據VHDL的優點做幾項敘述

1 涵蓋範圍廣

就垂直系統而言從基礎的FPGA到ASIC甚至是大型的系統設計皆在

適用範圍內

2 設計靈活

VHDL將電子電路設計的方式改變成以行為化描述的方式來設計因

此設計快速更改及維護容易犯錯機率降低以及除錯方便為其主要優

點更可以透過不同的編輯器或合成器加以合成然而得到的Netlist 檔

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

21

案可以依不同的邏輯元件及製程技術將所設計的電路實現出來

3 多種描述方式

VHDL有四種不同的電路描述分別為連線關係順序性敘述共時序

敘述和布林方程式等用以因應各種不同大小複雜性不同之電路設計

4 共通性強

不同的開發軟體皆可進行編輯VHDL也可以利用不同的模擬器來進行

模擬更可以適用於各種不同種類的邏輯元件又因所有元件皆可自行

設計應用就更無支援性的問題了

35 VHDL程式架構

VHDL 主體分為兩個基本架構分別為 Entity 單體宣告區以及 Architecture

架構宣告區

單體是一個設計中最基本的一部分主要用來宣告電路外部包裝通常為描

述電路設計中輸入輸出訊號的宣告而其型式有許多種一般常用者為

STD_LOGIC標準邏輯型式

架構是描述電路特性的最主要部分架構的部分用來描述各個元件間相互連

結的情形依其設計方法可分為以下三種

結構性描述(Structure Description)主要透過元件的宣告與元件的叫用等

方式構成電路中各元件的連結關係

資料流型式(Data Flow)主要是使用VHDL語言中所內建的標準布林函式

為主軸將各訊號間的布林代數關係以布林方程式來表示

行為性描述(Behavior Description)屬於高階描述方式主要使用電路週性

的行為性描述來設計如此透過電腦的合成與最佳化可以加快產品的設計週

期並使設計之電路非常易於維護在VHDL語言中的行為性描述電路設計

通常是使用Process的方式達成

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

22

資料物件(OBJECT)有常數(Constants)訊號(Signals)變數(Variables)

別名(Aliases)埠(Port)循環參數(Loop Varisble)以及通體會(Generics)

常數即為固定值在指定訊號為某一特定數值時使用訊號用來宣告所有元件內

部的信號線或內接腳位並具有暫存器的效果變數用來之處理及設定一定要發

生在行為描述程式內而不可在行為描述程式外因此僅能代表線路中的線的物

理意義其合成出來的電路不具暫存器的效果在電路中若有一條匯流排需

要區分成數束不同的子線連接到各個地方去時我們便可將原來的母線分開來各

自命名宣告每一束子線並各給其一個別名(Aliases)埠(PORT)是單體的

介面中端物件只有型態及信號特性也可以設定初值PORT的宣告只能在單

體(ENTITY)中使用其輸出輸入部分又分為以下四種

In表示該腳位要從外界接收信號送至硬體如石英震盪器

Out表示該腳位將傳送信號至硬體如LCM

Inout可收送雙向模式的信號

Buffer表示緩衝模式的訊號

通體定義單體的特性例如定義單體介面埠的大小循環參數(Loop Variable)

的物件不需要宣告在 LOOP 陳述中指定即可而資料型式的分類又可分為邏

輯訊號以及數值訊號在程式語言中以 TYPE作為指令

邏輯訊號是以布林代數(Boolean)位元(Bit)標準邏輯(Std_Logic)

基本邏輯序列(Bit_Vector)與標準邏輯序列(Std_Logic_Vector)來構成較常

用者為標準邏輯與標準邏輯序列標準邏輯表現的型態就是實際數位電路在輸入

或輸出位準所呈現的邏輯特性所能描述的邏輯特性真實而且完整而標準邏輯

序列則是電路中含多個訊號的情況下以序列的方式作為表達也可以說就是多

個標準邏輯的集合這些邏輯訊號的宣告方式為內部訊號宣告(Signal)或內

部變數訊號宣告(Variable)

數值訊號則是以整數(Integer)無號整數(UNSIGNED)序列實數(Real)

列舉式(Enumeration)資料型別陣列(Array)資料型別以及記錄(Record)

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

23

資料型別來構成其中無號整數同時具有邏輯和數值的特性因此既可作邏輯處

理又可作數值運算而實數的範圍在-10E38 to 10E38 之間須注意必須表示成

小數型式列舉式資料型別是一種集合種類的宣告使用者可以自行設定名稱

並將其定義成集合體的元素陣列資料型別則是由同一種資料型別所組成的資料

型別記錄資料型別是由兩種或兩種以上資料型別所構成它可視為族群元素集

合體的宣告

在VHDL中可以運算子的描述方式來簡化程式的撰寫分類為設定運算

子邏輯運算子關係運算子算術運算子位元運算子

設定運算子分為兩種訊號的設定運算子及變數的設定運算子表示法分別

為lt=rdquo及=rdquo

邏輯運算子則用來表示BITBOOLEAN及STD_LOGIC的訊號關係邏輯運

算表示法則與布林運算相同分別為NOTANDORNOR

NANDXORXNOR而XOR及XNOR為VHDL後

才新增之運算方式

關係運算子為一個布林型態的方式意即只有TRUE及FALSE兩種狀態通

常運用在語言中的條件式上其符號為=gtlt=分別

表示為等於大於小於不等於

算術運算子用來表示各資料型別間的相互算術運算符號及其意義分別為

+ (加)- (減) (乘) (除)(次方)REM(求餘數)MOD

(求模數)ABS(絕對值)除了基本的加減乘除運算外其餘皆只在編譯時

設定數值運算時使用而大部分的VHDL合成器只支援+及-兩種算術運

算子

位元運算子又稱位移運算子或數值運算子用來執行資料的數值運算例如

向右移位(Shift Right)向左旋轉(Rotate Left)等等符號如下SLASRA

SLLSRLROLROR

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

24

第四章 馬達與 LCM模組應用

41 專題硬體概述

我們此次的專題第一部分即研究直流馬達而其中我們所控制的馬達是

步進馬達(Stepping Motor)另外尚有 LCM 的使用除馬達與 LCM個別學習

之外更將兩者搭配使用形成一步進馬達速度控制器將目前之速度級別顯示

於 LCM上本次專題實驗的馬達控制器皆以 VHDL編譯於 FPGA晶片實現我

們有研究利用 VHDL 之程式敘述來達成控制馬達以及 LCM 的目的在這個部

份簡單的對於馬達及 LCM 的基本分類及性質還有其驅動方式先作基本的了

解這樣在設計 VHDL控制程式時才不會有錯誤產生

42 文字型 LCD

421 文字型 LCD簡介

LCD(Liquid Crystal Display)液晶顯示器其顯示的方式可分為文字型

LCD 與繪圖型 LCD 兩種一般文字型 LCD 常見的有 16 字 X2 列20 字 X2

列與 40 字 X2 列幾種而其介面以 16 支信號接腳最為常見但是通常只使用

前 14 之接腳LCD 模組的結構如圖 41 所示由 LCD 控制器LCD 驅動器

及 LCD 顯示器所組成目前市售 LCD 模組所採用的 LCD 控制器都相容使

用方法也相同因此機乎所有的 LCD 模組都具有相同的控制方法

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

25

圖 41 LCD控制方塊圖

其各接腳功能說明如表 41所示

表 41 LCD接腳功能說明

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

26

42 時序圖

讀取時序圖如圖 42

圖 42 (A) 讀取時序規格

圖 42 (B) 讀取時序圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

27

寫入時序圖如圖 43

圖 43 (A) 寫入時序規格

圖 43 (B) 寫入時序圖

我們由圖 42及圖 43的 LCD 讀寫時序週期得知其時序先送位址(RS)及讀

寫(RW)信號然後再送出致能信號(E)如此時序方能匹配

423 LCD內部旗標與暫存器

1 忙碌旗號(Busy Flag 簡稱 BF)

BF旗號是 LCD用來告訴 CPU它內部是否忙碌的一個旗號若 BF=1 表示 LCD

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

28

正在處理內部工作因此這時候不可以寫入資料給 LCD當 BF=0 時表示 CPU

可以寫資料給 LCD

當接腳 RS=0 且 RW =1 時忙碌旗標的內容會由接腳 DB7 輸出

2 暫存器

LCD 模組內部只有兩個 8 位元暫存器稱為指令暫存器(Instruction Register

IR)和資料暫存器(Data RegisterDR)它們都是 8 位元暫存器並且由 RS

腳來選用

3 位址計數器 AC(Address Counter)

位址計數器用來指示欲存取資料的 DD RAM 或 CG RAM 的位址位址設定指

令將為址寫入 IR 暫存器後 LCD 內部控制會將 IR 暫存器中的位址傳送到

AC當資料寫入或讀出後AC 的內容會自動加 1(ID=1)或減(ID=0)

4 字型產生器 CG RAM (Character Generate RAM)

LCD 模組內除了提供標準的字型(CG ROM)供使用外另外還提供 64 位元

組的 CG RAM 空間供使用者存放自己所設計的造型一個字的造型(5times7 點)

共使用 8 個位元組因此使用者最多可以存放 8 個自己的造型

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

29

表 42 LCD控制指令

接腳

RS RW

功能

0 0 把指令碼或位址寫入指令暫存器 IR並執行指令或設定一

個要存入或取出資料的位址

0 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 0 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

1 1 讀取忙碌旗標 BF 或位址計數器 AC 的內容

DB7=忙碌旗標 BF 的內容

DB6~DB0=位址計數器 AC 的內容

424 LCD 模組控制指令

LCD 顯示器可接受由 CPU 送過來的指令並且加以執行LCD 執行這些

指令需花 40micros~164ms 的時間這些控制指令應寫到 LCD 的 IR 暫存器

1 清除顯示 Clear Display

動作將 DDR資料全部填入空白碼 20H並將游標移到左上角原點位置清除

DD RAM 的位址計數器 AC 為 00HID 設為 1

2 游標歸位 Curse Home

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

30

動作 DD RAM 的資料保持不變僅將游標移至左上角原點處及第一行的第

一個字DD RAM 的位址計數器設為 00H

3 輸入模式設定 Entry Mode

動作這個指令設定游標的移動方向和顯示器是否要閃爍

表 43 LCD輸入模式控制指令

S ID 動作說明

0 0 顯示字元數不動游標左移位置計數器 AC減一

0 1 顯示字元數不動游標右移位置計數器 AC加一

1 0 顯示字元數右移游標不變位置計數器 AC不變

1 1 顯示字元數左移游標不變位置計數器 AC不變

4 顯示ONOFF 控制(Display ONOFF)

動作

D顯示器控制位元D=0 關 D=1開

C游標顯示控制位元 C=0 不顯示 C=1 顯示

B游標閃爍 Blink 控制位元B=0 不閃爍B=1 閃爍

5 游標移位控制

動作這個指令可以在不做任何讀寫資料的情況下移動游標或整個顯示幕向右

或向左移

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

31

表 44 LCD游標控制指令

SC RL 動作說明

0 0 游標左移AC值減

0 1 游標右移AC值加

1 0 整個顯示螢幕向左移(所有資料和游標)

1 1 整個顯示螢幕向右移(所有資料和游標)

6 功能設定 Function Set

動作

DL設定介面的位元寬度DL=1 時為 8 位元若 DL=0 時為 4 位元

N設定顯示器的行數N=0 時1 行顯示 N=1 時2 行顯示

F字型 Font 設定

表 45 LCD字型設定指令

N F 行數 字型 附註

0 0 1 5x7點

0 1 1 5x10點

1 1 5x7點 用 5x10點時不能顯示第二行

7 CG RAM 位址設定

動作設定 CG RAM 的位址由 A5~A0 之六個位元位址 00H~3FH 位址共

64 個位元組當寫入本命令之後接個輸入的資料將寫到 CGRAM 中

8 DD RAM 位址設定

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

32

動作設定 DD RAM的位址由 A6~A0之七個位元定址接著寫入的資料將

寫入 DD RAM中

9 讀取忙碌旗標 BF及位址計數器 AC的內容

動作若讀出的 BF=1表示 LCD模組正忙著內部的工作因此無法接受 CPU

的命令直到 BF=0才可以在讀 BF的同時也會讀到位址計數器的值

(DB0~DB6)這個讀出的位址可能是 CG RAM 的位址或是 DD RAM 的位

址端看前面設定

10 寫資料到 CG RAM 或 DD RAM 中

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

11 自 CG RAM 或 DD RAM 中讀取資料

動作寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM至於是寫到那一

個則是看前一次式設定 DD RAM或是 CG RAM的位址

LCD 控制指令表 44

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

33

表 46 控制指令表

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

34

LCD 顯示字形基本流程圖 44

圖 44 LCD控制流程圖

電源 ON

LCD初始化

是否忙碌

是否忙碌

寫入指令設定DD RAM 位址

字形顯示於LCD 上

寫入要顯示字型的ASCII 碼

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

35

電路圖 45

圖 45 LCD腳位電路圖

43 馬達簡介

電動機即為工業界俗稱的馬達馬達在工廠自動化中扮演著十分重要的角

色種類依照使用電源可分成直流馬達(DC Motor)與交流馬達(AC Motor)

兩大類若再以控制方式啟動方式與繞組方式分類則可分成步進馬達(Stepping

Motor)伺服馬達(Servo Motor)無刷馬達(霍爾馬達)單相交流馬達三相

感應馬達串激式直流馬達分激式直流馬達與複激式直流馬達等其中若以

動力輸出的觀點而言直流馬達交流馬達有較佳的動力輸出但若以控制精度

的方向來看則伺服馬達及步進馬達應該是較佳的選擇

431 直流馬達

圖 46為馬達之基本構造示意圖一般的電動機在構造上可以分成五個部份

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

36

圖 46 直流馬達基本構造圖

1 電樞(Armature)或轉子(Rotor)

為馬達旋轉的部份材質為永久磁鐵線圈(外接電源)導線(無外接電源)

或特殊形狀之導磁材料

2 場繞組(Field)或定子(Stator)

材質為永久磁鐵或是線圈(外接電源)

3 滑環(Slip Ring)或換向器(Commutator如直流馬達之碳刷)

連接轉子繞線至外部換向器用於改變電樞繞線之電流方向使用永久磁鐵為轉子

材質的馬達則無需滑環或換向器

4 軸承(Bearing)

可使用滾珠滾針滾柱含油自潤軸承主要提供轉子穩固的支撐

5 馬達控制器(Motor Controller)

雖然電動機的種類相當多不過各種電動機的基本操作原理都相同都是利

用電流流過定子產生磁場當轉子也通上電流時由於切割定子所產生的磁力線而

生成旋轉扭矩造成電動機轉子的轉動如圖所示假設轉子之繞組只有一組線圈

時當轉子線圈通上電流時由於切割定子所產生的磁力線而生成旋轉扭矩致使

轉子轉動以下圖 47而言定子的磁力線由左至右而轉子的電流方向為由右

方流入左方流出因此生成的旋轉扭矩使得轉子順時針旋轉

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

37

432 步進馬達

步進馬達的種類與原理

步進馬達的種類依照結構來分可以分成三種永久磁鐵 PM 式(Permanent

Magnet Type)可變磁阻 VR式(Variable Reluctance Type)以及複合式(Hybrid

Type)PM式步進馬達之結構如圖 48(a)所示PM式步進馬達的轉子是以永

久磁鐵製成其特性為線圈無激磁時由於轉子本身具磁性故仍能產生保持轉

矩PM 式步進馬達的步進角依照轉子材質不同而有所改變例如鋁鎳鈷系

(Alnico)磁鐵轉子之步進角較大為 45deg或 90deg而陶鐵系(Ferrite)磁鐵因可

多極磁化故步進角較小為 75deg及 15deg

圖 48 步進馬達種類

圖 47 電動機原理

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

38

48(b)為 VR 式步進馬達之結構VR 式步進馬達的轉子是以高導磁材料加工

製成由於是利用定子線圈產生吸引力使轉子轉動因此當線圈未激磁時無法保

持轉矩此外由於轉子可以經由設計提高效率故 VR式步進馬達可以提供較

大之轉矩通常運用於需要較大轉矩與精確定位之工具機上VR式的步進角一

般均為 15deg

複合式步進馬達在結構上是在轉子外圍設置許多齒輪狀之突出電極同時

在其軸向亦裝置永久磁鐵可視為 PM式與 VR式之合體故稱之為複合式步進

馬達複合式步進馬達具備了 PM式與 VR式兩者的優點因此具備高精確度與

高轉矩的特性複合式步進馬達的步進角較小一般介於 18deg~36deg之間最常

運用於 OA器材如影印機印表機或攝影器材上

電動機動作原理是當轉子通上電流時由於切割定子所產生的磁力線而生成

旋轉扭矩造成電動機轉子的轉動步進馬達的驅動原理也是如此不過若以驅動

訊號的觀點來看一般直流馬達與交流馬達所使用的驅動電壓訊號為連續的直流

訊號與交流訊號而步進馬達則是使用不連續的脈波訊號三種電壓訊號的電壓

時間圖如圖 49所示

圖 49 步進馬達輸入訊號

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

39

步進馬達之運轉特性

圖 410 步進馬達控制方塊圖

上圖 410 為步進馬達控制流程圖步進馬達係由微電腦控制器所控制當

控制訊號自微電腦輸出後隨即藉由驅動器將訊號放大達到控制馬達運轉的目

的整個控制流程中並無利用到任何回饋訊號因此步進馬達的控制模式為典型

的閉迴路控制(Close Loop Control)閉迴路控制的優點為控制系統簡潔無回

饋訊號因此不需感測器成本較低不過正由於步進馬達的控制為開路控制因此

若馬達發生失步或失速的情況時無法立即利用感測器將位置誤差傳回做修正補

償要解決類似的問題只能從了解步進馬達運轉特性著手

註流程圖中脈波產生器及微電腦控制器由 FPGA取代

步進馬達之應用

由於步進馬達所使用的驅動訊號為脈波訊號因此以普通直流電源加在馬達繞組

時馬達是不會連續轉動的此外步進馬達的電源線最少有五條其中一條為

共接點其餘四條分別為 A相A+相B相B+四相的輸入點有些步進馬達

的電源線共有六條其中兩條為共接點將 A相A+相與 B相B+四相的輸

入點分成兩組要分辨何者為共接點何者為輸入點以及正反轉的激磁順序

可以先用三用電表之歐姆檔量測線圈之電阻值理論上各相的電阻值應相等找

出共接點後再以低於額定電壓電流之直流電源一一測試便可找出步進馬達正

反轉的激磁順序

44 實作簡介

利用 FPGA 當作控制器主要用途為鍵盤掃描消除彈跳以及處理步進

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

40

馬達九段變速所需要的頻率然後將目前步進馬達工作的級數顯示在 LCD螢

幕上未來希望可以寫出讓步進馬達可以由使用者選擇正轉或是反轉並且一樣

有九段不同的速度可供選擇以及讓角速度顯示在 LCD螢幕上

圖 411 步進馬達實作成品

以下為控制 9段步進馬達之 VHDL程式碼

library IEEE

use IEEESTD_LOGIC_1164ALL

use IEEESTD_LOGIC_ARITHALL

use IEEESTD_LOGIC_UNSIGNEDALL

use workSTEP_MOTOR_SETABLE_SPEED_0_9_LCD_PACKall

entity STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

Port ( CLK in std_logic

RESET in std_logic

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

41

ROW in std_logic_vector(3 downto 0)

COLUMN out std_logic_vector(3 downto 0)

TRIGGER out std_logic_vector(3 downto 0)

LCM_DATA out std_logic_vector(7 downto 0)

LCM_RW out std_logic

LCM_EN out std_logic

LCM_RS out std_logic)

end STEP_MOTOR_SETABLE_SPEED_0_9_LCD

architecture Behavioral of STEP_MOTOR_SETABLE_SPEED_0_9_LCD is

signal PRESS std_logic

signal PRESS_VALID std_logic

signal SPEED std_logic

signal DEBOUNCE_CLK std_logic

signal LCM_COUNT std_logic_vector(5 downto 0)

signal SCAN_CODE std_logic_vector(3 downto 0)

signal REG_CODE std_logic_vector(3 downto 0)

signal PATTERN std_logic_vector(3 downto 0)

signal DIVIDER std_logic_vector(24 downto 0)

signal SPEED_CLK std_logic_vector(9 downto 0)

begin

process (CLKRESET)

begin

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

42

if RESET = 0 then

DIVIDER lt= 0000000000000000000000000

elsif CLKevent and CLK = 1 then

DIVIDER lt= DIVIDER + 1

end if

end process

SPEED_CLK(9) lt= DIVIDER(15)

SPEED_CLK(8) lt= DIVIDER(16)

SPEED_CLK(7) lt= DIVIDER(17)

SPEED_CLK(6) lt= DIVIDER(18)

SPEED_CLK(5) lt= DIVIDER(19)

SPEED_CLK(4) lt= DIVIDER(20)

SPEED_CLK(3) lt= DIVIDER(21)

SPEED_CLK(2) lt= DIVIDER(22)

SPEED_CLK(1) lt= DIVIDER(23)

SPEED_CLK(0) lt= DIVIDER(24)

DEBOUNCE_CLK lt= DIVIDER(13)

process (DEBOUNCE_CLKRESET)

begin

if RESET = 0 then

REG_CODE lt= 0000

elsif DEBOUNCE_CLKevent and DEBOUNCE_CLK = 1 then

if PRESS_VALID = 1 and SCAN_CODE lt1010 then

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

43

REG_CODE lt= SCAN_CODE

end if

case REG_CODE is

when 0000 =gt SPEED lt= SPEED_CLK(0)

when 0001 =gt SPEED lt= SPEED_CLK(1)

when 0010 =gt SPEED lt= SPEED_CLK(2)

when 0011 =gt SPEED lt= SPEED_CLK(3)

when 0100 =gt SPEED lt= SPEED_CLK(4)

when 0101 =gt SPEED lt= SPEED_CLK(5)

when 0110 =gt SPEED lt= SPEED_CLK(6)

when 0111 =gt SPEED lt= SPEED_CLK(7)

when 1000 =gt SPEED lt= SPEED_CLK(8)

when others =gt SPEED lt= SPEED_CLK(9)

end case

end if

end process

process (RESETSPEED_CLK(7))

begin

if RESET = 0 then

LCM_COUNT lt= 000000

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00000001

elsif SPEED_CLK(7)event and SPEED_CLK(7) = 1 then

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

44

if LCM_COUNT lt 100110 then

LCM_COUNT lt= LCM_COUNT + 1

else

LCM_COUNT lt= 000101

end if

case LCM_COUNT is

when 000000 =gt

LCM_RS lt= 0

LCM_RW lt= 0

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000001 =gt

LCM_DATA lt= 00111100 -- 8 BIT 2 Lines 5 7 Dot

when 000010 =gt

LCM_DATA lt= 00000001 -- Clear LCD Display

when 000011 =gt

LCM_DATA lt= 00000110 -- Cursor Shift Right AC + 1

when 000100 =gt

LCM_DATA lt= 00001100 -- Display on Cursor off

when 000101 =gt

LCM_RS lt= 0

LCM_DATA lt= 10000000 -- Set Cursor

when 000110 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 000111 =gt

LCM_DATA lt= 01110000 -- p

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

45

when 001000 =gt

LCM_DATA lt= 01100101 -- e

when 001001 =gt

LCM_DATA lt= 01100101 -- e

when 001010 =gt

LCM_DATA lt= 01100100 -- d

when 001011 =gt

LCM_DATA lt= 00100000 --

when 001100 =gt

LCM_DATA lt= 01000011 -- C

when 001101 =gt

LCM_DATA lt= 01101111 -- o

when 001110 =gt

LCM_DATA lt= 01101110 -- n

when 001111 =gt

LCM_DATA lt= 01110100 -- t

when 010000 =gt

LCM_DATA lt= 01110010 -- r

when 010001 =gt

LCM_DATA lt= 01101111 -- o

when 010010 =gt

LCM_DATA lt= 01101100 -- l

when 010011 =gt

LCM_DATA lt= 00100000 --

when 010100 =gt

LCM_DATA lt= 00111010 --

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

46

when 010101 =gt

LCM_DATA lt= 00100000 --

when 010110 =gt

LCM_RS lt= 0

LCM_DATA lt= 11000000 -- Set Cursor

when 010111 =gt

LCM_RS lt= 1

LCM_DATA lt= 01010011 -- S

when 011000 =gt

LCM_DATA lt= 01110000 -- p

when 011001 =gt

LCM_DATA lt= 01100101 -- e

when 011010 =gt

LCM_DATA lt= 01100101 -- e

when 011011 =gt

LCM_DATA lt= 01100100 -- d

when 011100 =gt

LCM_DATA lt= 00100000 --

when 011101 =gt

LCM_DATA lt= 01001100 -- L

when 011110 =gt

LCM_DATA lt= 01100101 -- e

when 011111 =gt

LCM_DATA lt= 01110110 -- v

when 100000 =gt

LCM_DATA lt= 01100101 -- e

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

47

when 100001 =gt

LCM_DATA lt= 01101100 -- l

when 100010 =gt

LCM_DATA lt= 00100000 --

when 100011 =gt

LCM_DATA lt= 00111010 --

when 100100 =gt

LCM_DATA lt= 00100000 --

when 100101 =gt

LCM_DATA lt= 0011 amp REG_CODE

when others =gt

LCM_DATA lt= 00100000 --

end case

end if

end process

LCM_EN lt= SPEED_CLK(7)

Process (SPEEDRESET)

begin

if RESET = 0 then

PATTERN lt= 1000

elsif SPEEDevent and SPEED = 1 then

case PATTERN is

when 1000 =gt PATTERN lt= 0100

when 0100 =gt PATTERN lt= 0010

when 0010 =gt PATTERN lt= 0001

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

48

when 0001 =gt PATTERN lt= 1000

when others =gt PATTERN lt= 1000

end case

end if

end process

TRIGGER lt= PATTERN

SCANNING_CODE CODE port map

(CLKRESETPRESSSCAN_CODE)

DETECTOR KEYPRESS_DETECTOR port map

(SCAN_CODEROWCOLUMNPRESS)

BOUNCER DEBOUNCER port map

(DEBOUNCE_CLKRESETPRESSPRESS_VALID)

end Behavioral

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

49

第五章 數位類比轉換器

51 專題硬體概述

此次的專題第二部分即研究數位類比轉換器(AD Converter)欲利用

ADC0809 將類比訊號轉換為數位訊號並與熱敏電阻搭配而成一個數位溫度

計以 VHDL 程式語言來將轉換後溫度顯示於七節顯示器上未來希望再設計

開關控制器當溫度到達設定值時則馬達啟動唯此部分再這次專題無法達成

所以以下僅做 AD Converter之介紹與成果

52 數位類比轉換器

521 ADC簡介

一般所量測之電壓或電流等連續訊號可稱之為類比訊號把類比訊號轉換

成數位訊號之裝置則稱為類比對數位轉換器(Analog To Digital Converter

ADC)數位訊號在傳送中即使有雜訊干擾它仍然可以把雜訊所造成之干擾降

至最低且可利用編碼技術使其具有除錯之功能除此之外數位訊號尚有容易

儲存之優點以下將說明類比對數位轉換器的基本原理及之工作原理和特性

522 ADC類型

一個 ADC可將類比電壓轉換為數位式數字此數字表示在有限的解析階數

之下所代表的輸入電壓ADC解析度由位元數(bit)來決定一個 n-bit的 ADC

有 2n 分之 1的解析度例如一個 12 bit ADC解析度為 4096分之一 (2^ 12

=4096)換算為量測 10Volt範圍時解析度為 244mV同樣的16 bit的 ADC的

解析度為 65536分之一(2^16 =65536)10Volt電壓範圍可解析至 0153mV例

如本次專題所使用的 AD轉換晶片 ADC0809的解析度為 8位元

類比轉數位轉換器有幾種方式不同的 ADC類型分別有不同的解析度精

確度及轉換速率等規格一般常見之 ADC為平行式(Flash)轉換連續近似型

ADC電壓轉頻率式 ADC及積分型 ADC下面提供平行式轉換以及連續近似型

的原理

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

50

平行式(Flash)轉換器

平行式轉換器為最簡單的它利用一個與量測範圍同大小的參考電壓並串

接一系列的 2n +1個電阻n即為代表 ADC轉換解析度之位元數而待測的輸

入電壓值即由比較器與分壓電阻所產生之 2n個分壓相比得知如圖 51所示為 2

位元平行式轉換器

圖 51 轉換器電路圖

快閃式(Flash)轉換器速度非常快(達到每秒 500百萬次取樣)因為每個

位元值為平行處理這種平行模式方法需大量的比較器因此大部份平行式轉

換器限制在 8位元解析度(共 256個比較器)快閃式轉換器一般常見於暫態

數位儀及數位式示波器

連續近似 ADC

連續近似 ADC使用一個數位轉類比轉換器(DAC)及一個比較器它利用

二分法或二項式搜尋法從輸出為 0開始比對從高位元起設定 DAC的每一個位

元再將 DAC 的輸出與待測電壓比對當有位元相比對為 1 時使得 DAC 的

輸出大於待測電壓此位元即設為 0連續近似法的 ADC圖示於 52圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

51

圖 52 連續近似法 ADC電路圖

連續近似法較快閃式為慢是由於比較器需要作一連串的比對動作及每一次

設定 DAC之後待其穩定之前需暫停作 ADC一般轉換速率為 200kHz以上連

續近似法以 12或 16位元解析來說費用相當低廉一般最常見 ADC的即為此類

523 類比對數位轉換器之基本原理

圖 53為一理想 3 位元(bit)類比對數位轉換器之特性曲線其類比訊號之

輸入範圍為 0伏特至 1 伏特在此圖中將輸入訊號分成 8 個範圍且每一個

範圍內所有類比值都以同一個數位碼來表示且此數位碼通常與該範圍之中間值

對應以上即是類比對數位轉換的基本概念因此在類比對數位轉換過程會存在

最低有效位元(Least Significant Bit LSB)的量化誤差(Quantization Error)此

誤差再加上轉換器本身所存在的類比誤差便形成類比對數位轉換器的誤差值

減少量化誤差(溢位或四捨五入所產生的誤差)的方法可增加轉換器的位元數

量化值(Quantization Value)Q 是指當數位輸出改變 1 LSB 時所需的輸入電

壓變化值其數學表示式如下

其中 n 為 ADC 數位輸出的位元數FS 為滿刻度(Full Scale)值當數位輸出

的位元數 n 越大時解析度越高則量化值 Q 也越小故所造成之量化誤差也

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

52

越小下圖 53為理想類比對數位轉換關係圖

圖 53 理想類比對數位轉換圖

ADC0809為連續漸進式類比對數位轉換器以下為轉換器的工作原理

上圖為連續漸進式類比對數位轉換器方塊圖其具有 8 位元解析度當類比訊

號輸入時取樣保持(Sample-And-Hold)電路先把輸入訊號 in V 保留住以避

免其在轉換過程中訊號異動此時控制邏輯(Control Logic)電路將暫存器

(Register)的所有輸出位元均重置(Reset)為0接著最高有效位元(Most

Significant Bit MSB))7 D 被置於1此時數位類比轉換器(Digital To Analog

Converter DAC)所輸出的電壓(D)V 為

此輸出電壓為參考電壓 Vref半如果輸入電壓 Vin比(D)V 高則 D7維

持在rdquo1rdquo否則將其變為0接著令次一位元 D6為1經過 DAC轉換後可

獲得輸出電壓(D)V此時再將新的(D)V 與 Vin比較若 Vin比(D)V高

則 D6 維持在1否則將其變為0依此類推一直到最低有效位元 D0

均比較完成此時便可得到完整 D7到 D0位輸出

524 ADC0809之特色

ADC0809為一具有 8 位元解析度及 8 通道多工器(Mutliplexer)的 28隻接

腳 IC其使用 5V 單電源供應工作類比輸入電壓範圍為 0V 至 5V消耗功率

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

53

為 15 mW由於具有 8 位元解析度故有 256階的量化若參考電壓為 5V則

每一步階為 01953 0 256 5 = V00000000(00H)表示 000V11111111(FFH)

表 49805VADC0809的不可調誤差(Unadjusted Error)為plusmn1 LSB即 01953 0

V其中包含滿刻度誤差補償(Offset)誤差非線性誤差及多工器誤差此

外因其具有 8個通道所以有 8個類比輸入埠且 ADC0809需要一組時序訊

號輸入方可工作此時序訊號的頻率範圍為 10KHz至 1280KHz在 640KHz的

時序頻率下典型的轉換時間為 100 ms

圖 54 ADC0809類比對數位轉換器接腳圖

上圖 54為 ADC0809類比對數位轉換器接腳圖其中以 EOC的輸出訊號作

為 START的輸入訊號並以時序作為 ALE及 CLK之輸入訊號在本次專題中

只用到一個輸入訊號由於為實驗套件組合所以使用的晶片為難度較高的

ADC0809已達到較好的教學效果其中 IN0為熱敏電阻經過 LM324放大後所

蒐集到的資訊而 A~CALESTARTOE為 VHDL程式碼所控制其中 OE

也是回授給予 FPGA的晶片經過程式判斷

IN0~IN7 支援八個通道輸入

VR 參考電源

CLK 時脈輸入

OE 輸出致能

EOC 轉換結束訊號

ALE 位置閂鎖

START 啟動轉換

D0~D7 數位輸出

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

54

53 實作簡介

針對 ADC0809之晶片特性及工作要求設計出程式並將輸出至馬達的訊號

先以 LED作為替代即若溫度達到程式要求之設定值則 LED燈亮而正在進

行的是對於晶片的硬體測試如輸入輸出的訊號量測輸出至七節燈管隻編碼是

否正確等等待日後完成時在將 LED 的訊號改成輸出至馬達的訊號即可有

一個簡單的溫度監測系統

程式架構使用了單擊電路來產生我們需要的控制訊號先針對 ADC0809之

控制訊號設計出電路並在設計一個二進位轉十進位之電路將數位訊號正確的

顯示在七節顯示器上

圖 55 溫度顯示實作成品

其程式碼如下

library ieee

use ieeestd_logic_1164all

use ieeestd_logic_unsignedall

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

55

entity adc is

port(

f_25Min STD_LOGIC

ALEbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 DOWNTO 0)

adstartbuffer STD_LOGIC

f_1Mbuffer STD_LOGIC

AIin STD_LOGIC_VECTOR(7 DOWNTO 0)

OEout STD_LOGIC

to_segout STD_LOGIC_VECTOR(7 DOWNTO 0)

LED1out STD_LOGIC

LED2out STD_LOGIC

seg_selout STD_LOGIC_VECTOR(5 DOWNTO 0)

)

end adc_temp

ARCHITECTURE beh OF adc_temp IS

component adc_timing is

port(

renew_ckin STD_LOGIC

f_25Mf_1Min STD_LOGIC

ALEbuffer STD_LOGIC

adstartbuffer STD_LOGIC

bcdstartbuffer STD_LOGIC

ADDRout STD_LOGIC_VECTOR(2 downto 0)

OEout STD_LOGIC

)

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

56

end component

component bin_to_bcd

port(

clkin std_logic

startin std_logic

bin_inin std_logic_vector(7 downto 0)

bcd_outbuffer std_logic_vector(11 downto 0)

busybuffer std_logic

)

end component

signal f_5Mstd_logic

signal renew_ckbcdstartbusystd_logic

signal bcd_outstd_logic_vector(11 downto 0)

type state is (s0s1s2s3s4)

begin

mdu5_1process(f_25M)

variable cnt_statestate

begin

if f_25M=0 and f_25Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_5Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_5Mlt=1

end case

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

57

end if

end process mdu5_1

mdu5_2process(f_5M)

variable cnt_statestate

begin

if f_5M=0 and f_5Mevent then

case cnt_state is

when s0=gtcnt_state=s1f_1Mlt=0

when s1=gtcnt_state=s2

when s2=gtcnt_state=s3

when s3=gtcnt_state=s4

when s4=gtcnt_state=s0f_1Mlt=1

end case

end if

end process mdu5_2

f_renewprocess(f_1M)

variable cntstd_logic_vector(18 downto 0)

begin

if f_1M=0 and f_1Mevent then

cnt=cnt+1

end if

renew_cklt=cnt(18)

end process f_renew

AD_timingadc_timing

port map(renew_ckf_25Mf_1MALEadstartbcdstartADDROE)

bcd_binbin_to_bcd

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

58

port map(f_1MbcdstartAIbcd_outbusy)

7seg_scanblock

signal choutstd_logic_vector(3 downto 0)

begin

scannprocess

variable scanstd_logic_vector(2 downto 0)

variable astd_logic_vector(23 downto 0)

VARIABLE LIMITstd_logic_vector(11 downto 0)

begin

wait until f_1M=1

a(19 downto 8)=bcd_out(11 downto 0)

a(7 downto 0)=10101011

LIMIT(11 DOWNTO 0)=000000100000

if scangt=5 then

scan=000

else

scan=scan+1

end if

if a(19 downto 8)lt=LIMIT(11 DOWNTO 0) then

LED1lt=scan(0)

else LED1lt=0

if a(19 downto 8)gtLIMIT(11 DOWNTO 0)then

LED2lt=scan(0)

else LED2lt=0

END IF

end if

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

59

case scan is

when 000 =gtseg_sellt=1011117SEG tlt=A(19 downto 16)

when 001 =gtseg_sellt=1101117SEG lt=A(15 downto 12)

when 010 =gtseg_sellt=1110117SEG tlt=A(11 downto 8)

when 011 =gtseg_sellt=1111017SEG lt=A(7 downto 4)

when 100 =gtseg_sellt=1111107SEG lt=A(3 downto 0)

when others =gtnull

end case

end process scann

WITH 7SEG SELECT

to_seg lt=00111111 when 0000

00000110 when 0001

01011011 when 0010

01001111 when 0011

01100110 when 0100

01101101 when 0101

01111101 when 0110

00000111 when 0111

01111111 when 1000

01101111 when 1001

01100011 when 1010

00111001 when 1011

00000000 when others

end block 7seg_scan

end BEH

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

60

參考文獻

[1]陳慶逸VHDL數位電路設實務教本儒林圖書公司2002

[2]卷佳壽美VHDL入門 全華科技圖書2003

[3]林國良VHDL硬體電路設計語言全華科技圖書1996

[4]林益鴻莊朝麟VHDL設計與應用專題論文逢甲大學自動控制工程學

系台中2002

[5]王仁華洪啟能VHDL實務應用與設計專題論文逢甲大學自動控制工

程學系台中2003

[6]黃國正李文棋林子敬陳俊旭單晶片控制步進馬達之運作專題論文

逢甲大學自動控制工程學系台中2001

[7]王詠傑馬達與人機介面專題論文逢甲大學自動控制工程學系台中

2004

[8]吳東樺蔡岳展黃中雋林家聖FPGA 外接馬達控制模組專題論文

逢甲大學自動控制工程學系台中2005

[9]陳文耀電動機控制工程復文書局1995

[10] 陳慶逸林柏辰VHDL數位電路實習與專題設計文魁資訊 2003

[11]王瑞祿FPGA發展系統使用手冊橋高企業有限公司

[12] 唐佩忠VHDL與數位邏輯設計高立圖書1999

[13] 林灶生劉紹漢FPGA晶片設計與專題製作全華圖書1995

[13] httpwwwcicorgtwcic_v13mainjsp 國家晶片設計中心

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

61

附錄

AD電路圖

圖 附-1 AD電路圖

12

34

56

78

910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

P Hea

der 2

0X2

IN3

1IN

42

IN5

3IN

64

IN7

5

STA

RT

6EO

C7

D3

8

OE

9

CLK

10V

CC

11

VR

EF+

12

GN

D13

D1

14D

215

VR

EF-

16

D0

17

D4

18D

519

D6

20D

721

ALE

22

AD

D C

23

AD

D B

24

AD

D A

25

IN0

26IN

127

IN2

28

AD

C08

09C

CN

=Val

ue=Val

ue

VC

C

4 11

132

1

A LM32

4AD

756

24 11

B LM32

4AD

9 108

34 11

C LM32

4AD

141213

44 11

D LM32

4AD

=Val

ue

=Val

ue=V

alue

=Val

ue

=Val

ue=V

alue

1 2

10M

Hz

VD

D

VD

D

VD

D

1 2

MH

DR

1X2

123456789

MH

DR

1X9

t

Res

The

rmal

VSS

VSS

Vou

t

Jum

per

W

Jum

per

VC

C

=Val

ueV

SSV

CC

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖

62

步進馬達電路圖

圖 附-2 步進馬達電路圖鍵盤電路圖