本發(fā)明屬于電子設(shè)計(jì)自動化領(lǐng)域,涉及一種多通道數(shù)據(jù)緩存實(shí)現(xiàn)方法,具體涉及一種基于FPGA/CPLD的多通道數(shù)據(jù)緩存實(shí)現(xiàn)方法。
背景技術(shù):在計(jì)算機(jī)廣泛應(yīng)用的今天,數(shù)據(jù)采集的重要性是十分顯著的,它是計(jì)算機(jī)與外部物理世界連接的橋梁,廣泛應(yīng)用于工業(yè)領(lǐng)域、汽車行業(yè)、交通運(yùn)輸、航空航天、電力能源及土木工程等領(lǐng)域。數(shù)據(jù)緩存是數(shù)據(jù)采集過程中的重要環(huán)節(jié),尤其是高速采集領(lǐng)域,數(shù)據(jù)緩存技術(shù)直接限制了采樣頻率的上限,影響了采樣質(zhì)量。在高速數(shù)據(jù)緩存方面,現(xiàn)場可編程門陣列(FPGA)擁有普通單片機(jī)和數(shù)字信號處理器(DSP)無法比擬的優(yōu)勢,F(xiàn)PGA打破了順序執(zhí)行的模式,在每個(gè)時(shí)鐘周期內(nèi)完成更多的處理任務(wù),超越了DSP的運(yùn)算能力,F(xiàn)PGA的時(shí)鐘頻率高、內(nèi)部時(shí)延小,全部控制邏輯都可由硬件完成,而且速度快,組成形式靈活,并可以集成外圍控制、譯碼和接口電路。而且利用EDA工具進(jìn)行設(shè)計(jì)、綜合和驗(yàn)證,可加速設(shè)計(jì)過程,降低開發(fā)風(fēng)險(xiǎn),縮短了開發(fā)周期,但現(xiàn)有的數(shù)據(jù)緩存的過程中,多通道數(shù)據(jù)存儲時(shí),各通道數(shù)據(jù)流的控制邏輯比較復(fù)雜,極易出現(xiàn)數(shù)據(jù)丟包現(xiàn)象,而且常常會出現(xiàn)存儲空間的浪費(fèi)。
技術(shù)實(shí)現(xiàn)要素:本發(fā)明的目的在于克服上述現(xiàn)有技術(shù)的缺點(diǎn),提供了一種基于FPGA/CPLD的多通道數(shù)據(jù)緩存實(shí)現(xiàn)方法,該方法充分利用RAM存儲空間,并且利用數(shù)字電路本身特性,通過合理設(shè)計(jì)計(jì)數(shù)器,大大簡化了控制邏輯時(shí)序的編程,數(shù)據(jù)存儲可靠性大大提高。為達(dá)到上述目的,本發(fā)明所述的基于FPGA/CPLD的多通道數(shù)據(jù)緩存實(shí)現(xiàn)方法包括以下步驟:1)判斷RAM中每個(gè)存儲單元的字節(jié)數(shù)RN的大小,當(dāng)RAM中每個(gè)存儲單元的字節(jié)數(shù)RN大于1時(shí),則將RAM中的每個(gè)存儲單元平均劃分為RN個(gè)單元,當(dāng)RAM中每個(gè)存儲單元的字節(jié)數(shù)RN等于1時(shí),則不進(jìn)行處理;2)在RAM中為每個(gè)通道劃分出獨(dú)立的緩存區(qū),再根據(jù)每個(gè)通道數(shù)據(jù)的字節(jié)數(shù)BN及采樣頻率確定各緩存區(qū)的字節(jié)數(shù)CS,其中,CS≥BN,然后對通道進(jìn)行編碼,其中,通道的編碼按緩存區(qū)從低字節(jié)到高字節(jié)的方向以及從低地址到高地址的方向逐個(gè)增加,設(shè)通道的個(gè)數(shù)為CN,則有CN*CS≤RN*2^AN,其中,AN為RAM地址的位數(shù);3)單片機(jī)通過0x8010操作端口將初始目標(biāo)地址的低8位寫入CPLD/FPGA地址緩存器的ADDR_BUF[7..0]中,并通過0x8011操作端口將將初始目標(biāo)地址的高8位寫入CPLD/FPGA地址緩存器的ADDR_BUF[15..8]中,再將CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址通過0x8012操作端口寫入RAM地址寄存器的DMAwrAddr及MCUrdAddr中;4)單片機(jī)通過0x8020操作端口啟動采樣脈沖,鎖存各通道當(dāng)前的通道數(shù)據(jù),并啟動DMA,然后啟動計(jì)數(shù)器DMAcnt,計(jì)數(shù)器DMAcnt由高位AddrH及低位AddrL拼接而成;5)在DMAcnt信號的驅(qū)動下,計(jì)數(shù)器DMAcnt中低位AddrL記一次數(shù)對應(yīng)相鄰RN個(gè)通道的緩存區(qū)地址加1,再以計(jì)數(shù)器DMAcnt作為多通道選擇器的控制位,將通過多通道選擇器的控制位選出的對應(yīng)通道數(shù)據(jù)放置到數(shù)據(jù)線上,然后在寫信息號的操作下,將通道數(shù)據(jù)寫入到對應(yīng)通道的緩存區(qū)內(nèi),當(dāng)計(jì)數(shù)器DMAcnt中的低位AddrL計(jì)數(shù)溢出時(shí),則表示相鄰RN個(gè)通道數(shù)據(jù)成功存入對應(yīng)通道的緩存區(qū)內(nèi),當(dāng)計(jì)數(shù)器DMAcnt的低位AddrL計(jì)數(shù)溢出時(shí),則會自動向計(jì)數(shù)器DMAcnt的高位AddrH加1,此時(shí)當(dāng)計(jì)數(shù)器DMAcnt的高位AddrH的數(shù)據(jù)地址為高位,則將地址自動指向下一個(gè)相鄰RN個(gè)通道,同時(shí)計(jì)數(shù)器DMAcnt的低位AddrL重新計(jì)數(shù),并開始下一個(gè)相鄰RN個(gè)通道數(shù)據(jù)的寫入,從而將所有通道數(shù)據(jù)存入對應(yīng)緩存區(qū)中;6)當(dāng)所有通道數(shù)據(jù)存入到對應(yīng)緩存區(qū)后,計(jì)數(shù)器DMAcnt的高位AddrH產(chǎn)生溢出,并產(chǎn)生脈沖信號,表示CN個(gè)通道一次采樣數(shù)據(jù)存入完成,然后給RAM地址寄存器中DMAwrAddr的地址中間部分AddrM加1,避免新采樣數(shù)據(jù)覆蓋上次采樣數(shù)據(jù),當(dāng)RAM地址寄存器中DMAwrAddr的地址中間部分AddrM溢出后,給各通道地址重新賦予初始地址,進(jìn)而實(shí)現(xiàn)循環(huán)數(shù)據(jù)緩存。步驟3)中將CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址通過0x8012操作端口寫入RAM地址寄存器的DMAwrAddr及MCUrdAddr的具體操作為:當(dāng)0x8012端口寫入數(shù)據(jù)的第0位為1,即bit0=1時(shí),將CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址寫入到RAM地址寄存器的MCUrdAddr中,當(dāng)0x8012端口寫入數(shù)據(jù)的第3位為1,即bit3=1時(shí),CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址寫入到RAM地址寄存器的DMAwrAddr中。RAM地址寄存器的DMAwrAddr由地址高位AddrH、地址中間部分AddrM及地址低位AddrL三部分拼接而成,其中,地址高位AddrH的位數(shù)等于log2(CN/RN),地址中間部分AddrM的位數(shù)等于log2(CS)減去地址低位AddrL的位數(shù),地址低位AddrL的位數(shù)等于log2(BN)。本發(fā)明具有以下有益效果:本發(fā)明所述的基于FPGA/CPLD的多通道數(shù)據(jù)緩存實(shí)現(xiàn)方法實(shí)現(xiàn)多通道數(shù)據(jù)緩存的過程中,單片機(jī)的讀地址及DMA寫地址各自獨(dú)立操作,在DMAcnt信號驅(qū)動下,RAM讀地址和寫地址分時(shí)占用數(shù)據(jù)線,讀操作和寫操作互不干擾;本發(fā)明中通過分析通道地址與通道數(shù)據(jù)間的對應(yīng)關(guān)系,巧妙的設(shè)計(jì)了計(jì)數(shù)器DMAcnt,十分方便的將通道地址與通道數(shù)據(jù)在邏輯時(shí)序上對應(yīng)起來,大大簡化了編程難度,適用于多通道的數(shù)據(jù)存儲。附圖說明圖1為本發(fā)明中實(shí)施例一的設(shè)計(jì)原理圖;圖2為本發(fā)明中實(shí)施例一中RAM的原理圖;圖3為本發(fā)明中實(shí)施例一中寫入初始目標(biāo)地址過程中的波形圖;圖4為本發(fā)明中實(shí)施例一中計(jì)數(shù)器DMAcnt計(jì)數(shù)時(shí)從0到2的過程中的仿真波形圖;圖5為本發(fā)明中實(shí)施例一中計(jì)數(shù)器DMAcnt計(jì)數(shù)時(shí)從3到5的過程中的仿真波形圖;圖6為本發(fā)明中實(shí)施例一中計(jì)數(shù)器DMAcnt計(jì)數(shù)時(shí)從6到7的過程中的仿真波形圖;圖7為本發(fā)明中實(shí)施例一中計(jì)數(shù)器DMAcnt計(jì)數(shù)時(shí)從8到10的過程中的仿真波形圖;圖8為本發(fā)明中實(shí)施例一中計(jì)數(shù)器DMAcnt計(jì)數(shù)時(shí)從11到13的過程中的仿真波形圖;圖9為本發(fā)明中實(shí)施例一中計(jì)數(shù)器DMAcnt計(jì)數(shù)時(shí)從14到15的過程中的仿真波形圖。具體實(shí)施方式下面結(jié)合附圖對本發(fā)明做進(jìn)一步詳細(xì)描述:本發(fā)明所述的基于FPGA/CPLD的多通道數(shù)據(jù)緩存實(shí)現(xiàn)方法包括以下步驟:1)判斷RAM中每個(gè)存儲單元的字節(jié)數(shù)RN的大小,當(dāng)RAM中每個(gè)存儲單元的字節(jié)數(shù)RN大于1時(shí),則將RAM中的每個(gè)存儲單元平均劃分為RN個(gè)單元,當(dāng)RAM中每個(gè)存儲單元的字節(jié)數(shù)RN等于1時(shí),則不進(jìn)行處理;2)在RAM中為每個(gè)通道劃分出獨(dú)立的緩存區(qū),再根據(jù)每個(gè)通道數(shù)據(jù)的字節(jié)數(shù)BN及采樣頻率確定各緩存區(qū)的字節(jié)數(shù)CS,其中,CS≥BN,然后對通道進(jìn)行編碼,其中,通道的編碼按緩存區(qū)從低字節(jié)到高字節(jié)的方向以及從低地址到高地址的方向逐個(gè)增加,設(shè)通道的個(gè)數(shù)為CN,則有CN*CS≤RN*2^AN,其中,AN為RAM地址的位數(shù);3)單片機(jī)通過0x8010操作端口將初始目標(biāo)地址的低8位寫入CPLD/FPGA地址緩存器的ADDR_BUF[7..0]中,并通過0x8011操作端口將將初始目標(biāo)地址的高8位寫入CPLD/FPGA地址緩存器的ADDR_BUF[15..8]中,再將CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址通過0x8012操作端口寫入RAM地址寄存器的DMAwrAddr及MCUrdAddr中;4)單片機(jī)通過0x8020操作端口啟動采樣脈沖,鎖存各通道當(dāng)前的通道數(shù)據(jù),并啟動DMA,然后啟動計(jì)數(shù)器DMAcnt,計(jì)數(shù)器DMAcnt由高位AddrH及低位AddrL拼接而成;5)在DMAcnt信號的驅(qū)動下,計(jì)數(shù)器DMAcnt中低位AddrL記一次數(shù)對應(yīng)相鄰RN個(gè)通道的緩存區(qū)地址加1,再以計(jì)數(shù)器DMAcnt作為多通道選擇器的控制位,將通過多通道選擇器的控制位選出的對應(yīng)通道數(shù)據(jù)放置到數(shù)據(jù)線上,然后在寫信息號的操作下,將通道數(shù)據(jù)寫入到對應(yīng)通道的緩存區(qū)內(nèi),當(dāng)計(jì)數(shù)器DMAcnt中的低位AddrL計(jì)數(shù)溢出時(shí),則表示相鄰RN個(gè)通道數(shù)據(jù)成功存入對應(yīng)通道的緩存區(qū)內(nèi),當(dāng)計(jì)數(shù)器DMAcnt的低位AddrL計(jì)數(shù)溢出時(shí),則會自動向計(jì)數(shù)器DMAcnt的高位AddrH加1,此時(shí)當(dāng)計(jì)數(shù)器DMAcnt的高位AddrH的數(shù)據(jù)地址為高位,則將地址自動指向下一個(gè)相鄰RN個(gè)通道,同時(shí)計(jì)數(shù)器DMAcnt的低位AddrL重新計(jì)數(shù),并開始下一個(gè)相鄰RN個(gè)通道數(shù)據(jù)的寫入,從而將所有通道數(shù)據(jù)存入對應(yīng)緩存區(qū)中;6)當(dāng)所有通道數(shù)據(jù)存入到對應(yīng)緩存區(qū)后,計(jì)數(shù)器DMAcnt的高位AddrH產(chǎn)生溢出,并產(chǎn)生脈沖信號,表示CN個(gè)通道一次采樣數(shù)據(jù)存入完成,然后給RAM地址寄存器中DMAwrAddr的地址中間部分AddrM加1,避免新采樣數(shù)據(jù)覆蓋上次采樣數(shù)據(jù),當(dāng)RAM地址寄存器中DMAwrAddr的地址中間部分AddrM溢出后,給各通道地址重新賦予初始地址,進(jìn)而實(shí)現(xiàn)循環(huán)數(shù)據(jù)緩存。步驟3)中將CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址通過0x8012操作端口寫入RAM地址寄存器的DMAwrAddr及MCUrdAddr的具體操作為:當(dāng)0x8012端口寫入數(shù)據(jù)的第0位為1,即bit0=1時(shí),將CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址寫入到RAM地址寄存器的MCUrdAddr中,當(dāng)0x8012端口寫入數(shù)據(jù)的第3位為1,即bit3=1時(shí),CPLD/FPGA地址緩存器中ADDR_BUF內(nèi)的初始目標(biāo)地址寫入到RAM地址寄存器的DMAwrAddr中。RAM地址寄存器的DMAwrAddr由地址高位AddrH、地址中間部分AddrM及地址低位AddrL三部分拼接而成,其中,地址高位AddrH的位數(shù)等于log2(CN/RN),地址中間部分AddrM的位數(shù)等于log2(CS)減去地址低位AddrL的位數(shù),地址低位AddrL的位數(shù)等于log2(BN)。實(shí)施例一參考圖1、圖2、圖3、圖4、圖5、圖6、圖7、圖8及圖9,RAM為512x16bit,即AN等于19,RN等于2,通道數(shù)CN等8,每通道采集數(shù)據(jù)為32位,即BN等于4,RAM中每個(gè)通道劃分區(qū)域大小CS為64K字節(jié),具體實(shí)現(xiàn)包括以下步驟:1)劃分RAM,RAM中的每個(gè)存儲單元為2個(gè)字節(jié),故將RAM每個(gè)存儲單元?jiǎng)澐譃?個(gè)單字節(jié)單元;2)在RAM中為每個(gè)通道劃分出獨(dú)立的緩存區(qū),每塊緩存區(qū)的字節(jié)數(shù)劃分成64Kbits,其中,緩存區(qū)占用RAM一半空間,故將RAM最高位地址在FPGA里面設(shè)為0,即A18等于0;3)單片機(jī)將初始目標(biāo)地址的低8位寫入CPLD/FPGA地址緩存器的ADDR_BUF[7..0],操作端口為0x8010,操作數(shù)為0x00,并將初始目標(biāo)地址的高8位寫入CPLD/FPGA地址緩存器的ADDR_BUF[15..8],操作端口為0x8011,操作數(shù)為0x00,將CPLD/FPGA地址緩存器ADDR_BUF中地址寫入RAM地址寄存器DMAwrAddr及MCUrdAddr,操作端口為0x8012,操作數(shù)據(jù)為0x09(bit3=1、bit0=1),ADDR_BUF的內(nèi)容同時(shí)寫入單片機(jī)地址操作寄存器MCUrdAddr及DMA地址寄存器DMAwrAddr,其中,DMA地址寄存器DMAwrAddr共18位,最高位定位0,RAM地址寄存器的DMAwrAddr由地址高位AddrH、地址中間部分AddrM及地址低位AddrL三部分拼接而成,地址高位AddrH的位數(shù)等于2,地址中間部分AddrM的位數(shù)等于14,地址低位AddrL的位數(shù)等于2;4)單片機(jī)啟動采樣脈沖,操作端口為0x8020,鎖存各通道當(dāng)前數(shù)據(jù)并啟動DMA,隨后啟動計(jì)數(shù)器DMAcnt,計(jì)數(shù)器DMAcnt由低位AddrH和高位AddrL兩部分拼接而成,位數(shù)為4;5)在DMAcnt信號驅(qū)動下,計(jì)數(shù)器DMAcnt的低位AddrL計(jì)數(shù)對應(yīng)相鄰2個(gè)通道的緩存區(qū)地址的按字節(jié)逐個(gè)增加,計(jì)數(shù)器DMAcnt為0x00時(shí),地址對應(yīng)0x00000,DMAcnt為0x03時(shí),地址對應(yīng)0x00003,此時(shí)以計(jì)數(shù)器DMAcnt作為多通道選擇器的控制位選出對應(yīng)通道編碼,并將選出的通道編碼放在數(shù)據(jù)線上,計(jì)數(shù)器DMAcnt為0x00時(shí),對應(yīng)數(shù)據(jù)為0x1212,DMAcnt為0x03時(shí),對應(yīng)數(shù)據(jù)為0x7878,在寫信號作用下,數(shù)據(jù)被寫入對應(yīng)通道的緩存區(qū),即通道0和通道1的0x00000被寫入0x12,通道0和通道1的0x00003被寫入0x78;6)當(dāng)DMAcnt低位AddrL計(jì)數(shù)溢出后,表示相鄰2個(gè)通道數(shù)據(jù)成功存入對應(yīng)通道的緩存區(qū),計(jì)數(shù)器DMAcnt高位AddrL計(jì)數(shù)溢出會自動向MAcnt高位AddrH加1,如之前地址為0x00000,現(xiàn)在則變?yōu)?x10000,即實(shí)現(xiàn)了地址自動指向下一個(gè)2個(gè)相鄰?fù)ǖ?,此時(shí)計(jì)數(shù)器DMAcnt的低位AddrL繼續(xù)開始計(jì)數(shù),可實(shí)現(xiàn)新2個(gè)相鄰?fù)ǖ罃?shù)據(jù)寫入,如此可以將所有通道數(shù)據(jù)存入對應(yīng)緩存區(qū);7)所有通道數(shù)據(jù)存入對應(yīng)緩存區(qū)后,計(jì)數(shù)器DMAcnt的高位AddrH會產(chǎn)生溢出,產(chǎn)生一個(gè)脈沖信號intY[0],表示8個(gè)通道數(shù)據(jù)全部存入完成,此時(shí)將RAM地址寄存器中DMAwrAddr的地址中間部分AddrM加1,即第二次采集緩存地址從0x00004開始,以免新采樣數(shù)據(jù)覆蓋上次采樣數(shù)據(jù);8)RAM地址寄存器中DMAwrAddr的地址中間部分AddrM溢出后,各通道地址重新賦予初始地址,如此循環(huán)可實(shí)現(xiàn)數(shù)據(jù)持續(xù)存儲。