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