本文转载自:coldnew's blog
在进入到这种混搭 ARM/FPGA 的开发板的世界之前,很多人都是从纯粹的 FPGA 开发板玩起,因此也让我们看看如何仅透过可程序逻辑(Programmable Logic, PL) 来对 Zybo board 上面的 LED 进行闪烁控制。
本文将采用业界比较常用的 Verilog 进行示范。
开发目标
我们要透过纯粹的可程序逻辑(Programmable Logic, PL) 去控制 LED,也就是说,我们只写硬件描述语言 Verilog 来控制 Zybo board 上面的 LED,让他依照我们设定的频率进行闪烁/亮灭。
根据 ZYBO FPGA Board Reference Manual 上面的信息,我们想要控制的这四个在板子上的 LED 都是位于可程序逻辑区(Programmable Logic, PL)可以碰触到的地方,如果你想要透过 Zynq 去对这些 LED 进行控制,你就会需要透过 AXI GPIO 的帮助,就像这样:
关于如何在 Zynq 下面控制这几个 LED,这部份我们将下一篇文章再来提及。
建立我们的项目
我们首先当然是建立我们的项目了,在进行这一步前,请先确定你有按照 让 Vivado 有 Zybo Board 的配置文件 一文所说,将 Zybo board 的设计导入。
启动了 Vivado 后,点选 Create Project 。
接下来指定好你的项目名称与路径
选择 RTL Project
在开发板选项中,选择 Zybo Board
完成项目建立
撰写程序
在项目建立完后,接下来就是添加并撰写我们的 Verilog 程序,点选 Project Manager -> Add sources 来增加档案
由于我们要增加的是可程序逻辑的设计档,因此选择 Add or create design sources
选择 Create File 去建立 top.v 这个档案,这也同时是我们的主程序
建立好 top.v 后,点选它来进行编辑
top.v
在我们的主程序 top.v 中,我们定义了一组缓存器用来存放当前计数的状态,每计数 125 百万次后,就让 led 缓存器的数值增加,反之则是让计数器的内容增加。
选择计数 125 百万次的原因,在于我们会把 clk 这个输入,连结到 125M Hz 的频率输入,这个频率是由 50M Hz 的石英振荡器经过 Ethernet PHY 后所产生的
也就是说,由于我们的频率输入将会设定为 125 MHz,因此让计数器计数 125 百万次后调整 LED 缓存器的信息,相当于 每 1 秒 修改一次 LED 缓存器的内容
我们的 top.v 程序如下
`timescale 1ns / 1ps
module top(output [3:0] led,
input clk);
reg [3:0]
led;
reg [26:0] counter;
always @(posedge clk) begin
if (counter == 27'd1250000000) begin
led <= led + 1;
counter <= 0;
end
else begin
counter <= counter +1;
end
end
endmodule
加入 Constraints
我们撰写好了 Verilog 模块 top.v,接下来就是要让这模块的 I/O 和 Zybo board 的脚位对应到,我们先连结到Zybo Resource Center 去下载 Master XDC 档案。
你也可以直接透过 wget 命令下载并解压出 ZYBO_Master.xdc 这个档案,它就是本节要加入的 Constraints 檔
coldnew@gentoo /tmp $
wget https://reference.digilentinc.com/_media/zybo/zybo_master_xdc.zip
coldnew@gentoo /tmp $
unzip zybo_master_xdc.zip
Archive: zybo_master_xdc.zip
inflating: ZYBO_Master.xdc
接下来一样选择 Project Manager -> Add sources 来增加档案
这次我们要增加的是 Constraints 档,因此选择 Add or create constraints
透过 Add Files 添加刚刚下载的 ZYBO_Master.xdc 档案
ZYBO_Master.xdc
在 ZYBO_Master.xdc 里面,预设所有对应接脚都是被批注掉的,这边我们反批注我们需要的 clk 以及 led 接脚,要注意到这边的 I/O 名称要对应到前面所写的 top.v 里面的 I/O 名称。
##Clock signal
##IO_L11P_T1_SRCC_35
set_property PACKAGE_PIN L16 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
#create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports clk]
##LEDs
##IO_L23P_T3_35
set_property PACKAGE_PIN M14 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
##IO_L23N_T3_35
set_property PACKAGE_PIN M15 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
##IO_0_35
set_property PACKAGE_PIN G14 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
##IO_L3N_T0_DQS_AD1N_35
set_property PACKAGE_PIN D18 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
这样我们就把 Verilog 模块和实际硬件对应的部份解决了
产生比特流 (bitstream)
前面的处理都好了后,接下来点选 Program and Debug -> Generate Bitstream 去让 Vivado 将这个项目产生出比特流 (bitstream),ZYNQ 会根据 bitstream 的信息对 FPGA 进行设定。
当 bitstream 产生完成后,会弹出一个窗口,这边我们选择 Open Harware Manager 进入到下载程序
下载到 Zybo board
确定此时你有将 Zybo board 接到计算机,并且你 JP5 设定在 QSPI 模式下,就像这样
点选 Open target 选择我们的目标开发板
选择 Auto Connect 让 Vivado 自行寻找下载目标
Vivado 告诉我们找到了一台使用 xc7z010 IC 的板子,就是我们的 Zybo board,选择这个进行刻录
在下载前,Vivado 会在确认一次 bitstream 的位置,确认无误后点选 Program 进行刻录
结果
在你执行 Program device 后,Vivado 会将刚刚产生的 bitstream 下载到我们的 Zybo Board 并执行它,最后完成的成果如下
取得程序代码
本文的范例已经放置于 GitHub 上,你可以到以下的 repo 去寻找,具体项目对应的教学名称,则请参考README.md 档案
延伸阅读[1] FPGA Programming: First Steps with the ZYBO Development Board
[2] Simple Verilog example useing Vivado 2015 with zybo FPGA board v0.1
[3] ECE 699: Lecture 3 General Purpose Input Output GPIO
[4] Tutorial 1: The Simplest FPGA in the World | Beyond Circuits
评论
查看更多