最近礦難,某寶某魚上都出現了大量礦機控制板。。。ASIC負責挖礦,控制板負責聯網、監視、控制之類。控制板不乏有各種水果派,像香橙派、樹莓派、狗骨頭之類的所謂“極客玩具”在其之列,想必國內水果派廠家活的是相當滋潤。。。光靠極客教育哪有什麼賺頭,極客大都很窮的,像我這樣看到這麼便宜的“zynq開發板”,便忍不住要跟風收一波垃圾了。。。
某魚上EBAZ4205
控制板氾濫,它出自翼比特E9+
礦機。它的老版控制卡EBAZ4203
配置與其基本一樣。
下面一大坨都是計算卡,上面一小塊纔是控制板
板子概況
主控 | XC7Z010CLG400-1 |
內存 | 256MB DDR3,EM6GD16EWKG或者MT41K128M16 |
nand | 128MB SLC |
以太網 | 百兆網卡,IP101GA |
供電 | 5V也行 |
其他 | TF卡,UART1,2個風扇口,14針jtag,3個20pin IO口 |
開發工程
SOC啓動配置
ZYNQ系列的SOC集成了雙核ARM Cortex-A9和FPGA。整個SOC分爲PS
(processing system)和PL
(programmable logic)兩部分。PS包括處理器、片上AMBA總線、存儲控制器、部分外設以及固定的IO口;PL就是FPGA。ZYNQ 7010處理器主頻可以到約600MHz,FPGA有約28K個LE。
ZYNQ的PS部分可以拋開PL部分而獨立運行,因爲PS的外設都默認綁定了一些IO口(MIO
),內存控制器之類的IO口還是不可更改的,這時候就可以像開發其他ARM SOC那樣去玩ZYNQ。MIO是有限的,一些外設端口衝突的話可以通過EMIO
繞道PL將其引出,這時候就需要管PL部分了。
ZYNQ的啓動分爲三步:
BOOT ROM
,根據引腳配置選擇從哪裏啓動,如QSPI、nand/nor flash、SD卡等。將FSBL
(first stage bootloader)加載到片上內存裏。7010的片上內存有256k。FSBL
,初始化更多的MIO口,初始化DDR,還可以初始化PL部分,然後將應用程序搬到DDR中。初始化部分由vivado直接生成,即那個上萬行的ps7_init.c
。FSBL可以直接用Xilinx SDK的例子工程,相當於這些工作都可以點點鼠標就完成了。應用程序
。可以直接是用戶的應用程序,也可以是又一個loader,比如uboot之類的,剩下的事情就由程序員自己做決定了。
應當指出,FSBL相當於是uboot SPL的地位。在Xilinx uboot工程中,那個上萬行的初始化c程序就編譯進SPL中去了,所以如果用SDK的FSBL就不需要uboot的SPL了。
這塊板子的R2577
和R2584
電阻用於配置啓動設備。把R2584
焊到R2577
上,將原來nand啓動改爲SD卡啓動。
Vivado操作流程
利用Xilinx那套笨重的開發環境,helloworld工程完全可以用鼠標操作出來,一行代碼都不用寫。。
首先新建個工程
一直next到選擇芯片。選xc7z010clg400-1
接下來就順着左邊欄Flow Navigator
進行操作。
Create Board Design
點加號添加ZYNQ7 Processing System
:
雙擊出來的zynq7 processing system藍框框,配置PS系統:
-
添加nand控制器,默認就行了:
vivado -
添加MIO設置。勾上ENET0、SD0、UART1。注意引腳配置:
vivado -
設置外設時鐘。把網口改成百兆的:
vivado -
設置DDR。幸好我們的
MT41K128M16
有默認參數配置:vivado
因爲板子的網口通過EMIO引出,所以我們需要一個個手動分配引腳。但是這個IP是GMII千兆網口,TX RX有8位,而百兆網卡用的MII接口TX RX只有4位,必須顯式地加兩個concat模塊來將8位轉爲4位,否則多餘的引腳引出了但是不分配IO口,最後生成bitstream時候會報錯。
將GMII的TX、RX引到各自的concat模塊處,將GMII其他引腳以及MDIO引出:右鍵點擊Make External
將FCLK_CLK0
跟M_AXI_GP0_ACLK
連起來,最後點擊上方欄的Run Block Automation
完成剩下的工作。
完成後的效果:
左邊欄Generate Block Design
先Generate Block Design
,然後右鍵Source
框下面的bd文件,Create HDL Wrapper
:
左邊欄Run Synthesis
先綜合一次,然後打開Open Synthesized Design
->Constraint Wizard
,分配引腳。這時需要新建一個constraint文件。
將網口的引腳都設置爲LVCMOS33
電平,然後逐個分配引腳。。。
設置完成後Ctrl-S
保存,約束文件生成如下:
set_property IOSTANDARD LVCMOS33 [get_ports ENET0_GMII_RX_CLK_0]
...
set_property PACKAGE_PIN U14 [get_ports ENET0_GMII_RX_CLK_0]
set_property PACKAGE_PIN U15 [get_ports ENET0_GMII_TX_CLK_0]
set_property PACKAGE_PIN W19 [get_ports {ENET0_GMII_TX_EN_0[0]}]
set_property PACKAGE_PIN W18 [get_ports {enet0_gmii_txd[0]}]
set_property PACKAGE_PIN Y18 [get_ports {enet0_gmii_txd[1]}]
set_property PACKAGE_PIN V18 [get_ports {enet0_gmii_txd[2]}]
set_property PACKAGE_PIN Y19 [get_ports {enet0_gmii_txd[3]}]
set_property PACKAGE_PIN W16 [get_ports ENET0_GMII_RX_DV_0]
set_property PACKAGE_PIN W15 [get_ports MDIO_ETHERNET_0_0_mdc]
set_property PACKAGE_PIN Y14 [get_ports MDIO_ETHERNET_0_0_mdio_io]
set_property PACKAGE_PIN Y16 [get_ports {enet0_gmii_rxd[0]}]
set_property PACKAGE_PIN V16 [get_ports {enet0_gmii_rxd[1]}]
set_property PACKAGE_PIN V17 [get_ports {enet0_gmii_rxd[2]}]
set_property PACKAGE_PIN Y17 [get_ports {enet0_gmii_rxd[3]}]
然後再綜合一次。。。
左邊欄Run Implementation 和 Generate Bitstream
要跑一段時間。。。
輸出設計
File
->Export
->Export Hardware
記得勾上Include Bitstream
。
進入SDK
File
->Launch SDK
SDK操作流程
首先需要新建FSBL。
File
->New
->Application Project
,Next到Templates
,選Zynq FSBL
:
然後它會自動開始編譯。。。
然後才新建helloworld。。
File
->New
->Application Project
,Next到Templates
,選Hello World
。它也會自動開始編譯,不出意外的話就完事了。
最後生成啓動文件BOOT.bin
左邊欄右鍵helloworld工程,Create Boot Image
。可以看到這個啓動文件包括了三部分:
- fsbl
- bitstream
- 應用程序
點亮板子
將一張SD卡格式化爲fat文件系統,將bootimage/BOOT.bin
丟進去,插上電就能啓動了。
測試網口
SDK裏面新建lwIP Echo Server
工程,等它編譯完,生成BOOT.bin,拷到SD卡里。插好網線,在終端中telnet
它的7號端口,輸入一行,回車,然後它就將你輸入的東西返回來了。。。
最後更新時間:2019-04-28 15:26:10
歡迎留言,大佬輕拍。。