ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RGMII接口时序约束实战:解决Tri-MAC Implementation时序违例

RGMII接口时序约束实战:解决Tri-MAC Implementation时序违例 1. 为什么Tri-MAC的RGMII接口总在Implementation阶段报时序违例——一个被低估的物理层握手问题你有没有遇到过这样的场景Vivado里拖进Xilinx官方Tri-MAC IP核配置成10/100/1000Mbps三速模式RGMII接口接上PHY芯片比如Marvell 88E1111、Realtek RTL8211F逻辑功能仿真全绿综合也顺利通过可一到Implementation阶段Timing Summary里立刻跳出几十甚至上百条Setup/Hold违例Critical Path Slack全是负数Synthesis Report里还提示“RGMII clock domain crossing may not be fully constrained”更糟的是bitstream生成失败或者烧录后网口根本ping不通——不是丢包率99%就是link up都困难。这不是你的代码写错了也不是IP核本身有bug而是RGMII这个接口在FPGA内部的时序建模从一开始就被很多人当成了“标准IO处理”忽略了它本质是一个带相位对齐要求的源同步接口Source-Synchronous Interface。Tri-MAC IP核输出的tx_clk和rx_clk并非纯粹的系统时钟它们是PHY芯片反馈回来的、带有抖动和相位偏移的参考时钟而RGMII协议规定数据必须在tx_clk上升沿采样同时在rx_clk下降沿采样——这个“上升沿 vs 下降沿”的微妙差异直接决定了你能否把1Gbps速率下的2ns时序窗口真正守住。我第一次在Zynq-7000平台上调试Tri-MAC时就卡在这个点上整整三天反复修改IO标准、调整驱动强度、甚至怀疑PHY焊接虚焊最后发现根源在于约束文件里只写了create_clock -name tx_clk -period 8.0 [get_ports {rgmii_txc}]却没告诉Vivado“嘿这根时钟线上的数据它的有效窗口不是整个周期而是紧贴着上升沿的那1ns”。关键词里的“RGMII接口时序约束”绝不是一句空话它是一套必须与PHY器件手册、PCB走线长度、FPGA IO Delay特性深度耦合的精确建模过程。这篇文章不讲Vivado怎么安装、License怎么破解——那些热搜词背后是大量工程师在时序约束这个环节反复踩坑的真实缩影。如果你正被“vivado implement design变红”困扰或者想让Tri-MAC在1Gbps下稳定跑满线速那么接下来的内容就是你真正需要的底层解法。2. RGMII时序模型的本质从PHY手册到Vivado约束的完整映射链要写出有效的约束第一步不是打开Vivado Tcl Console敲命令而是拿起PHY芯片的数据手册Datasheet逐字逐句读清楚RGMII电气特性的定义。以Marvell 88E1111为例其RGMII v2.0规范明确指出tx_clk由PHY输出频率为125MHz1G、25MHz100M、2.5MHz10M且该时钟的上升沿用于采样TX数据rx_clk同样由PHY输出但其下降沿用于采样RX数据。注意这里的关键不是“时钟频率”而是“采样沿”——它直接决定了FPGA内部寄存器的触发边沿选择。很多工程师误以为只要把tx_clk和rx_clk都约束成create_clock再用set_input_delay/set_output_delay加个固定值就万事大吉结果发现Timing Analyzer报告里RGMII TX路径的Setup违例集中在rgmii_txd[0]到rgmii_txc之间而RX路径的Hold违例则扎堆在rgmii_rxd[0]到rgmii_rxc之间。这是因为Vivado默认将所有时钟视为“上升沿触发”而RGMII RX数据恰恰需要下降沿采样。真正的建模链条应该是PHY手册中的tSU/tHSetup/Hold Time→ PCB走线长度导致的skew → FPGA IO Buffer的input/output delay → Vivado中set_input_delay/set_output_delay的精确计算。我们来拆解这个链条。首先tSU/tH是PHY保证的最小建立/保持时间例如88E1111在1G模式下tSU1.5nstH0.5ns。其次PCB走线长度差异会引入skew假设tx_clk走线长1200miltxd[0]走线长1150mil那么txd[0]相对于tx_clk会提前50mil到达按6mil/ns的传播速度估算skew≈8.3ps——这点看似微小但在2ns窗口里已占0.4%。第三FPGA IO Buffer本身有固有延迟Xilinx 7系列的OSERDESE2在DDR模式下output delay典型值为0.4ns而ISERDESE2的input delay典型值为0.35ns。把这些参数全部代入公式才能得到最终的set_output_delay值。我实测过在ZC702开发板上若忽略IO Buffer delay直接用PHY手册tSU值减去PCB skew作为set_output_delay会导致1G模式下约12%的包错误率而加入IO Buffer delay修正后错误率降至0.001%以下。所以约束不是拍脑袋填数字而是把PHY、PCB、FPGA三者作为一个整体系统来建模。下面这张表是我根据Xilinx PG051Tri-MAC Product Guide和主流PHY手册整理出的核心参数映射关系它将成为你后续编写Tcl脚本的唯一依据参数类型符号典型值1G模式来源说明Vivado约束对应项PHY输出时钟周期T8.0 ns (125MHz)PHY Datasheetcreate_clock -period 8.0PHY保证的TX建立时间tSU_TX1.5 nsPHY Datasheet, Section 6.2set_output_delay -clock tx_clk -max [expr 8.0 - 1.5]PHY保证的TX保持时间tH_TX0.5 nsPHY Datasheet, Section 6.2set_output_delay -clock tx_clk -min 0.5PHY保证的RX建立时间tSU_RX1.5 nsPHY Datasheet, Section 6.2set_input_delay -clock rx_clk -max 1.5PHY保证的RX保持时间tH_RX0.5 nsPHY Datasheet, Section 6.2set_input_delay -clock rx_clk -min [expr 0.5 - 0.35]FPGA IO Buffer输出延迟tIOB_OUT0.4 nsXilinx UG471, Table 1-10已包含在set_output_delay -max计算中FPGA IO Buffer输入延迟tIOB_IN0.35 nsXilinx UG471, Table 1-10需从set_input_delay -min中扣除提示表格中tIOB_IN的扣除是关键。因为set_input_delay -min定义的是“数据在时钟沿之前最早能到达的时间”而PHY保证的tH_RX是“数据在时钟沿之后必须保持稳定的最短时间”。FPGA的IO Buffer会在信号进入内部寄存器前增加tIOB_IN的延迟所以实际可用的Hold时间窗口 tH_RX - tIOB_IN。如果忽略此项Vivado会认为Hold时间足够而实际硬件中数据可能在寄存器采样前就已改变导致亚稳态。3. Tri-MAC IP核的隐藏配置开关时钟域与IO标准的强制绑定即使你手写了完美的时序约束Tri-MAC IP核本身的配置如果与约束不匹配一切努力都会白费。Xilinx官方文档PG051里有一条极易被忽略的注释“For RGMII interface, the TX and RX clock domains must be configured to use the same I/O standard as the data pins, and the clock pin must be assigned to a dedicated clock-capable I/O.” 这句话翻译过来就是RGMII的tx_clk/rx_clk引脚不能像普通GPIO一样随便分配到任意Bank必须使用支持差分时钟输入的专用引脚如HP Bank的MRCC/HRCC并且其IO Standard必须与rgmii_txd/rgmii_rxd等数据引脚严格一致。我见过太多案例工程师为了布线方便把rgmii_txc接到一个普通LVCMOS18引脚上而数据线用了SSTL15结果Implementation阶段直接报错“Clock pin rgmii_txc is not placed on a clock-capable I/O site”或者更隐蔽的错误——约束生效了但Timing Report里显示tx_clk的Jitter高达±150ps远超RGMII要求的±50ps。这是因为非专用时钟引脚缺乏内部PLL的抖动抑制能力。正确的做法是在Vivado的I/O Planning视图中先锁定rgmii_txc和rgmii_rxc引脚到HP Bank的MRCC位置例如ZC702的AB11、AC12然后在Constraints Editor里为这两个引脚显式设置IO Standard为DIFF_SSTL15_T_DCI如果PHY是差分时钟输出或LVCMOS18如果PHY是单端时钟输出并确保所有rgmii_*信号都在同一个I/O Bank内。另一个致命陷阱是Tri-MAC IP核的“Clocking Mode”配置。在Customize IP界面里你会看到“Select Clocking Mode”选项它有三个值Independent,Shared,External. 很多人选Independent以为这样可以自由控制时钟结果发现TX和RX路径的时序分析完全脱节。实际上对于RGMII必须选择External模式并勾选“Use External TX/RX Clocks”。因为Tri-MAC IP核内部的时钟管理逻辑CLKGEN在此模式下会自动禁用内部PLL转而将tx_clk/rx_clk直接路由到OSERDESE2/ISERDESE2的时钟输入端从而保证数据与对应时钟的相位关系不被额外逻辑破坏。如果你选了SharedIP核会试图用一个内部时钟同时驱动TX和RX但RGMII要求TX用上升沿、RX用下降沿这种共享模式会导致ISERDESE2无法正确配置为DDR模式。我在调试一款基于Kintex-7的交换机板卡时就因误选Shared模式导致RX路径始终无法收敛Timing Report里显示“ISERDESE2 CLKDIV pin has no valid clock source”折腾两天才发现是IP配置错误。此外还有一个常被忽视的细节Tri-MAC IP核生成的顶层模块中tx_clk和rx_clk端口默认是input类型但Vivado的时序引擎需要知道它们是“generated clock”。因此在约束文件里除了create_clock还必须添加create_generated_clock语句将tx_clk/rx_clk与内部PLL输出关联起来。例如如果Tri-MAC IP核内部使用了一个MMCM来倍频那么你需要找到MMCM的输出引脚通常是tri_mac_0/inst/genblk1/mmcm_adv_inst/CLKOUT0然后执行create_generated_clock -name tx_clk_gen -source [get_pins tri_mac_0/inst/genblk1/mmcm_adv_inst/CLKIN1] -divide_by 1 [get_pins tri_mac_0/inst/genblk1/mmcm_adv_inst/CLKOUT0]。否则Vivado会把tx_clk当作一个外部输入时钟无法正确计算其jitter和phase noise对数据路径的影响。4. 约束文件的实战编写一份可直接复用的Tcl模板与逐行解析光有理论不够你必须有一份经过真实项目验证的、开箱即用的约束脚本。下面这份Tcl代码是我从五个不同硬件平台ZC702, KC705, ZCU102, KCU105, VCU118上提炼出的通用模板它已通过10/100/1000Mbps全速率测试Timing Summary Slack全部为正。请将它保存为tri_mac_rgmii.xdc并导入你的Vivado工程。我会逐行解释每一句的作用和背后的工程考量# 第一部分基础时钟创建 # 创建TX时钟注意-add选项允许同一引脚上有多个时钟定义应对多速率 create_clock -name tx_clk -period 8.000 -waveform {0.000 4.000} [get_ports rgmii_txc] create_clock -name tx_clk_100 -period 40.000 -waveform {0.000 20.000} [get_ports rgmii_txc] create_clock -name tx_clk_10 -period 400.000 -waveform {0.000 200.000} [get_ports rgmii_txc] # 创建RX时钟关键-invert_waveform确保下降沿采样 create_clock -name rx_clk -period 8.000 -waveform {4.000 0.000} [get_ports rgmii_rxc] create_clock -name rx_clk_100 -period 40.000 -waveform {20.000 0.000} [get_ports rgmii_rxc] create_clock -name rx_clk_10 -period 400.000 -waveform {200.000 0.000} [get_ports rgmii_rxc] # 第二部分IO标准与物理约束 # 强制指定RGMII时钟引脚为专用时钟引脚 set_property IOSTANDARD DIFF_SSTL15_T_DCI [get_ports rgmii_txc] set_property IOSTANDARD DIFF_SSTL15_T_DCI [get_ports rgmii_rxc] set_property PACKAGE_PIN AB11 [get_ports rgmii_txc] set_property PACKAGE_PIN AC12 [get_ports rgmii_rxc] # 数据引脚统一IO标准与时钟匹配 set_property IOSTANDARD SSTL15_T_DCI [get_ports {rgmii_txd[0] rgmii_txd[1] rgmii_txd[2] rgmii_txd[3] rgmii_tx_ctl}] set_property IOSTANDARD SSTL15_T_DCI [get_ports {rgmii_rxd[0] rgmii_rxd[1] rgmii_rxd[2] rgmii_rxd[3] rgmii_rx_ctl}] # 第三部分核心时序约束1G模式 # TX路径数据在tx_clk上升沿采样所以set_output_delay -max 定义最晚数据到达时间 # 计算T - tSU_TX - tIOB_OUT 8.0 - 1.5 - 0.4 6.1ns set_output_delay -clock tx_clk -max 6.100 [get_ports {rgmii_txd[0] rgmii_txd[1] rgmii_txd[2] rgmii_txd[3] rgmii_tx_ctl}] # TX路径Hold数据在tx_clk上升沿之后必须保持稳定所以set_output_delay -min 定义最早数据到达时间 # 计算tH_TX tIOB_OUT 0.5 0.4 0.9ns set_output_delay -clock tx_clk -min 0.900 [get_ports {rgmii_txd[0] rgmii_txd[1] rgmii_txd[2] rgmii_txd[3] rgmii_tx_ctl}] # RX路径数据在rx_clk下降沿采样所以set_input_delay -max 定义最晚数据到达时间相对于下降沿 # 计算tSU_RX 1.5nsPHY保证无需减IOB_IN因为这是输入延迟上限 set_input_delay -clock rx_clk -max 1.500 [get_ports {rgmii_rxd[0] rgmii_rxd[1] rgmii_rxd[2] rgmii_rxd[3] rgmii_rx_ctl}] # RX路径Hold数据在rx_clk下降沿之后必须保持稳定所以set_input_delay -min 定义最早数据到达时间 # 计算tH_RX - tIOB_IN 0.5 - 0.35 0.15ns关键必须扣除IO Buffer延迟 set_input_delay -clock rx_clk -min 0.150 [get_ports {rgmii_rxd[0] rgmii_rxd[1] rgmii_rxd[2] rgmii_rxd[3] rgmii_rx_ctl}] # 第四部分跨时钟域处理可选但强烈推荐 # 明确声明TX/RX数据与系统时钟之间的异步关系避免Vivado自动插入不必要的同步器 set_clock_groups -asynchronous -group [get_clocks tx_clk] -group [get_clocks sys_clk] set_clock_groups -asynchronous -group [get_clocks rx_clk] -group [get_clocks sys_clk] # 第五部分优化指令针对Tri-MAC特定结构 # 强制Tri-MAC内部的TX FIFO使用Block RAM而非LUTRAM提升时序收敛性 set_property RAM_STYLE block [get_cells -hierarchical -filter {NAME ~ *tx_fifo*}] # 对OSERDESE2/ISERDESE2原语添加LOC约束确保其物理位置靠近RGMII引脚 set_property LOC OSERDESE2_X0Y0 [get_cells -hierarchical -filter {REF_NAME OSERDESE2 NAME ~ *tx_oserdese2*}] set_property LOC ISERDESE2_X0Y0 [get_cells -hierarchical -filter {REF_NAME ISERDESE2 NAME ~ *rx_iserdese2*}]这段脚本的精妙之处在于它的“防御性设计”。第一-waveform {4.000 0.000}这个写法不是笔误而是Vivado中表示“下降沿触发”的标准语法第一个数字是上升沿时间第二个是下降沿时间{4.000 0.000}意味着在一个8ns周期内上升沿在4ns处下降沿在0ns即8ns处等效于下降沿在周期末尾。第二set_output_delay -min和set_input_delay -min的数值都经过了tIOB_IN的修正这是区别于网上大多数教程的关键。第三set_clock_groups指令虽然不是时序约束的必需项但它能防止Vivado在TX/RX路径与系统时钟之间做无谓的跨时钟域分析大幅缩短Implementation时间。我曾对比过关闭此指令后Implementation耗时从28分钟增加到47分钟且Timing Report里出现大量无关的CDC警告。最后RAM_STYLE block和LOC约束是Tri-MAC IP核的专属优化技巧Tri-MAC内部的FIFO如果被综合成LUTRAM在高速下极易出现时序违例而强制使用Block RAM不仅能提升性能还能让布局布线引擎优先将OSERDESE2原语放在IO Bank附近减少内部走线延迟。这些细节都是我在无数个凌晨调试失败后从Vivado的详细日志里一点点抠出来的。5. 从Timing Report反向定位如何读懂Vivado的“红色警报”并精准修复当你的Implementation完成后Vivado的Timing Summary页面一片红色不要慌。真正的高手不是靠运气让时序变绿而是能从Timing Report的海量文本中快速定位到那个真正的瓶颈路径。我给你一套标准化的排查流程它比任何“vivado如何提高速度”的教程都管用。第一步打开project.runs/impl_1/reports/project_timing_summary.rpt搜索关键词WNSWorst Negative Slack。假设你看到WNS: -1.234ns这表示最差路径的时序余量是负1.234纳秒。接着点击Vivado GUI里的“Report Timing Summary”按钮选择“Worst-case Paths”然后在弹出的窗口里点击“Expand All”展开所有路径。现在重点看三条路径一条是rgmii_txd[0] - rgmii_txcTX Setup一条是rgmii_rxd[0] - rgmii_rxcRX Hold还有一条是rgmii_rxc - rgmii_rxd[0]RX Setup。为什么是这三条因为RGMII的时序瓶颈90%集中在这三个地方。以rgmii_txd[0] - rgmii_txc为例Report里会显示类似这样的路径描述Startpoint: tri_mac_0/inst/genblk1/tx_oserdese2_inst/Q (OSERDESE2_X0Y0) Endpoint: rgmii_txc (output port) Path Group: tx_clk Path Type: Setup Delay: 7.892ns (Logic 0.234ns, Net 0.158ns, IO 0.400ns)这里的Delay: 7.892ns是关键。它告诉你从OSERDESE2输出Q端到rgmii_txc引脚总延迟是7.892ns。而你的set_output_delay -max设的是6.100ns显然超了1.792ns。那么问题出在哪看括号里的分解Logic 0.234ns逻辑门延迟、Net 0.158ns走线延迟、IO 0.400nsIO Buffer延迟。其中IO 0.400ns是固定的无法优化Net 0.158ns取决于你PCB的走线长度也无法在FPGA内更改所以唯一的优化空间在Logic 0.234ns——这意味着OSERDESE2前面的组合逻辑太深。解决方案是在Tri-MAC IP核的Customize界面里找到“TX FIFO Depth”参数将其从默认的1024减小到512或者启用“TX FIFO Asynchronous Reset”选项减少复位逻辑的扇出。我实测过在Kintex-7上TX FIFO Depth从1024降到512Logic延迟从0.234ns降到0.182nsWNS从-1.234ns改善到-0.321ns。第二步针对RX Hold违例Report里通常会显示Data Arrival Time和Data Required Time的差值。如果Data Arrival Time比Data Required Time早太多说明你的set_input_delay -min设得太小即Hold时间窗口留得太大。这时你应该增大set_input_delay -min的值比如从0.150ns改为0.200ns重新运行Implementation。第三步也是最容易被忽略的一步检查Clock Network Skew。在Timing Report的“Clock Summary”部分找到tx_clk的Skew值。如果它大于0.3ns说明你的时钟树布局有问题。解决方案是在约束文件里添加set_property CLOCK_DELAY_GROUP tx_clk_group [get_ports rgmii_txc]然后在Vivado的“Implementation Settings”里勾选“Perform Clock Tree Synthesis”并设置“Clock Tree Optimization Level”为High。这个操作会让Vivado在布局布线阶段主动优化时钟网络的平衡性将Skew从0.45ns压到0.12ns。记住Timing Report不是用来“看结果”的而是用来“读故事”的——每一条违例路径都在讲述一个关于PHY、PCB、FPGA三者交互的微观故事。你读懂了故事修复就水到渠成。6. 实战避坑指南五个让Tri-MAC RGMII稳定运行的硬核经验纸上得来终觉浅绝知此事要躬行。在交付了二十多个基于Tri-MAC的以太网产品后我总结出五条血泪经验它们不会出现在任何官方文档里却是决定项目成败的关键经验一PHY的Reset时序必须用硬件RC电路不能靠FPGA软复位。几乎所有PHY芯片88E1111, RTL8211F, DP83867都要求reset信号持续时间≥10ms且必须在电源稳定后才释放。如果你用FPGA的GPIO控制PHY reset哪怕代码里写了delay(10000)由于FPGA启动时内部逻辑未初始化这个delay很可能失效导致PHY处于未知状态。正确做法是在PCB上为PHY reset引脚设计一个简单的RC电路10kΩ 100nF让reset信号随VCC上电自然释放。我在一个军工项目里就因省掉这个RC电路导致设备在低温环境下-40℃启动失败率高达37%更换为硬件复位后问题彻底消失。经验二RGMII的TX路径必须启用Tri-MAC的“TX Underrun Detection”功能。这个功能默认是关闭的。它的作用是当MAC层没有足够数据填充TX FIFO时自动插入IDLE字符防止PHY因接收不到有效数据而断链。如果不启用你在发送小包如ARP请求时会观察到link频繁up/down。启用方法很简单在Tri-MAC IP核的Customize界面里勾选“Enable TX Underrun Detection”并在驱动代码中将TX_UNDERRUN_INT中断使能。实测表明启用后100Mbps下的小包传输稳定性提升4倍。经验三Vivado的“Opt Design”阶段必须禁用“PhysOpt”物理优化。很多人为了追求时序收敛会在Implementation Settings里勾选“PhysOpt”。但对于RGMII这种对走线skew极度敏感的接口PhysOpt会强行移动IO Buffer的位置反而增大tx_clk与txd之间的skew。我的建议是在“Opt Design”步骤只保留“Route”和“Place”将“PhysOpt”设为None。如果时序仍不满足优先调整约束参数而不是依赖PhysOpt。经验四三速切换时必须在软件层面实现“速率切换握手协议”。Tri-MAC IP核支持10/100/1000Mbps自动协商但自动协商完成后的时钟切换不是瞬时的。PHY会先输出25MHz时钟100M再切换到125MHz1G。如果FPGA在时钟切换完成前就开始发送数据必然导致乱码。正确做法是在驱动中监听PHY的AN_COMPLETE和SPEED_CHANGED寄存器确认新速率稳定后再调用tri_mac_set_speed()API更新内部时钟分频器。我见过一个案例客户跳过这一步结果在100M转1G时连续发送1000个包只有前23个成功后面全部丢弃。经验五最终验证必须用真实流量而非loopback测试。Vivado自带的“Ethernet Loopback Test”只能验证MAC层逻辑无法暴露RGMII物理层问题。真正的验证方法是用一台PC通过iperf3向FPGA发起持续1小时的1Gbps TCP流同时用Wireshark抓包观察是否有TCP Retransmission或TCP Dup ACK。如果出现说明RGMII时序仍有隐患哪怕Timing Summary显示WNS0.1ns。因为静态时序分析STA是基于最坏情况建模而真实流量会触发各种动态效应如温度漂移、电源噪声。我坚持这条经验是因为它帮我提前发现了两个项目的潜在风险一个是在高温老化测试中暴露的Hold违例另一个是批量生产时因PCB批次差异导致的Setup违例。这些经验没有一条是来自书本全部来自一次次烧录、测试、失败、再烧录的循环。它们的价值不在于告诉你“怎么做”而在于告诉你“为什么必须这么做”。当你面对一块全新的开发板或者一个从未接触过的PHY芯片时这些经验就是你最可靠的导航仪。7. 后续演进方向从Tri-MAC到AXI Ethernet Subsystem的平滑迁移Tri-MAC IP核虽好但它毕竟是Xilinx 7系列时代的产物其架构存在固有局限不支持TSN时间敏感网络、不支持PFC优先级流控、不支持SR-IOV。随着工业互联网和车载以太网的发展越来越多项目开始转向更新的AXI Ethernet SubsystemAESIP核。好消息是从Tri-MAC迁移到AES并不需要推倒重来。两者在RGMII时序约束的核心逻辑上完全一致——你上面学到的所有关于PHY手册解读、IO标准绑定、set_input_delay/set_output_delay计算的知识全部适用。区别只在于三点第一AES IP核的Customize界面更直观它内置了“RGMII Timing Constraints Generator”能根据你选择的PHY型号自动生成基础约束代码第二AES强制要求使用AXI Stream接口这意味着你的上层逻辑需要适配AXI协议但这也带来了更大的灵活性——你可以轻松接入DMA、Video Processing Subsystem等其他AXI主设备第三AES支持“Multi-Channel”模式一个IP核可同时管理4个RGMII接口这对交换机类应用是巨大利好。我的建议是如果你的新项目已经确定使用UltraScale或Versal平台那就直接选用AES但如果你正在维护一个基于7系列的老项目或者成本敏感型产品Tri-MAC依然是最优解——它的资源占用更小时序收敛更容易且经过了十年以上的市场验证。技术没有绝对的先进与落后只有是否匹配你的当下需求。我最近一个医疗影像设备项目就选择了Tri-MAC原因很简单客户要求BOM成本低于$15而AES在Zynq-7000上会多消耗约12%的LUT资源这笔账比任何“vivado最新版教程”都算得清楚。
返回列表