FPGA與CF卡的接口設(shè)計(jì)
1 前言
CF卡是目前應(yīng)用最為廣泛的存儲(chǔ)卡,由于它不帶驅(qū)動(dòng)器,也沒有其它的移動(dòng)部件,因此,極少出現(xiàn)機(jī)械故障,使存儲(chǔ)的圖像數(shù)據(jù)更加安全。CF卡的使用壽命也非常長,即使用上 100多年也可以保證數(shù)據(jù)完好無損。而且 CF卡耗電量小,只有普通硬盤的 5%。與其它存儲(chǔ)卡相比,容量大是 CF卡的另一個(gè)優(yōu)勢,目前主流產(chǎn)品已經(jīng)達(dá)到 512Mb和 1Gb標(biāo)準(zhǔn)。另外它還具備速度快、價(jià)格便宜等優(yōu)點(diǎn)。
最近幾年,FPGA[1]以其應(yīng)用的靈活方便蓬勃發(fā)展,在通信、航空航天、醫(yī)療設(shè)備、消費(fèi)類電子產(chǎn)品等領(lǐng)域一展身手。使用 FPGA控制 CF的技術(shù)到目前為止還沒有成熟,本文從硬件和軟件角度出發(fā),介紹了 FPGA與 CF卡的接口設(shè)計(jì)、給出了用 Verilog HDL語言編寫的讀取 CF卡中數(shù)據(jù)的源程序并給出了用雙 RAM訪問 CF卡的編程技巧。
2 系統(tǒng)設(shè)計(jì)
系統(tǒng)采用 EP1C6Q240C8[2]為主控制芯片,它是 Altera公司開發(fā)的一款 Cyclone系列的FPGA芯片。它有豐富的 I/O接口、PLL和內(nèi)部存儲(chǔ)資源,無需外接 SRAM,既節(jié)約成本又簡化了設(shè)計(jì)過程。
系統(tǒng)采用 Kingston公司生產(chǎn)的 CF卡,容量為 1Gb。
2.1 系統(tǒng)硬件設(shè)計(jì) [3][4]
500)this.style.width=500;" border="0" />
CF卡的訪問方式有三種,分別為 I/O模式、 Memory模式和 TrueIDE模式。本系統(tǒng)采用 TrueIDE模式訪問 CF卡。需要注意的是當(dāng)主機(jī)電源一直接通時(shí),拔插 CF卡將會(huì)使其從原來的 TrueIDE方式重新配置成 Memory方式。所以要讓 CF卡一直工作在 TrueIDE模式,需要在電源加電啟動(dòng)時(shí)將 OE輸人信號(hào)接地。此方式也支持 8位存取方式。
當(dāng) CSEL輸入信號(hào)接地時(shí), CF卡工作方式為主模式;CSEL輸入信號(hào)接高電平時(shí),CF卡工作方式為從模式。本系統(tǒng)中將 CF卡配置成從模式工作方式。當(dāng)采用 TrueIDE訪問模式工作時(shí),第 3位到第 10位地址線需要接地, WE信號(hào)需要接高電平。
500)this.style.width=500;" border="0" />
2.2 系統(tǒng)軟件設(shè)計(jì)
CF卡的數(shù)據(jù)存儲(chǔ)以扇區(qū)為基本單位。系統(tǒng)讀寫 CF卡時(shí)都是以扇區(qū)為單位進(jìn)行的。為了滿足系統(tǒng)對(duì)速度和控制連續(xù)性的要求,系統(tǒng)的程序設(shè)計(jì)中,利用 FPGA的內(nèi)部資源開辟了兩塊 RAM,用于存儲(chǔ)一個(gè)扇區(qū)的數(shù)據(jù),這樣從 CF卡讀數(shù)據(jù)到 RAM和將 RAM中的數(shù)據(jù)讀到被控系統(tǒng)中就成了兩個(gè)相對(duì)獨(dú)立的工作過程,這樣既利用了 CF卡大容量的存儲(chǔ)特性又利用了 EP1C6Q240C8的工作速度快和內(nèi)部資源豐富的優(yōu)點(diǎn)。圖 2是利用雙 RAM的具體程序設(shè)計(jì)的流程圖。
3 CF卡讀數(shù)據(jù)
從 CF卡讀取一個(gè)扇區(qū)的數(shù)據(jù),如圖 3所示。首先根據(jù)表 1所示的控制命令設(shè)定 8位工作模式、設(shè)置讀取的扇區(qū)數(shù)目、相應(yīng)地址和訪問模式;然后發(fā)送讀命令(0x20),等待 CF卡準(zhǔn)備就緒后,從數(shù)據(jù)寄存器中連續(xù)讀取一個(gè)扇區(qū)的數(shù)據(jù)放入到數(shù)據(jù)緩沖區(qū)。
500)this.style.width=500;" border="0" />
500)this.style.width=500;" border="0" />
4 CF卡讀數(shù)據(jù)源程序
由于篇幅限制,這里僅給出部分程序。
always @(posedge clk or negedge reset)
begin if((set_finished==0)||((cf_to_ram1)&(ram1_finished==0))||((cf_to_ram2)& (ram2_finished==0))||((cf_to_ram2_first)&(ram2_finished==0)))
begin if(time_cont <= 166) begin
time_cont <= time_cont +1; end else begin
time_cont <= 0; end
end if(time_cont == 26) begin
ceaddr <= `features_wr ; write_data <= `features_data; write_start <= 1;
end if(time_cont == 28) begin
iowr <= 0; end if(time_cont == 34) begin
iowr <= 1; end if(time_cont == 35) begin
ceaddr <= 5'b11111; write_start <= 0; end
end
5 結(jié)束語
本設(shè)計(jì)采用 FPGA讀寫 CF卡,既利用了 FPGA的內(nèi)部資源豐富和設(shè)計(jì)方便的優(yōu)點(diǎn),同時(shí)利用了 CF卡容量大、體積小和價(jià)格低廉等優(yōu)點(diǎn),給出了高效讀寫 CF卡的方法,該方法已成功應(yīng)用于實(shí)際系統(tǒng)中。