• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            雙口RAM應用實例

            更新時間:2023-12-30 00:09:47 閱讀: 評論:0

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

            雙口RAM應用實例

            雙端口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

            雙口RAM應用實例

            本文發布于:2023-12-30 00:09:47,感謝您對本站的認可!

            本文鏈接:http://www.newhan.cn/zhishi/a/1703866187130942.html

            版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。

            本文word下載地址:雙口RAM應用實例.doc

            本文 PDF 下載地址:雙口RAM應用實例.pdf

            標簽:數據   端口   存儲器   電路   設計
            留言與評論(共有 0 條評論)
               
            驗證碼:
            推薦文章
            排行榜
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實用文體寫作網旗下知識大全大全欄目是一個全百科類寶庫! 優秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 中文字幕手机在线看片不卡| 91在线无码精品秘 入口九色十| av在线免费观看你懂的| 99国产成+人+综合+亚洲欧美| 四虎成人精品无码| 国产深夜福利在线免费观看| 97久久久亚洲综合久久| 欧美成人无码a区视频在线观看| 成年人尤物视频在线观看| 亚洲精品国模一区二区| 色欲色香天天天综合网站免费| 久久国产V一级毛多内射| 久久精品国产久精国产果冻传媒| 国产精品乱人伦一区二区| 亚洲欧美色一区二区三区| 亚洲精品中文字幕二区| 最近的最新的中文字幕视频| 国产精品一二三区蜜臀av| 国产高在线精品亚洲三区| 台湾佬自拍偷区亚洲综合| 香蕉99国内自产自拍视频| 亚洲国产精品色一区二区| 亚洲精品无码日韩国产不卡av| www欧美在线观看| 91久久夜色精品国产网站| 亚洲国产午夜理论片不卡| 中国女人熟毛茸茸A毛片| japanese无码中文字幕| 国产精品色婷婷亚洲综合看片| 伊在人间香蕉最新视频| 无套内谢少妇毛片在线| 国产精品毛片一区二区| 18禁超污无遮挡无码网址 | 亚洲精品视频免费| 国产va免费精品观看| 国产一区二区在线观看我不卡| 国产粉嫩系列一区二区三| 艳妇乳肉豪妇荡乳在线观看| 日韩放荡少妇无码视频| 亚韩精品中文字幕无码视频| 777米奇色狠狠888俺也去乱|