【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】
? ? ? ? 數字電路設計,如果僅僅是寫寫代碼,做做verilog仿真,那么其實是不需要轉移到fpga上面的。這就好比是算法工程師,他做好了算法,寫好了matlab仿真之后,如果僅僅是為了發論文,這個時候其實目的已經達到了。但是我們最終是需要用verilog做產品的,也就是所有的電路都要port到fpga上的,這個時候就要想辦法創建fpga工程,下載程序了。
1、從ise到vivado、vitis
? ? ? ? 我們使用的芯片是zynq,主要是7010和7020。最早xilinx fpga編譯的工具叫ise,它只能做fpga的開發,現在加了arm之后,ise變成了vivado,最新的軟件叫vitis。相比較原來的軟件,vivado不僅安裝大小大了很多,功能也多了不少,它既可以做fpga的開發,還可以做arm的開發、hls的開發。如果不涉及到linux系統的開發,vivado windows版本其實可以覆蓋所有的開發內容。
2、vivado的開發步驟
? ? ? ? 目前為止,我們使用vivado還是先做fpga方面的開發。一個fpga工程在構建之前,最好已經做好了仿真方面的測試。比如我們之前做的iverilog+vvp+gtkwave就是仿真測試。如果通想過不停編譯fpga工程來進行在線測試,效率是非常低的。
? ? ? ? 一般vivado的開發步驟分成這三個步驟,首先是綜合,也就是把verilog語言轉變成各種網表。其次是實現布局布線,也就是把這些網表映射到fpga的硬件資源上面,中間會涉及到各種條件的約束。最后就是bitstream的生成。有了這個bitstream,就可以下載到具體的fpga上面,檢測一下執行效果了。
3、vivado最重要的優點就是軟硬協同開發
? ? ? ? 之前用ise開發fpga,大部分就是純數字的電路開發。但是vivado的開發思路有了很大的轉變。就拿zynq來說,由于有硬核arm和mio多功能接口,大部分外設、協議開發的工作其實都可以arm+軟件來完成。這個時候fpga部分就可以做一些算法加速、硬件擴展的工作。因為此時fpga做成的ip就可以為cpu所調用,這樣整個系統又靈活、效率又高。ps,也就是arm部分可以專注于業務和流程,而pl,也就是fpga專注于性能和接口拓展,兩者緊密合作,做自己擅長的工作即可。以前雖然也這么做,但是兩者是通過分列式元器件實現的,現在是合二為一了。
4、先fpga,再block design,最后sdk開發
? ? ? ? 很多ip其實是vivado自帶的,比如pll、rom、ram、fifo、ddr contrller、dma這些。但是很多行業特定的算法,都是沒有的,這部分就要自己寫。所以我們做好fpga開發之后,一般就會套一個axi接口,這樣就可以為cpu所調用。
? ? ? ? 所謂的block design,就是從數字電路層面構建一個系統。里面有arm cpu,有reset系統,有axi總線,有dma,還有各種各樣的外設ip、算法ip,最后把它們串聯成系統,構建一個超級fpga工程。這樣的設計既有系統性,還有靈活性。
? ? ? ? 最后就是sdk開發,最初的時候可以專注于裸機開發,或者是rtos開發。如ps自帶的mio接口,使用的也是固化ip,類似于gpio、uart、iic、sd、eth部分,這部分完全不需要pl的參與,就和mcu開發是一樣的。如果是ps端口不夠,就可以用pl拓展端口,或者直接把pl的算法ip導入進來,做好驅動,做好dma數據收發,這樣ip就可以為我們所用了。
5、第一個vivado工程
? ? ? ? 明確了未來的方向,目前為止我們還是以fpga為主。fpga本身也是可以單獨進行arm開發,或者是單獨進行fpga開發,只不過arm+fpga融合是效率最高的方式。如果是純fpga開發,只需要注意三點就可以了,第一點就是開始的時候,一定要注意好芯片類型的選擇。比如假設soc類型是7020clg400-1,結果后續端口選擇了其他soc的pin腳,很容易出現warning,或者直接bitstream生成失敗。
? ? ? ? 第二點,就是準備好verilog代碼。這部分代碼最好是之前仿真測試好的,這里直接copy粘貼過來即可。不要指望全部下載到fpga進行調試,這個效率是非常慢的。一般第一個verilog都是點燈程序,那么可以仿真測試好,再copy過來即可。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2025/09/11 22:07:11
// Design Name:
// Module Name: led
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////module led(input clk,input rst,output reg[1:0] led);reg[31:0] counter;
localparam THRESHOLD_VALUE = 32'd25000000;always@(posedge clk or negedge rst)if(!rst)counter <= 32'd0;else if(counter == THRESHOLD_VALUE)counter <= 32'd0;elsecounter <= counter + 1;always@(posedge clk or negedge rst)if(!rst)led <= 2'b00;else if(counter == THRESHOLD_VALUE)led <= ~led;endmodule
? ? ? ? 第三,就是xdc約束文件。有了verilog還不夠,我們還需要告訴fpga,哪部分是輸入,哪部分是輸出,clk是哪一個,只有這樣才能進行全部的工作。xdc可以和verilog一樣,一開始的時候就全部寫好,直接Generate bitstream即可。
set_property PACKAGE_PIN P15 [get_ports {led[1]}]
set_property PACKAGE_PIN U12 [get_ports {led[0]}]
set_property PACKAGE_PIN N18 [get_ports clk]
set_property PACKAGE_PIN R19 [get_ports rst]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports rst]
create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]
? ? ? ? 其實不光是vivado,其他廠家的eda基本上也是這么一個流程。只是過程可能會多一個仿真,比如modelsim的仿真,只是我們自己使用了iverilog,所以這一步就可以跳過去了。等到bitfile生成好了,就可以繼續準備后面的驗證測試了。
6、jtag燒錄
? ? ? ? 燒錄一般有兩種方法,一種就是jtag燒錄器直接燒入,還有一種就是直接type c燒入,這個時候燒錄模塊已經merge到開發板上面了。如果是vivado工具,直接輸入“open hardware target”,繼續單擊“Open Target”,左側選擇識別的芯片(比如7010或者是7020),右擊選擇“Program Device”,繼續選擇好對應的bitstream file,單擊“Program”即可。一般燒錄好了之后,芯片自己就開始運行了。不過斷電之后,程序也消失了。
? ? ? ??