數據交換機的傳送速率很高,當其和串行口通信時(shí),在發(fā)送前把數據分為兩部分分別發(fā)送到串行口,然后經(jīng)過(guò)數據合并轉換器把各個(gè)串行口的數據合并在一起并轉換成PCM流。本文介紹了基于CPLD芯片EPM7128設計的數據合并轉換器。 1 數據合并轉換器硬件電路 1.1 主要硬件簡(jiǎn)介 EPM7128是可編程的大規模邏輯器件,為ALTERA公司的MAX7000系列產(chǎn)品,具有高阻抗、電可擦等特點(diǎn),可用門(mén)單元為2500個(gè),管腳間最大延遲為5ns,工作電壓為+5V。 IDT7205為FIFO型異步讀寫(xiě)的存儲器芯片,容量為8192×9比特,存取時(shí)間為12ns,有空、半滿(mǎn)、滿(mǎn)三個(gè)標志位,最大功耗為660mW,工作電壓為+5V。 MSM486DX屬于PC104嵌入式系統的5X86系列,為AMD-133MHz CPU,具有COM1、COM2兩個(gè)串口,一個(gè)LPT并口,一個(gè)FLOPPY接口,一個(gè)IDE接口,一個(gè)VGA/LCD接口,一個(gè)AT-KEYBOARD 接口,16個(gè)中斷,額定功率為8W,工作電壓為+5V。 1.2 數據合并轉換器電路框圖 可編程的數據合并轉換器電路框圖如圖1所示。圖中,DB為數據總線(xiàn),AB為地址總線(xiàn),R和W分別為讀寫(xiě)信號線(xiàn),INT5、INT7、INT10和INT11為四個(gè)中斷,CS1、CS2和CS3是在CPLD內部生成的地址譯碼器Addr-encoder分別送給分頻器、兩個(gè)串行口的片選信號,ORG是晶振送給分頻器的振蕩脈沖,CLK 是分頻器輸出的脈沖FrameCLK和PCMCLK,WFIFO、RFIFO是由CPLD生成的包含地址信息的訪(fǎng)問(wèn)FIFO的讀寫(xiě)脈沖, DATA_IN1和DATA_IN2為串行口輸入數據,PCM_DATA是數據合并轉換器輸出的PCM流,PCMCLKA為輸出的碼同步時(shí)鐘,WORLDCLKA為輸出的字同步時(shí)鐘。 1.3 電路工作分析 晶振把時(shí)鐘脈沖送給分頻器,分頻器含有兩個(gè)可編程的定時(shí)器。分頻器把可控的FRAMECLK和PCMCLK送給CPLD,在CPLD內部經(jīng)過(guò)邏輯組合形成三路脈沖信號,一路控制計數器形成INT5、INT7兩個(gè)幀頻中斷觸發(fā)脈沖,CPU接到中斷后立即寫(xiě)FIFO;另一路控制移位寄存器把并行數據轉換成串行數據PCM流;第三路形成RFIFO去連續讀FIFO。兩個(gè)串行口通過(guò)中斷方式(INT10、INT11)接收到外部數據后,暫存緩沖區內,按一定格式由中斷INT5控制寫(xiě)給FIFO。 2 CPLD內部邏輯電路 CPLD內部邏輯電路如圖2所示。圖中,虛線(xiàn)框內為CPLD內部電路,虛線(xiàn)框外為CPLD的I/O口。 2.1 地址譯碼器 地址譯碼器Addr-encoder用VHDL語(yǔ)言生成。Addr-encoder的輸出有總線(xiàn)驅動(dòng)器芯片74245的使能脈沖ENB,總線(xiàn)傳輸方向的使能脈沖DIR,寫(xiě)FIFO操作脈沖WFIFO,分頻器和串行口的片選CS1、CS2和CS3,FIFO數據空滿(mǎn)標志脈沖RFIFOFLAG,FIFO復位時(shí)鐘脈沖WCTRL。 2.2 數據移位部分 FRAMECLK周期是PCMCLK 的8倍,它們都是分頻器送來(lái)的脈沖。FRAMECLK反相后作為FIFO的讀信號,兩次反相后作為字同步時(shí)鐘。PCMCLK直接作為移位寄存器74165的時(shí)鐘觸發(fā)脈沖,兩者與非后的輸出低電平作為74165重裝載數據的觸發(fā)電平。它們的信號時(shí)序如圖3所示。 從三者的時(shí)序圖可知,每當一個(gè)字節的最后一位完成移位后,在FRAMECLK脈沖反相的下降沿觸發(fā)下讀取FIFO數據,這時(shí)74165的裝載使能74165STD恰好為低電平(與非結果),完成新數據裝載,然后在PCMCLK脈沖的上升沿作用下開(kāi)始新一輪次的數據移位。 2.3 幀長(cháng)計數器部分 兩個(gè)74161設計成1/64的分頻器,也叫幀長(cháng)計數器,此計數器的時(shí)鐘為FRAMECLK,計數器的輸出最高兩位邏輯與為中斷INT7,把與門(mén)輸出與次高位邏輯異或為中斷INT5。這樣,INT7比INT5在時(shí)序上早半個(gè)周期。開(kāi)機復位后,INT7脈沖首先產(chǎn)生,觸發(fā)中斷,CPU中斷后在服務(wù)程序中把64個(gè)字節數據寫(xiě)到FIFO,然后屏蔽中斷INT7,半個(gè)周期后,FIFO中還剩32個(gè)字節數據(因為FIFO的讀脈沖和FRAMECLK反相同頻)。然后中斷INT5到來(lái),CPU響應后,再寫(xiě)64個(gè)字節數據給FIFO,使FIFO中一直保持有數據的狀態(tài)(可避免讀FIFO正好落在兩個(gè)寫(xiě)FIFO之間,FIFO因無(wú)數據而讀死)。這樣,每當中斷INT5到來(lái),都寫(xiě)64字節給FIFO,周而復始,所以把64字節定為幀長(cháng)。 設PCMCLK的頻率為f(MHz),則FRAMECLK的頻率為f/8,由于幀長(cháng)為64,所以有:幀頻=f/(8×64),PCM流速率=f(bit/s)。分頻器的分頻比是通過(guò)軟件設定的,所以PCM流的速率可編程。 3 軟件設計 分頻器編程: outp(0x303,0x36)://方式3,方波。// outp(0x300,0x50);//timer0,分頻比為80。// outp(0x300,0x00); outp(0x303,0x74);//方式2,脈沖。// outp(0x301,0x08);//timer1,分頻比為8。// outp(0x301,0x00)? 數據合并: if((com1_count%24)==0) ;//串行口1的24字節數據放在 數組Frame的4~27的位置。// { com_buf1[com1_count++]=db1; //串行口1接收數據// int Original_Counter? Original_Counter=com1_count/24? memcpy(Frame[Original_Counter-1]+4,&com_buf1[com1_count-24],24); if((com2_count%24)==0) ;//串行口2的24字節數據放在 數組Frame的28~51的位置。// { com_buf2[com2_count++]=db2 ;//串行口2接收數據// int Original_Counter; Original_Counter=com2_count/24; Memcpy(Frame[Original_Counter-1]+28,&com_ Buf2[com2_count-24],24) ;//合并后的數據放在Frame ? 數組中。// 寫(xiě)FIFO: void Send_To_Fifo(int number); //Send_To_Fifo函數為中斷 服務(wù)程序的一部分。// { for int i=0;i<64;i++) outp(WFIFO Frame[number][i ]; //數組送給FIFO, 實(shí)現數據合并// ?} |