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