摘? 要: 介紹用C8051F015微控制器" title="微控制器">微控制器控制硬盤進行HDTV碼流存取的高清碼流回放機的硬件設計和軟件編程。該系統作為解碼器的前端,可以實現HDTV碼流的適時回放。
關鍵詞: HDTV? 碼流? ATA/ATAPI-4標準? LBA模式?? CPLD
?
隨著HDTV在全球的興起以及數字技術的日趨成熟,音/視頻產品數字化、高清晰度化已成為未來家電視聽產品的大趨勢。高清晰度電視HDTV (High-Definition Television)采用了國際上流行的MPEG-2標準,MPEG-2規定了數字圖像的音視頻編解碼算法以及傳送的碼流應該符合的語法和語義,而其編解碼算法又參考了聽覺心理模型和視覺心理模型。HDTV的圖像格式為1920×1080I,傳輸碼率高達20Mbps,同時采用的視頻壓縮技術可使HDTV的每一幀包含更多的信息,大大提高圖像的清晰度。HDTV在音頻壓縮方面采用了數字音頻的編碼和壓縮技術,現有的數字音頻編碼壓縮方案有MPEG、Dolby AC-3和美國AT&T的MPAC以及歐洲的MIX。它們都能實現5.1聲道,其聲道數可以擴展到5.1,即三個前面的聲道(L、C、右聲道R)、兩個環繞聲道(左環繞聲道Ls、右環繞聲道Rs)和一個低音效果聲道LFE,使聲音效果可以達到家庭影院的音響效果。HDTV聲光效果上的優勢,注定它的發展有著技術和市場的雙重必然性。為了配合HDTV及相關技術產品的推廣,筆者開發了一個既可以作為MPEG解碼器信號源,又可以作為信道 編碼/調制器信號源的碼流回放機,應用于數字電視產品的開發、生產調試及展示宣傳。
HDTV節目有傳輸碼率高、節目信息量大的特點。為了研制出符合大容量高速率要求的碼流回放機,傳統的方法是用操作系統控制硬盤的讀寫操作" title="讀寫操作">讀寫操作。這樣做的好處在于:首先,PC機的主頻很高,用來作為控制碼流的時鐘信號在速度上不會有瓶頸問題;其次,對硬盤里HDTV節目的讀取是基于文件系統的,研發人員不用寫硬盤的驅動程序,軟件的工作量大大減小。但是,就碼流回放機本身而言,它是一個單任務設備,采用操作系統的方案無疑將造成CPU資源的極大浪費。因此,筆者設想用單片機或DSP控制硬盤的讀寫操作。只要所選微控制器在速度上滿足高清晰度電視的碼率要求,在技術上就能夠實現預期的功能。與操作系統方案相比較,用微控制器無疑可以大大降低生產成本,同時也降低了硬件設計的難度。不過,在這種方式下,需要編寫硬盤的底層驅動程序。
1 總體方案
華天HTTS HDTV第III代碼流回放機可以播放數字高清晰度電視HDTV碼流。該碼流回放機整體設計沒有采用在工控機上研發PCI卡驅動硬盤的方案,而是遵照AT Attachment with Packet Interface Extension(ATA/ATAPI-4)標準,用8位單片機C8051F015通過PIO方式按照LBA模式直接對硬盤進行物理級的讀寫操作。硬盤接收微控制器的命令后按照邏輯地址順序輸出 HDTV 碼流給兩片FIFO,硬盤輸出的16位數據通過兩片8位FIFO緩存后輸出給CPLD進行拆分以識別包同步和字節同步。經CPLD解析后的數據流再經過解碼器解碼及適當后處理,送顯示器、揚聲器以提供視頻、音頻信號。既可以作為MPEG解碼器的信號源,又可以作為信道編碼/調制器的信號源。
2 C8051F015內部結構
C8051F015的內部結構如圖1所示。它使用了CYGNAL的專利——CIP-51微控制器內核CIP-51。CIP-51與MCS-51的指令集完全兼容,可以使用標準803x/805x的匯編器和編譯器進行軟件開發。同時,CIP-51采用流水線結構,70%的指令執行時間為1或2個系統時鐘周期,外部晶振最大可以到25MHz。8位HDTV輸出碼流的標準時鐘頻率為19MHz和25MHz。考慮到硬盤的輸出是16位,理論上采用這款MCU完全可以達到速度要求。這里,就系統的初始化問題有幾點說明:(1)內外部晶振切換。在外部晶體振蕩器被允許時,系統晶體驅動器的輸出端XTAL2腳會出現一個瞬時脈沖,該脈沖足以在晶體實際啟動前,將OSCXCN寄存器中的XTLVLD位置1。在允許晶體振蕩器和檢查XTLVLD位之間引入1ms的延時,可以防止提前切換到外部晶振。(2)配置交叉開關。系統內部交叉開關根據優先權譯碼表將所選擇的內部數字資源分配到I/O" title="I/O">I/O引腳,寄存器XBR0、XBR1、XBR2用于選擇內部數字功能或讓I/O引腳默認為I/O端口。I/O引腳的輸出驅動器特性用端口配置寄存器PRT0CF、PRT1CF、PRT2CF和PRT3CF定義。每個端口輸出驅動器都可被配置為漏極開路或推挽方式。將配置寄存器的相應位配置為漏極開路,并在外部加1kΩ的上拉電阻,可用3.3V供電的C8051F015去驅動5V供電的硬盤。初始化程序:
void sysclk_init(void)
{? ? WDTCN = 0xde; ???????????? //禁止看門狗定時器
???????? WDTCN = 0xad;
???????? //啟動外部振蕩器
? ??? OSCXCN=0x67; ????? ???? //外接24MHz的晶振
? ?? ?? //配置外部晶體
? ????? while((OSCXCN&XTLVLD_BIT)==0)
? ????? {}
? ????? OSCICN=0x88; ????? //選擇外部振蕩器作為系統時鐘,禁止內部振蕩
}
? ?? ? //配置交叉開關
?????? ?void xbar_init(void)
{ XBR0=0x04;? ?????????? //RX TX連到兩個引腳
? ? XBR1=0x04;????????????????????//INT0連到斷口引腳
? XBR2=0x40;???? ????????//使能交叉開關和弱上拉
? ? PRT0CF=0xff;??????????????????//控制FIFO讀寫,使能
PRT1CF=0x07;? ?????????//控制CPLD讀寫,使能
? PRT2CF=0x00; ??????????//P0口的所有輸出為弱上拉(寫硬盤命令字)
PRT3CF=0x00; ????//控制硬盤讀寫,使能
??? }
?
3 ATA/ATAPI-4標準下的硬盤內部寄存器和PIO讀時序關系
3.1 硬盤內部寄存器
目前,大部分計算機配置了兩個IDE接口,地址范圍分別為:0170~0177,0376~0376(對應PC機的 Secondary IDE Channel)和01F0~01F6,03F6~03F6(對應PC機的Primary IDE Channel)。地址譯碼如表1所示。
?
·數據寄存器(170 R//W):這是一個16位PIO數據寄存器,用于對扇區的讀、寫和格式化操作。MCU通過該寄存器向硬盤控制寄存器寫入或從硬盤控制器讀出扇區緩沖區的數據。
·錯誤寄存器(171 R):該寄存器是一個8位的寄存器,它反映控制寄存器在診斷方式或操作方式下的錯誤原因。
·扇區數寄存器(172 R//W):它記錄讀、寫命令的扇區數。當多扇區" title="多扇區">多扇區傳輸時,每完成一個扇區操作,該寄存器自動減1,直至為0。如果初值為0,則表示256;如果有錯誤發生,該寄存器包含已經操作成功的扇區數。
·扇區號寄存器(173 R//W):它記錄讀、寫和校驗命令指定的起始扇區號。本文用LBA模式。該寄存器記錄邏輯扇區的0字節。
·柱面號寄存器(174 175 R//W):它記錄讀、寫、校驗、尋址和格式化命令指定的柱面號,在LBA尋址方式下,這2個寄存器包含起始扇區的1和2字節。
·驅動器/磁頭寄存器(176 R//W):它記錄讀、寫、校驗、尋道和格式化命令指定的驅動器號、磁頭號和尋址方式。在ATA/ATAPI-4中其定義如表2所示。
?
?
HS0~HS3(磁頭選擇):在LBA方式中,是邏輯扇區的高4位。
DEV驅動器選擇:0選擇主驅動器,1選擇從驅動器。
L(LBA方式):L=1,置驅動器為LBA模式;L=0,置驅動器為CHS模式。
·狀態寄存器" title="狀態寄存器">狀態寄存器(177 R):反映了硬盤執行命令后的狀態。讀該寄存器要清除中斷請求信號,為避免清除中斷,可以讀輔助狀態寄存器376h。這兩個寄存器的內容完全一樣。在ATA/ATAPI-4中其定義如表3所示。
?
?
BSY:驅動器忙。
DRDY:驅動器準備好。
DRQ:請求服務,驅動器請求通過寄存器與處理器交換一個字節數據。
ERR:命令執行錯誤。
3.2 硬盤PIO方式下特定區域多扇區讀的操作
????如果想從硬盤的特定扇區讀出碼流信息,首先主機(C8051F015)要對驅動器/磁頭寄存器、柱面號寄存器、扇區號寄存器、扇區數寄存器設置參數。完畢后要等待至少400ns才能去讀狀態寄存器的參數判斷以上設置是否有效。硬盤接收命令后置BSY=1,并開始執行命令。硬盤如果準備好傳送數據包,就置DRQ=1,同時清零BSY。主機循環讀狀態寄存器或輔助狀態寄存器判斷BSY=0&DRQ=1,一旦硬盤狀態符合要求,主機寫參數0x80(128扇區)到數據寄存器(0x170),并寫0x20(PIO讀)到命令寄存器(0x177),表示要求讀出硬盤相應地址里的數據塊。硬盤判斷數據寄存器被置數后立即置BSY=1&DRQ=0。主機讀到置位信息后給硬盤讀時鐘,硬盤輸出數據直到數據包傳完為止。
4 系統設計方案
4.1系統硬件構成
基于8位微控制器的系統設計方案如圖2所示。主系統中以C8051F015為控制核心,C8051F015產生硬盤和FIFO的讀寫時序(為了避免硬盤寄存器參數也被寫入FIFO,在硬件上要把二者的讀寫時鐘分開。);硬盤輸出的16位數據分高低8位分別送入兩片64KB的FIFO緩存。數據經緩存后持續地輸出到CPLD,CPLD對16位數據流進行拆分,同時識別包同步和字節同步。這樣,原始的一路HDTV碼流就被分成3路輸送給解碼器解碼。主系統通過串行總線與前面板相連,采用通用單片機AT89C51為前面板的控制核心。AT89C51接收來自鍵盤的命令并在LCD上以文字和圖形的方式展現在用戶面前,同時通過串口通信,啟動主控制器執行命令。
?
4.2 系統軟件設計
4.2.1 存碼流部分
本系統沒有引入操作系統和文件格式,所以碼流文件存入硬盤時就不能按文件格式,而只能按二進制流的方式從PC機的碼流文件中讀出數據,再按同樣的方式寫入裸盤。為了解決存碼流的問題,試圖調用BIOS中斷,讓BIOS的磁盤服務例程負責把INT13的讀寫請求轉化為ATA界面對硬盤的請求,并執行數據I/O傳輸的物理動作。但由于BIOS本身寄存器的限制,用它去訪問硬盤有8.4G容限的問題。如果想突破這個限制而用擴展的INT13,將是一個比較復雜的過程。可以利用PC機上的Secondary IDE Channel(0x170~0x177)作為硬盤寄存器的端口地址。在這個硬件平臺下,可以直接將fread()函數讀出的碼流按塊寫入目標硬盤,甚至不要求太多地考慮時序問題。
4.2.2 讀碼流部分
這部分軟件是在上述硬件系統平臺上直接編程。系統在啟動硬盤前要等待串行中斷,接收由前面板發出的命令,再根據接收的數據信息具體決定應該播放哪幾個節目;隨后對硬盤、FIFO進行初始化,啟動CPLD,FIFO輸出數據時鐘信號,并讓硬盤按命令輸出數據流。數據在總線穩定的時間內給FIFO寫時鐘,以采集正確的碼流信息(這里強調時序)。FIFO有“半滿”(HF)標志,用HF去觸發中斷,有中斷請求,就讓硬盤輸出64KB的數據。如此循環,保證FIFO不空。當FIFO輸出第一個數據時,CPLD開始對數據流進行拆分,并按照HDTV碼流的格式標準對數據流進行判別(HDTV碼流188字節為一個包,每個包頭是0x47),即每計數1次,就輸出一個比特同步,每計數188次并識別下一個數為0x47,就輸出一個包同步。這部分程序流程如圖3。
?
4.2.3 應用程序
系統設置硬盤寄存器參數時,首先調用SetMode()函數設定硬盤的IDLE狀態和自掉電功能,可以保證硬盤在不工作的情況下,磁頭會復位到“登陸區”;然后調用SetAdress()函數選擇對應的寄存器;接下來可以調用ReadSector()函數進行多扇區讀操作。以下是寄存器選擇子函數和多扇區讀子函數。
//寄存器選擇子函數:
void SetAddress(unsigned char cs, unsigned char adr) {
???? DA0=((adr & 0x01)==0x01);
? ??? DA1=((adr & 0x02)==0x02);
? ??? DA2=((adr & 0x04)==0x04);
? ?? ? if (cs==CTRL) {
??? ????????????? nCS1FX=1;
??? ????????????? nCS3FX=0;
??????? } else {
??? ????????????? nCS1FX=0;
? ??????????????? nCS3FX=1;
??????? }
}?
//多扇區讀子函數:
unsigned char ReadSector(unsigned long point,unsigned char *Buffer) {
??? unsigned int i,k;
WriteBYTE(CMD,6, 0xe0); ????????????? ?// LBA模式
WriteBYTE(CMD,5, point>>16);?? // LBA模式下的高16位地址
WriteBYTE(CMD,4, point>>8);? ?? // LBA 模式下的高8位地址
WriteBYTE(CMD,3,point);?? ?????? // LBA 模式下的低8位地址
??? WriteBYTE(CMD,2, 0x80);??????????????? // 一次讀寫的扇區數
// Issue read sector command...
WriteBYTE(CMD,7, 0x20);????? // 0x20為多扇區讀命令
Timer10mSec=10000;
while((ReadBYTE(CMD,7)&0x08)!=0x08 && Timer 10mSec);???//等待DRQ=1或者timeout
if (Timer10mSec==0) return 0xFF;
// Fetch the sector...
LSBDATA=ALLINPUT;
// Select address and activate CS
SetAddress(CMD, 0);
for(k=0;k<0x80;k++)
for (i=0; i<512; i+=2) {???? ?? // 一次讀兩字節
????????????? nDIOR=0;????????????? ?????? //硬盤的讀時鐘
?? ??? ?????? WCK=1;????????? ?? //FIFO的寫時鐘
????????????? WCK=0;
????????? nDIOR=1;
}
?? ? ?nCS1FX=1;????? ????????? //復位CS
????? nCS3FX=1;
?????? ? ?? ? return ReadBYTE(CMD, 1);?????? //返回錯誤寄存器的信息
}
本文是“第三代碼流回放機研制”課題的一個重要組成部分。本方案利用微控制器對硬盤進行基于LBA模式下的讀寫操作(不用操作系統),硬軟件簡潔可靠,技術上也解決了前期產品的兩個難題:
(1)一些舊機器的BIOS不支持INT 13h Extension,無法訪問8.4G以上硬盤空間;
????(2)WINDOWS操作系統不支持存儲1.2G以上碼流文件。
將此系統逆向設計,能夠研發出適時錄制TS流和衛星節目的儀器。
?
參考文獻
1 Information Technology—AT Attachment with Packet Interface Extention-(ATA/ATAPI-4).
2 馬忠梅,籍順心,張 凱,馬 巖.單片機的C語言應用程序設計.北京:北京航空航天大學出版社,1999
2 譚浩強. C程序設計.北京:清華大學出版社,1991
3 李 剛, 林 凌.與8051兼容的高性能,高速單片機—C8051Fxxx.北京:北京航空航天大學出版社,2002
4 侯伯亨,顧 新.VHDL硬件描述語言與數字邏輯電路設計.西安:西安電子科技大學出版社,2001