最近矿难,某宝某鱼上都出现了大量矿机控制板。。。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系统:
因为板子的网口通过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 。
进入SDKFile ->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 。可以看到这个启动文件包括了三部分:
点亮板子将一张SD卡格式化为fat文件系统,将bootimage/BOOT.bin 丢进去,插上电就能启动了。
测试网口SDK里面新建lwIP Echo Server 工程,等它编译完,生成BOOT.bin,拷到SD卡里。插好网线,在终端中telnet 它的7号端口,输入一行,回车,然后它就将你输入的东西返回来了。。。
|