![](/c49/33/54344494167.jpg)
出版社:清華大學出版社 ISBN:9787302466628 商品編碼:54344494167 品牌:鳳凰新華(PHOENIX 包裝:平裝-膠訂 開本:32 出版時間:2017-06-01 代碼:49 作者:湯勇明,張聖清,陸佳華
" 內容介紹 本書繫統論述了數字電路與邏輯設計的理論、方法與實踐技術。全書基於Verilog HDL與Vivado開發環境,共18章,詳盡介紹了如下內容: 邏輯設計與Vivado基礎、布爾代數與Verilog HDL基礎、組合邏輯電路設計基礎、時序邏輯電路設計基礎、有限狀態機設計基礎、邏輯設計工程技術基礎、Vivado數字積木流程、串行通信接口控制器、RAM接口控制器、字符點陣顯示模塊接口控制器、VGA接口控制器、數字圖像采集、數字邏輯繫統設計案例、單周期CPU設計案例、數字信號處理設計案例(FIR)、數字圖像處理設計案例、大學生FPGA設計案例以及Xilinx資源導讀。 為便於教師和廣大讀者學習與動手實踐,本書配套提供了教學課件、教學視頻及程序代碼等教學資源。 本書適合作為普通高等院校電子信息類、電氣信息類、自動化類專業的本科生教材,也可作為相關專業研究生參考教材,並適合作為電子與電氣工程技術領域的科研工程技術人員的參考用書。 關聯推薦 本教材嚴格參照教育部高等學校電子電氣基礎課程教學指導分WY會制訂的《電子電氣基礎課程教學基本要求》編寫。全書注重激發學生的學習興趣,突出模塊化編程思想並詳細介紹了IP設計、封裝和調用方法;對於常用邏輯模塊及邏輯繫統案例的選取,采取由淺入深的方式,設計過程和例程盡量詳細,可以直接動手實驗。全書融合了東南大學電子科學與工程學院 “數字繫統”課程的豐富教學經驗,吸收了東南大學多年參與PLD競賽的經驗,並充分考慮產業界對電子信息類專業人纔培養的具體需求,是一本真正意義上產學深度合作的教材。教學資源:(1) 教學課件 配書教案(PPT)可到清華大學出版社wz本書頁面下載。(2) 設計平臺 采用科研和教學中應用*廣泛的Xilinx Artix-7器件和Vivado工具。(3) 程序代碼 配書源程序在Github開源,並保持更新。(4) 教學視頻 配書教學視頻及實驗操作視頻可到OpenHWwz獲取。 目錄
目錄 D一部分邏輯設計基礎 D1章邏輯設計概述及Vivado基礎 1.1邏輯設計概況 1.2Verilog HDL語言基礎 1.2.1硬件描述語言概述 1.2.2Verilog HDL語言要素和設計流程 1.3PLD器件基礎 1.3.1可編程邏輯器件技術發展歷程 1.3.2FPGA和CPLD簡介 1.3.3Xilinx FPGA介紹 1.3.4FPGA選型應該考慮的問題 1.4Vivado開發環境及設計流程 1.4.1Vivado功能介紹 1.4.2Vivado用戶界面介紹和菜單操作 1.4.3Vivado開發流程 D2章布爾代數和Verilog HDL基礎 2.1布爾代數 2.1.1三種基本邏輯門 2.1.2四種常用邏輯門 2.2布爾定律 2.2.1單變量布爾定律 2.2.2雙變量和三變量的布爾定律 2.3布爾代數化簡 2.3.1公式法化簡 2.3.2卡諾圖化簡 2.4Verilog HDL語言基礎 2.4.1Verilog HDL模塊及端口 2.4.2Verilog HDL數據類型聲明 2.4.3Verilog HDL運算操作 D3章組合邏輯電路設計基礎 3.1組合電路中的always塊 3.1.1基本語法格式 3.1.2過程賦值 3.1.3變量的數據類型 3.1.4簡單實例 3.2條件語句 3.2.1ifelse語句 3.2.2case語句 3.3循環語句 3.3.1for語句 3.3.2repeat語句 3.3.3while語句 3.3.4forever語句 3.4always塊的一般編碼原則 3.4.1組合電路代碼中常見的錯誤 3.4.2組合電路中always塊的使用原則 3.5常數和參數 3.5.1常數 3.5.2參數 3.6設計實例 3.6.1多路選擇器 3.6.2比較器 3.6.3譯碼器和編碼器 3.6.4十六進制數七段LED顯示譯碼器 3.6.5二進制—BCD碼轉換器 3.7練習題 D4章時序電路設計基礎 4.1觸發器和鎖存器 4.1.1基本D觸發器 4.1.2含異步復位的D觸發器 4.1.3含異步復位和同步使能的D觸發器 4.1.4基本鎖存器 4.1.5含清0控制的鎖存器 4.2寄存器 4.2.11位寄存器 4.2.2N位寄存器 4.2.3寄存器組 4.3移位寄存器 4.3.1具有同步預置功能的8位移位寄存器 4.3.28位通用移位寄存器 4.4計數器 4.4.1簡單的二進制計數器 4.4.2通用二進制計數器 4.4.3模m計數器 4.5設計實例 4.5.1數碼管掃描顯示電路 4.5.2秒表 4.6練習題 D5章有限狀態機設計基礎 5.1引言 5.1.1有限狀態機的特點 5.1.2Mealy狀態機和Moore狀態機 5.1.3有限狀態機的表示方法 5.2有限狀態機代碼實現 5.3設計實例 5.3.1序列檢測器設計 5.3.2ADC采樣控制電路設計 5.3.3按鍵消抖電路設計 5.4課程練習 D6章邏輯設計工程技術基礎 6.1數字電路穩定性 6.2組合邏輯與毛刺 6.2.1組合邏輯設計中的毛刺現像 6.2.2組合邏輯設計中毛刺的處理 6.3異步設計與毛刺 6.3.1異步時序電路中的毛刺現像 6.3.2異步時序電路中毛刺的處理 6.4Verilog HDL設計中的編程風格 6.4.1強調代碼編寫風格的必要性 6.4.2強調編寫規範的宗旨 6.4.3變量及信號命名規範 6.4.4編碼格式規範 6.5Xilinx開發環境中的其他邏輯設計輔助工具 D二部分常用邏輯設計模塊 D7章Vivado數字積木流程 7.1IP基礎 7.2打包屬於自己的IP 7.3IP設計示例——二進制轉格雷碼 7.4練習題 D8章串行通信接口控制器 8.1UART串口通信協議及控制器設計 8.1.1UART協議介紹 8.1.2UART協議實例 8.2PS/2協議及實例設計 8.2.1PS/2協議介紹 8.2.2PS/2設計實例 8.3SPI同步串行總線協議及控制器設計 8.3.1SPI協議介紹 8.3.2SPI控制器模塊實例 8.4I2C兩線式串行總線協議及控制器設計 8.4.1I2C協議介紹 8.4.2I2C模塊設計實例 8.5練習題 D9章RAM接口控制器 9.1內部存儲器 9.1.1FIFO 9.1.2單端口RAM設計 9.1.3雙端口RAM設計 9.2外部存儲器 9.2.1DRAM介紹 9.2.2DDR SDRAM原理 9.2.3DDR SDRAM控制器原理 9.3練習題 D10章字符點陣顯示模塊接口控制器 10.1字符型液晶控制器設計 10.1.1LCD原理 10.1.2字符型LCD1602模塊 10.1.3字符型液晶模塊顯示實例 10.2點陣OLED控制器設計 10.2.1OLED原理 10.2.2OLED驅動原理 10.2.3OLED顯示實例 10.3練習題 D11章VGA接口控制器 11.1CRT顯示器原理 11.2VGA控制器設計 11.2.1VGA視頻接口的概念 11.2.2VGA的接口信號 11.2.3行同步和場同步 11.3VGA接口設計實例 11.3.1VGA顯示條紋和棋盤格圖像 11.3.2VGA圖像顯示實例(文字/圖片顯示或者數碼相框) 11.3.3VGA IP的使用 11.4練習題 D12章數字圖像采集 12.1數字圖像采集概述 12.2繫統設計原理 12.2.1繫統架構 12.2.2OV7725芯片介紹 12.2.3OV7725 SCCB協議 12.2.4OV7725配置寄存器 12.2.5OV7725圖像采集 12.2.6Block RAM 12.2.7VGA顯示的實現 12.3模塊搭建與綜合實現 12.4繫統調試及板級驗證 12.4.1引腳分配 12.4.2模塊連接 12.5練習題 D三部分邏輯繫統設計案例 D13章數字邏輯繫統設計案例: 數字鐘 13.1數字鐘設計案例 13.1.1實驗原理 13.1.2實驗設計流程 13.2基於集成邏輯分析儀的調試 13.3約束設計 13.3.1物理約束 13.3.2時序約束 13.4練習題 D14章單周期處理器設計實例 14.1單周期處理器體繫架構簡介 14.1.1單周期處理器指令集簡介 14.1.2單周期處理器繫統結構 14.2設計流程 14.2.1實驗原理 14.2.2設計與驗證 D15章數字信號處理實例: FIR濾波器 15.1FIR濾波器簡介 15.2基於HLS的FIR濾波器實現流程 15.3工程測試 15.4生成IP 15.5練習題 D16章數字圖像處理設計案例 16.1項目概述 16.2硬件介紹 16.3模塊介紹 16.3.1RGB轉HSV模塊 16.3.2Color Detect色彩檢測及坐標計算 16.4舵機控制模塊 16.5實例實現過程 16.6板級驗證 16.7練習題 D17章大學生FPGA設計案例 17.1邏輯控制 17.2圖像處理 17.2.1VGA控制顏色 17.2.2視力表 17.2.3手部運動檢測繫統 17.3儀表儀器 17.3.1數字示波器 17.3.2邏輯分析儀 17.3.3波形發生器 17.4其他 D18章Xilinx資源導讀 18.1獲取本書參考例程 18.1.1Github介紹及使用 18.1.2OpenHW介紹 18.1.3Xilinx各類比賽 18.2Xilinxwz 18.2.1FPGA應用與解決方案 18.2.2文檔資料查找 18.2.3Vivado工具和License的下載以及更新 18.2.4問題的查找 18.2.5Xilinx社區 18.3視頻教程 18.4Vivado學習參考文檔 參考文獻 顯示全部信息 在線試讀 D3章CHAPTER 3 組合邏輯電路設計基礎 本章學習導言組合邏輯電路在任一時刻的輸出狀態隻取決於該時刻的輸入狀態的組合,而與電路以前的狀態無關。即電路隻是由門電路組成,沒有,也沒有反饋電路。D2章介紹的簡單邏輯運算符可用於描述基本構成的門級設計,實際已經是基本的組合邏輯電路設計內容。本章主要介紹由中等規模組件構成組合邏輯電路的HDL描述,例如加法器、比較器和多路復用器等。本章1先結合實例對Verilog HDL行為描述的常用語法進行介紹,包括always塊、if語句、case語句、參數和常數等,並通過一些常見組合邏輯電路實例來展示常用組合電路設計。本章的目的是給出組合邏輯電路基本概念,在介紹Verilog HDL用於組合邏輯設計的條件語句和循環語句等基本要素後,分別給出比較器、多路選擇器等常見組合邏輯的介紹及其Verilog HDL實現。這些常用組合邏輯在邏輯繫統中出現頻率高,算得上搭建邏輯繫統的Z基本積木,熟練掌握對於復雜邏輯繫統設計以及邏輯繫統設計優化均有重要作用。 3.1組合電路中的always塊在進行較為復雜的邏輯電路設計時,為了提高設計效率,通常采用較為抽像的行為描述,Verilog HDL使用一些順序執行的過程語句來進行行為描述。這些語句封裝在一個always塊或initial塊中,initial塊僅在仿真開始的時候執行一次,而always塊能夠進行綜合,生成能夠執行邏輯運算或控制的電路模塊。在本部分中重點討論always塊。always塊可以看成一個包含內部過程描述語句的黑盒子,過程語句包含多種結構,但是很多都沒有對應的硬件,編碼不佳的always塊通常會導致不必要的復雜實施或者根本無法綜合。本部分主要關注可綜合的組合邏輯電路設計,討論內容限制為三種類型的語句: 塊程序賦值、條件語句和循環語句。3.1.1基本語法格式帶敏感信號列表的always塊的簡化使用格式如下:D3章CHAPTER 3 組合邏輯電路設計基礎 本章學習導言組合邏輯電路在任一時刻的輸出狀態隻取決於該時刻的輸入狀態的組合,而與電路以前的狀態無關。即電路隻是由門電路組成,沒有,也沒有反饋電路。D2章介紹的簡單邏輯運算符可用於描述基本構成的門級設計,實際已經是基本的組合邏輯電路設計內容。本章主要介紹由中等規模組件構成組合邏輯電路的HDL描述,例如加法器、比較器和多路復用器等。本章1先結合實例對Verilog HDL行為描述的常用語法進行介紹,包括always塊、if語句、case語句、參數和常數等,並通過一些常見組合邏輯電路實例來展示常用組合電路設計。本章的目的是給出組合邏輯電路基本概念,在介紹Verilog HDL用於組合邏輯設計的條件語句和循環語句等基本要素後,分別給出比較器、多路選擇器等常見組合邏輯的介紹及其Verilog HDL實現。這些常用組合邏輯在邏輯繫統中出現頻率高,算得上搭建邏輯繫統的Z基本積木,熟練掌握對於復雜邏輯繫統設計以及邏輯繫統設計優化均有重要作用。 3.1組合電路中的always塊在進行較為復雜的邏輯電路設計時,為了提高設計效率,通常采用較為抽像的行為描述,Verilog HDL使用一些順序執行的過程語句來進行行為描述。這些語句封裝在一個always塊或initial塊中,initial塊僅在仿真開始的時候執行一次,而always塊能夠進行綜合,生成能夠執行邏輯運算或控制的電路模塊。在本部分中重點討論always塊。always塊可以看成一個包含內部過程描述語句的黑盒子,過程語句包含多種結構,但是很多都沒有對應的硬件,編碼不佳的always塊通常會導致不必要的復雜實施或者根本無法綜合。本部分主要關注可綜合的組合邏輯電路設計,討論內容限制為三種類型的語句: 塊程序賦值、條件語句和循環語句。3.1.1基本語法格式帶敏感信號列表的always塊的簡化使用格式如下: always@(敏感信號列表) begin可選的模塊名 可選的本地變量聲明; 順序執行語句; 順序執行語句; … end 敏感信號列表是always塊響應的信號和事件列表,對於組合電路,應該包含所有的輸入信號。D有兩個或者兩個以上的信號時,在Verilog HDL 1995中,它們之間可以用關鍵字or來連接,例如: always@(a or b or c) Verilog HDL 2001規範中,可以使用“,”來區分,例如: always@(a , b , c) 在本書中,使用Verilog HDL 2001規範。@(敏感信號列表)項實際上是一個時序控制結構,它是可綜合always塊中的W一時序控制結構。模塊體可包含任意數目的過程語句,D模塊體隻有一條語句時,定界符begin和end可以省略。敏感信號可分為兩種類型: 一種是電平敏感型; 一種是邊緣敏感型。每個always過程一般隻由一種類型的敏感信號來觸發,而不能混合使用。對於組合電路,一般采用電平觸發; 對於時序電路,一般由時鐘邊沿觸發。Verilog HDL提供了posedge和negedge兩個關鍵詞來分別描述上升沿和下降沿。always塊可以看作一個復雜的電路部分,可以被中止和激活。D敏感列表中的信號發生變化或某一事件發生時,該部分被激活並執行內部過程語句,由於沒有其他時序控制結構,執行過程會一直持續到end模塊纔會終止,因此,always塊實際上是個“永遠循環”過程,每次的循環由敏感信號列表觸發。3.1.2過程賦值過程賦值隻能用在always塊或initial塊中,有兩種賦值方式: 阻塞賦值和非阻塞賦值。其基本語法格式如下: 阻塞賦值: 變量名 = 表達式; 非阻塞賦值: 變量名 <= 表達式 ; 在阻塞賦值中,在執行下一條語句前,一個表達式隻能賦給一個數據類型的值,可以理解為賦值阻斷了其他語句的執行,與C語言中的正常變量賦值行為相似。在非阻塞賦值中,表達式的值在always塊結束時進行賦值,這種情況下賦值沒有阻斷其他語句的執行。Verilog的初學者經常會混淆阻塞賦值和非阻塞賦值,不能正確理解它們的區別。這樣可能會導致意外的行為或競爭條件。它們的基本使用原則是(1) 組合電路使用阻塞賦值; (2) 時序電路使用非阻塞賦值。因為本章關注的是組合電路,因此隻使用阻塞賦值語句。3.1.3變量的數據類型在過程賦值中,一個表達式隻能賦給一種變量數據類型的輸出,這些變量數據類型有reg型、integer型、real型、time型和realtime型。reg數據類型和wire數據類型類似,可以用於過程輸出; integer數據類型表示固定大小(通常是32位)有符號二進制補碼格式,由於大小固定,在綜合中通常不用該數據類型; 其他幾種數據類型用於建模和仿真,無法被綜合。3.1.4簡單實例用兩個簡單例子來說明always模塊和過程阻塞賦值的用法和行為。1. 一位比較器可以用always塊來設計簡單的一位比較器電路,代碼見例3.1。例3.1一位比較器的always塊實現 module eq1_always ( inputi0,i1, output reg eq //eq聲明為reg類型 ); reg p0, p1; //p0和p1聲明為reg類型 always @(i0, i1)//i0和i1必須在敏感信號列表中 begin //語句的順序是很重要的 p0= ~i0&~i1; p1= i0 &i1; eq= p0| p1 ; end endmodule 因為eq、p0和p1信號在always塊內賦值,它們都聲明為reg型數據類型; 敏感列表包括i0和i1,並由逗號隔開,D其中一個發生變化時,always塊則被激活; 三條阻塞賦值語句順序執行,和C程序中的語句FC類似,語句的順序十分重要,在D三條阻塞賦值語句執行前p0和p1必須賦值。要正確建立所需的行為模型,組合電路的敏感列表必須包含所有的輸入信號,忽略一個信號J可能導致綜合和仿真結果不一致,在Verilog HDL 2001中,可以用下面的符號 always@* 來隱式地包含所有輸入信號,在本書組合電路描述中使用這種結構。2. 過程賦值語句和持續賦值語句的比較其實,持續賦值語句和過程賦值語句的行為大不相同,下面以一個三輸入的與門來說明它們的區別。例3.2中的代碼,使用的是過程賦值語句,它完成的功能是執行a、b和c的邏輯與運算(即a&b&c),綜合的電路如圖3.1(a)所示。例3.2三輸入的與電路 module and_block_assign ( inputa , b , c, output regy ); always@ * begin y = a ; y=y&b; y=y&c; end endmodule 如果采用類似例3.3中的持續賦值語句,則描述結果不正確。在例3.3的代碼中,每條程序賦值綜合一部分電路,左端3次出現的y表明三個輸出捆綁在一起,對應的電路如圖3.1(b)所示,這顯然不是想要的設計結果。 例3.3與電路的不正確代碼 module and_cont_assign ( inputa,b,c, outputy ); assign y = a; assign y = y & b; assign y = y &c ; endmodule 圖3.1正確和不正確的代碼段推導出的電路 3.2條件語句條件語句有ifelse語句和case語句兩種,它們都是順序語句,應該放在always塊內使用。下面分別結合實例對這兩種語句進行介紹。3.2.1ifelse語句1. 語法 ifelse語句的簡化語法如下: if (表達式) begin 順序執行語句; 順序執行語句; end else begin 順序執行語句 ; 順序執行語句 ; end [表達式]項一般為邏輯表達式或者關繫表達式,也可以是一位的變量。語句先對表達式判斷,如果表達式為真,則執行下面分支的語句,否則執行else分支的語句。else分支具有選擇性,可以省略。如果分支裡隻有一條語句,則定界符begin和end可以省略。多條if語句可以“級聯”,以執行多布爾條件並建立優先級,如下: if (表達式1) ... else if (表達式2) else if (表達式3) ... else 2. 實例用兩個簡單例子來說明ifelse語句的用法。1) 4位優先編碼器4位優先編碼器有四個優先級,r[3]、r[2]、r[1]和r[0]作為一組4位輸入信號,r[3]優先級Z高,輸出是較高優先級的二進制代碼,優先編碼器的功能表如表3.1所示,HDL代碼見例3.4。 表3.1四輸入優先編碼器功能表 輸入 (r[3] r[2] r[1] r[0])輸出 (y[2] y[1] y[0])1xxx10001xx011001x01000010010000000 例3.4使用ifelse語句的優先編碼器的HDL代碼 module prio_encoder_if ( input[3:0] r, output reg[2:0]y ); always@* if(r[3]==1'b1)//可以寫成 (r[3]) y = 3'b100; else if(r[2]==1'b1) //可以寫成 (r[2]) y = 3'b011; else if (r[1]==1'b1) //可以寫成 (r[1]) y = 3'b010; else if(r[0]==1'b1) //可以寫成 (r[0]) y = 3'b001; else y = 3'b000; endmodule 代碼1先檢查信號r[3]請求,如果為1則將100賦給y,如果r[3]為0,則繼續檢查信號r[2]請求並重復以上過程,直至所有請求信號檢查完畢。注意Dr[3]為1時布爾表達式(r[3]==1'b1)為真,由於在Verilog中真值也可表示為1'b1,因此表達式也可以寫成(r[3])。2) 24譯碼器根據n位輸入的信號,一個n-2n二進制譯碼器將2n位輸出中的一位置位,24譯碼器的真值表如表3.2所示,該電路包括控制信號端en來使能譯碼功能,HDL代碼見例3.5。 表3.2帶使能的24譯碼器的真值表 ena[1]a[0]y0xx00001000001101001011001001111000 例3.5使用ifelse語句實現的24譯碼器 module decoder_2_4_if ( input [1:0] a, input en, outputreg[3:0] y ); always @* if(en==1'b0) y = 4'b0000; else if (a==2'b00) y = 4'b0001; else if(a==2'b01) y = 4'b0010; else if(a==2'b10) y = 4'b0100; else y = 4'b1000; endmodule 代碼1先檢查使能位en是否為1,如果條件為假(即en為0),則設置輸出y為無效狀態; 如果條件為真,則檢測4個二進制數的組合順序,設置輸出y的狀態。注意布爾表達式(en==1'b0)也可以寫成~en。3.2.2case語句相對於ifelse語句隻有兩個分支而言,csae語句則是一種多分支語句,其可用於描述多條件分支電路,例如譯碼器、數據選擇器、狀態機及微處理器指令譯碼等。case語句有case、casez和casex三種表示方式,以下分別進行介紹。1. case語句語法case語句的簡化語法如下: case(表達式) 分支項1: begin 順序執行語句; 順序執行語句; ... end 分支項2: begin 順序執行語句; 順序執行語句; ... end 分支項3: begin 順序執行語句; 順序執行語句; … end ... default: begin 順序執行語句; 順序執行語句; end endcase case語句是一條多路決策語句,其將case 表達式和多個分支項進行比較,程序跳入與D前表達式相等的分支項對應的分支執行,如果有多個分支項匹配,則執行D一條匹配的分支。Z後一條分支為可選的,關鍵詞是default,包含表達式未指定的所有值。如果一條分支中隻有一條語句,則定界符begin和end可以省略。2. case語句實例采用和ifelse語句例子中相同的優先編碼器和譯碼器來說明case語句的用法。1) 24譯碼器的case語句描述24譯碼器的功能表如表3.2所示,使用case語句的HDL代碼見例3.6。例3.6使用case語句實現的24譯碼器HDL代碼 module decoder_2_4_case ( input[1:0]a, inputen, output reg[3:0]y ); always @* case({en, a}) 3'b000, 3'b001, 3'b010, 3'b011: y = 4'b0000; 3'b100: y = 4'b0001; 3'b101: y = 4'b0010; 3'b110: y = 4'b0100; 3'b111
" |