一、介紹
本文介紹的是在ZYNQ 7020黑金開發(fā)板上實現(xiàn)PL端流水燈的例子,開發(fā)板上PL端的LED燈總共有4個,在原理圖中找到 PL LED 如下圖所示,通過看圖可知,給 LED 置低電平時燈才亮。
這里預(yù)想的實驗結(jié)果是:在1秒鐘內(nèi),4個LED各亮0.25秒,看起來就像流水燈一樣。
LED:4個,賦值為0時即點亮。
時鐘:50MHz。
復(fù)位:低電平有效,按鍵設(shè)為開發(fā)板上的 PL KEY1。
計數(shù):電平每變化一次就加1,加到49999999后重新置為0。
二、代碼編寫
工程的創(chuàng)建這里不再過多介紹,之前的文章已經(jīng)介紹過了。
下面的代碼就是在計數(shù)到0,0.25,0.5,0.75秒這些時刻時,點亮對應(yīng)的1個LED燈。
`timescale 1ns / 1ps
module led(
input sys_clk,
input rst_n,
output reg[3:0] led
);
reg[31:0] timer_counter;
always@(posedge sys_clk or negedge rst_n)
begin
if(!rst_n)
begin
led <= 4'b1111; //置0時燈才亮
timer_counter <= 32'd0;
end
else if(timer_counter == 32'd0)
begin
led <= 4'b1110;
timer_counter <= timer_counter +32'd1;
end
else if(timer_counter == 32'd12_500_000)
begin
led <= 4'b1101;
timer_counter <= timer_counter +32'd1;
end
else if(timer_counter == 32'd25_000_000)
begin
led <= 4'b1011;
timer_counter <= timer_counter +32'd1;
end
else if(timer_counter == 32'd37_500_000)
begin
led <= 4'b0111;
timer_counter <= timer_counter +32'd1;
end
else if(timer_counter == 32'd49_999_999)
begin
timer_counter <= 32'd0;
end
else
begin
led <= led;
timer_counter <= timer_counter +32'd1;
end
end
endmodule
下面代碼實現(xiàn)的功能與上面代碼一致,其中引入了case語句。
`timescale 1ns / 1ps
module led(
input sys_clk,
input rst_n,
output reg[3:0] led
);
reg[31:0] timer_counter;
always@(posedge sys_clk or negedge rst_n)
begin
if(!rst_n)
begin
led <= 4'b1111;
timer_counter <= 32'd0;
end
else if(timer_counter == 32'd49_999_999)
// else if(timer_counter == 32'd19) //用于測試
begin
timer_counter <= 32'd0;
end
else
begin
case(timer_counter)
32'd0 : led <= 4'b1110;
32'd12_500_000 : led <= 4'b1101;
32'd25_000_000 : led <= 4'b1011;
32'd37_500_000 : led <= 4'b0111;
// 32'd0 : led <= 4'b1110; //用于測試
// 32'd5 : led <= 4'b1101;
// 32'd10 : led <= 4'b1011;
// 32'd15 : led <= 4'b0111;
endcase
timer_counter <= timer_counter + 32'd1;
end
end
endmodule
代碼編寫完成后系統(tǒng)會自動保存,注意看右側(cè)邊欄處是綠色還是紅色,是綠色就說明代碼沒有錯誤,把鼠標(biāo)放在綠色框上面就會顯示下面的信息。
如果是紅色就說明代碼中有錯誤,代碼出錯的地方也會有紅色的波浪線,如下圖所示。
順便提一下,這個Vivado默認(rèn)的代碼字體太小了,在菜單欄點擊Tools——>Settings打開設(shè)置窗口,找到Text Editor——>Fonts and Colors,在右側(cè)就可以設(shè)置代碼的字體大小了。
三、引腳分配
在左側(cè) RTL ANALYSIS 下點擊 Open Elaborated Design 查看原理圖,如下圖所示。
如果在底部沒有 I/O Ports 可以點擊頂部菜單欄 Window 下的 I/O Ports 選項調(diào)出。
然后就要參考原理圖給這些端口分配引腳。
復(fù)位是低電平有效的,將其和開發(fā)板上PL的一個按鍵進(jìn)行綁定,如下圖所示,選擇開發(fā)板上的第四個實體鍵 PL KEY1(前三個分別是復(fù)位和兩個PS端的按鍵),對應(yīng)的原理圖引腳是KEY1。
開發(fā)板上的PL端實體按鍵如下圖所示。
四個 LED 和按鍵 KEY1 對應(yīng)的引腳如下圖所示。
時鐘選擇的是 50MHz,在原理圖中找到相應(yīng)的名稱,如下圖。
然后找到該名稱對應(yīng)的引腳是U18,如下圖所示。
其中頂部的VCC3V3代表3.3V,因此將其VCC設(shè)置為LVCMOS33*,如下圖所示就分配完成了。
命名并保存該文件,該文件是后綴為xdc的約束文件,打開后如下圖所示。
后續(xù)也可以通過編輯該文件實現(xiàn)引腳的分配或者修改。
接下來運行綜合,完成后打開約束向?qū)姘?,設(shè)置系統(tǒng)時鐘為50MHz。
這時候約束文件中也會多一行代碼,如下圖所示。
四、仿真分析
在下載比特流文件到開發(fā)板之前,之所以先在Vivado軟件中仿真,是因為生成比特流的過程太慢了,如果你每改動一次就在板子上驗證一下實在是太費時間了,所以提前在仿真中調(diào)試好代碼,有把握后到開發(fā)板上驗證即可。
上面提供的代碼中,用于測試的代碼可以將計數(shù)量縮小,這樣在仿真中就可以縮短仿真時間,這對整體的功能實現(xiàn)沒有任何影響,不過要在生成比特流文件時記得將代碼改過來。
在 Simulation Settings下可以設(shè)置仿真的運行時長,這里根據(jù)需要設(shè)置。
新建一個用于仿真的源文件,如下圖。
完成后在文件中寫入下面的仿真測試代碼。
`timescale 1ns / 1ps
module sim_led();
reg sys_clk;
reg rst_n;
wire [3:0] led;
initial
begin
sys_clk = 1;
rst_n = 0 ;
#100; //延遲100ns
rst_n = 1;
end
//Create clock
always #10 sys_clk = ~ sys_clk; //時鐘頻率為50MHZ,周期為20ns,因此每延遲10ns,時鐘翻轉(zhuǎn)一次
// Instantiate the Unit Under Test (UUT) 例化待測設(shè)計
led uut_led(
.sys_clk (sys_clk),
.rst_n (rst_n),
.led (led)
);
endmodule
先用Vivado自帶的仿真工具進(jìn)行簡單的行為仿真,得到的結(jié)果如下圖所示。仿真這部分的操作如果不太熟悉可以參考文章:Vivado中Simulator仿真軟件的使用。
通過上述仿真,其結(jié)果與代碼中預(yù)設(shè)的一致,那下面就可以到開發(fā)板上驗證了。如果仿真結(jié)果與自己的預(yù)想不一致,就要修改代碼,重新仿真,直到結(jié)果與自己的預(yù)期相符,然后再到開發(fā)板上驗證。
五、添加 ILA IP
ILA(Integrated Logic Analyzer),即集成邏輯分析儀,這里添加兩個探針,分別設(shè)置為4位和32位,對應(yīng)代碼中的 led 和 timer_counter。這一部分的詳細(xì)介紹可以參考文章:使用Vivado軟件進(jìn)行硬件調(diào)試。
生成后打開ila_0文件,復(fù)制84-90行的內(nèi)容,注意有多個探針時的位數(shù)設(shè)置,在代碼中不要搞錯。
在led.v文件的endmodule前添加下面的代碼。
ILA 就添加完成了。
六、板上驗證
接下來點擊生成比特流(Generate Bitstream),這個時間會比較長,完成后彈出下面對話框,選擇Open Hardware Manager。
連接好開發(fā)板的JTAG接口,給開發(fā)板上電,然后下載比特流文件到開發(fā)板。
添加ILA后Debug probes file這里也會有文件。
下載進(jìn)度條滿了之后就說明下載成功了,PL端流水燈的演示如下動圖所示。
使用集成邏輯分析儀查看,給其設(shè)置一個觸發(fā)值25000000,可以看到,從25000001開始,LED的值發(fā)生了變化,如下圖所示。
當(dāng)然,在12500000和37500000處,LED的值也會發(fā)生變化。通過仿真、開發(fā)板上LED的動圖以及ILA分析,其結(jié)果是按照代碼中設(shè)置的那樣輸出的。文章來源:http://www.zghlxwxcb.cn/news/detail-493843.html
以上就是 ZYNQ——PL端流水燈的實現(xiàn)的全部內(nèi)容了!
參考資料:
ZYNQ 開發(fā)平臺 FPGA 教程 AX7020文章來源地址http://www.zghlxwxcb.cn/news/detail-493843.html
到了這里,關(guān)于ZYNQ——PL端流水燈的實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!