入手这个蜂鸟FPGA评估板可不能仅仅用来学习蜂鸟E203 CPU,既然上面有 Artix-7XC7A100T FPGA还可以用来学习FPGA嘛。
好,开始!做一个计数器,根据计数器值来驱动板上的LED吧,昨天用了几个小时玩了一下~~~
基本教程步骤和Vivado 2018.2的项目内容、生成的bitstream文件可以从这里得到:
https://pan.baidu.com/s/1PTxaWp4vyKOjMHPQDKU02Q 提取码:dzxp
当然参照上面压缩包中的“Vivado简明教程.pdf”中的步骤一步步创建工程、踩坑、排障,更有利于学习 :)
需要注意的是:
源码很简单,关键是怎么让源码和蜂鸟板配合起来,我就去看蜂鸟文档、e203 git中的约束文件,找到100mhz时钟、3个LED接在FPGA、Reset按钮哪个管脚上,根据文档和约束找出来的答案是:
100mhz外部时钟是在FPGA W19管脚上,板卡上三个靠得很近的三个LED灯分别接在管脚V19, Y19, W20上,MCU_Reset接在P20上。所以我就先根据蜂鸟板的约束文件把这几个部分拷贝出来,然后把这个demo项目的信号与管脚对应起来:
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
##### create clock #####
set_property -dict {PACKAGE_PIN W19 IOSTANDARD LVCMOS33} [get_ports clk_osc_100m]
create_clock -period 10.000 -name clk_100m -waveform {0.000 5.000} -add [get_ports clk_osc_100m]
##### rst define #####
set_property PACKAGE_PIN P20 [get_ports rst]
set_property IOSTANDARD LVCMOS33 [get_ports rst]
set_property PACKAGE_PIN W20 [get_ports {led[2]}]
set_property PACKAGE_PIN Y19 [get_ports {led[1]}]
set_property PACKAGE_PIN V19 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
上面的rst, clk_osc_100m, led[0].. 都是项目中定义的管脚。有了这些这个demo项目中的信号就与FPGA管脚对应起来了
按照上面的pdf中步骤一步步操作最终就能够编译出来bitstream。
为了生成最终写入flash的mcs文件,我在项目的settings | Bitstream | tcl.post中设置了使用cfgmem.tcl,使用vivado生成bitstream的最后阶段会调用这个脚本生成mcs.(这个脚本来源于e203 git中的同名脚本,改了下内容)
如果上述步骤一切正确,最后的Generate Bitstream完成后会在demo.runs/impl_1目录中找到top.bit, top.ltx, top.mcs文件。 如果想临时写入fpga,就烧写top.bit和top.ltx到fpga中;如果想要断电后还在,就按照蜂鸟板教程中写mcs的方法把top.mcs写入到fpga的外接flash中。(蜂鸟e203 cpu就被抹掉了,要想恢复蜂鸟板原有功能,就把原来的 risc-v e203 system.mcs重新写入到flash就可以了。)
运行方法:
按住板上的MCU_Reset按钮, 就可以看到红绿蓝三个LED灯交替点亮、熄灭。。。
嘿嘿,要一直按住Reset按钮很不爽,改一下top.v中的源码吧,让它变成缺省就开始计数。。。
这是个极为简单的FPGA例子,从这里面可以学到怎么将fpga的逻辑代码与已有的板卡关联;怎么编写fpga约束文件。