2023年12月30日發(作者:幼兒園安全管理)

雙端口RAM在高速數據采集中的應用
利用傳統方法設計的高速數據采集系統由于集成度低、電路復雜,高速運行電路干擾大,電路可靠性低,難以滿足高速數據采集工作的要求。應用FPGA可以把數據采集電路中的數據緩存、控制時序邏輯、地址譯碼、總線接口等電路全部集成進一片芯片中,高集成性增強了系統的穩定性,為高速數據采集提供了理想的解決方案。下面以一個高速數據采集系統為例介紹雙端口RAM的應用。
該系統要求實現對頻率為5MHz的信號進行采樣,系統的計算處理需要對信號進行波形分析,信號采樣時間為25μs。根據設計要求,為保證采樣波形不失真,A/D采樣頻率用80MHz,采樣精度為8位數據寬度。計算得出存儲容量需要2K字節。其系統結構框圖如圖3所示,圖4給出了具體電路連接圖。
根據設計要求,雙端口RAM的LPM_WIDTH參數設置為8,LPM_WIDTHAD參數設置為11(211=2048),使用讀寫使能端及讀寫時鐘。ADCLK、WRCLK和地址發生器的計數頻率為80MHz。
A/D轉換值對雙端口RAM的寫時序為順序寫方式,每完成一次A/D轉換,存儲一次數據,地址加1指向下一單元,因此寫地址發生器(RAM_CONTROL)采用遞增計數器實現,計數頻率與ADCLK、WRCLK一致以保證數據寫入時序的正確性。寫操作時序由地址和時鐘發生器、A/D轉換時鐘和雙端口RAM的寫時鐘產生。停止采樣時AD_STOP有效,寫地址發生器停止計數,同時停止對RAM的寫操作。將地址發生器的計數值接至DSP總線可以獲取采樣的首尾指針。地址發生器單元一般用(VHDL)語言編程實現,然后生成符號文件RAM_CONTROL在上層文件調用。其部分VHDL語言程序如下:
對雙端口RAM的讀操作采用存儲器映像方式,其讀出端口接DSP的外擴RAM總線,DSP可隨機讀取雙端口RAM的任一單元數據,以方便波形分析。 由于
LPM_RAM_DP模塊的讀端數據總線q不具有三態特性,因此調用三態緩沖器74244,通過其將輸出數據連接到DSP數據總線上。
在高速數據采集電路中,數據緩存也可以用FIFO或單端口RAM實現。用FIFO進行數據緩存,由于其已經把地址發生部分集成在模塊單元內,因此省去了一部分程序編寫,但是DSP卻不能任意地訪問FIFO的存儲單元,只能是順序寫入/讀出數據,這樣設計,系統的靈活性就大大降低。如果DSP的分析計算需要特定單元的數據,則系統的效率和速度會因為無效數據的讀取而降低。使用單端口RAM進行數據緩存同樣存在一些問題。由RAM側看,DSP和A/D轉換器是掛在一條總線上的,當從RAM向DSP傳輸數據的時候,A/D轉換器就不能有數據傳到該總線上,否則會產生總線沖突,引起芯片損壞。解決這個問題就需要增加電路。應用雙端口RAM就不存在這個問題,而且使系統結構劃分更明確,符合模塊化設計思想。
結語
綜上所述,利用FPGA芯片的高速工作特性,以及其內部集成嵌入式陣列和大規模邏輯陣列的特點,設計存儲器,三態緩存器、地址發生器、以及復雜的時序邏輯電路等,應用于高速數據采集電路中可以使電路大大簡化,性能提高。同時由于FPGA可實現在系統編程(ISP),使系統具有可在線更新、升級容易等特點,是一種較為理想的系統及電路實現方法。
在FPGA中構造存儲器
許多系列的FPGA芯片內嵌了存儲陣列,如ALTERA EPlK50芯片內嵌了5K字節的存儲陣列。因此,在FPGA中實現各種存儲器,如單/雙端口RAM、單/雙端口ROM、先進先出存儲器FIFO等非常方便,而且具有諸多優點。其硬件可編程的特點允許開發人員靈活設定存儲器數據的寬度、存儲器的大小、讀寫控制邏輯等,尤其適用于各種特殊存儲要求的場合。FPGA/FPGA器件可工作于百兆頻率以上,其構造的存儲器存取速度也可達百兆次/秒以上,這樣構成的高速存儲器能夠勝任存儲數據量不太大,但速度要求很高的工作場合。
FPGA中構造存儲器主要有兩種方法實現。一是通過硬件描述語言如VHDL、AHDL、Verilog
HDL等編程實現。二是調用MAX+PLUSⅡ自帶的庫函數實現。調用庫函數方法構造存儲器較硬件描述語言輸入方式更為方便、靈活、快捷和可靠,故也更常用之。
利用庫函數構造雙端口RAM
在MAX+PLUSⅡ中有幾個功能單元描述庫。prim邏輯元庫,包括基本邏輯單元電路,如與、或、非門,觸發器、輸入、輸出引腳等;mf宏功能庫,包括TTL數字邏輯單元如74系列芯片;而下文將要詳細介紹的參數化雙端口RAM模塊所在的參數化模塊庫(mega-lpm)
中,包括各種參數化運算模塊(加、減、乘、除)、參數化存儲模塊(單、雙端口RAM、ROM、FIFO等)以及參數化計數器、比較器模塊等等。庫中的這些元件功能邏輯描述經過了優化驗證,是數字電路設計中的極好選擇。
mega-lpm庫中共有五種參數化雙端口RAM模塊:ALTDPRAM、LPM_RAM_DP、CSDPRAM、LPM_RAM_DQ和LPM_RAM_IO。其中ALTDPRAM和LPM_RAM_DP模塊讀寫有兩套總線,讀和寫有各自的時鐘線、地址總線、數據總線和使能端,可同時進行讀寫操作。除此之外,ALTDPRAM模塊還有一個全局清零端口。CSDPRAM模塊則有a、b兩組寫端時鐘線、地址總線、數據總線和使能端,可同時對RAM進行寫操作,但對RAM讀、寫只能分時進行。LPM_RAM_DQ模塊相對簡單,讀與寫共用一組地址總線,有各自的數據線和時鐘線。LPM_RAM_IO模塊只有一組地址總線和數據總線。
mega-1pm函數庫中的雙端口RAM模塊全是參數化調用,這為設計帶來極大的方便。通過對各種參數的取舍、參數設置和組合,再結合讀寫控制邏輯就可以構造出設計需要的存儲器模塊。雙端口RAM常見的應用模式主要有以下兩種:
1.存儲器映像方式。該方式可以隨意對存儲器的任何單元進行讀寫操作。其主要應用于多CPU的共享數據存儲、數據傳送等。該方式中,讀、寫控制線、地址總線和數據總線有兩套。根據兩端口之間數據的傳送方向為單向或雙向,又有單向數據總線和雙向數據總線之分。
2.順序寫方式。該方式對RAM的寫操作只能順序寫入。這種情況適用于對象特性與時間緊密相關或傳送數據與順序密切相關的場合,如文件傳送、時序過程、波形分析等。根據寫控制邏輯的不同,可對RAM進行循環寫入或一次寫入方式。該方式下的讀操作可以是存儲器映像讀或順序讀,前一種有較大的靈活性,而后一種則類似于FIFO形式。
在讀、寫使用獨立的地址總線和數據總線時,可以同時對RAM不同單元進行讀寫操作。根據不同控制邏輯的要求,對讀寫時鐘、時鐘使能端口可以適時設置,以滿足控制需要。
我用的FPGA芯片是EP1C6Q240C6,其內部靜態RAM容量 Up to 294,912 RAM bits (36,864
bytes)
如果作為采集圖像的中間緩存,分辨率為1280*1024的一幀圖像,圖像數據量為1280*1024*8bit(RAW DATA) = 10485760 bit = 1310720 bytes,遠遠大于RAM的容量,那么就采用雙口RAM存儲1行的圖像數據。
lpm_ram_dp 參數化雙端口 RAM 宏模塊
// synopsys translate_off
`timescale 1 ps / 1 ps
// synopsys translate_on
module dpram16k_1to512_32 (
data,
wren,
wraddress,
rdaddress,
wrclock,
rdclock,
wr_aclr,
rd_aclr,
q);
input [0:0] data;
input wren;
input [13:0] wraddress;
input [8:0] rdaddress;
input wrclock;
input rdclock;
input wr_aclr;
input rd_aclr;
output [31:0] q;
wire [31:0] sub_wire0;
wire [31:0] q = sub_wire0[31:0];
altsyncram altsyncram_component (
.wren_a (wren),
.aclr0 (wr_aclr),
.clock0 (wrclock),
.aclr1 (rd_aclr),
.clock1 (rdclock),
.address_a (wraddress),
.address_b (rdaddress),
.data_a (data),
.q_b (sub_wire0)
// synopsys translate_off
,
.addressstall_a (),
.addressstall_b (),
.byteena_a (),
.byteena_b (),
.clocken0 (),
.clocken1 (),
.data_b (),
.q_a (),
.rden_b (),
.wren_b ()
// synopsys translate_on
);
defparam
altsyncram_ed_device_family = "Cyclone",
altsyncram_ion_mode = "DUAL_PORT",
altsyncram__a = 1,
altsyncram_d_a = 14,
altsyncram_ds_a = 16384, //2^14 = 16384
altsyncram__b = 32,
altsyncram_d_b = 9,
altsyncram_ds_b = 512, //2^9 = 512
altsyncram__type = "altsyncram",
altsyncram__byteena_a = 1,
altsyncram_a_reg_b = "UNREGISTERED",
altsyncram__aclr_a = "CLEAR0",
altsyncram_rol_aclr_a = "CLEAR0",
altsyncram_s_aclr_a = "CLEAR0",
altsyncram_s_reg_b = "CLOCK1",
altsyncram_s_aclr_b = "CLEAR1",
altsyncram_a_aclr_b = "NONE",
altsyncram__up_uninitialized = "FALSE";
endmodule
//
雙端口RAM的設計與測試(verilog)
以下是用verilog語言寫的同步雙端口設計文件(來自Actel官方文件中)
寫的很精煉
編程風格也不錯,該文檔中注釋的相當明確
自己綜合和仿真測試過,沒問題
測試
測試寫的比設計長多了,寫的很好值得學習,也可以直接用在你的設計中
`timescale 1 ns/100 ps
module test;
parameter width = 8; // bus width
parameter addr = 8; // # of addr lines
parameter numvecs = 20; // actual number of vectors
parameter Clockper = 1000; // 100ns period
reg [width-1:0] Data;
reg [addr-1:0] WAddress, RAddress;
reg Clock, WE, RE,rst; //addition rst
reg [width-1:0] data_in [0:numvecs-1];
reg [width-1:0] data_out [0:numvecs-1];
wire [width-1:0] Q;
integer i, j, k, numerrors;
ram u0(.data(Data), .q(Q), .clk(Clock),
.rst(rst),
.wen(WE),
.ren(RE), .waddr(WAddress), .raddr(
RAddress));
initial
begin
// quential test patterns entered at neg edge Clock
data_in[0]=8'h00; data_out[0]=8'hxx;
data_in[1]=8'h01; data_out[1]=8'hxx;
data_in[2]=8'h02; data_out[2]=8'hxx;
data_in[3]=8'h04; data_out[3]=8'hxx;
data_in[4]=8'h08; data_out[4]=8'hxx;
data_in[5]=8'h10; data_out[5]=8'hxx;
data_in[6]=8'h20; data_out[6]=8'hxx;
data_in[7]=8'h40; data_out[7]=8'hxx;
data_in[8]=8'h80; data_out[8]=8'hxx;
data_in[9]=8'h07; data_out[9]=8'h01;
data_in[10]=8'h08; data_out[10]=8'h02;
data_in[11]=8'h09; data_out[11]=8'h04;
data_in[12]=8'h10; data_out[12]=8'h08;
data_in[13]=8'h11; data_out[13]=8'h10;
data_in[14]=8'h12; data_out[14]=8'h20;
data_in[15]=8'h13; data_out[15]=8'h40;
data_in[16]=8'h14; data_out[16]=8'h80;
data_in[17]=8'haa; data_out[17]=8'h80;
data_in[18]=8'h55; data_out[18]=8'haa;
data_in[19]=8'haa; data_out[19]=8'h55;
end
initial
begin
rst=0;
Clock = 0;
WE = 0;
RE = 0;
WAddress = 0;
RAddress = 0;
Data = 0;
numerrors = 0;
#200 rst=1; //there rst ret to ram
#200 rst=0;
end
always#(Clockper / 2) Clock = ~Clock;
initial
begin
#2450 WE = 1;
#8000 WE = 0;
RE = 1;
#8000 RE = 0;
WE = 1;
#1000 RE = 1;
end
initial
begin
#1450;
for (k = 0; k <= width; k = k + 1)
#1000 WAddress = k;
WAddress = 0;
end
initial
begin
#9450;
for (j = 0; j <= width; j = j + 1)
#1000 RAddress = j;
RAddress = 0;
end
initial
begin
$display("");
//skip first rising edge
for (i = 0; i <= numvecs-1; i = i + 1)
begin
@(negedge Clock);
// apply test pattern at neg edge
Data = data_in;
@(podge Clock)
#450; //45 ns later
// check result at podge + 45 ns
$display("Pattern#%d time%d: WE=%b; Waddr=%h; RE=%b; Raddr=%h; Data=%h;
Expected Q=%h;Actual Q=%h", i, $stime, WE, WAddress, RE, RAddress,Data,
data_out, Q);
if ( Q !== data_out )
begin
$display(" ** Error");
numerrors = numerrors + 1;
end
end
if (numerrors == 0)
$display("Good! End of Good Simulation.");
el
if (numerrors > 1)
$display(
"%0d ERRORS! End of Faulty Simulation.",
numerrors);
el
$display(
"1 ERROR! End of Faulty Simulation.");
#1000 $finish; // after 100 ns later
end
endmodule
設計
為了方便,我將其設計代碼也放在這兒,你可以直接用綜合和仿真
`timescale 1 ns/100 ps
//#############################################
//# Behavioral dual-port SRAM description :
//# Active High write enable (WE)
//# Active High read enable (RE)
//# Rising clock edge (Clock)
//#############################################
module reg_dpram(Data, Q, Clock, WE, RE, WAddress,
RAddress);
parameter width = 8;
parameter depth = 8;
parameter addr = 3;
input Clock, WE, RE;
input [addr-1:0] WAddress, RAddress;
input [width-1:0] Data;
output [width-1:0] Q;
reg [width-1:0] Q;
reg [width-1:0] mem_data [depth-1:0];
// ############################################
// # Write Functional Section
// ############################################
always @(podge Clock)
begin
if(WE)
mem_data[WAddress] = #1 Data;
end
//#############################################
//# Read Functional Section
//#############################################
always @(podge Clock)
begin
if(RE)
Q = #1 mem_data[RAddress];
end
endmodule
本文發布于:2023-12-30 00:09:47,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1703866187130942.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:雙口RAM應用實例.doc
本文 PDF 下載地址:雙口RAM應用實例.pdf
| 留言與評論(共有 0 條評論) |