0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的二進制時鐘設(shè)計方案

科技觀察員 ? 來源:hackster.io ? 作者:hackster.io ? 2022-05-13 17:41 ? 次閱讀

本方案是一個基于FPGA的二進制時鐘,使用GPS作為時間參考。

歷史上準(zhǔn)確測量時間提出了許多挑戰(zhàn)。只有約翰哈里森設(shè)計了一個可靠的時鐘,它可以在格林威治子午線保持參考時間,從而能夠在1700年代進行準(zhǔn)確的導(dǎo)航以及繪制尚未開發(fā)的海洋和陸地的圖表。

今天,我們生活在日益互聯(lián)的世界中,準(zhǔn)確的時間參考同樣重要。如果沒有一個共同的時間參考,當(dāng)我們從一個信號塔傳遞到另一個信號塔時,信號塔就無法輕松同步代碼和切換呼叫。同樣,沒有共同時間參考的時間戳業(yè)務(wù)和銀行交易也可能具有挑戰(zhàn)性,并成為事件順序的仲裁噩夢。

當(dāng)然,可用的最準(zhǔn)確的時鐘是原子鐘,但遺憾的是,它們也是最昂貴的,這限制了機構(gòu)使用它們的能力。

然而,有一個時間參考精確到+/-10ns,可以從空中免費提取,這就是全球?qū)Ш叫l(wèi)星系統(tǒng)提供的時間參考。當(dāng)然,其中最著名的是全球定位系統(tǒng)(GPS),盡管有幾個,例如GLONASS和Galileo。

所有這些衛(wèi)星都包含原子鐘,這使我們能夠?qū)崿F(xiàn)跨系統(tǒng)的高度準(zhǔn)確的時間參考。

在這個項目中,我們將使用GPS接收器Pmod接收GPS信號并對其進行處理,以便我們可以在二進制時鐘上顯示時間。

為此,我們將使用Vivado和SDK,這將是我們使用SDK的最后一個項目,因為Vitis可用。

維瓦多設(shè)計

要開始設(shè)計,我們需要做的第一件事是安裝Digilent庫,使我們能夠配置PmodGPS/

該庫支持在Vivado和SDK的硬件和軟件開發(fā)中使用Pmod。

為此,請在我們的Vivado項目中選擇、項目選項并選擇IP并導(dǎo)航到新的IP存儲庫。

poYBAGJ-JxiAFq7wAAGix69uubE373.png

我們還需要一些東西來驅(qū)動NeoPixel顯示器,同樣對于之前的項目,我在這里將一個neopixelIP模塊推送到我的github

然后我們就可以創(chuàng)建一個Vivado項目,該項目將利用這些IP模塊與PmodGPS通信。

在新的Vivado項目中,我們需要以下IP

ZynqPS-為最小化配置

PmodGPS-將在軟件控制下與PmodGPS通信

AXIBRAM控制器-使ZynqPS能夠在PL中讀取和寫入BRAM

BRAM-雙端口BRAM包含Neo像素值

NeoPixelIP-驅(qū)動NeoPixel驅(qū)動信號

處理器重置塊-為系統(tǒng)提供重置

AXI互連-使多個AXI從設(shè)備能夠連接到單個PS主設(shè)備

需要配置PS才能提供

50MHz時的結(jié)構(gòu)時鐘

20MHz的結(jié)構(gòu)時鐘-用于為NeoPixelIP提供時鐘

GPMasterAXI接口

已啟用結(jié)構(gòu)中斷

pYYBAGJ-Jx2AWgY0AAHmN9u6poU217.png

pYYBAGJ-JyeAHiFUAAHT66kVxa8219.png

pYYBAGJ-JyyAJCQRAAHrdjeVr78513.png

這應(yīng)該會產(chǎn)生如下所示的框圖

poYBAGJ-JzGAH5s6AAGXJl8NnaA363.png

在生成和導(dǎo)出位流之前,我們還需要設(shè)置引腳的IO位置。

我將在PmodGPS的Minized上使用Pmod2,在NeoPixel驅(qū)動器上使用Pmod1我們在XDC文件中執(zhí)行此操作,如下所示。

poYBAGJ-JziADewDAAIC2bEUMlM943.png

這樣我們就可以實現(xiàn)設(shè)計并將硬件設(shè)計導(dǎo)出到SDK以生成所需的軟件。

軟件設(shè)計

在SDK中,我們需要根據(jù)剛剛從Vivado導(dǎo)出的硬件設(shè)計創(chuàng)建一個新的應(yīng)用程序和BSP。

一旦在BSP中創(chuàng)建了它,我們應(yīng)該會在BSPMSS文件中看到Pmod驅(qū)動程序。

pYYBAGJ-JzyAJ75fAAOKAce1bSk614.png

對于更改,我們的軟件應(yīng)用程序?qū)⑹侵袛囹?qū)動的。

我們的軟件解決方案將遵循的架構(gòu)是

配置和初始化PmodGPS

配置和初始化BRAM控制器

配置中斷控制器并啟用來自PmodGPSUART的中斷。

等待PmodGPS鎖定信號

從PmodGPS讀取位置和時間數(shù)據(jù)

將時間轉(zhuǎn)換為二進制元素進行顯示

更新NeoPixel顯示

為了使用PmodGPS和AXIBRAM控制器,我們可以使用PmodGPS.h和xbram.h中提供的API

poYBAGJ-J0KALjRbAADV2BCxt1Y927.png

雖然可以使用xscugic.h提供的API配置中斷控制器

intSetupInterruptSystem(PmodGPS*InstancePtr,u32interruptDeviceID,u32interruptID){

intResult;

u16Options;

INTC*IntcInstancePtr=&intc;

XScuGic_Config*IntcConfig;

IntcConfig=XScuGic_LookupConfig(interruptDeviceID);

if(NULL==IntcConfig){

returnXST_FAILURE;

}

Result=XScuGic_CfgInitialize(IntcInstancePtr,IntcConfig,

IntcConfig-》CpuBaseAddress);

if(Result!=XST_SUCCESS){

returnXST_FAILURE;

}

XScuGic_SetPriorityTriggerType(IntcInstancePtr,interruptID,0xA0,0x3);

Result=XScuGic_Connect(IntcInstancePtr,interruptID,

(Xil_ExceptionHandler)XUartNs550_InterruptHandler,

&InstancePtr-》GPSUart);

if(Result!=XST_SUCCESS){

returnResult;

}

XScuGic_Enable(IntcInstancePtr,interruptID);

XUartNs550_SetHandler(&InstancePtr-》GPSUart,(void*)GPS_intHandler,

InstancePtr);

Xil_ExceptionInit();

Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,

(Xil_ExceptionHandler)INTC_HANDLER,IntcInstancePtr);

Xil_ExceptionEnable();

Options=XUN_OPTION_DATA_INTR|XUN_OPTION_FIFOS_ENABLE;

XUartNs550_SetOptions(&InstancePtr-》GPSUart,Options);

returnXST_SUCCESS;

}

我想做的第一件事是確保PmodGPS能夠鎖定信號并為我提供準(zhǔn)確的位置。

poYBAGJ-J0mAYJOWAADW0r0XmnI797.png

當(dāng)此代碼在Pmod2連接到PmodGPS的Minized上執(zhí)行時,我們會在終端上看到以下輸出,為我提供了一個位置。

poYBAGJ-J06Ac0pOAAHxfWbkJjQ016.png

為了檢查這是正確的位置,將它輸入到谷歌地圖中可以以合理的精度提供我辦公室的位置。

pYYBAGJ-J1SAPCSRAAGbbD34LII526.png

由于能夠鎖定GPS信號,因此更新了代碼以提供時間。這個時間被稱為協(xié)調(diào)世界時或簡稱UTC,UTC參考格林威治標(biāo)準(zhǔn)時間,目前也恰好與英國的時間相同。

時間作為浮點數(shù)從PmodGPS輸出,如下面的終端輸出所示。

pYYBAGJ-JpWAFBUyAAHtxcFGR7E051.png

為了能夠創(chuàng)建一個二進制時鐘,我們需要將其分解為以下內(nèi)容

小時幾十

小時單位

分十

分鐘單位

秒十

秒單位

這將使我們能夠使用NeoPixelArray繪制時間。

二進制時鐘顯示時間如下

pYYBAGJ-J26AIJyPAAG0LzRbZx4058.png

在NeoPixel上,我將在陣列中間使用6x4LED陣列。

但首先我們需要將UTC時間轉(zhuǎn)換為所需的格式,我們可以使用以下方法將時間(例如153400)拆分為正確的小時、分鐘和秒分組。

pYYBAGJ-JouAajpXAAB0yas-ZfA669.png

然后我們可以根據(jù)二進制時間顯示的需要將每個元素分成十位和單位。

poYBAGJ-JoaACx0gAABINvH1H5Q502.png

一旦我們分離了數(shù)字,我們就需要將值轉(zhuǎn)換為二進制值,為此我創(chuàng)建了一個簡單的子例程

poYBAGJ-JoaACx0gAABINvH1H5Q502.png

這個函數(shù)返回一個代表二進制數(shù)的四位向量,對于這個例子,我們不需要超過4位。

由于NeoPixel陣列被視為一個長64NeoPixel元素,因此對于每個計數(shù)位置,我們只需要更改LED偏移位置。

根據(jù)該位是否已設(shè)置,LED的顏色是否會發(fā)生變化,設(shè)置的位為綠色,否則為藍色。

我使用下面的代碼來確定設(shè)置LED的值,因為二進制轉(zhuǎn)換函數(shù)返回一個指針。

pYYBAGJ-JmuAV7zdAAAe_fSdSjQ407.png

當(dāng)我把所有這些放在一起時,一旦PmodGPS鎖定信號,二進制時鐘就會按預(yù)期運行。

確認(rèn)

對于許多人來說,讀取二進制時鐘可能與傳統(tǒng)時鐘不同。因此,通過終端查看NeoPixel顯示和UTC時間輸出,我們可以驗證顯示是否正確。

poYBAGJ-JmeAZbE9AAMZJAIgqK8883.png

解碼后的時間看起來是正確的。

結(jié)論

該項目演示了我們?nèi)绾屋p松快速地將GPS用于導(dǎo)航以外的系統(tǒng),并創(chuàng)建一個有趣的示例,該示例可用作顯示器等。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21620

    瀏覽量

    601232
  • gps
    gps
    +關(guān)注

    關(guān)注

    22

    文章

    2880

    瀏覽量

    165925
  • 二進制
    +關(guān)注

    關(guān)注

    2

    文章

    786

    瀏覽量

    41564
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用Arduino和LED矩陣構(gòu)建簡單的二進制時鐘

    在這個初學(xué)者項目中,我們通過構(gòu)建LED矩陣和使用Arduino來創(chuàng)建二進制時鐘。
    的頭像 發(fā)表于 07-25 18:51 ?5686次閱讀

    二進制相對調(diào)相(二進制差分調(diào)相2DPSK)的工作原理

    二進制相對調(diào)相(二進制差分調(diào)相2DPSK)的工作原理
    發(fā)表于 10-21 13:01 ?3179次閱讀
    <b class='flag-5'>二進制</b>相對調(diào)相(<b class='flag-5'>二進制</b>差分調(diào)相2DPSK)的工作原理

    二進制

    二進制   二進制與十進制的區(qū)別在于數(shù)碼的個數(shù)和進位規(guī)律有很大的區(qū)別,顧名思義,二進制的計數(shù)規(guī)律為逢二進一,是以2為基數(shù)的計數(shù)體制。10這
    發(fā)表于 04-06 23:48 ?8155次閱讀
    <b class='flag-5'>二進制</b>

    二進制時鐘電路

    二進制時鐘電路
    發(fā)表于 09-11 11:22 ?3094次閱讀
    <b class='flag-5'>二進制</b><b class='flag-5'>時鐘</b>電路

    二進制編碼和二進制數(shù)據(jù)

    二進制編碼和二進制數(shù)據(jù)   二進制編碼是計算機內(nèi)使用最多的碼制,它只使用兩個基本符號"0"和"1",并且通過由這兩個符號組成的
    發(fā)表于 10-13 16:22 ?4748次閱讀

    什么是二進制計數(shù)器,二進制計數(shù)器原理是什么?

    什么是二進制計數(shù)器,二進制計數(shù)器原理是什么? 計數(shù)器是數(shù)字系統(tǒng)中用得較多的基本邏輯器件。它不僅能記錄輸入時鐘脈沖的個數(shù),還可以實現(xiàn)
    發(fā)表于 03-08 13:16 ?3.1w次閱讀

    二進制電平,什么是二進制電平

    二進制電平,什么是二進制電平 在二進制數(shù)字通信系統(tǒng)中,每個碼元或每個符號只能是“1”和“0”兩個狀態(tài)之一。若將每個碼元可能取的狀態(tài)增
    發(fā)表于 03-17 16:51 ?2341次閱讀

    二進制加法程序【匯編版】

    二進制加法程序【匯編版】二進制加法程序【匯編版】二進制加法程序【匯編版】二進制加法程序【匯編版】
    發(fā)表于 12-29 11:02 ?0次下載

    二進制加法程序【C語言版】

    二進制加法程序【C語言版】二進制加法程序【C語言版】二進制加法程序【C語言版】二進制加法程序【C語言版】
    發(fā)表于 12-29 11:03 ?0次下載

    基于FPGA二進制相移鍵控設(shè)計方案

    基于FPGA二進制相移鍵控設(shè)計方案
    發(fā)表于 05-28 09:36 ?12次下載

    微型二進制時鐘開源分享

    電子發(fā)燒友網(wǎng)站提供《微型二進制時鐘開源分享.zip》資料免費下載
    發(fā)表于 11-02 16:19 ?0次下載
    微型<b class='flag-5'>二進制</b><b class='flag-5'>時鐘</b>開源分享

    帶秒的Arduino 24小時二進制時鐘

    電子發(fā)燒友網(wǎng)站提供《帶秒的Arduino 24小時二進制時鐘.zip》資料免費下載
    發(fā)表于 11-04 10:17 ?1次下載
    帶秒的Arduino 24小時<b class='flag-5'>二進制</b><b class='flag-5'>時鐘</b>

    Arduino的二進制時鐘屏蔽

    電子發(fā)燒友網(wǎng)站提供《Arduino的二進制時鐘屏蔽.zip》資料免費下載
    發(fā)表于 11-21 11:40 ?0次下載
    Arduino的<b class='flag-5'>二進制</b><b class='flag-5'>時鐘</b>屏蔽

    基于Arduino Uno的二進制時鐘

    該項目是關(guān)于使用 Arduino 和兩個 LED 矩陣的數(shù)字和二進制時鐘,帶有 MAX72XX 和 RTC(實時時鐘),包括幾個功能。數(shù)字和二進制
    發(fā)表于 12-20 14:46 ?0次下載

    二進制編碼器工作原理 如何選擇二進制編碼器

    二進制編碼器是一種數(shù)字電路,它將輸入的二進制代碼轉(zhuǎn)換為對應(yīng)的輸出信號。在數(shù)字系統(tǒng)中,編碼器用于將數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式,以便于處理和傳輸。 二進制編碼器工作原理 輸入與輸出關(guān)系 :
    的頭像 發(fā)表于 11-06 09:44 ?140次閱讀