內容簡介
本書是以C語言作為入門語言的程式設計的教材,以嶄新的思路進行設計和編排。全書以程式設計零起點讀者為主要對象,以培養程式設計能力為目標,簡潔通俗、循序漸進,通過數百個例題,重點講解程式設計思想和方法,力圖將C語言基礎知識介紹和程式設計能力培養完美結合。本書共9章,包括程式設計概述、C語言程式設計入門、語句和基本控制結構、函式、指針、數組、結構、檔案以及編寫多檔案程式。
隨著信息產業的迅速發展,軟體人才的需求量越來越大。程式設計是軟體人才必備的基礎知識和技能。 程式設計基礎是一門理論與實踐密切相關、以培養學生程式設計能力為目標的課程。如何消除學生學習程式設計的畏難情緒,使學生順利進入程式設計的大門,逐步掌握程式設計思想和方法,提高實踐動手能力,是本課程教學的難點。 程式設計既是科學,又是藝術。學習程式設計是一件非常辛苦的事情,要有非常強的耐心和實踐精神,需要花費大量的時間,不可能一蹴而就,必須從某個起點開始循序漸進地學習。
本書可作為高等學校學生學習程式設計課程的教材,也可供程式設計師和編程愛好者參考使用。
編輯推薦
隨著信息產業的迅速發展,軟體人才的需求量越來越大。程式設計是軟體人才必備的基礎知識和技能。
程式設計基礎是一門理論與實踐密切相關、以培養學生程式設計能力為目標的課程。如何消除學生學習程式設計的畏難情緒,使學生順利進入程式設計的大門,逐步掌握程式設計思想和方法,提高實踐動手能力,是本課程教學的難點。
程式設計既是科學,又是藝術。學習程式設計是一件非常辛苦的事情,要有非常強的耐心和實踐精神,需要花費大量的時間,不可能一蹴而就,必須從某個起點開始循序漸進地學習。
本書就是一個很好的起點,以程式設計零起點讀者為主要對象,採用標準C語言(C89)作為程式設計的描述語言。C語言是目前業界最廣泛使用的程式設計語言,作者確信選用C語言作為程式設計基礎課程的教學語言是正確的選擇。在多年的教學實踐中,作者深深感到C語言的靈活和高效,能夠帶給軟體開發者無盡想像的空間,同時也深深感到講授C語言過程中面臨的困難和挑戰,意識到在程式設計基礎課程中講授C語言並不那么容易。C語言是一門複雜的程式設計語言,是為軟體開發者設計的,而非為初學者設計的,向初學者講授C語言時必須很好地控制其固有的複雜性。
儘管目前有關學習C語言的書籍很多,但學習C語言仍然讓大多數初學者心存畏懼。作者一直從事程式設計方面的教學和科研工作,主講過多門程式設計課程,積累了豐富的教學經驗。結合自己學習和使用C語言的經驗和感悟,以程式設計為主線,通過數百個例題,簡潔通俗地講解程式設計思想和方法,並穿插介紹相關的語言知識,循序漸進培養學生程式設計能力。本書對那些渴望掌握C語言而又心存畏懼的初學者是一個很好的選擇。
教學改革的重點之一,就是要抓學生實踐動手能力的培養,學生的能力是決定就業的根本,而就業率又是體現教育質量的重要指標。作為國內首家服務外包本科學院以及教育部、商務部在江蘇、浙江兩省開展地方高校計算機學院培養服務外包人才試點工作單位,我們實施了程式設計課程的教學改革,在教學內容、教學方法、教學手段和考核方式上,基本形成了比較完整的體系,目的就是培養學生的程式設計能力,適應社會對軟體服務外包人才培養的需求。本書源於教學改革和教學實踐,體現了程式設計教學改革的成果。
全書共有9章,各章內容安排如下:第1章程式設計概述,介紹計算機系統、程式設計基本概念和C語言的基礎知識。第2章C語言程式設計入門,介紹基本數據類型及其運算、表達式的書寫規則、標準函式館的使用以及程式設計錯誤、程式設計風格。第3章語句和基本控制結構,介紹編寫結構化程式的方法,內容包括語句和順序、分支、循環等基本控制結構。第4章函式,內容包括函式的聲明、定義和使用,遞歸函式,存儲類別和作用域,預處理指令。第5章指針,內容包括指針的基本概念、指針的聲明和使用,通用指針、指針和const的關係、指針作為函式參數和函式返回值類型以及函式指針。第6章數組,介紹組織和處理成組數據的方法,內容包括數組的基本概念、數組的聲明和使用、數組作為函式參數、數組和指針的關係、排序和查找、字元串以及動態存儲分配。第7章結構,介紹組織和處理複雜數據的方法,內容包括結構類型和結構變數、結構指針、結構數組,結構作為函式參數和函式返回值類型。還特別介紹了鍊表的概念和基本操作,以及聯合、位運算、位域的基本知識。第8章檔案,介紹數據永久性保存的方法,內容包括檔案的基本概念、檔案操作、檔案輸入輸出以及檔案定位。第9章編寫多檔案程式,介紹了編寫大型程式的一些方法,內容包括模組、分塊開發、利用項目實現程式的多檔案組織。
寫給教師
跟各位尊敬的老師一樣,作者從事了多年的程式開發和教學工作,深知教學的艱辛,為教學方法費盡了心機,為教學效果傷透了腦筋,為學生的學習成績搖頭惋惜……所有這一切,從主觀上說,與教師素質有關、與教學方法有關、與學生的學習態度有關;而在客觀上,與教材和教學內容組織更有著重大的關聯。編寫本書的目的,就是試圖從客觀的角度,使教師的教學熱情有更好的著力點,從而更順利地完成既定的教學目標,讓教師和學生的辛勞能得到應有的回報。
建議課堂授課學時為51學時(教學時間為17周,每周為3學時),實驗另行安排學時。第1章3學時,第2章9學時,第3章6學時,第4章9學時,第5章3學時,第6章9學時,第7章6學時,第8章3學時,第9章3學時。
每章後面都有精心設計的實驗題,可以據此來布置實驗內容,使學生從第1周起就練習編程,並貫穿始終。許多實驗題與例題有關聯。實驗題都有運行結果,較難的實驗題有編程提示和程式代碼,便於學生檢驗自己編寫的程式。
實驗所用作業系統可以是Windows、Mac OS X或UNIX/Linux,建議使用業界流行的C語言集成開發工具(例如,Visual Studio、Xcode或Code∷Blocks的較新版本),支持利用項目來實現程式的多檔案組織。徹底拋棄非常陳舊的Visual C++ 6.0和Turbo C 2.0.
在講授過程中,應該完全遵循C語言的標準版本(例如C89) ,避免程式依賴任何特定的計算機、作業系統和編譯器。要注重培養學生養成良好的編碼風格,強調程式的可讀性。在編寫程式時,採用一種統一的、良好的編碼風格是非常重要的。本書程式全部採用一種符合業界規範的編碼風格。
我們所面對的教學對象,絕大多數是第一次接觸程式設計的學生,很多學生對學習程式設計還有較大的畏難情緒。培養學生程式設計能力不外乎三點: 興趣、天賦和經驗。經驗可以通過實踐加以積累,天賦不容易改變,所以程式設計課程教學唯一能起作用的就是提高學生對於編程的興趣。
以往的程式設計教學多以講授語法為主,沒有引導學生如何合理優美地使用語言來解決實際問題。對初學者來說,語法內容講得太多,難以在短時間內理解和消化。更何況,在課堂教學中,不可能把語法知識面面俱到地講授。這就造成了學生學完後多數不會編程。這種只造磚、不蓋房的教學方式,本身就造就了學生的學習態度,使學生感覺就是為了考試過關、為了學分而學習,所以學習的興趣不大,主觀能動性缺乏,學過的東西也很少能對將來的就業和工作有幫助,因此,真正能夠達到課程期望目標的學生少之又少。
應該拋棄過多的語法細節和實際很少使用的語言特性,通過“例題→知識點說明→模仿編程→實踐提高”的教學方式,讓學生首先得到成功的經歷,儘快體驗成功的喜悅,逐漸喜愛看似枯燥的課程,增強學習的信心,激發求知慾。如果不僅會造磚,而且用造好的磚瓦親手蓋起了漂亮的房子,那么,學生就不會輕易將它們丟棄,而且還會長期擁有、使用和維護它們。這樣,學到的東西就會真正成為他們自己的財富,而他們也將由此長期受益。那么,教師順利、圓滿地完成教學目標也就可以期待了。
寫給學生
程式設計是一門實踐性很強的學科,僅靠記概念、背原理是遠遠不夠的。通常學生在上課時基本都能夠聽懂,可到了自己動手編程的時候,就會覺得無從下手。要解決這個問題沒有捷徑可走,只有增加實踐的時間和數量,熟能生巧,經歷得多了,就會慢慢理解程式設計的思想,用過的方法多了,遇到問題才有可能想到解決的思路。
剛開始可能會感覺程式設計很難、很痛苦,可是當第一次編寫出了一個小程式,就會覺得無比欣喜,回頭看看其實也並不是那么難。解決了一個過去不能解決的問題,就是一種自我實現,就會有成就感,就會發覺自己原來這么有潛力。反過來這種感覺會更加激發學習的熱情,驅使自己去解決更多的難題,實現更多實用的任務,同時這些成果還可以作為提高自己工作效率的工具,豈不兩全其美?這個過程也正是一條造就高手之路。所以學習程式設計一定要有信心、耐心和恆心,要實踐、實踐、再實踐。
致謝
在本書寫作過程中,參考了部分圖書資料和網站資料,在此向其作者表示感謝。
本書的出版得到了清華大學出版社的大力支持,在此表示衷心的感謝。
徵求建議與批評
感謝讀者選擇本書。由於作者水平和經驗有限,書中難免有不足之處,懇請讀者提出寶貴意見和建議,使本書日臻完善。
2012年8月
圖書目錄
第1章 程式設計概述 /1
1.1 計算機系統 /1
1.1.1 計算機硬體系統 /1
1.1.2 計算機軟體系統 /2
1.1.3 計算機中的信息表示 /3
1.2 程式設計基礎 /5
1.2.1 程式 /5
1.2.2 程式設計語言 /5
1.2.3 程式設計 /6
1.3 C語言的發展歷史與特點 /7
1.3.1 C語言的歷史 /7
1.3.2 C語言的特點 /9
1.4 初識C語言 /10
1.4.1 基本術語 /10
1.4.2 C程式的開發過程 /10
1.4.3 第一個C程式 /11
1.4.4 計算圓面積的程式 /12
1.5 實驗 /13
1.5.1 實驗目的 /13
1.5.2 實驗環境 /13
1.5.3 實驗內容 /13
1.5.4 實驗主要步驟 /15
1.5.5 評分標準 /15
1.5.6 實驗報告 /16
小結 /16
習題 /16
第2章 C語言程式設計入門 /18
2.1 編寫簡單的程式 /18
2.1.1 兩個整數的加法程式 /18
2.1.2 華氏溫度轉換為攝氏溫度的程式 /19
2.2 標識符 /19
2.2.1 C語言中的基本記號 /19
2.2.2 標識符 /20
2.2.3 關鍵字 /21
2.2.4 變數和常量 /21
2.3 數據類型 /23
2.3.1 數據類型的基本概念 /23
2.3.2 整型 /23
2.3.3 浮點型 /24
2.3.4 字元型 /26
2.3.5 類型定義 /28
2.4 運算符和表達式 /29
2.4.1 運算符和表達式的基本概念 /29
2.4.2 算術運算符和算術表達式 /29
2.4.3 賦值運算符和賦值表達式 /32
2.4.4 自增和自減運算符 /34
2.4.5 關係運算符和關係表達式 /35
2.4.6 邏輯運算符和邏輯表達式 /37
2.4.7 條件運算符和條件表達式 /38
2.4.8 逗號運算符和逗號表達式 /40
2.4.9 長度運算符 /41
2.5 類型之間的關係 /42
2.5.1 隱式(自動)類型轉換 /42
2.5.2 顯式(強制)類型轉換 /43
2.6 標準庫的使用 /44
2.6.1 標準庫概述 /44
2.6.2 常用數學函式 /45
2.6.3 格式化輸入輸出函式 /48
2.6.4 字元輸入輸出函式 /54
2.6.5 常用字元處理函式 /54
2.6.6 整型的大小 /56
2.6.7 浮點型的特性 /58
2.7 程式設計錯誤 /60
2.7.1 語法錯誤 /60
2.7.2 運行時錯誤 /60
2.7.3 邏輯錯誤 /61
2.7.4 測試和調試 /61
2.8 程式設計風格 /62
2.8.1 適當的注釋 /62
2.8.2 命名習慣 /62
2.8.3 程式編排 /63
2.9 實驗 /64
2.9.1 實驗目的 /64
2.9.2 實驗環境 /64
2.9.3 實驗內容 /65
2.9.4 實驗主要步驟 /71
2.9.5 評分標準 /71
2.9.6 實驗報告 /71
小結 /71
習題 /72
第3章 語句和基本控制結構 /75
3.1 程式的基本控制結構 /75
3.1.1 簡單語句 /75
3.1.2 單入口單出口的控制結構 /76
3.2 分支結構 /77
3.2.1 if語句 /77
3.2.2 switch語句 /84
3.2.3 枚舉 /91
3.3 循環結構 /94
3.3.1 while語句 /94
3.3.2 do-while語句 /98
3.3.3 for語句 /100
3.3.4 使用哪種循環 /106
3.3.5 退出循環 /106
3.3.6 多重循環 /108
3.4 實例學習 /112
3.5 實驗 /121
3.5.1 實驗目的 /121
3.5.2 實驗環境 /122
3.5.3 實驗內容 /122
3.5.4 實驗主要步驟 /131
3.5.5 評分標準 /132
3.5.6 實驗報告 /132
小結 /132
習題 /133
第4章 函式 /137
4.1 函式的定義和調用 /137
4.1.1 使用函式編寫程式 /137
4.1.2 函式定義 /143
4.1.3 函式調用 /144
4.1.4 函式聲明 /148
4.1.5 程式終止 /150
4.1.6 用計算機生成隨機數 /151
4.2 遞歸函式 /155
4.2.1 什麼是遞歸 /155
4.2.2 運用遞歸求解問題 /157
4.2.3 遞歸和循環 /160
4.3 函式設計的基本規則 /163
4.3.1 函式頭的設計規則 /163
4.3.2 函式體的設計規則 /164
4.4 存儲類別和作用域 /164
4.4.1 內部變數和外部變數 /164
4.4.2 動態存儲變數和靜態存儲變數 /165
4.4.3 作用域和生命期 /167
4.5 預處理指令 /169
4.5.1 什麼是預處理指令 /169
4.5.2 宏定義 /170
4.5.3 條件編譯 /173
4.6 實例學習 /174
4.7 實驗 /179
4.7.1 實驗目的 /179
4.7.2 實驗環境 /179
4.7.3 實驗內容 /179
4.7.4 實驗主要步驟 /183
4.7.5 評分標準 /183
4.7.6 實驗報告 /183
小結 /183
習題 /184
第5章 指針 /188
5.1 指針的基本概念 /188
5.1.1 什麼是指針 /188
5.1.2 聲明指針變數 /189
5.1.3 取地址運算符和解引用運算符 /190
5.1.4 指向指針的指針 /192
5.2 指針賦值 /194
5.3 通用指針 /196
5.4 使用const修飾指針 /197
5.5 指針和函式 /199
5.5.1 指針作為函式的參數 /199
5.5.2 指針作為函式的返回值 /203
5.5.3 指向函式的指針 /204
5.6 實例學習 /208
5.7 實驗 /211
5.7.1 實驗目的 /211
5.7.2 實驗環境 /212
5.7.3 實驗內容 /212
5.7.4 實驗主要步驟 /213
5.7.5 評分標準 /213
5.7.6 實驗報告 /213
小結 /213
習題 /215第6章 數組 /217
6.1 一維數組 /217
6.1.1 使用一維數組編寫程式 /217
6.1.2 聲明和處理一維數組 /220
6.1.3 一維數組和函式 /227
6.2 二維數組 /230
6.2.1 使用二維數組編寫程式 /230
6.2.2 聲明和處理二維數組 /233
6.2.3 二維數組和函式 /237
6.3 指針和數組 /240
6.3.1 指針的運算 /240
6.3.2 指針和一維數組 /243
6.3.3 指針和二維數組 /246
6.4 排序和查找 /247
6.4.1 排序 /247
6.4.2 查找 /249
6.4.3 qsort函式和bsearch函式 /253
6.5 字元串 /257
6.5.1 字元串的基本概念 /257
6.5.2 字元串的基本操作 /259
6.5.3 常用字元串處理函式 /263
6.6 動態存儲分配 /267
6.7 實例學習 /270
6.8 實驗 /276
6.8.1 實驗目的 /276
6.8.2 實驗環境 /277
6.8.3 實驗內容 /277
6.8.4 實驗主要步驟 /283
6.8.5 評分標準 /283
6.8.6 實驗報告 /284
小結 /284
習題 /284第7章 結構 /288
7.1 結構 /288
7.1.1 使用結構編寫程式 /288
7.1.2 結構類型和結構變數 /292
7.1.3 結構和指針 /296
7.1.4 結構和數組 /297
7.1.5 結構和函式 /301
7.2 鍊表 /303
7.2.1 什麼是鍊表 /303
7.2.2 鍊表的基本操作 /304
7.2.3 有序鍊表 /306
7.3 聯合 /309
7.4 底層程式設計 /311
7.4.1 位運算符 /311
7.4.2 結構中的位域 /314
7.5 實例學習 /315
7.6 實驗 /322
7.6.1 實驗目的 /322
7.6.2 實驗環境 /322
7.6.3 實驗內容 /322
7.6.4 實驗主要步驟 /326
7.6.5 評分標準 /326
7.6.6 實驗報告 /326
小結 /326
習題 /327
第8章 檔案 /331
8.1 檔案的基本概念 /331
8.1.1 流和檔案指針 /331
8.1.2 文本檔案和二進制檔案 /332
8.1.3 檔案緩衝區 /332
8.2 檔案操作 /333
8.2.1 打開檔案 /333
8.2.2 關閉檔案 /333
8.2.3 設定檔案緩衝區 /334
8.2.4 臨時檔案 /335
8.2.5 刪除檔案和重命名檔案 /335
8.2.6 檢測檔案末尾和錯誤條件 /336
8.3 檔案輸入輸出 /337
8.3.1 格式化輸入輸出 /337
8.3.2 字元輸入輸出 /338
8.3.3 行輸入輸出 /340
8.3.4 塊輸入輸出 /341
8.4 檔案定位 /342
8.5 實例學習 /346
8.6 實驗 /353
8.6.1 實驗目的 /353
8.6.2 實驗環境 /353
8.6.3 實驗內容 /354
8.6.4 實驗主要步驟 /355
8.6.5 評分標準 /355
8.6.6 實驗報告 /355
小結 /355
習題 /356
第9章 編寫多檔案程式 /359
9.1 模組 /359
9.2 分塊開發 /360
9.2.1 程式物理組織 /360
9.2.2 頭檔案 /361
9.2.3 單一頭檔案結構和多頭檔案結構 /363
9.2.4 項目 /363
9.3 實例學習 /364
9.4 實驗 /367
9.4.1 實驗目的 /367
9.4.2 實驗環境 /367
9.4.3 實驗內容 /367
9.4.4 實驗主要步驟 /370
9.4.5 評分標準 /370
9.4.6 實驗報告 /370
小結 /371
習題 /371
第1章 邏輯電路導論 /1
1.1 開關電路數學表示方法初步 /1
1.1.1 真值表 /1
1.1.2 二進制編碼 /2
1.1.3 真值表的常見形式 /3
1.1.4 分析與綜合 /3
1.2 邏輯代數 /4
1.2.1 邏輯代數的基本運算 /4
1.2.2 邏輯函式 /6
1.2.3 邏輯代數的基本公式和運算規則 /6
1.3 用與門、或門和非門進行邏輯綜合 /9
1.4 公式法化簡邏輯函式 /10
1.5 卡諾圖 /12
1.5.1 卡諾圖是真值表的圖形表示 /12
1.5.2 用卡諾圖化簡邏輯函式 /12
1.5.3 概念提升 /16
1.6 邏輯函式的標準形式 /18
1.6.1 函式的“積之和”表達式 /18
1.6.2 函式的“和之積”表達式 /18
1.6.3 兩種表達形式的互換 /19
1.6.4 包含無關項的邏輯函式的化簡 /20
?*1.7 表格法化簡邏輯函式 /22
?*1.7.1 求質蘊含項集合 /23
?*1.7.2 求最小覆蓋 /25
1.7.3 表格法小結 /31
1.8 解題示例 /32
【本章小結】 /33
【習題】 /34
第2章 數字積體電路的基本元件--門電路 /37
2.1 概述 /37
2.2 TTL集成門電路 /40
2.2.1 TTL與非門簡介 /40
2.2.2 TTL與非門的外特性及其參數 /41
2.2.3 集電極開路的與非門 /44
2.2.4 TTL三態門 /45
2.3 MOS場效應電晶體 /46
2.4 MOS門電路 /50
2.4.1 NMOS門電路 /50
2.4.2 CMOS門電路 /52
2.4.3 其他類型的CMOS門電路 /54
2.4.4 CMOS邏輯門電性能分析 /56
2.4.5 不同類型邏輯門的配合問題 /58
2.5 74系列中小規模積體電路晶片 /58
2.6 可程式邏輯器件 /58
2.6.1 可程式邏輯陣列PLA /59
2.6.2 可程式陣列邏輯PAL和GAL /59
2.6.3 複雜可程式器件 /60
2.6.4 現場可程式門陣列 /60
2.6.5 可程式開關的物理實現 /61
2.6.6 CPLD和FPGA特點比較 /63
【本章小結】 /63
【習題】 /64
第3章 組合邏輯電路的最佳化實現 /66
3.1 組合邏輯電路的特點與最佳化實現 /66
3.2 單輸出函式和多輸出函式 /67
3.2.1 多輸出函式的化簡 /67
3.2.2 多輸出函式的最佳化實現 /71
3.2.3 用EDA工具最佳化實現組合邏輯
電路示例 /72
3.3 多級邏輯電路的綜合 /74
3.3.1 提取公因子 /74
3.3.2 功能分解 /75
3.4 組合邏輯電路積木塊 /76
3.4.1 多路選擇器 /76
3.4.2 用LUT構建更大規模的組合邏輯
電路 /78
3.4.3 編碼器 /78
3.4.4 解碼器 /81
3.4.5 數值比較器 /82
3.4.6 算術邏輯運算電路 /83
3.5 組合邏輯電路中的競爭和險象 /83
3.5.1 險象的分析 /83
3.5.2 險象的消除 /86
3.6 解題示例 /87
【本章小結】 /90
【習題】 /90
第4章 數的表示方法和算術運算電路 /94
4.1 數制和編碼 /94
4.1.1 數的位置表示法 /94
4.1.2 二進制數和十進制數的相互轉換 /95
4.1.3 八進制數的二進制編碼 /97
4.1.4 十六進制數的二進制編碼 /97
4.1.5 十進制數的二進制編碼 /98
4.1.6 格雷碼 /100
4.1.7 字元編碼 /100
4.1.8 奇偶校驗碼 /102
4.2 無符號數的加法運算 /104
4.2.1 二進制整數的加法運算 /104
4.2.2 BCD碼形式的十進制數加法運算 /107
4.3 有符號數的表示方法和算術運算 /110
4.3.1 二進制定點數的原碼錶示形式 /110
4.3.2 二進制定點數的補碼錶示形式和
加減運算 /110
4.3.3 二進制定點數的反碼錶示形式和
加減運算 /114
4.4 用EDA工具設計算術運算電路示例 /116
【本章小結】 /121
【習題】 /121
第5章 鎖存器、觸發器和暫存器 /124
5.1 鎖存器 /124
5.1.1 基本R-S鎖存器 /124
5.1.2 選通D鎖存器 /125
5.2 D觸發器 /128
5.2.1 從總體的角度觀察D觸發器 /128
5.2.2 D觸發器和D鎖存器的比較 /131
5.2.3 帶使能控制的D觸發器 /131
5.3 主從D觸發器 /133
5.4 其他類型的觸發器 /134
5.4.1 T觸發器 /134
5.4.2 JK觸發器 /135
5.5 暫存器 /136
5.6 設計示例 /138
【本章小結】 /142
【習題】 /142
第6章 同步時序電路 /144
6.1 同步時序電路概述 /144
6.2 同步時序電路的設計 /146
6.2.1 狀態圖和狀態表 /147
6.2.2 狀態分配 /149
6.2.3 確定激勵函式和輸出函式 /150
6.2.4 VHDL行為描述與使用EDA工具
設計 /150
6.3 狀態化簡 /152
6.3.1 完全規定的有限狀態機和不完全規定
的有限狀態機 /152
6.3.2 狀態化簡算法 /152
6.4 同步時序電路中的競爭和險象 /154
6.4.1 狀態變遷序列與險象的關係 /154
6.4.2 在VHDL行為描述中指定狀態
編碼 /156
6.5 算法狀態機圖 /157
6.6 解題示例 /158
【本章小結】 /168
【習題】 /169
第7章 異步時序電路 /173
7.1 異步時序電路的特點 /173
?*7.2 脈衝異步時序電路 /173
?*7.2.1 脈衝異步時序電路的分析 /174
?*7.2.2 脈衝異步時序電路的綜合 /176
?*7.3 電位異步時序電路 /180
?*7.3.1 電位異步時序電路的分析 /181
?*7.3.2 電位異步時序電路的綜合 /183
?*7.4 電位異步時序電路綜合中防範險象的
措施 /188
?*7.5 解題示例 /195
【本章小結】 /204
【習題】 /204
第8章 數字系統設計 /207
8.1 數字系統的特點和設計方法 /207
8.2 交通燈控制器設計 /208
8.3 求最大值電路的設計 /214
8.4 數字系統中某些技術細節 /219
8.4.1 減少時鐘偏移的布線網路 /220
8.4.2 觸發器的異步輸入 /220
8.4.3 消除機械開關抖動的電路 /220
【本章小結】 /221
【習題】 /221
附錄A EDA工具 QuartusII簡介 /224
A.1 QuartusII的安裝與運行 /224
A.2 設計流程 /227
A.3 項目的建立與版本管理 /229
A.3.1 建立一個新項目 /229
A.3.2 QuartusII項目的版本管理 /231
A.4 設計的原理圖描述 /233
A.4.1 進入原理圖編輯器 /233
A.4.2 從元件庫中調入元件符號 /234
A.4.3 繪製原理圖 /235
A.5 設計的VHDL描述 /236
A.5.1 進入文本編輯器 /236
A.5.2 在文本編輯器中編輯VHDL
檔案 /237
A.5.3 發現並糾正VHDL代碼中的
錯誤 /239
A.5.4 保存檔案 /239
A.6 綜合和編譯 /240
A.6.1 進入編譯器 /240
A.6.2 發現並糾正原理圖中的錯誤 /242
A.7 模擬驗證 /242
A.7.1 使用波形編輯器繪製測試向量
波形 /243
A.7.2 執行模擬 /246
A.8 層次化設計實例 /248
A.8.1 在原理圖編輯器中實現層次化
設計 /248
A.8.2 VHDL設計描述與原理圖混合使用的
層次化設計 /251
A.9 時序分析器 /254
A.10 調用帶參數的庫元件 /256
A.10.1 在原理圖編輯器中創建一個存
儲器 /256
A.10.2 初始化存儲器的內容 /261
A.10.3 存儲器的模擬實例 /262
A.11 可程式器件的物理實現 /263
A.11.1 引腳分配 /263
A.11.2 對目標器件編程 /266
A.12 用SignalTapII實時測試FPGA中的信號
波形 /271
附錄B 硬體描述語言VHDL簡介 /277
B.1 VHDL的產生與發展 /277
B.2 用VHDL建立電路模型 /278
B.2.1 電路模型 /278
B.2.2 實體聲明與結構體 /279
B.2.3 結構體的描述方式 /281
B.2.4 標識符 /281
B.3 面向模擬器的某些特性 /282
B.3.1 模擬周期 /283
B.3.2 延遲時間 /283
B.4 VHDL中的對象 /284
B.5 數據類型 /285
B.5.1 標量類型 /286
B.5.2 複合類型 /287
B.5.3 子類型 /289
B.5.4 檔案類型 /289
B.5.5 類型轉換 /289
B.6 VHDL的詞法單元 /291
B.6.1 注釋 /291
B.6.2 數字 /291
B.6.3 字元 /292
B.6.4 字元串 /292
B.6.5 位串 /292
B.7 屬性 /293
B.8 表達式與運算符 /295
B.9 子程式--過程與函式 /299
B.10 程式包與設計庫 /300
B.10.1 程式包--設計中的數據共享 /300
B.10.2 設計庫 /302
B.10.3 VHDL中名字的可見性 /302
B.10.4 library語句和use語句 /303
B.11 行為描述 /304
B.11.1 進程語句 /304
B.11.2 行為模型的順序性 /305
B.11.3 行為模型的並行性 /312
B.12 結構描述 /316
B.12.1 連線埠的基本特徵 /316
B.12.2 元件例化語句 /317
B.12.3 配置指定 /318
B.12.4 規則結構 /319
B.12.5 無連線連線埠 /320
B.13 重載 /321
B.14 VHDL保留字和預定義程式包 /322
B.14.1 VHDL保留字 /322
B.14.2 標準程式包STANDARD /323
B.14.3 IEEE多值邏輯系統程式包
std_logic_1164 /330
參考文獻 /333
第1章 邏輯電路導論 /1
1.1 開關電路數學表示方法初步 /1
1.1.1 真值表 /1
1.1.2 二進制編碼 /2
1.1.3 真值表的常見形式 /3
1.1.4 分析與綜合 /3
1.2 邏輯代數 /4
1.2.1 邏輯代數的基本運算 /4
1.2.2 邏輯函式 /6
1.2.3 邏輯代數的基本公式和運算規則 /6
1.3 用與門、或門和非門進行邏輯綜合 /9
1.4 公式法化簡邏輯函式 /10
1.5 卡諾圖 /12
1.5.1 卡諾圖是真值表的圖形表示 /12
1.5.2 用卡諾圖化簡邏輯函式 /12
1.5.3 概念提升 /16
1.6 邏輯函式的標準形式 /18
1.6.1 函式的“積之和”表達式 /18
1.6.2 函式的“和之積”表達式 /18
1.6.3 兩種表達形式的互換 /19
1.6.4 包含無關項的邏輯函式的化簡 /20
?*1.7 表格法化簡邏輯函式 /22
?*1.7.1 求質蘊含項集合 /23
?*1.7.2 求最小覆蓋 /25
1.7.3 表格法小結 /31
1.8 解題示例 /32
【本章小結】 /33
【習題】 /34
第2章 數字積體電路的基本元件--門電路 /36
2.1 概述 /36
2.2 TTL集成門電路 /39
2.2.1 TTL與非門簡介 /39
2.2.2 TTL與非門的外特性及其參數 /40
2.2.3 集電極開路的與非門 /43
2.2.4 TTL三態門 /44
2.3 MOS場效應電晶體 /45
2.4 MOS門電路 /49
2.4.1 NMOS門電路 /49
2.4.2 CMOS門電路 /51
2.4.3 其他類型的CMOS門電路 /53
2.4.4 CMOS邏輯門電性能分析 /55
2.4.5 不同類型邏輯門的配合問題 /57
2.5 74系列中小規模積體電路晶片 /57
2.6 可程式邏輯器件 /57
2.6.1 可程式邏輯陣列PLA /58
2.6.2 可程式陣列邏輯PAL和GAL /58
2.6.3 複雜可程式器件 /59
2.6.4 現場可程式門陣列 /59
2.6.5 可程式開關的物理實現 /60
2.6.6 CPLD和FPGA特點比較 /62
【本章小結】 /62
【習題】 /63
第3章 組合邏輯電路的最佳化實現 /65
3.1 組合邏輯電路的特點與最佳化實現 /65
3.2 單輸出函式和多輸出函式 /66
3.2.1 多輸出函式的化簡 /66
3.2.2 多輸出函式的最佳化實現 /69
3.2.3 用EDA工具最佳化實現組合邏輯電路示
例 /70
3.3 多級邏輯電路的綜合 /72
3.3.1 提取公因子 /72
3.3.2 功能分解 /73
3.4 組合邏輯電路積木塊 /74
3.4.1 多路選擇器 /74
3.4.2 用LUT構建更大規模的組合邏輯電路
/76
3.4.3 編碼器 /76
3.4.4 解碼器 /79
3.4.5 數值比較器 /80
3.4.6 算術邏輯運算電路 /81
3.5 組合邏輯電路中的競爭和險象 /81
3.5.1 險象的分析 /81
3.5.2 險象的消除 /84
3.6 解題示例 /85
【本章小結】 /88
【習題】 /88
第4章 數的表示方法和算術運算電路 /91
4.1 數制和編碼 /91
4.1.1 數的位置表示法 /91
4.1.2 二進制數和十進制數的相互轉換 /92
4.1.3 八進制數的二進制編碼 /94
4.1.4 十六進制數的二進制編碼 /94
4.1.5 十進制數的二進制編碼 /95
4.1.6 格雷碼 /97
4.1.7 字元編碼 /97
4.1.8 奇偶校驗碼 /99
4.2 無符號數的加法運算 /101
4.2.1 二進制整數的加法運算 /101
4.2.2 BCD碼形式的十進制數加法運算 /104
4.3 有符號數的表示方法和算術運算 /107
4.3.1 二進制定點數的原碼錶示形式 /107
4.3.2 二進制定點數的補碼錶示形式和加減運
算 /107
4.3.3 二進制定點數的反碼錶示形式和加減運
算 /111
4.4 用EDA工具設計算術運算電路示例 /113
【本章小結】 /118
【習題】 /118
第5章 鎖存器、觸發器和暫存器 /121
5.1 鎖存器 /121
5.1.1 基本R-S鎖存器 /121
5.1.2 選通D鎖存器 /122
5.2 D觸發器 /125
5.2.1 從總體的角度觀察D觸發器 /125
5.2.2 D觸發器和D鎖存器的比較 /128
5.2.3 帶使能控制的D觸發器 /128
5.3 主從D觸發器 /130
5.4 其他類型的觸發器 /131
5.4.1 T觸發器 /131
5.4.2 JK觸發器 /132
5.5 暫存器 /133
5.6 設計示例 /135
【本章小結】 /139
【習題】 /139
第6章 同步時序電路 /141
6.1 同步時序電路概述 /141
6.2 同步時序電路的設計 /143
6.2.1 狀態圖和狀態表 /144
6.2.2 狀態分配 /146
6.2.3 確定激勵函式和輸出函式 /147
6.2.4 VHDL行為描述與使用EDA工具設計
/147
6.3 狀態化簡 /149
6.3.1 完全規定的有限狀態機和不完全規定的
有限狀態機 /149
6.3.2 狀態化簡算法 /149
6.4 同步時序電路中的競爭和險象 /151
6.4.1 狀態變遷序列與險象的關係 /151
6.4.2 在VHDL行為描述中指定狀態編碼
/153
6.5 算法狀態機圖 /154
6.6 解題示例 /155
【本章小結】 /163
【習題】 /163
第7章 異步時序電路 /167
7.1 異步時序電路的特點 /167
?*7.2 脈衝異步時序電路 /167
?*7.2.1 脈衝異步時序電路的分析 /168
?*7.2.2 脈衝異步時序電路的綜合 /170
?*7.3 電位異步時序電路 /174
?*7.3.1 電位異步時序電路的分析 /175
?*7.3.2 電位異步時序電路的綜合 /177
?*7.4 電位異步時序電路綜合中防範險象的措施
/182
?*7.5 解題示例 /189
【本章小結】 /198
【習題】 /198
第8章 數字系統設計 /201
8.1 數字系統的特點和設計方法 /201
8.2 交通燈控制器設計 /202
8.3 求最大值電路的設計 /208
8.4 數字系統中某些技術細節 /213
8.4.1 減少時鐘偏移的布線網路 /214
8.4.2 觸發器的異步輸入 /214
8.4.3 消除機械開關抖動的電路 /214
【本章小結】 /215
【習題】 /215
附錄A EDA工具 QuartusII簡介 /218
A.1 QuartusII的安裝與運行 /218
A.1.1 QuartusII的首次安裝 /219
A.1.2 申請授權檔案 /220
A.1.3 改變QuartusII主界面的樣式 /220
A.2 設計流程 /222
A.3 項目的建立與版本管理 /223
A.3.1 建立一個新項目 /223
A.3.2 QuartusII項目的版本管理 /225
A.4 設計的原理圖描述 /227
A.4.1 進入原理圖編輯器 /227
A.4.2 從元件庫中調入元件符號 /228
A.4.3 繪製原理圖 /229
A.5 設計的VHDL描述 /230
A.5.1 進入文本編輯器 /231
A.5.2 在文本編輯器中編輯VHDL檔案
/231
A.5.3 發現並糾正VHDL代碼中的錯誤
/232
A.5.4 保存檔案 /234
A.6 綜合和編譯 /234
A.6.1 進入編譯器 /234
A.6.2 發現並糾正原理圖中的錯誤 /236
A.7 模擬驗證 /236
A.7.1 使用波形編輯器繪製測試向量波形
/237
A.7.2 執行模擬 /240
A.8 層次化設計實例 /242
A.8.1 在原理圖編輯器中實現層次化設計
/242
A.8.2 VHDL設計描述與原理圖混合使用的
層次化設計 /245
A.9 時序分析器 /248
A.10 調用帶參數的庫元件 /250
A.10.1 在原理圖編輯器中創建一個存儲器
/250
A.10.2 初始化存儲器的內容 /255
A.10.3 存儲器的模擬實例 /256
A.11 可程式器件的物理實現 /257
A.11.1 引腳分配 /257
A.11.2 對目標器件編程 /260
A.12 用SignalTapII實時測試FPGA中的信號波形
/265
附錄B 硬體描述語言VHDL簡介 /271
B.1 VHDL的產生與發展 /271
B.2 用VHDL建立電路模型 /272
B.2.1 電路模型 /272
B.2.2 實體聲明與結構體 /273
B.2.3 結構體的描述方式 /275
B.2.4 標識符 /275
B.3 面向模擬器的某些特性 /276
B.3.1 模擬周期 /277
B.3.2 延遲時間 /277
B.4 VHDL中的對象 /278
B.5 數據類型 /279
B.5.1 標量類型 /280
B.5.2 複合類型 /281
B.5.3 子類型 /283
B.5.4 檔案類型 /283
B.5.5 類型轉換 /283
B.6 VHDL的詞法單元 /285
B.6.1 注釋 /285
B.6.2 數字 /285
B.6.3 字元 /286
B.6.4 字元串 /286
B.6.5 位串 /286
B.7 屬性 /287
B.8 表達式與運算符 /289
B.9 子程式--過程與函式 /293
B.10 程式包與設計庫 /294
B.10.1 程式包--設計中的數據共享 /294
B.10.2 設計庫 /296
B.10.3 VHDL中名字的可見性 /296
B.10.4 library語句和use語句 /297
B.11 行為描述 /298
B.11.1 進程語句 /298
B.11.2 行為模型的順序性 /299
B.11.3 行為模型的並行性 /306
B.12 結構描述 /310
B.12.1 連線埠的基本特徵 /310
B.12.2 元件例化語句 /311
B.12.3 配置指定 /312
B.12.4 規則結構 /313
B.12.5 無連線連線埠 /314
B.13 重載 /315
B.14 VHDL保留字和預定義程式包 /316
B.14.1 VHDL保留字 /316
B.14.2 標準程式包STANDARD /317
B.14.3 IEEE多值邏輯系統程式包std_logic_
1164 /324
參考文獻 /327