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