MCU與USB設(shè)備控制器IP核的設(shè)計
收發(fā)器的模型如圖3所示,Dplus為正相USB差分?jǐn)?shù)據(jù)線,Dminu為負(fù)相USB差分?jǐn)?shù)據(jù)線,兩者都是雙向的。 OEn為USB發(fā)送使能,為低時作為發(fā)送功能,單相輸出口被置為高阻,為高時作為接收功能,單相輸入口被 置為高阻。
2.3.2 Dpll(數(shù)字鎖相環(huán))模塊
數(shù)字鎖相環(huán)實現(xiàn)時鐘恢復(fù)、分頻及同步時鐘;該模塊用外部的6M時鐘CLK進(jìn)行分頻,產(chǎn)生1.5M的USB系 統(tǒng)時鐘,以及把收發(fā)器產(chǎn)生的差分信號和并行信號進(jìn)行鎖相,避免產(chǎn)生亞穩(wěn)態(tài)。
2.3.3 SIE(串行接口引擎)模塊
SIE是USB控制器的主要模塊;實現(xiàn)協(xié)議層的功能、信息包的解析和組合、同步信號識別、位填充和位 剝離、NRZI(非歸零反轉(zhuǎn))的編碼和解碼、同步字段和包結(jié)束碼的檢測和生成、CRC5、CRC16校驗等功能;圖 4是設(shè)備接收主機發(fā)送數(shù)據(jù)時的狀態(tài)機。
從圖4可以看出設(shè)備在沒有數(shù)據(jù)傳輸時處于空閑態(tài),低速設(shè)備空閑時D+、D-處于J態(tài),當(dāng)有K態(tài)到來時 進(jìn)入狀態(tài)轉(zhuǎn)換;以KJKJKK為同步位,同步字段里的最后的2位是同步字段結(jié)束的記號,并且標(biāo)志了包標(biāo)識 符(PID,Packet Identifier)的開始。然后根據(jù)不同的PID分別進(jìn)入地址態(tài)或數(shù)據(jù)態(tài), 緊跟在地址態(tài)后面的 是端點態(tài),因為地址和端點分別是有7位和4位構(gòu)成共11位,所以只要5位CRC校驗就可以了,CRC校驗完后就要結(jié)束此次的包傳輸,USB協(xié)議中以2個 SE0態(tài)和一個J態(tài)來表示包的結(jié)束。在數(shù)據(jù)態(tài)判斷是否為SE0態(tài), SE0態(tài)表示8個字節(jié)的數(shù)據(jù)都發(fā)送完畢,因為非SE0態(tài)即J、K態(tài)都表示工作態(tài),所以在數(shù)據(jù)態(tài)中如果總線上 沒有SE0到來就一直接收數(shù)據(jù)。
2.3.4 ENDPCTL(端點控制)模塊
設(shè)計中用到兩個端點,端點0和端點1。端點0是半雙工傳輸,主要是在設(shè)備的枚舉過程中用于控制傳輸, 端點1是在枚舉完成后的中斷傳輸中用設(shè)備和主機之間的數(shù)據(jù)傳輸。由于中斷傳輸主要是通過端點1輸入, 但也有少許輸出(如鍵盤的LED燈輸出),我們?yōu)榱斯?jié)省資源,所以由端點0完成少許的輸出。
2.3.5 BUFCTL(緩沖器控制)模塊
緩沖器控制模塊是USB和SRAM及ROM的連接橋梁,在主機要求輸入數(shù)據(jù)的IN token狀態(tài)時,控制器 從SRAM或ROM中取出數(shù)據(jù)送給主機或主機輸出數(shù)據(jù)的OUT token狀態(tài)時,控制器把接收到的數(shù)據(jù)存放在 SRAM中,它主要根據(jù)串行接口引擎SIE的接收或發(fā)送準(zhǔn)備信號來控制讀寫信號,保證數(shù)據(jù)能正確傳輸。 USB與MCU共享通用寄存器區(qū),usbREQUST為來自USB的請求訪問存儲器信號,usbADDR為USB訪問存 儲器的地址信號,usbADDR[11:8]不等于零時屬于USB訪問程序存儲器的地址空間。當(dāng)USB與MCU同時訪 問數(shù)據(jù)存儲器(SRAM)時,MCU具有優(yōu)先權(quán)。
3 系統(tǒng)驗證環(huán)境
在完成了Verilog 代碼設(shè)計后,我們進(jìn)行了仿真、綜合驗證,前仿用Modelsim、綜合用Synplify Pro、 綜合后仿真用Cadence 中的NC_Verilog,主要由于NC_Verilog 在后仿中的速度要優(yōu)于Modelsim,提高了效 率;圖5 是用NC_Verilog 仿真設(shè)備的枚舉過程;
任何USB 的數(shù)據(jù)傳輸都是建立在成功通過枚舉的基礎(chǔ)上的,只有正確完成了枚舉,USB 主機和設(shè)備之 間的通信才正在建立起來。所以枚舉是USB 通信的最關(guān)鍵的一步。在驗證過程中模擬了PC 主機向設(shè)備發(fā)送 各種命令來完成枚舉。在圖5 中pid[3:0]中D、3、9、2、1、B 分別表示Setup、DATA0、IN、Ack、Out、 DATA1。當(dāng)設(shè)備插上PC 時主機會持續(xù)的SE0 來復(fù)位設(shè)備,這時設(shè)備的地址默認(rèn)為00,然后主機第一次發(fā)送 Setup 包來獲取設(shè)備的前8 個設(shè)備描述符,當(dāng)設(shè)備成功返回數(shù)據(jù)后,主機第二次發(fā)送Setup 包來給設(shè)備配 置地址,從圖中faddr[7:0]可以看出我們給設(shè)備配置的地址為02,在這以后主機都是通過這個地址向設(shè)備 獲取全部的18 個設(shè)備描述符和全部的配置描述符集,在取完這些描述符后主機對設(shè)備進(jìn)行配置,主機就識 別出設(shè)備了。
4 結(jié)論
本文描述了自主研發(fā)的MCU+USB設(shè)備控制器的設(shè)計思路。用Verilog語言對其進(jìn)行了RTL級描述。用 Modelsim進(jìn)行前仿驗證,并在Cadence公司的NC_Verilog上通過了綜合后仿驗證。為了進(jìn)一步驗證設(shè)計的正 確性,本項目選擇了XILINX公司的Virtex xc2s2006pq208芯片及XC18V02的存儲器,并把上述IP核綜合到此 FPGA上加以驗證。綜合結(jié)果表明,協(xié)議層模塊占用了1672個Slice(71%),652個Slice Registers(13%),2870個4 input LUTs(61%),51個bonded IOBs(36%)。使用上華工藝,該芯片已經(jīng)流片返回了,并通過demo 板連接到PC上,PC可以檢測出為人體輸入學(xué)設(shè)備,說明該芯片完全符合制定的設(shè)計要求。
評論