基于IP核的PSTN短消息終端SoC軟硬件協(xié)同設計
SoC中的FSK/DTMF調制解調器、LCD接口、鍵盤(pán)掃描、數據存儲器擴展頁(yè)面尋址接口以及線(xiàn)路狀態(tài)控制接口等,都作為片內外設連接在DW8051_core所特有的SFR內部總線(xiàn)上。8 KB的片上RAM和片外512 KB的Flash存儲器AM29LV040都連接在DW8051_core的MEM總線(xiàn)上,如圖1所示。
圖1 經(jīng)過(guò)擴展的DW8051_core SFR總線(xiàn)以及SoC系統結構
3.2 外設在SFR總線(xiàn)上的地址映射
DW8051_core通過(guò)SFR地址總線(xiàn)sfr_addr[0:7],SFR讀信號sfr_rd,SFR寫(xiě)信號sfr_wr,SFR數據輸出總線(xiàn)sfr_data_out[0:7],數據輸入總線(xiàn)sfr_data_in[0:7]來(lái)訪(fǎng)問(wèn)映射到SFR總線(xiàn)上的片上外設。每一個(gè)外設都通過(guò)SFR地址映射成SFR總線(xiàn)上的一個(gè)寄存器,如圖2所示。
對這些擴展SFR寄存器的訪(fǎng)問(wèn)和對普通寄存器的訪(fǎng)問(wèn)在形式上并沒(méi)有區別。當應用程序使用Keil的C51編譯器時(shí),修改reg51.h文件可以讓編譯器確認用戶(hù)所擴展的SFR寄存器。對擴展SFR外設地址的分配可以根據設計需要而不同,但是只能使用DW8051_core沒(méi)有保留和占用的地址,否則會(huì )發(fā)生沖突。在reg51.h文件中添加以下語(yǔ)句讓編譯器確認擴展的寄存器:
sfr SEND_MODEM_DATA = 0xf1;/* 擴展,發(fā)送Modem數據,只寫(xiě) */
sfr READ_FSK_DECODE = 0xf1;/* 擴展,讀FSK解調數據,只讀 */
sfr READ_DTMF_DECODE = 0xf2;/* 擴展,讀DTMF解調數據,只讀 */
sfr MODEM_STATUS = 0xf3;/* 擴展,Modem狀態(tài),只讀 */
sfr MODEM_CTRL = 0xf2;/* 擴展,Modem控制,只寫(xiě) */
sfr KEYPAD_VALUE = 0xf4;/* 擴展,讀鍵盤(pán)值,只讀 */
sfr FLASH_PAGE = 0xf5; /* 擴展,頁(yè)面尋址,只寫(xiě) */
sfr LCD_DATA = 0xf6; /* 擴展,LCD數據,讀寫(xiě) */
sfr LCD_CTRL = 0xf7; /* 擴展,LCD控制,只寫(xiě) */
sfr CIRCUIT_STATUS = 0xff; /* 擴展,線(xiàn)路狀態(tài),只讀 */
sfr CIRCUIT_CTRL = 0xff; /* 擴展,線(xiàn)路控制,只寫(xiě) */
為了節約SFR總線(xiàn)地址資源,一些擴展的SFR寄存器在硬件上設計為只能寫(xiě)、不可讀,另外一些被設計為只能讀、不可寫(xiě)。這樣,二者可以復用同一個(gè)SFR總線(xiàn)地址,比如MODEM_CTRL和READ_DTMF_DECODE寄存器;但是這樣在需要先將那些“只寫(xiě)”寄存器的內容讀出,運算后再進(jìn)行寫(xiě)回操作的時(shí)候就很不方便。這里采用了鏡像變量的方法,為每一個(gè)“只寫(xiě)”寄存器建立一個(gè)全局變量,每次寫(xiě)寄存器操作后,都對這個(gè)全局變量進(jìn)行同樣的寫(xiě)操作,時(shí)刻保持變量值和寄存器的內容一致,在需要讀出的時(shí)候就使用此全局變量。MODEM_CTRL寄存器的bit0控制Modem是DTMF還是FSK模式。下面以對這一位的操作為例說(shuō)明。
建立它的鏡像全局變量:
unsigned char xdata modem_ctrl_mirror;
定義控制位:
#define MODEM_B0_MODE0x01// 1-DTMF, 0-FSK
圖2 片上外設在SFR總線(xiàn)上的物理連接
評論