第五章 I/O 介面控制模組規劃與設計
I/O 介面控制模組設計須配合自製之 FPGA 實驗平台上所設置的 I/O 模組進行設計。自製之 FPGA 實驗平台的配置將在第六章第一節討論之。
FPGA 實驗平台上的輸入模組包含 1 組 4x4 掃描式鍵盤、4 組 8 位元之指 撥開關(Dip Switch)、8 個按壓開關(Push Button);輸出模組包含 1 個 20 x 2 的文字型 LCD、2 組 4 位元的七段顯示器、5 組 10 位元之 LED。其中,
需撰寫 I/O 控制模組的為 4x4 掃描式鍵盤、文字型 LCD 及七段顯示器,
此外因在輸入模組中具備按鍵式的開關,故而亦需撰寫防彈跳電路。以 下將分節敘述各 I/O 介面控制模組程式規劃與設計。
第一節 輸入單元模組
壹、防彈跳電路
防彈跳電路設計是所有按鍵式輸入模組必須嵌入的基本電路,防止因 彈跳現象而得到不正確的鍵值。當按鍵被按下時,按鍵內部的機械開關會 產生振動現象,而得到不穩定的輸出,時間約持續數十個 ms,稱為彈跳現 象[35]。按鍵判斷是採用三級正反器搭配組合邏輯電路。當 DB_IN 連續讀 到三次 HI 準位時,防彈跳電路將會輸出一個 HI 準位,表示該按鍵被確實 被按下而非彈跳輸入。內部電路如圖 5-1 所示。
圖 5-1 防彈跳電路模組內部電路連接圖
D CLK
Q DFF DB_IN
CLOCK
CLR
D CLK
Q DFF
CLR
D CLK
Q DFF
CLR RESET
Q1 Q2 Q3
DB_BUF DeBounce
DB_OUT
貳、鍵盤控制模組
鍵盤可視為是多個按鍵的組合,每個按鍵具有個別的代表意義,如家 用按鍵式電話機,還有常用的個人電腦鍵盤。鍵盤控制模組是為得到按下 不同按鍵所得到的不同意義而設計。一個鍵盤掃描控制電路基本上包括:
防彈跳電路、掃描訊號產生電路、鍵盤解碼電路三大部分,鍵盤控制模組 內部電路圖如圖 5-2 所示。
圖 5-2 4x4 鍵盤控制模組內部電路方塊圖
ROWDAT[3:0]是鍵盤控制模組產生的鍵盤列掃描訊號,COLDAT[3:0]
則是按鍵按下後輸入鍵盤控制模組的訊號接收端。當掃描訊號送到某一 列,而該列的某個按鍵被按下時,COLDAT[3:0]得到訊號輸入,經過防彈 跳電路(DB)消除彈跳現象後得到 COLBUF[3:0]會在對應的位元,得到一個 準確的 HI 準位輸入,所以由 ROWDAT 與 COLBUF 作按鍵解碼,可得到 特定鍵值輸出(LED_DIG[3:0]),鍵值由 Decode Circuit 內定義。
4x4 KeyPad Scanning Signal Generate Circuit
4x4 KeyPad Decode Circuit
4x4 KeyPad
LED_DIG[3:0]
ROWDAT [3:0]
DB DB DB DB
COLDAT[3:0]
GET_DIG DBG_STATE RESET
CLOCK
KeyPad_Controller
COLBUF[3:0]
第二節 輸出單元模組
壹、七段顯示器控制模組
本研究自製的 FPGA 實驗平台上的七段顯示器硬體電路如圖 5-3 所 示。七段顯示器的顯示資料預先由 74LS47 解碼,並利用 74LS138 解碼各 個七段顯示器的掃描信號,節省七段顯示器控制模組耗費的 FPGA I/O 接
腳數。
圖 5-3 8 個顯示位元之七段顯示器硬體接腳示意圖
由硬體電路架構規劃七段顯示器控制模組,內部最主要是一個掃描訊 號產生電路,在人類眼睛產生視覺暫留的時間內,控制時脈速度輪流點亮 8 個七段顯示器,點亮第 1 個七段顯示器時,送出第 1 個七段顯示器顯示 資料,點亮第 2 個七段顯示器,送出第 2 個七段顯示器顯示資料,依此類 推…由人類肉眼觀察這 8 個七段顯示器是同時點亮的狀態,送出顯示的資 料亦是相同原理。內部電路方塊圖如圖 5-4 所示。
74LS138
COM3 COM4 COM5 COM6
A B C D E F G Dot
74LS47
LED_COM[2:0]
LED_DATA[3:0]
COM7 COM8 COM2
COM1
圖 5-4 七段顯示器控制模組內部電路方塊圖
貳、文字型 LCD 控制模組
文字型 LCD 控制模組是由 2 個 VHDL 程式模組所組成(LCD_CTRL 及 LCD_TOP),內部電路方塊圖如圖 5-5 所示。
圖 5-5 LCD 控制模組內部電路方塊圖 下層的 LCD_CTRL 模組功能有二:
LCD
DB7~
DB0
EN RS R/W
LCD_TOP
LCD_Initial ROM
LCD_CTRL CLOCK
Delay
CLOCK RESET
S_DATA_IN [7:0]
S_RECV_DT (Busy Flag)
PC_DATABUS
TRI-State
TRI_ST_CTRL
LCD_EN LCD_RS LCD_RW RESET
CLOCK PC_GO
PC_DATABUS
MUX
PC_GO_BUF
REG_DAT[31:0]
LCD_EN LCD_RS LCD_RW LCD_DATA
_BUS[7:0]
S_DATA_IN [7:0]
Transfer ASCII
REG_SEL[4:0] SEL
PC_ADDR_X PC_ADDR_Y ADDR_X_BUF
ADDR_Y_BUF
Reset Clock
Out Counter Reset
Clock DATA_IN0 DATA_IN1 DATA_IN2 DATA_IN7
LCD_COM
LCD_DATA
…… MUX
Seven Segment Controller
二、送出設定 LCD 顯示模式控制指令。例如:顯示游標與否、游標移動 方向等…
上層的 LCD_TOP 模組除了 LCD_CTRL 外還包括 3 個小模組,分別是 時脈延遲電路(Clock Delay)、LCD 初始資料記憶體(LCD_Initial ROM)、及 ASCII Code(Transfer ASCII)轉換電路。時脈延遲電路是延遲輸入至 LCD 的 時脈週期,太快的 Clock 會致使 LCD 設定指令沒有足夠的時間執行完畢;
LCD 初始資料記憶體儲存重設 LCD 後,LCD 螢幕上常駐的顯示資料;
ASCII Code 轉換電路功能是將讀進來的二進位資料轉換成對應的 ASCII Code 再寫至 LCD 模組的資料匯流排顯示。
此外 LCD_TOP 在 LCD 初始化後,還能接受由外部模組(如 MIPS CPU 的執行結果)所輸入的顯示資料。