本文轉(zhuǎn)載自:coldnew's blog
在進(jìn)入到這種混搭 ARM/FPGA 的開(kāi)發(fā)板的世界之前,很多人都是從純粹的 FPGA 開(kāi)發(fā)板玩起,因此也讓我們看看如何僅透過(guò)可程序邏輯(Programmable Logic, PL) 來(lái)對(duì) Zybo board 上面的 LED 進(jìn)行閃爍控制。
本文將采用業(yè)界比較常用的 Verilog 進(jìn)行示范。
開(kāi)發(fā)目標(biāo)
我們要透過(guò)純粹的可程序邏輯(Programmable Logic, PL) 去控制 LED,也就是說(shuō),我們只寫(xiě)硬件描述語(yǔ)言 Verilog 來(lái)控制 Zybo board 上面的 LED,讓他依照我們?cè)O(shè)定的頻率進(jìn)行閃爍/亮滅。
根據(jù) ZYBO FPGA Board Reference Manual 上面的信息,我們想要控制的這四個(gè)在板子上的 LED 都是位于可程序邏輯區(qū)(Programmable Logic, PL)可以碰觸到的地方,如果你想要透過(guò) Zynq 去對(duì)這些 LED 進(jìn)行控制,你就會(huì)需要透過(guò) AXI GPIO 的幫助,就像這樣:
關(guān)于如何在 Zynq 下面控制這幾個(gè) LED,這部份我們將下一篇文章再來(lái)提及。
建立我們的項(xiàng)目
我們首先當(dāng)然是建立我們的項(xiàng)目了,在進(jìn)行這一步前,請(qǐng)先確定你有按照 讓 Vivado 有 Zybo Board 的配置文件 一文所說(shuō),將 Zybo board 的設(shè)計(jì)導(dǎo)入。
啟動(dòng)了 Vivado 后,點(diǎn)選 Create Project 。
接下來(lái)指定好你的項(xiàng)目名稱(chēng)與路徑
選擇 RTL Project
在開(kāi)發(fā)板選項(xiàng)中,選擇 Zybo Board
完成項(xiàng)目建立
撰寫(xiě)程序
在項(xiàng)目建立完后,接下來(lái)就是添加并撰寫(xiě)我們的 Verilog 程序,點(diǎn)選 Project Manager -> Add sources 來(lái)增加檔案
由于我們要增加的是可程序邏輯的設(shè)計(jì)檔,因此選擇 Add or create design sources
選擇 Create File 去建立 top.v 這個(gè)檔案,這也同時(shí)是我們的主程序
建立好 top.v 后,點(diǎn)選它來(lái)進(jìn)行編輯
top.v
在我們的主程序 top.v 中,我們定義了一組緩存器用來(lái)存放當(dāng)前計(jì)數(shù)的狀態(tài),每計(jì)數(shù) 125 百萬(wàn)次后,就讓 led 緩存器的數(shù)值增加,反之則是讓計(jì)數(shù)器的內(nèi)容增加。
選擇計(jì)數(shù) 125 百萬(wàn)次的原因,在于我們會(huì)把 clk 這個(gè)輸入,連結(jié)到 125M Hz 的頻率輸入,這個(gè)頻率是由 50M Hz 的石英振蕩器經(jīng)過(guò) Ethernet PHY 后所產(chǎn)生的
也就是說(shuō),由于我們的頻率輸入將會(huì)設(shè)定為 125 MHz,因此讓計(jì)數(shù)器計(jì)數(shù) 125 百萬(wàn)次后調(diào)整 LED 緩存器的信息,相當(dāng)于 每 1 秒 修改一次 LED 緩存器的內(nèi)容
我們的 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
我們撰寫(xiě)好了 Verilog 模塊 top.v,接下來(lái)就是要讓這模塊的 I/O 和 Zybo board 的腳位對(duì)應(yīng)到,我們先連結(jié)到Zybo Resource Center 去下載 Master XDC 檔案。
你也可以直接透過(guò) wget 命令下載并解壓出 ZYBO_Master.xdc 這個(gè)檔案,它就是本節(jié)要加入的 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
接下來(lái)一樣選擇 Project Manager -> Add sources 來(lái)增加檔案
這次我們要增加的是 Constraints 檔,因此選擇 Add or create constraints
透過(guò) Add Files 添加剛剛下載的 ZYBO_Master.xdc 檔案
ZYBO_Master.xdc
在 ZYBO_Master.xdc 里面,預(yù)設(shè)所有對(duì)應(yīng)接腳都是被批注掉的,這邊我們反批注我們需要的 clk 以及 led 接腳,要注意到這邊的 I/O 名稱(chēng)要對(duì)應(yīng)到前面所寫(xiě)的 top.v 里面的 I/O 名稱(chēng)。
##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 模塊和實(shí)際硬件對(duì)應(yīng)的部份解決了
產(chǎn)生比特流 (bitstream)
前面的處理都好了后,接下來(lái)點(diǎn)選 Program and Debug -> Generate Bitstream 去讓 Vivado 將這個(gè)項(xiàng)目產(chǎn)生出比特流 (bitstream),ZYNQ 會(huì)根據(jù) bitstream 的信息對(duì) FPGA 進(jìn)行設(shè)定。
當(dāng) bitstream 產(chǎn)生完成后,會(huì)彈出一個(gè)窗口,這邊我們選擇 Open Harware Manager 進(jìn)入到下載程序
下載到 Zybo board
確定此時(shí)你有將 Zybo board 接到計(jì)算機(jī),并且你 JP5 設(shè)定在 QSPI 模式下,就像這樣
點(diǎn)選 Open target 選擇我們的目標(biāo)開(kāi)發(fā)板
選擇 Auto Connect 讓 Vivado 自行尋找下載目標(biāo)
Vivado 告訴我們找到了一臺(tái)使用 xc7z010 IC 的板子,就是我們的 Zybo board,選擇這個(gè)進(jìn)行刻錄
在下載前,Vivado 會(huì)在確認(rèn)一次 bitstream 的位置,確認(rèn)無(wú)誤后點(diǎn)選 Program 進(jìn)行刻錄
結(jié)果
在你執(zhí)行 Program device 后,Vivado 會(huì)將剛剛產(chǎn)生的 bitstream 下載到我們的 Zybo Board 并執(zhí)行它,最后完成的成果如下
取得程序代碼
本文的范例已經(jīng)放置于 GitHub 上,你可以到以下的 repo 去尋找,具體項(xiàng)目對(duì)應(yīng)的教學(xué)名稱(chēng),則請(qǐng)參考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
評(píng)論