
服务热线:
13510270108







取缔
清空纪录
汗青纪录
清空纪录
汗青纪录
XILINX FPGA 开发工具 Vivado 急剧上手与资源优化技巧
搞FPGA开发,,,,,,,Vivado是绑不开的坎。。。。。从2012年颁布至今,,,,,,,这套工具已经迭代到2025.1版本,,,,,,,代替了老旧的ISE,,,,,,,成为7系劣注UltraScale甚至Versal器件的官方开发平台。。。。。但好多人一上手就懵——界脸蛋大、选项密密麻麻,,,,,,,稍不把稳就踩坑。。。。。这篇文章不堆术语,,,,,,,只讲实战中真正管用的器材。。。。。
一、创建工程:别让步就毁了整个项目
打开Vivado,,,,,,,点击"Create Project",,,,,,,这一步看似单一,,,,,,,实则暗藏杀机。。。。。
蹊径是个雷区。。。。。 千万别用中文、空格或特殊字符。。。。。D:\我的FPGA尝试\project这种蹊径,,,,,,,轻则IP加载失败,,,,,,,沉则Tcl剧本直接崩掉。。。。。正确做法:D:/fpga_projects/led_blink/,,,,,,,纯英文、无空格、放SSD上综合速度能快一截。。。。。
器件选择别手敲型号。。。。。 在"Default Part"页面点"Boards"标签,,,,,,,输入开发板名称好比"Arty A7",,,,,,,Vivado会自动填充正确的Part Name和引脚约束。。。。。要是搜不到板子,,,,,,,去Xilinx官网下载对应的Board Files包,,,,,,,解压到%APPDATA%\Xilinx\Vivado\下就杏祝。。。。
务必勾选"Do not specify sources at this time"。。。。。 先建空工程,,,,,,,后续再按模浚??????樵龀ぴ次募。。。。。好多新手让工具自动天生top.v,,,,,,,了局定名和端口全不合,,,,,,,删了沉写浪费半天。。。。。
工程建好后,,,,,,,目录结构建议这么摆:
目录
用处
srcs/
Verilog/VHDL源码
constrs_1/
XDC约束文件
sim_1/
Testbench仿真
ip_repo/
自界说IP核

二、写代码:Verilog这块别犯低级错
Vivado支持Verilog和VHDL,,,,,,,但90%的人用Verilog。。。。。模浚??????槭歉纳杓频ピ
verilog
?
?
?
1
module top (
2
input wire clk,
3
input wire rst_n,
4
output reg
led
5
);
6
reg [25:0] counter;
7
always @(posedge clk or negedge rst_n) begin
8
if (!rst_n) begin
9
counter <= 26'd0;
10
led <= 1'b0;
11
end else if (counter == 26'd50_000_000) begin
12
counter <= 26'd0;
13
led <= ~led;
14
end else begin
15
counter <= counter + 1'b1;
16
end
17
end
18
endmodule
19
有个细节好多人忽略:复位逻辑尽量用同步复位。。。。。Xilinx器件的FF自身带异步复位端,,,,,,,但同步复位能省LUT资源。。。。。数据信号不必要复位,,,,,,,节造信号才必要——这一条能助你省下不少逻辑。。。。。
模浚??????槭路,,,,,,,强烈建议用定名端口衔接:u1(.a(a), .b(b), .c(c)),,,,,,,别用地位衔接u1(a, b, c)。。。。。团队合作里,,,,,,,地位一旦错位就是致命bug。。。。。

三、约束文件:没有它,,,,,,,设计就是子虚乌有
XDC文件干两件事:管脚分配和时序约束。。。。。管脚编号去开发板道理图里查,,,,,,,时序约束里create_clock是命脉:
tcl
1
create_clock -period 10.000 -name sys_clk [get_ports clk]
2
没这句话,,,,,,,所有蹊径都被当异步处置,,,,,,,时序分析直接失效,,,,,,,实现阶段必挂。。。。。

四、资源优化:统一职能,,,,,,,别人用200个LUT你用600个????????
差距就在代码写法里。。。。。
,,,,,,,别把组合逻辑塞进时序逻辑。。。。。 前提运算全堆在always块里,,,,,,,综合器会保留所有分支的推算资源,,,,,,,明明统一功夫只必要一个了局,,,,,,,却占了两套加法器。。。。。正确做法是把选择提到组合逻辑层,,,,,,,让后续流程有机遇做资源共享。。。。。
第二,,,,,,,乘法进DSP,,,,,,,除法能免则免。。。。。 wire [31:0] product = a * b;这种18位以内的乘法会自动射中DSP48E1。。。。。但a / 7这种非2次幂除法,,,,,,,综合器会发展成几百个LUT的状态机。。。。。能用移位代替的,,,,,,,坚定不写除号。。。。。
第三,,,,,,,BRAM要按端正来。。。。。 深度必须是2的幂次,,,,,,,地址宽度不超过18bit。。。。。reg [11:0] buf [0:300];这种深度301的数组,,,,,,,极或许率掉回LUTRAM,,,,,,,又慢又费资源。。。。。改成512深度,,,,,,,哪怕只用300个地位,,,,,,,空间换效能,,,,,,,值得。。。。。
第四,,,,,,,时钟门控别忘了。。。。。 按时器空闲时计数器还在每个时钟翻转,,,,,,,功耗白白浪费。。。。。用enable信号节造计数器更新,,,,,,,综合器能自动插入时钟门控逻辑。。。。。实测Artix-7上,,,,,,,功耗能降靠近40%。。。。。
五、综合与实现:跑完流程才算完
综合性质上是把Verilog翻译成LUT+FF的网表。。。。。跑之前设好战术:时序敏感选Performance_ExtraTimingOpt,,,,,,,面积敏感选Area Optimization。。。。。综合完必看三份汇报:Warning有没佑注资源用了几多、时钟约束有没有遗漏。。。。。
实现阶段就是"施工"——布局、布线、天生比特流。。。。。关键蹊径上的大扇出信号,,,,,,,用set_property max_fanout 10压一压;;;;;;;跨时钟域的信号,,,,,,,双寄放器同步加ASYNC_REG属性是标配。。。。。
Vivado这工具,,,,,,,入门不难,,,,,,,精通靠踩坑。。。。。把这几条吃透,,,,,,,你就已经跑在大无数新手前面了。。。。。
