基于ARM920T設(shè)計的SMC接口研究與PC/104總線仿真
地址總線及訪問控制信號均由CPU驅(qū)動,外部設(shè)備始終處于被動接收狀態(tài),正確設(shè)定數(shù)據(jù)流向即可.
數(shù)據(jù)總線信號是時分雙向傳輸?shù)?,為遍免出現(xiàn)總線沖突,必須保證除非CPU 透過該收發(fā)器對外設(shè)進行讀訪問,否則收發(fā)器的CPU 側(cè)應(yīng)始終處于高阻狀態(tài).為此,16T245等具有輸出使能端的器件只需使輸出無效即可,而對于無使能端的收發(fā)器則應(yīng)使CPU側(cè)處于輸入狀態(tài)(高阻).
確認CPU 已向兼容PC/104總線發(fā)起讀操作的有效方法是檢查RDn的下降沿是否發(fā)生.一旦RDn下降,應(yīng)立即將收發(fā)器置成從外設(shè)流向CPU方向,且輸出使能有效,并至少保持至RDn上升沿之后,以保證可靠讀?。?p align="left">3.2 端口映射
SMC的存儲器分組片選信號CSn可作為高位地址線參加這址譯碼.任取CSi和CSj組用于兼容總線,即可分別實現(xiàn)O-0x3FFFFFF的獨立存儲器地址和IO端口地址.可用地址數(shù)量已經(jīng)遠超出XT系統(tǒng)中的1 M(存儲器)和1 K(IO端口).
在Linux系統(tǒng)中,io.h文件中聲明了函數(shù)iore—map(),用于將兼容總線上外部資源的物理地址映射到核心虛地址空間中.iounmap()函數(shù)用于取消ioremap()所做的映射.上述操作都應(yīng)在設(shè)備驅(qū)動程序中執(zhí)行.在外部資源成功映射到核心虛地址后,使用指向核心虛地址的指針就可訪問相應(yīng)設(shè)備資源,但顯然這種訪問方式與在X86平臺下差異較大.
將兼容總線視為一個獨立的字符設(shè)備,為其編寫驅(qū)動程序,實現(xiàn)對指定偏移地址的讀寫函數(shù),此處的偏移地址即對應(yīng)PC/104總線中的物理地址 .
對inb(),outb()等X86平臺下的常見的底層端口操作函數(shù),可用宏替換的方式轉(zhuǎn)由驅(qū)動中的相應(yīng)讀寫函數(shù)實現(xiàn).
3.3 總線時序控制
綜合前文所述,盡管SMC的SRAM 訪問時序非常接近PC/lO4總線,但是要實現(xiàn)高兼容性的PC/lO4,仍有兩方面問題需要解決,一是SMC驅(qū)動的SRAM 讀寫速度遠高于PC/104總線,二是為解決電平兼容問題引入的總線收發(fā)器,其數(shù)據(jù)流向和輸出使能需要適當?shù)目刂疲?p align="left"> 以下VHDL代碼根據(jù)SMC輸出的RDn和WRn設(shè)置EIOR和EIOW 時序,并適時輸出信號EXIDR,EXOE控制收發(fā)器數(shù)據(jù)流向和輸出使能.
ECLK是頻率為27 MHz是時鐘脈沖.
If ECLK’EVENT and ECLK一‘1’then
if( )then __地址無效
EXoE 一:1’;
EXDlR 一‘1’;
EIOR 一‘1’;
rdreg 一0;
else
if rdreg 1 l then
rdreg 一rdreg+ 1;
EXOE 一‘0’;
else
rdreg 一0;
EXDIR 一‘1’;
EXoE 一‘1’;
評論