DE-10 Standard HPS SOC和FPGA聯(lián)合使用例程

轉(zhuǎn)載自https://blog.csdn.net/zhou_sking/article/details/106884824
本教程演示了如何使用HPS/ARM與FPGA進行通信。我們將為DE10標(biāo)準(zhǔn)開發(fā)板介紹如何根據(jù)官方的DE10_Standard_GHRD工程開發(fā)出自己的My_GRHD工程叶眉。之后氢哮,我們會在My_GHRD工程上運行我們自己改造過后的HPS_FPGA_LED應(yīng)用程序。該應(yīng)用程序會控制連接到DE10標(biāo)準(zhǔn)開發(fā)板上FPGA部分的A的10個LED燈閃爍。其中答毫,LEDR0將會通過閃爍模擬板子的心跳驱富,LEDR1-8將會按照一定頻率進行左移右移循環(huán)閃爍60次蓖捶,LEDR9將會在LEDR1-8的每一次循環(huán)后閃爍一次。例程中HPS通過Lightweight HPS-to-FPGA Bridge控制FPGA部分連接的LED燈浙宜。而且,例程中FPGA部分是由HPS通過HPS中FPGA manager進行配置蛹磺。

系統(tǒng)要求

在開始本教程之前粟瞬,請注意演示項目準(zhǔn)備需要以下內(nèi)容:

友晶DE10-Standard FPGA板,包括

  • 用于串口中斷通信的Mini USB線纜
  • 存儲空間4G以上Micros SD卡,安裝Liunx系統(tǒng)萤捆,SD卡Linux系統(tǒng)的燒寫參考友晶官方文檔DE10-Standard_Getting_Started_Guide CHAPTER 5
  • Micros SD卡讀卡器

一臺x86架構(gòu)的PC機

  • 裝有64位Windows 7/10操作系統(tǒng)
  • 配有一個USB端口
  • 裝有Quartus Prime 16.1或以上版本
  • 裝有SoC EDS 16.1 或以上版本
  • 裝有Win32 Disk Imager軟件

Intel SoC FPGA的AXI 橋

在Intel SoC FPGA中裙品,HPS邏輯與FPGA結(jié)構(gòu)通過AXI(Advanced eXtensible Interface)橋進行連接。為了實現(xiàn)HPS邏輯與FPGA 結(jié)構(gòu)的通信俗或,需要通過使用Intel系統(tǒng)集成工具Qsys添加HPS組件來進行系統(tǒng)設(shè)計市怎。從HPS組件的AXI主端口,HPS可以訪問那些連接到AXI主端口的內(nèi)存映射從端口蕴侣。

HPS包含以下HPS-FPGA AXI橋

  • FPGA-to-HPS橋
  • HPS-to-FPGA橋
  • 輕量級的HPS-to-FPGA橋

下圖顯示了FPGA結(jié)構(gòu)和L3與HPS互連的AXI橋的框圖焰轻。每個主(M)接口和從(S)接口顯示其數(shù)據(jù)寬度。括號中標(biāo)注了每個互連的時鐘域昆雀。


AXI橋的框圖

HPS-to-FPGA橋由3級(L3)主開關(guān)控制辱志,輕量級控制HPS-to-FPGA橋由L3從外圍從開關(guān)控制。

FPGA-to-HPS橋接控制L3主開關(guān)狞膘,允許任何在FPGA結(jié)構(gòu)的主實現(xiàn)(implemented)去訪問在HPS中大多數(shù)從實現(xiàn)揩懒。

所有三個橋都包含全局程序員視圖GPV寄存器。GPV寄存器控制網(wǎng)橋的行為挽封。通過輕量級的HPS-to-FPGA橋訪問可以所有三個橋的GPV寄存器已球。

這個例程向用戶介紹了如何使用HPS/ARM與FPGA進行通信。這個與DE10-Standard板上ARM C程序配套的GHRD工程,演示了HPS/ARM程序如何控制連接到FPGA部分的紅色LED智亮。

GRHD工程

術(shù)語GHRD是黃金硬件參考設(shè)計(Golden Hardware Reference Design)的簡稱忆某。友晶科技為DE10-Standard開發(fā)板提供的GRD項目位于CD文件夾中: CD-ROM\Demonstration\SOC_FPGA\ DE10_Standard_GHRD。

本項目由以下組成部分組成:

  • ARM Cortex?-A9 MPCore HPS
  • 四個用戶按鈕輸入
  • 十個用戶DIP開關(guān)輸入
  • 10個用戶I/O用于LED輸出
  • 64KB片上存儲器
  • ? JTAG to Avalon master bridges
  • Interrupt capturer for use with System Console
  • System ID

MPU所看到的SoC FPGA部分的系統(tǒng)外圍設(shè)備的內(nèi)存映射從輕量級的HPS-to-FPGA到FPGA的基礎(chǔ)地址0xFF20_0000開始阔蛉。MPU可以通過Qsys中的地址偏移來訪問這些外圍設(shè)備弃舒。用戶可以打開GHRD項目與Quartus II軟件。然后打開soc_system状原。qsys文件與qsys工具聋呢。下圖列出了連接到輕量級HPS-to-FPGA的外圍設(shè)備的地址映射。


這些外設(shè)的所有Avalon引出信號( Avalon Conduit signals)都連接到DE10-Standard板上SoC FPGA的I/O引腳颠区,如圖所示

My_GHRD工程

在實際的應(yīng)用過程中削锰,友晶科技提供的DE10_Standard_GHRD工程并不是十分契合我們的開發(fā)需要,這可能包括外圍設(shè)備的冗余和不足毕莱。下面為了實現(xiàn)本教程開篇所定的目標(biāo)器贩,我們需要根據(jù)DE10_Standard_GHRD工程進行修改。其中友晶科技提供的DE10_Standard_GHRD工程實現(xiàn)的是LEDR0通過閃爍模擬板子的心跳央串,LEDR1-9按照一定頻率進行左移右移循環(huán)閃爍60次磨澡;我們的目標(biāo)是LEDR0通過閃爍模擬板子的心跳,LEDR1-8按照一定頻率進行左移右移循環(huán)閃爍60次质和,LEDR9在LEDR1-8的每一次循環(huán)后閃爍一次稳摄。可以看出饲宿,我們只需要將DE10_Standard_GHRD工程中的LEDR9的設(shè)計進行更改就可以打到我們的目的厦酬。下面正式開始更改操作。

準(zhǔn)備設(shè)計文件

新建文件夾:E:\work\Quartus\My_GHRD瘫想,然后將DE10_Standard_GHRD工程目中的一下文件復(fù)制到工程目錄下:

  • 文件夾:hps_isw_handoff
  • 文件夾:ip
  • 文件:DE10_Standard_GHRD.v
  • 文件:DE10_Standard_GHRD.sdc
  • 文件:generate_hps_qsys_header.sh
  • 文件:hps_common_board_info.xml
  • 文件:soc_system.qsys
  • 文件:soc_system_board_info.xml

因為其中的文件DE10_Standard_GHRD.v后面將會被指定為頂層文件仗阅,所以需要將其更改為與工程名My_GHRD相同的My_GHRD.v文件,同時為了與工程名保持協(xié)調(diào)国夜,我們也將文件DE10_Standard_GHRD.sdc更改為與工程名My_GHRD相同的My_GHRD.sdc减噪。最終工程目錄文件夾如下圖所示:


創(chuàng)建My_GHRD工程

首先,建立一個名為:My_GHRD的工程车吹。打開軟件Quartus Prime Standard Edition筹裕,點擊:File→New Project Wizard…,進入工程創(chuàng)建引導(dǎo)界面窄驹。


點擊引導(dǎo)界面下方的:Next朝卒,進入Directory, Name, Top-Level Entity設(shè)置界面。


點擊右側(cè)按鈕:…選擇你的工程目錄E:/work/Quartus/My_GHRD乐埠。之后設(shè)置工程名:My_GHRD抗斤。此時軟件將自動把頂層設(shè)計entity name設(shè)置為工程名:My_GHRD囚企。繼續(xù)點擊:Next,進入Project Type設(shè)置界面瑞眼。

在Project Type界面選擇:Empty Project選項龙宏,繼續(xù)點擊:Next,進入Add Files設(shè)置界面伤疙。
在Add Files設(shè)置界面烦衣,點擊右側(cè)按鈕:…,添加工程目錄下的文件:My_GHRD.v和soc_system.qsys以及文件夾hps_isw_handoff和ip下的所有文件進入工程掩浙。


然后點擊:Next,進入Family, Device & Board Settings設(shè)置界面秸歧。

在Family, Device & Board Settings設(shè)置界面厨姚,我們要設(shè)置我們所用的SoC FPGA型號:5CSXFC6D6F31C6N。為了能夠快速鎖定我們要選擇的SoC FPGA型號键菱,我們可以點擊:Device下拉列表谬墙,選擇:Cyclone V SX Extended Features,以縮小選型范圍经备。


然后拭抬,選擇Available devices下的5CSXFC6D6F31C6。繼續(xù)點擊:Next侵蒙,進入EDA Tool Settings設(shè)置界面造虎。


在EDA Tool Settings設(shè)置界面下,我們保留默認(rèn)設(shè)置纷闺。之后點擊:Fnish算凿,完成工程創(chuàng)建,退出工程創(chuàng)建引導(dǎo)界面犁功。

Qsys設(shè)計

由于我們需要在DE10_Standard_GHRD工程的基礎(chǔ)上更改Qsys的設(shè)計來實現(xiàn)對LEDR9的單獨控制氓轰,所以我們需要在Qsys中添加一個1位的PIO端口來實現(xiàn)對LEDR9的控制,同時需要將原來用于同時控制LEDR0-9的10位PIO端口的改為9位的PIO端口浸卦。

依次點擊:Tools→Qsys署鸡,啟動Qsys,之后選中要打開的soc_system.qsys文件限嫌。


接下來靴庆,在打開的soc_system.qsys文件添加一個1位的PIO端口。在左上角的IP Catalog的搜索框中搜索“ PIO ”萤皂,之后雙擊下面列表中的“ PIO(Parallel I/O) ”撒穷。

此時將彈出“ PIO(Parallel I/O) ”設(shè)置界面。將PIO的數(shù)據(jù)寬度Width設(shè)置為:1裆熙,數(shù)據(jù)輸入輸出方向Direction設(shè)置為:Output端礼。最后點擊右下角的Finish按鈕退出設(shè)置禽笑。


現(xiàn)在,新的Qsys設(shè)計中將會出現(xiàn)我們新添加的PIO端口pio_0蛤奥,我們可以對其進行重命名佳镜。光標(biāo)移動到在端口名pio_0處,右鍵選擇“Rename”凡桥,重命名為:led_pio9蟀伸。點擊空白處保存命名。


之后我們需要對led_pio9組件的信號進行連接缅刽,將光標(biāo)放置到下圖中l(wèi)ed_pio9組件中clk信號所在行的白點處啊掏,點擊后可以將led_pio9組件中clk信號與clk_0組件的clk信號進行連接,可以表示為:led_pio9.clk—clk_0.clk衰猛。使用類似的操作迟蜜,將led_pio9組件的其它信號分別與其它組件進行如下連接,最終的連接關(guān)系如下:

  • led_pio9.clk—clk_0.clk
  • led_pio9.reset—clk_0.clk_reset
  • led_pio9.s1—mm_bridge_0.m0—fpga_only_master.master

如下圖:


其中l(wèi)ed_pio9有一個信號led_pio9.external_connection需要進行對外引出啡省。光標(biāo)置于信號led_pio9.external_connection處右擊選擇:Connections:led_pio9.external_connection→Export as: led_pio9_external_connection。


到此,添加一個1位的PIO端口led_pio9的操作已經(jīng)完成。

接下來需要將原來控制LEDR0-9的數(shù)據(jù)寬度為10位的PIO端口led_pio更改為只用控制LEDR0-8的數(shù)據(jù)寬度為9位的PIO端口led_pio。雙擊組件led_pio涧团,將數(shù)據(jù)寬度Width(1-32 bits)設(shè)置為:9阿迈,關(guān)閉Parameters窗口將自動保存更改。


現(xiàn)在,我們要為我們新添加的PIO端口led_pio9分配基地址,同時更新Qsys設(shè)計中其它組件的基地址。依次點擊:System→Assign Base Addresses灶壶。


可以看出,至此,我們需要在Qsys設(shè)計中做的更改已經(jīng)完成了。現(xiàn)在,只要重新生成相應(yīng)的HDL文件,更新Qsys設(shè)計就可以結(jié)束Qsys部分的設(shè)計了。但是后面對工程編譯時軟件將會輸出錯誤提示:
Error (10228): Verilog HDL error at soc_system_sysid_qsys.v(34): module “soc_system_sysid_qsys” cannot be declared more than once。
更令人遺憾的是亲桥,目前本人還沒有找到解決上述錯誤信息的辦法。有一個無奈的辦法就是:將Qsys設(shè)計中的soc_system_sysid_qsys組件刪除。這不會影響Qsys設(shè)計的功能,關(guān)于該組件功能的詳細(xì)介紹,讀者可以自行查找,此處不再贅述。
刪除soc_system_sysid_qsys組件的辦法是:將soc_system_sysid_qsys組件sysid_qsys的Use列方框中的“√”去掉。


之后進行Qsys設(shè)計中的文件生成工作催蝗。點擊右下角的Generate HDL…按鈕。


在彈出的“Generation”窗口中截酷,確認(rèn)Output Directory下Path所指定的生成文件的輸出目錄在工程目錄下三热。然后點擊Generate按鈕抑堡。


接下來會彈出“Save System Completed”窗口有缆,點擊右下角的Close按鈕灌曙。


接下來會彈出的“Generate”窗口魄幕,等待幾分鐘咙轩,文件生成工作完成后阴颖,右下角的“Close”按鈕會高亮顯示活喊。此時,點擊“Close”按鈕量愧。


最后浑此,又會退回到Qsys設(shè)計頁面篇裁,點擊右下角的Finish按鈕脐区,退出Qsys設(shè)計际插。

在返回Quartus Prime Standard Edition主界面后,會提示我們把更新后的.qip和.sip文件重新手動添加到工程中來。點擊提示窗口右下角的Close按鈕。



現(xiàn)在,我們來手動添加更新后的.qip和.sip文件榨崩。右擊Project Navigator窗口中工程名:My_GHRD哩盲。點擊Settings…選項。


接下來會彈出Category界面,點擊右側(cè)的…按鈕。


此時會彈出Select File界面誓斥,在指定的目錄下找到生成的soc_system.qip文件并選中,然后點擊右下角的“打開”按鈕拄养。


最后离斩,可以在返回的Catagory界面中可以看到生成的soc_system.qip文件已經(jīng)被成功添加到工程中。


在上述界面中可以看到文件:hps_reset_bb.qip和hps_reset_bb.v瘪匿,這一組文件的定義了模塊:hps_reset跛梗。但是,由于 文件:hps_reset.qip和hps_reset.v這一組文件同樣也定義了模塊:hps_reset柿顶,所以hps_reset_bb.qip和hps_reset_bb.v的加入會導(dǎo)致模塊:hps_reset的重復(fù)定義茄袖。

現(xiàn)在我們需要將文件:hps_reset_bb.qip和hps_reset_bb.v進行移除操软。選中文件:hps_reset_bb.qip和hps_reset_bb.v嘁锯,點擊右側(cè)的Remove按鈕移除文件。最后,點擊右下角的OK按鈕退出該界面家乘。


至此蝗羊,工程My_GHRD中Qsys部分的設(shè)計已經(jīng)完成。接下來我們需要對工程中的硬件描述文件.v文件進行修改仁锯。其實耀找,我們在DE10_Standard_GHRD工程的基礎(chǔ)上只用對My_GHRD中頂層實體文件My_GHRD.v中各個模塊的引腳及其連接關(guān)系進行描述即可。

在此之前业崖,我們先指定我們的頂層實體文件My_GHRD.v野芒。點擊Project Navigator窗口中Hierachy按鈕,會彈出下拉列表双炕,我們點擊File選項狞悲。


找到工程中的My_GHRD.v,右擊選擇Set as Top-Level Entity妇斤。


在這里插入圖片描述

我們雙擊Project Navigator窗口中工程名My_GHRD摇锋,此時軟件將會打開工程的頂層實體文件My_GHRD.v


硬件描述設(shè)計

對頂層實體文件My_GHRD.v的修改主要有以下各處:
第一,頂層實體模塊的命名須與工程名My_GHRD保持一致站超。


第二荸恕,在模塊soc_system u0中對新引出的PIO端口led_pio9_external_connection_export進行聲明∷老啵可以發(fā)現(xiàn)融求,我們聲明端口led_pio9_external_connection_export的同時需要為其指定一個wire類型的變量進行連接。對照led_pio_external_connection_export連接到wire類型的變量fpga_led_internal上媳纬,我們新定義了一個wire類型的變量fpga_led9_internal與端口led_pio9_external_connection_export進行連接双肤。當(dāng)然,wire類型的變量fpga_led9_internal可以理解為是一條導(dǎo)線钮惠,它的一端接到了模塊soc_system u0中對新引出的PIO端口led_pio9_external_connection_export上茅糜,兩外一端也是要為它連接適當(dāng)?shù)亩丝诘摹N覀冃略龆丝趌ed_pio9_external_connection_export的目的就是能夠?qū)ED燈LEDR9進行控制素挽,所以蔑赘,不難想到,wire類型的變量fpga_led9_internal另一端一定是要連接到端口LEDR[9]上面的预明。這樣缩赛,總體的更改就是下面這樣的:

  • 將原來與LEDR[9:1]連接的變量wire [8:0] fpga_led_internal改為:與LEDR[8:1]連接的wire
    [7:0] fpga_led_internal
  • 定義新的變量wire fpga_led9_internal與LEDR[9]連接
  • 將新的變量wire fpga_led9_internal另一端與模塊soc_system u0中的端口led_pio9_external_connection_export進行連接

My_GHRD工程編譯

現(xiàn)在,我們可以對工程My_GHRD進行編譯操作撰糠。首先是進行工程的分析與綜合酥馍,依次點擊:Processing→Start→Start Analysis & Synthesis。


工程的分析綜合通過后阅酪,主界面中左側(cè)的Tasks窗口下的Analysis & Synthesis欄前面會展示一個綠色的“√”旨袒,后面會顯示分析綜合所用的時間汁针。


上面分析綜合成功后,下一步需要進行Fitter(Place & Route)砚尽,這里進行的是關(guān)于FPGA內(nèi)部的布局布線操作施无。在此之前我們需要對我們模塊中設(shè)計的輸入輸出引腳進行引腳分配。引腳分配的方法有很多種必孤,讀者可以自行學(xué)習(xí)猾骡。這里由于我們定義了大量的引腳,而且我們有現(xiàn)成的DE10_Standard_GHRD工程可以利用敷搪,我們只需將該工程里面的引腳分配信息轉(zhuǎn)移進入我們的My_GHRD工程就可以了兴想。

我們現(xiàn)在打開DE10_Standard_GHRD工程。進入工程后,我們點擊:Assignments→Pin Planner,進入引腳分配界面讹语。


在該界面下卖词,點擊:File→Export…。


之后會彈出Export窗口。我們需要選擇我們要導(dǎo)出的文件格式為:.tcl。


然后,點擊右下角的Export按鈕蔚龙。


最后,依次點擊引腳分配界面和DE10_Standard_GHRD工程界面右上角的關(guān)閉按鈕映胁,退出DE10_Standard_GHRD工程木羹。

我們現(xiàn)在已經(jīng)得到了我們需要的引腳分配文件DE10_Standard_GHRD.tcl,現(xiàn)在我們需要把它從DE10_Standard_GHRD工程目錄下復(fù)制到My_GHRD工程目錄下解孙。為了與My_GHRD工程名保持一致坑填,將其改名為:My_GHRD.tcl。


接下來弛姜,我們需要利用得到的引腳分配文件My_GHRD.tcl對工程My_GHRD中的引腳進行分配脐瑰。點擊:Tools→Tcl Scripts…。


在彈出的Tcl Scripts窗口下廷臼,點擊右側(cè)的Add to Project…按鈕苍在。


在彈出的Add to Project窗口下,選中我們的引腳分配文件My_GHRD.tcl荠商,并點擊右下角的打開按鈕寂恬。


此時,軟件又自動退回到Tcl Scripts窗口下莱没。在Libraries欄中找到我們的引腳分配文件My_GHRD.tcl初肉,點擊下方的Run按鈕來加載我們的引腳分配文件。


在后面彈出的界面中點擊OK按鈕饰躲,退回到Tcl Scripts窗口牙咏。


最后點擊到Tcl Scripts窗口下方的Close按鈕退出到Tcl Scripts窗口井佑,回到工程主界面。


在這里插入圖片描述

此時眠寿,點擊主界面的:Assignments→Pin Planner進入引腳分配界面。


在引腳分配界面中焦蘑,可以看到盯拱,引腳大部分已經(jīng)被分配完成,未分配的引腳暫時不用擔(dān)心它們例嘱,我們還沒有用到狡逢。


現(xiàn)在,我們開始對工程進行布局布線拼卵。點擊:Processing→Start→Start Fitter奢浑。


工程的布局布線通過后,主界面中左側(cè)的Tasks窗口下的Fitter(Place & Route)欄前面會展示一個綠色的“√”腋腮,后面會顯示布局布線所用的時間雀彼。


到此,基本上我們可以判斷在邏輯上我們的設(shè)計已經(jīng)沒有問題了即寡,接下來我們是可以進行工程的全編譯了徊哑。但是,在實際的應(yīng)用設(shè)計中我們還要考慮對信號的時序進行約束聪富,尤其是具有 SDRAM DDR3這種高速存取器件的設(shè)計中莺丑。對于時序約束,我們可以利用DE10_Standard_GHRD工程中的時序約束文件:DE10_Standard_GHRD.sdc墩蔓。同樣的梢莽,將其復(fù)制到My_GHRD工程目錄下,改名為:My_GHRD.sdc奸披。


將時序約束文件添加進入工程昏名,右擊Project Navigator窗口下的工程名:My_GHRD,點擊:Setting…按鈕阵面。


接下來會彈出Category界面葡粒,點擊右側(cè)的…按鈕。


此時會彈出Select File界面膜钓,進入工程主目錄下嗽交,點擊右下角的文件類型選擇按鈕,選中:Script Files( * .tcl.sdc.pdc*.qip)一項颂斜。

下找到時序約束文件My_GHRD.sdc并選中夫壁,然后點擊右下角的“打開”按鈕。


最后沃疮,可以在返回的Catagory界面中可以看到時序約束文件:My_GHRD.sdc文件已經(jīng)被成功添加到工程中盒让。依次點擊右下角的Apply按鈕和OK按鈕退出該界面梅肤。


此時已經(jīng)回到工程主界面,我們可以進行工程的全編譯了邑茄。點擊Processing→Start Compilation姨蝴。


C語言設(shè)計

本節(jié)將介紹如何設(shè)計一個ARM C程序來控制PIO控制器led_pio。SoC EDS用于編譯C項目肺缕。為了讓ARM程序控制PIO組件led_pio左医,我們需要led_pio地址。使用Linux內(nèi)置驅(qū)動程序’ /dev/mem '和mmap system-call可以將led_pio組件的物理基址映射到Linux應(yīng)用軟件可以直接訪問的虛擬地址同木。

HPS頭文件

ARM C程序需要led_pio的組件信息浮梢,因為程序會嘗試控制組件。這部分將會描述如何使用一個給定的Linux shell批處理文件將Qsys HPS信息提取到一個頭文件中彤路,這個頭文件稍后將包含在C程序中秕硝。

上面提到的批處理文件名為:generate_hps_qsys_header.sh。它與DE10_Standard_GHRD工程位于同一個文件夾中≈拮穑現(xiàn)在远豺,我們要為工程My_GHRD生成頭文件。首先坞嘀,從DE10_Standard_GHRD工程目錄下復(fù)制文件:generate_hps_qsys_header.sh到My_GHRD工程目錄下憋飞。


接下來,使用記事本打開批處理文件:generate_hps_qsys_header.sh姆吭,確認(rèn)文件中紅線標(biāo)注的路徑下有應(yīng)用程序:sopc-create-header-files.exe榛做。其中,路徑:/cygdrive/d/…表示D盤…内狸。如果該路徑下沒有上述應(yīng)用程序检眯,讀者需自行更改其中的路徑。


注意昆淡,如果后面在SoC EDS命令shell中運行g(shù)enerate_hps_qsys_header.sh時锰瘸,提示出現(xiàn)錯誤。(其實這個錯誤當(dāng)時解決后忘記進行記錄昂灵,好像是提示執(zhí)行文件sopc-create-header-files的過程中sopcinfo2swinfo還是swinfo2header找不到之類的避凝。)我們需要在文件sopc-create-header-files中鎖定錯誤出現(xiàn)的行。對無法找到的應(yīng)用程序路徑進行指定眨补。最終文件sopc-create-header-files中對應(yīng)部分應(yīng)該為:

cmd="sopcinfo2swinfo --input=$sopc_design_file --output=$swinfo_tmp_fname ${sopcinfo2swinfo_args[@]}"
/cygdrive/d/intelFPGA/Quartus16.1/quartus/sopc_builder/bin/sopcinfo2swinfo --input="$sopc_design_file" --output="$swinfo_tmp_fname" ${sopcinfo2swinfo_args[@]} || {
    echo "$PN: $cmd failed"
    exit 1
}

cmd="swinfo2header --swinfo $swinfo_tmp_fname --sopc $sopc_design_file ${swinfo2header_args[@]}"
/cygdrive/d/intelFPGA/Quartus16.1/quartus/sopc_builder/bin/swinfo2header --swinfo "$swinfo_tmp_fname" --sopc "$sopc_design_file" "${swinfo2header_args[@]}" || {
    echo "$PN: $cmd failed"
    exit 1
}

一定注意管削,我們之間的Quartus安裝路徑是不同的,你需要根據(jù)自己的安裝路徑指定應(yīng)用程序的路徑撑螺,以便軟件能夠找到它們含思。

然后,啟動SoC EDS命令shell


在SoC EDS Command Shell中,轉(zhuǎn)到My_GHRD工程目錄下含潘。其中我的工程目錄為:E:\work\Quartus\My_GHRD饲做。讀者根據(jù)自己的工程目錄路徑設(shè)置,為了輸入方便遏弱,可以使用Tab鍵自動補全功能盆均。注意:在E盤,路徑就是:/cygdrive/e/…漱逸。

執(zhí)行批處理文件:generate_hps_qsys_header.sh by


此時泪姨,會在My_GHRD工程目錄下生成HPS頭文件:hps_0.h。


現(xiàn)在虹脯,我們已經(jīng)得到所需的頭文件:hps_0.h。我們可以用一些代碼查看編輯軟件查看一下它里面的內(nèi)容奏候,我這里用的代碼查看編輯軟件是Source Insight循集。可以看到蔗草,生成的頭文件:hps_0.h中已經(jīng)為我們新增的PIO模塊led_pio9生成了一系列宏定義咒彤。在頭文件中,led_pio9的基地址由一個常量LED_PIO9_BASE表示咒精,led_pio9的數(shù)據(jù)寬度由一個常量LED_PIO9_DATA_WIDTH表示镶柱,這兩個常量將會在后面的C語言代碼中被使用。


LED_PIO地址映射

本部分將描述如何將pio_led的物理地址映射為應(yīng)用程序軟件可以訪問的虛擬地址模叙。下圖顯示了C程序派生led_pio基址的虛擬地址歇拆。


首先,open 通過系統(tǒng)調(diào)用打開內(nèi)存設(shè)備驅(qū)動程序" /dev/mem "范咨,然后mmap通過系統(tǒng)調(diào)用用于將HPS物理地址映射為由void指針變量virtual_base表示的虛擬地址故觅。代碼將外圍區(qū)域的物理基地址(HW_REGS_BASE = 0xfc000000)映射為一個基于虛擬地址的virtual_base。對于任何外圍區(qū)域的控制器渠啊,用戶可以通過其相對于外圍區(qū)域的偏移量與基于的虛擬地址virtual_base進行疊加來計算任何外圍區(qū)域的控制器的虛擬地址输吏。根據(jù)這個規(guī)則,可以通過將下面兩個偏移地址添加到virtual_base來計算led_pio的虛擬地址:

  • 輕量級的HPS-to- fpga AXI總線相對于HPS基址的偏移地址
  • Pio_led 相對 于 Lightweight HPS-to-FPGA AXI 總線的偏移地址

第一個偏移地址是0xff200000替蛉,在頭文件hps.h中定義為常量ALT_LWFPGASLVS_OFST贯溅。頭文件hps.h是SoC EDS中的頭文件。位于Quartus安裝文件夾:D:\intelFPGA\SoCEDS16.1\embedded\ip\altera\hps\altera_hps\hwlib\include\soc_cv_av\socal中躲查。


第二個偏移地址是0x110它浅,在頭文件hps_0.h中定義為:LED_PIO_BASE


LED_PIO的虛擬地址由一個void指針變量h2p_lw_led_addr表示。應(yīng)用程序可以直接使用指針變量來訪問控制器中的寄存器LED_PIO镣煮。

控制LED

C程序員需要理解LED_PIO的PIO核的寄存器映射罚缕,然后才能控制它。下圖顯示了PIO核的寄存器映射怎静。每個寄存器的寬度是32位邮弹。詳情可以參閱PIO Core數(shù)據(jù)手冊黔衡。對于led控制,我們只需要將輸出值寫入相對于基于地址0x10040的偏移地址為0寄存器腌乡。因為DE10-Standard板上的LED是高電平觸發(fā)的盟劫,將值0x00000000寫入偏移地址為0的寄存器將關(guān)閉所有9個紅色led。DE10-Standard上有10個紅色led与纽,其中9個連接到這個控制器上侣签。最后一個LED (LED0)用于模擬FPGA心跳。將值0x000001ff寫入偏移地址為0寄存器將打開所有9個紅色led急迂。在C程序中影所,向pio_led的0偏移寄存器寫入值0x000001ff可以表示為:

*(uint32_t *)h2p_lw_led_addr = 0x000001ff;

這條語句會將void指針賦值給uint32_t指針,所以C編譯器知道寫一個32位的值0x000001ff到虛擬地址h2p_lw_led_addr里面僚碎。


主程序

在友晶科技提供的例程中猴娩,又一個應(yīng)用程序例程HPS_FPGA_LED。它的功能為:控制LEDR1-9進行LED移位閃爍操作勺阐,完成60次循環(huán)移位閃爍后卷中,程序終止。我們的設(shè)計目標(biāo)是:控制LEDR1-8進行LED移位閃爍操作渊抽,LEDR9隨著LEDR1-8每一次移位而閃爍一次蟆豫,完成60次循環(huán)移位閃爍后,程序終止懒闷。例程HPS_FPGA_LED的功能與我們的設(shè)計目標(biāo)非常接近十减,所以我們可以在例程HPS_FPGA_LED的設(shè)計基礎(chǔ)上進行更改。

首先愤估,在光盤目錄下找到例程HPS_FPGA_LED所在的文件夾:DE10-Standard_v.1.2.8_SystemCD\Demonstration\SoC_FPGA\HPS_FPGA_LED嫉称。將應(yīng)用程序目錄HPS_FPGA_LED復(fù)制到My_GHRD工程目錄下,并把My_GHRD工程目錄下的hps_0.h放到應(yīng)用程序目錄HPS_FPGA_LED下灵疮。

現(xiàn)在就可以開始根據(jù)我們的目標(biāo)修改應(yīng)用程序目錄HPS_FPGA_LED下的:main.c织阅。

我們要在主程序中設(shè)置一個void指針變量h2p_lw_led9_addr來存放新增的PIO組件LED_PIO9的虛擬地址。

h2p_lw_led9_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + LED_PIO9_BASE ) & ( unsigned long)( HW_REGS_MASK ) );

對于LEDR9的控制震捣,我們只需要在虛擬地址h2p_lw_led9_addr所指向的地址空間中寫入0x1點亮LEDR9荔棉、寫入0x0熄滅LEDR9。

*(uint32_t *)h2p_lw_led9_addr = 0x1;    //點亮LEDR9
*(uint32_t *)h2p_lw_led9_addr = 0x0;    //熄滅LEDR9

但是為了使LEDR9隨著LEDR1-8的移位進行閃爍蒿赢,我們可以設(shè)置一個int變量n润樱,讓其隨著LEDR1-8移位進行+1操作。我們對變量n進行取余操作后羡棵,將余值寫入虛擬地址h2p_lw_led9_addr所指向的地址空間中即可壹若。

*(uint32_t *)h2p_lw_led9_addr = n%2;
n = n+1;

最終,main.c文件內(nèi)容如下:

/*
This program demonstrate how to use hps communicate with FPGA through light AXI Bridge.
uses should program the FPGA by GHRD project before executing the program
refer to user manual chapter 7 for details about the demo
*/

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "hwlib.h"
#include "socal/socal.h"
#include "socal/hps.h"
#include "socal/alt_gpio.h"
#include "hps_0.h"

#define HW_REGS_BASE ( ALT_STM_OFST )
#define HW_REGS_SPAN ( 0x04000000 )
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )

int main() {

    void *virtual_base;
    int n=0;
    int fd;
    int loop_count;
    int led_direction;
    int led_mask;
    void *h2p_lw_led_addr;
    void *h2p_lw_led9_addr;

    // map the address space for the LED registers into user space so we can interact with them.
    // we'll actually map in the entire CSR span of the HPS since we want to access various registers within that span

    if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
        printf( "ERROR: could not open \"/dev/mem\"...\n" );
        return( 1 );
    }

    virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );

    if( virtual_base == MAP_FAILED ) {
        printf( "ERROR: mmap() failed...\n" );
        close( fd );
        return( 1 );
    }

    h2p_lw_led_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + LED_PIO_BASE ) & ( unsigned long)( HW_REGS_MASK ) );
    h2p_lw_led9_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + LED_PIO9_BASE ) & ( unsigned long)( HW_REGS_MASK ) );

    // toggle the LEDs a bit

    loop_count = 0;
    led_mask = 0x01;
    led_direction = 0; // 0: left to right direction
    while( loop_count < 60 ) {

        // control led
        *(uint32_t *)h2p_lw_led_addr = ~led_mask;
        *(uint32_t *)h2p_lw_led9_addr = n%2;
        n=n+1;

        // wait 100ms
        usleep( 100*1000 );

        // update led mask
        if (led_direction == 0){
            led_mask <<= 1;
            if (led_mask == (0x01 << (LED_PIO_DATA_WIDTH-1)))
                 led_direction = 1;
        }else{
            led_mask >>= 1;
            if (led_mask == 0x01){ 
                led_direction = 0;
                loop_count++;
            }
        }

    } // while

    // clean up our memory mapping and exit

    if( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) {
        printf( "ERROR: munmap() failed...\n" );
        close( fd );
        return( 1 );
    }

    close( fd );

    return( 0 );
}

Makefile與編譯

Makefile的內(nèi)容如下:該程序包括SoC EDS提供的頭文件。在Makefile中店展,還指定了ARM-linux交叉編譯养篓。

#
TARGET = HPS_FPGA_LED

#
ALT_DEVICE_FAMILY ?= soc_cv_av
SOCEDS_ROOT ?= $(SOCEDS_DEST_ROOT)
HWLIBS_ROOT = $(SOCEDS_ROOT)/ip/altera/hps/altera_hps/hwlib
CROSS_COMPILE = arm-linux-gnueabihf-
CFLAGS = -g -Wall   -D$(ALT_DEVICE_FAMILY) -I$(HWLIBS_ROOT)/include/$(ALT_DEVICE_FAMILY)   -I$(HWLIBS_ROOT)/include/
LDFLAGS =  -g -Wall 
CC = $(CROSS_COMPILE)gcc
ARCH= arm

build: $(TARGET)
$(TARGET): main.o 
    $(CC) $(LDFLAGS)   $^ -o $@  
%.o : %.c
    $(CC) $(CFLAGS) -c $< -o $@

.PHONY: clean
clean:
    rm -f $(TARGET) *.a *.o *~ 

要編譯這個應(yīng)用程序HPS_FPGA_LED,在SoC EDS Command Shell中進入應(yīng)用程序目錄HPS_FPGA_LED下赂蕴。

cd HPS_FPGA_LED/

使用ls命令查看HPS_FPGA_LED目錄下的文件柳弄,可以發(fā)現(xiàn)其中含有根據(jù)原來的main.c文件編譯出的main.o文件和可執(zhí)行文件:HPS_FPGA_LED。

ls

我們需要清除根據(jù)原來的main.c文件編譯出的main.o文件和可執(zhí)行文件:HPS_FPGA_LED「潘担現(xiàn)在執(zhí)行make clean命令碧注。

make clean

再次使用ls命令,可以看到根據(jù)原來的main.c文件編譯出的main.o文件和可執(zhí)行文件:HPS_FPGA_LED已經(jīng)被清除了糖赔。

ls

現(xiàn)在萍丐,使用make命令根據(jù)更改后的main.c文件編譯出main.o文件和可執(zhí)行文件:HPS_FPGA_LED。

make

整個操作過程如下圖所示:


至此放典,我們已經(jīng)完成了硬件設(shè)計和應(yīng)用程序設(shè)計兩方面的設(shè)計工作逝变。接下來就可以分別將包含有硬件邏輯信息的文件My_GHRD.sof和可執(zhí)行文件HPS_FPGA_LED下載到DE10_Standard開發(fā)板上執(zhí)行了。

系統(tǒng)測試

現(xiàn)在刻撒,我們需要在DE10_Standard開發(fā)板上進行系統(tǒng)測試骨田,驗證我們之前硬件邏輯設(shè)計和應(yīng)用程序設(shè)計耿导。這部分主要包括硬件邏輯的下載和應(yīng)用程序的運行声怔,硬件邏輯信息包含在文件My_GHRD.sof中,我們需要用它對FPGA進行編程舱呻;應(yīng)用程序的運行其實就是在開發(fā)板上執(zhí)行可執(zhí)行文件HPS_FPGA_LED醋火。

啟動開發(fā)板

在進行硬件邏輯的下載和應(yīng)用程序的運行之前,我們首先要對開發(fā)板進行各種線纜的連接和啟動模式的配置箱吕。其中芥驳,線纜的連接主要包括:電源線、USB Blaster II線茬高、串口線和網(wǎng)口線兆旬。配置模式的選擇就是將開關(guān)SW10的MSEL[4:0]引腳配置為:01010,開關(guān)如下圖所示怎栽,使得開發(fā)板可以從SD卡引導(dǎo)Linux系統(tǒng)啟動丽猬。


連接好各種線纜后,打開DE10_Standard開發(fā)板上的串口熏瞄。
首先脚祟,確認(rèn)開發(fā)板連接到電腦上的端口號。打開:控制面板→設(shè)備管理器→端口强饮,可以看到:USB Serial Port(COM9)由桌,這個COM9就是電腦為我們的開發(fā)板串口分配的端口號。
連接好各種線纜后,打開DE10_Standard開發(fā)板上的串口行您。
首先铭乾,確認(rèn)開發(fā)板連接到電腦上的端口號。打開:控制面板→設(shè)備管理器→端口邑雅,可以看到:USB Serial Port(COM9)片橡,這個COM9就是電腦為我們的開發(fā)板串口分配的端口號。


打開串口工具淮野,隨意選一款串口工具即可捧书,我使用的是DE-10文檔里推薦的Putty串口工具,這里附上下載地址http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe

設(shè)置以下參數(shù):

  • Protocol:Serial

  • Port:COM9 USB Serial Port

  • Baud rate:115200

  • Data bits:8

  • Parity:None

  • Stop bits:1
    點擊:Open按鈕骤星。

    按下開發(fā)板的電源開關(guān)经瓷,啟動開發(fā)板。此時會在串口工具中看到開發(fā)板啟動信息洞难。等待提示輸入用戶名登錄命令舆吮。在用戶登錄處鍵入:root,回車队贱。用戶登錄密碼處不用填寫色冀,直接回車。


硬件邏輯下載

硬件邏輯下載的方式有很多種柱嫌》嫣瘢可以通過USB Blaster II纜線將包含有硬件邏輯信息的文件My_GHRD.sof下載到SoC FPGA的FPGA上;也可以通過USB Blaster II纜線將包含有硬件邏輯信息的文件My_GHRD.jic下載到EPCS中编丘;還可以通過串口或者網(wǎng)口將有硬件邏輯信息的文件soc_sytem.rbf和設(shè)備樹覆蓋文件fpga.dtbo放到SD卡的Linux系統(tǒng)中与学,由Linux對FPGA進行配置。

這里為了方便嘉抓,我們采用通過JTAG纜線將包含有硬件邏輯信息的文件My_GHRD.sof下載到SoC FPGA的FPGA上的方式對FPGA進行配置索守。啟動Quartus Prime Programmer。


進入Quartus Prime Programmer Standard Edition界面后抑片,點擊:Hardware Setup…按鈕卵佛,檢測下載用于My_GHRD.sof的JTAG鏈。


在Hardware Setup界面下敞斋,雙擊:DE-SoC截汪,然后點擊:Close按鈕退出該界面。如果該界面下沒有顯示DE-SoC選項渺尘,在確保開發(fā)板上電挫鸽,且JTAG線纜連接無誤的情況下,關(guān)閉該界面重新進入幾次即可鸥跟。

退回Quartus Prime Programmer Standard Edition界面后丢郊,點擊:Auto Detect按鈕盔沫,自動檢測JTAG鏈上的器件。


此時會彈出Select Device界面枫匾,提示我們選擇我們所用的SoC FPGA型號架诞,選擇:5CXFC6D6。然后點擊右下角OK按鈕退出該界面干茉。


此時谴忧,Quartus Prime Programmer Standard Edition界面將會顯示我們JTAG鏈上的器件。


選中:5CXFC6D6角虫,然后點擊左側(cè)的:Change File…按鈕沾谓,為5CXFC6D6添加配置文件。


在彈出的Select Programming File界面下戳鹅,找到My_GHRD工程目錄下的:output_files/My_GHRD.sof并選中均驶,然后點擊:Open。


返回Quartus Prime Programmer Standard Edition界面后枫虏,找到5CSXFC6D6F31所在行妇穴,勾選:Program/Configure。然后隶债,點擊Start按鈕開始配置FPGA腾它。


最后做个,在Process欄可以看到配置進度姻报。此處顯示:100%(Successful)表明FPGA配置成功。


應(yīng)用程序運行

在完成FPGA的硬件邏輯配置后诗充,我們就可以將應(yīng)用程序發(fā)送到開發(fā)板中執(zhí)行了回俐。

文件傳輸

我們采用網(wǎng)口文件傳輸方式將應(yīng)用程序可執(zhí)行文件HPS_FPGA_LED發(fā)送開發(fā)板的Linux系統(tǒng)中逛腿。
本地連接配置如下圖所示:



接下來稀并,我們需要設(shè)置開發(fā)板的IP地址和電腦本地連接的IP地址在同一網(wǎng)段仅颇,即:192.168.137.*。我們暫且將其設(shè)定為:192.168.137.3碘举。

如果我們是第一次在開發(fā)板上運行友晶科技提供的鏡像忘瓦,這時啟動的Linux系統(tǒng)中的網(wǎng)絡(luò)IP地址并非如此,我們需要對其進行設(shè)定引颈。IP地址設(shè)定有兩種方法:一種是設(shè)定臨時的靜態(tài)IP地址耕皮;一種是設(shè)定永久的靜態(tài)IP地址。前者在關(guān)閉開發(fā)板后IP地址將自動失效蝙场;后者的IP地址是永久生效的凌停,除非再次更改。

我們這里只設(shè)定臨時靜態(tài)IP地址售滤。在串口工具中輸入命令:ifconfig eth0 192.168.137.3罚拟,即可設(shè)定IP地址台诗。可以再次運行命令:ifconfig確認(rèn)IP地址設(shè)定是否成功赐俗。

IP地址設(shè)置完成后拉队,我們就可以進行文件傳輸了。進入SoC EDS Command Shell中阻逮,進入應(yīng)用程序所在的目錄下粱快。輸入:scp HPS_FPGA_LED root@192.168.137.3:~/,回車叔扼。此時將會啟動文件傳輸事哭,接著在:Are you sure you want to continue connecting <yes/no>?后面輸入:yes,可執(zhí)行文件HPS_FPGA_LED將會自動傳輸?shù)介_發(fā)板上Linux系統(tǒng)的root用戶主目錄下瓜富。

在串口工具中慷蠕,輸入命令ls可以查看當(dāng)前所在的root用戶主目錄下已經(jīng)存在可執(zhí)行文件HPS_FPGA_LED。



至此食呻,使用網(wǎng)口進行文件傳輸已經(jīng)完成流炕。

當(dāng)然,我們也可以采用比較通用的FTP服務(wù)通過網(wǎng)口進行傳輸仅胞,讀者可以自行學(xué)習(xí)每辟。

文件執(zhí)行

文件執(zhí)行前我們需要更改可執(zhí)行文件HPS_FPGA_LED的權(quán)限。在串口工具中輸入命令:chmod 777 HPS_FPGA_LED干旧。然后渠欺,輸入命令:./HPS_FPGA_LED執(zhí)行可執(zhí)行文件。

按下鍵盤的:Ctrl + C可以終止程序運行椎眯。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挠将,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子编整,更是在濱河造成了極大的恐慌舔稀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掌测,死亡現(xiàn)場離奇詭異内贮,居然都是意外死亡,警方通過查閱死者的電腦和手機汞斧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門夜郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粘勒,你說我怎么就攤上這事竞端。” “怎么了庙睡?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵事富,是天一觀的道長剑勾。 經(jīng)常有香客問我,道長赵颅,這世上最難降的妖魔是什么虽另? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮饺谬,結(jié)果婚禮上捂刺,老公的妹妹穿的比我還像新娘。我一直安慰自己募寨,他們只是感情好族展,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拔鹰,像睡著了一般仪缸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上列肢,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天恰画,我揣著相機與錄音,去河邊找鬼瓷马。 笑死拴还,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的欧聘。 我是一名探鬼主播片林,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怀骤!你這毒婦竟也來了费封?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒋伦,失蹤者是張志新(化名)和其女友劉穎弓摘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凉敲,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡衣盾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年寺旺,在試婚紗的時候發(fā)現(xiàn)自己被綠了爷抓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡阻塑,死狀恐怖蓝撇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陈莽,我是刑警寧澤渤昌,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布虽抄,位于F島的核電站,受9級特大地震影響独柑,放射性物質(zhì)發(fā)生泄漏迈窟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一忌栅、第九天 我趴在偏房一處隱蔽的房頂上張望车酣。 院中可真熱鬧,春花似錦索绪、人聲如沸湖员。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娘摔。三九已至,卻和暖如春唤反,著一層夾襖步出監(jiān)牢的瞬間凳寺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工彤侍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留读第,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓拥刻,卻偏偏與公主長得像怜瞒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子般哼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 實驗?zāi)康模涸贒E10-Standard 下通過HPS控制FPGA實現(xiàn)流水燈 實驗環(huán)境: Quartus15.0-L...
    大佬帶帶我啊閱讀 1,351評論 0 0
  • SHA-256是區(qū)塊鏈和比特幣方案中用到的一種哈希算法吴汪。區(qū)塊鏈和比特幣大家都應(yīng)該有所了解。比特幣的設(shè)計原則是用加密...
    壹諾思維閱讀 6,531評論 3 5
  • 在當(dāng)初讀書的時候就一直想學(xué)學(xué)fpga蒸眠,可能是沒有什么不得不學(xué)的原因漾橙,最后總是沒有付諸行動。正好年前有點經(jīng)費打算買個...
    汪浩瀚閱讀 664評論 0 0
  • 久違的晴天楞卡,家長會霜运。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了蒋腮。班主任說已經(jīng)安排了三個家長分享經(jīng)驗淘捡。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友池摧。感恩相遇焦除!感恩不離不棄。 中午開了第一次的黨會作彤,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,564評論 0 11