引 言
當前,高密度可編程邏輯器件CPLD,由于具有巨大的靈活性而廣泛應用于狀態(tài)機、同步、譯碼、解碼、計數(shù)、總線接口、串并轉(zhuǎn)換等很多方面,而且在信號處理領(lǐng)域的應用也活躍起來。通用串行總線(USB,Universal Serial Bus)接口既是一種快速、雙向、廉價、可以進行熱插拔的串行接口技術(shù),也是一種體系完備的通信協(xié)議,已逐漸成為計算機的主流接口。USB接口的收發(fā)模塊用于進行數(shù)據(jù)編碼和與外部相連。本文主要介紹使用CPLD實現(xiàn)通用串行總線(USB)接口收發(fā)模塊。
1、USB收發(fā)模塊的數(shù)據(jù)規(guī)范和通信協(xié)議
1.1 USB的數(shù)據(jù)編碼方式
USB系統(tǒng)在進行串行數(shù)據(jù)傳輸時,使用一種NRZI(None Return Zero Invert ,即不歸零反向碼)的編碼方案。在該編碼方案中,“1”表示電平不變,“0”表示電平改變。圖1
給出了一個數(shù)據(jù)流和它的NRZI編碼。
如果直接使用這樣的編碼方式會遇到一個很嚴重的問題:若重復相同的“1”信號持續(xù)進入時,就會使電平長時間無法轉(zhuǎn)換,逐漸積累從而導致讀取數(shù)據(jù)產(chǎn)生嚴重的脫節(jié)。為了確保信號發(fā)送的準確性,當在USB總線上發(fā)送一個數(shù)據(jù)包時,傳輸設(shè)備就要進行位插入操作。所謂位插入操作是指在數(shù)據(jù)被編碼前,在數(shù)據(jù)流中每6個連續(xù)的“1”后面插入一個“0”,從而強迫NRZI碼發(fā)生變化。
位插入操作如圖2所示。USB數(shù)據(jù)的傳送是由低位到高位。每包數(shù)據(jù)的開始是一個同步格式,同步格式固定為80H。從同步格式開始,位插入操作貫穿于整個數(shù)據(jù)傳輸過程,在同步格式后的數(shù)據(jù)“1”作為真正數(shù)據(jù)流的第一位。位插入操作是由傳輸端強制執(zhí)行的。
1.2 USB收發(fā)模塊工作過程
USB收發(fā)模塊的發(fā)送單元由串行化﹑位插入﹑NRZI編碼等幾部分組成;接收單元由NRZI解碼﹑反位插入﹑并行化等組成。整個收發(fā)單元的工作過程如下:發(fā)送端在數(shù)據(jù)發(fā)送前,首先要將并行數(shù)據(jù)串行化,然后進行位插入,最后進行NRZI編碼;接收端在接收數(shù)據(jù)前就必須先執(zhí)行NRZI解碼,然后進行反位插入,最后進行串行數(shù)據(jù)并行化。
2、USB收發(fā)模塊的設(shè)計流程
使用VHDL語言進行USB收發(fā)模塊的設(shè)計采用自下而上的設(shè)計方法,即先設(shè)計其各部分功能單元,再編寫頂層文件調(diào)用各功能單元以實現(xiàn)其總體功能。根據(jù)USB收發(fā)模塊的工作過程可以確定其設(shè)計流程。下面以發(fā)送模塊為例,介紹各模塊的具體實現(xiàn)。
2.1 串行化部分的設(shè)計
USB收發(fā)模塊傳輸?shù)臄?shù)據(jù)都是串行數(shù)據(jù),一個串行數(shù)據(jù)由10位組成:1位啟動位,8位數(shù)據(jù)位,1位停止位。由于系統(tǒng)內(nèi)部處理的都是并行數(shù)據(jù),所以在發(fā)送之前應該進行并行數(shù)據(jù)串行化處理。串行化的過程是將輸入的并行數(shù)據(jù)按由低位到高位的順序存入一個有序數(shù)組中,并按串行數(shù)據(jù)格式進行編碼。根據(jù)這一原理可以編寫VHDL程序?qū)崿F(xiàn)串行化功能。
2.2 位插入部分的設(shè)計
在位插入部分的設(shè)計中,最關(guān)鍵的步驟是計數(shù)器的設(shè)置和使用。位插入的進行與否由計數(shù)器的值決定,而計數(shù)器的值則由輸入串行數(shù)據(jù)的狀態(tài)直接決定。由于只有在連續(xù)輸入6個“1”之后,即計數(shù)器的值為6時才進行一次位插入,而在計滿6個數(shù)之前,只要有一位輸入的串行數(shù)據(jù)為“0”,則計數(shù)器立即清零。因此,在每讀入一位數(shù)據(jù)之后,就要判斷其是否為“1”,以決定計數(shù)器加一還是清零。正是由于計數(shù)器狀態(tài)極易發(fā)生改變,所以增加了編程的復雜性。
2.3 NRZI編碼部分的設(shè)計
NRZI編碼的原理如前所述。
2.4 數(shù)據(jù)傳輸控制方式
為了能對數(shù)據(jù)位進行準確的操作,選取每位數(shù)據(jù)包含4個時鐘周期(CLK)。例如低速1.5Mbit/s的工作時鐘應選取為6MHz 。在串行數(shù)據(jù)發(fā)送控制器中設(shè)置了一個2位的時鐘計數(shù)器,利用該計數(shù)器高位的狀態(tài)來產(chǎn)生數(shù)據(jù)發(fā)送時鐘(TXCLK),在每個發(fā)送時鐘的上升沿發(fā)送一位數(shù)據(jù)。串行數(shù)據(jù)發(fā)送過程的波形如圖3所示。
最后,在完成各功能單元設(shè)計的情況下,編寫頂層文件調(diào)用各個功能單元,以實現(xiàn)USB收發(fā)模塊的整體功能。在頂層文件中設(shè)置了外部輸入和輸出端口,作為信號和數(shù)據(jù)進出發(fā)送模塊的端口;同時還定義了許多不同的中間變量和信號,用以將各個功能單元連接起來,從而實現(xiàn)數(shù)據(jù)和信號從輸入到輸出的連續(xù)工作過程。
3、USB收發(fā)模塊的部分VHDL源代碼
下面針對串行數(shù)據(jù)的NRZI編碼,給出USB收發(fā)模塊的部分VHDL程序源代碼:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY NRZI IS
PORT (EN : IN STD_LOGIC;
IND1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
OUT1 : OUT STD_LOGIC_VECTOR(8DOWNTO 0));
END NRZI;
ARCHITECTURE behav OF NRZI IS
BEGIN
PROCESS(EN)
BEGIN
IF EN =‘1’ THEN OUT1(0) 《= ‘1’;
IF IND1(0)=‘1’ THEN OUT1(1) 《=OUT1(0);
ELSIF IND1(0)=‘0’ THEN OUT1(1) 《= NOT(OUT1(0));
END IF;
END IF;
IF IND1(1)=‘1’ THEN OUT1(2) 《=OUT1(1);
ELSIF IND1(1)=‘0’ THEN OUT1(2) 《= NOT(OUT1(1));
END IF;
END IF;
… … …
IF IND1(7)=‘1’ THEN OUT1(8) 《=OUT1(7);
ELSIF IND1(7)=‘0’ THEN OUT1(8) 《= NOT(OUT1(7));
END IF;
END IF;
END IF;
END PROCESS;
END behav;
在能夠體現(xiàn)模塊功能的前提下,該程序中的輸入與輸出均設(shè)置為八位串行數(shù)據(jù),但輸出起始位設(shè)置為
“1”,實際輸出為九位。在實際使用中輸入與輸出數(shù)據(jù)均有可能超出八位,但也只是增加了編程的復雜性,其設(shè)計方法并不發(fā)生改變。
4、仿真結(jié)果
USB收發(fā)模塊串行數(shù)據(jù)NRZI編碼單元的VHDL源代碼通過MAXPLUSⅡ軟件仿真[4]后的波形如圖4所示。
由圖4所示的仿真波形,當使能端EN=‘1’時,電路才開始工作,輸入數(shù)據(jù)和輸出數(shù)據(jù)的起始位都為‘1’。將仿真波形中的輸入數(shù)據(jù)IND1和輸出波形OUT1與圖1所示的NRZI編碼原理波形相比,發(fā)現(xiàn)仿真波形符合NRZI編碼原理,即說明此VHDL源程序完全符合設(shè)計要求。其余各個功能單元的VHDL源代碼也可用相同的方法進行仿真,將仿真所得結(jié)果與理論推導結(jié)果相比較可知各程序符合設(shè)計要求。
5、收發(fā)模塊的硬件實現(xiàn)
在完成源程序的設(shè)計和仿真之后,可以選用可編程邏輯器件來具體實現(xiàn)USB收發(fā)模塊的硬件功能。本設(shè)計選用Altera公司MAX3000A系列可編程邏輯器件中的EPM3032A芯片。EPM3032A的集成度為600可用門 ﹑32個宏單元﹑34個可用I/O引腳,外加電壓為3.3V。這些基于EEPROM器件的組合傳輸延遲快至4.5ns。以上述發(fā)送模塊為例,定義輸入引腳為:時鐘CLK,使能端EN,8位輸入IN0~IN7。定義輸出引腳為 :串行數(shù)據(jù)輸出端口OUT。將程序下載至芯片中,即可實現(xiàn)該設(shè)計的硬件功能。
6、結(jié)束語
USB收發(fā)模塊是USB接口的重要組成部分,傳統(tǒng)的設(shè)計方法是使用現(xiàn)有的芯片組合為硬件電路。這種開發(fā)方法要受到現(xiàn)有芯片可實現(xiàn)功能的制約,開發(fā)時間長,電路調(diào)試復雜,設(shè)計修改困難,易產(chǎn)生資源浪費。
本文作者創(chuàng)新點:采用VHDL語言作為設(shè)計工具,結(jié)合相應的CPLD器件來實現(xiàn)USB收發(fā)模塊的硬件功能,大大地縮短了設(shè)計周期,提高了設(shè)計的可靠性、靈活性,彌補了傳統(tǒng)設(shè)計方法的不足。
責任編輯:gt
評論