在vivado中使用tcl脚本(UG894)

2023-11-17

本文源自UG894,主要介绍如何在vivado中使用tcl脚本

1.vivado中如何获取tcl help

vivado中任何自带的命令都可以通过“-help”获取帮助信息。
也可以直接输入“help”取得vivado命令合集,并通过“help -category (tools)”来获取某类操作的所有命令简介。

2.工程模式下编译和报告示例脚本

该过程可以通过运行GUI vivado自动产生的记录文件vivado.jou查看,该文件中记录了自打开vivado后运行的所有命令。
1.通过create_project命令建立工程。
2.通过add_files或import_files添加工程文件。
3.通过launch_runs和wait_on_run依次进行综合实现。

3.在vivado中加载并运行自己的tcl脚本

3.1 vivado启动时自动初始化脚本

vivado会在启动时自动加载Vivado_init.tcl文件中定义的脚本。可将自己写的proc写入该文件中,或者直接source自己的tcl脚本。
Vivado_inti.tcl路径为%APPDATA%/Xilinx/Vivado//Vivado_init.tcl

3.2 通过source运行tcl脚本

可以通过source将tcl脚本加载进入vivado中

source <filename>

使用source会默认打印脚本代码内容,可通过“-notrace”隐藏代码内容

source <filename> -notrace

3.3 在vivado编译流程中添加脚本

在Setting中,找到综合、实现、生成比特流设置,都可以添加tcl.pre和tcl.post的路径,即可在该流程之前或者之后插入自己的tcl脚本。

4.tcl脚本编写方法

原文档这部分主要简介tcl脚本语法及经典问题,此处只挑出其中的经典问题进行记录

4.1 proc参数数量不定时的解决方法

当proc参数数量不定时,即proc有0-n个参数都可以正常运行时,参数可以以链表形式给出,在proc中,依次对输入参数列表元素进行分析处理,每处理一个就删除一个,直至所有参数处理完毕。

# 将第一个元素从列表中移除
proc lshift listVar {
      upvar 1 $listVar L
      set r [lindex $L 0]
      set L [lreplace $L [set L 0] 0]
      return $r
  }
  
  
  proc myproc { args } {
  
    #-------------------------------------------------------
    # Process command line arguments
    #-------------------------------------------------------
    set error 0
    set help 0
    set verbose 0
    set ports {}
    # if {[llength $args] == 0} { incr help }; # Uncomment if necessary
    # 以此分析参数元素,每次循环将第一个元素删除
    while {[llength $args]} {
      set flag [lshift args]
      switch -exact -- $flag {
        -p -
        -ports {
             set ports [lshift args]
        }
        -v -
        -verbose {
             set verbose 1
        }
        -h -
        -help {
             incr help
        }
        default {
             if {[string match "-*" $flag]} {
               puts " ERROR - option '$flag' is not a valid option."
               incr error
             } else {
               puts "ERROR - option '$flag' is not a valid option."
               incr error
             }
        }
      }
    }
  
    if {$help} {
      set callerflag [lindex [info level [expr [info level] -1]] 0]
      # <-- HELP
      puts [format {
    Usage: %s
                [-ports|-p <listOfPorts>]
                [-verbose|-v]
                [-help|-h]
  
    Description: xxxxxxxxxxxxxxxxxxx.
                 xxxxxxxxxxxxxxxxxxx.
  
    Example:
       %s -port xxxxxxxxxxxxxxx
  
  } $callerflag $callerflag ]
      # HELP -->
      return -code ok {} 
    }
  
    # Check validity of arguments. Increment $error to generate an error
  
    if {$error} {
      return -code error {Oops, something is not correct}
    }
  
    # Do something
  
    return -code ok {}
  }

【注意】原文档中还给出了另一种用switch分析列表的方法,但是没有看懂,这里先不写了

4.2 局部变量和全局变量

局部变量是proc内部变量,该变量只在proc内使用,与外部变量相互独立(当与外部变量名字相同时,他们相互独立互不影响)。
全局变量是在proc外部定义的变量,属于全局命名空间变量。如果要在proc内部调用全局变量,需要在变量名前用global关键词;或者在变量名前加“::”。

proc printEnv {} {
  global env
  foreach var [lsort [array names env]] { puts "  $var = $env($var)" }
}
proc printEnv {} {
  foreach var [lsort [array names ::env]] { puts "  $var = $::env($var)" }
}

【注意】通常不建议用在proc内用global调用全局变量,global通常用于避免向proc传递太大的列表。通常优先考虑用upvar。

4.3 namespace的使用

为了避免变量和函数名重复,可以将函数和变量定义在更独立的空间。命名空间可以嵌套,通过::来调用命名空间中的变量和函数。

01  namespace eval foo {
02    variable stack [list]
03    variable count 0
04    variable params
05    array set params [list var1 value1 var2 value2 var3 value3]
06    
07    namespace export push pop
08    
09    proc push { args } {
10      variable stack
11      variable count
12      lappend stack $args
13      incr count
14    }
15  
16    proc pop {} {
17      variable stack
18      variable count
19      if {[llength $stack] > 0} {
20        set value [lindex $stack end]
21        set stack [lrange $stack 0 end-1]
22        incr count -1
23        return $value
24      } else {
25        error " no more element in the stack"
26      }
27    }
28    
29  }
30  
31  proc foo::dump {} {
32    variable stack
33    variable count
34    if {[llength $stack] > 0} {
35      puts " There are $count element(s) in the stack:"
36      foreach element $stack {
37        puts "    $element"
38      }
39      return 0
40    } else {
41      error " no element in the stack"
42    }
43  }
44  
45  namespace import foo::*

5.访问设计对象

vivado提供了非常丰富的get_*命令用于访问设计对象,这些命令会以列表形式返回所需内容。

5.1 对象特性

每种设计对象(net,pin,port……)都有不同种类的特性参数,可以通过get_* filter来找到某种特性的对象,可以通过report_property来展示某个对象的所有特性。特性也可以增加和删除。

5.2 对象检索

通过get_*、-hierarchical、filter、-regxp、-of_objects等来检索相关对象,此处不在赘述。

6.处理对象列表

通过get_*都以tcl链表形式返回对象,因此可以通过tcl内置的列表命令进行处理。

foreach X [lsort -decreasing [get_cells]] {puts $X}
wbArbEngine
usb_vbus_pad_1_i_IBUF_inst
usb_vbus_pad_0_i_IBUF_inst
usbEngine1
usbEngine0
...

7.保存命令输出

很多vivado命令都支持将输出保存至指定文件中,通过-file选项;或将输出结果以string形式保存,通过-return_string,以便后面的函数调用。

# 新建文件并写入内容
report_timing -delay_type max -file setup_violations.rpt
report_timing -delay_type min -file hold_violations.rpt

# 通过-append在原有文件中新增内容
report_timing -delay_type max -file all_violations.rpt
report_timing -delay_type min -file -append all_violations.rpt

文件的绝对或者相对路径可以当作文件名的一部分。

report_*命令也可以通过-return_string将结果以字符串形式输出,并可以赋给tcl变量。

set timeLines [split [report_timing -return_string -max_paths 10] \n ]

7.1 对文件进行操作

tcl提供了一系列命令对文件进行操作,这些都是tcl基本语法,此处不再赘述。

7.2 对字符串进行操作

tcl提供了一系列命令对字符串进行处理,此处不再赘述。

8.error处理

写脚本时,一个好的习惯:使用某个参数前先检查参数状态,比如打开文件前检查文件是否存在,使用报告列表时先检查是否有元素存在,这样会避免很多脚本运行错误。

8.1 检查变量状态

# 打开文件前检查文件是否存在
if {[file exists $filename]} {
  set FH [open $filename r]
  if {$FH != {}} {
    # The file is opened, do something
    # …
    close $FH
  } else {
    puts " File $filename could not be opened"
  }
} else {
  puts " File $filename does not exist"
}


# 在使用get_*之后,检查对象是否存在
proc get_pin_dir { pinName } {
 if {$pinName == {}} {
   puts " Error - no pin name provided"
   return {}
 }
 set pin [get_pins $pinName]
 if {$pin == {}} {
   puts " Error - pin $pinName does not exist"
   return {}
 }
 set direction [get_property DIRECTION $pin]
 return $direction
}

8.2 处理tcl错误

一些内置tcl命令出错时,如果没有对错误进行处理,可能会中断命令执行。例如当执行file命令时发现文件无法打开。
为了处理命令出错的情况,tcl内置了catch命令,当发现错误时返回1,否则返回0。

# catch语法
catch script [varname]
# script为一个或一个命令集,varname为报错内容存储变量名。示例如下:
If {[catch script errorstring]} {
  # A low-level TCL_ERROR happened
  puts " Error - $errorstring "
} else {
  # No TCL_ERROR was generated
  puts " The code completed successfully "
}
# 当使用file命令时发现文件无法开始时,通过cathc处理
if {[file exists $filename]} {
  if {[catch { set FH [open $filename r] } errorstring]} {
    puts " File $filename could not be opened : $errorstring"
  } else {
    # The file is opened, do something
    # …
    close $FH
  }
} else {
  puts " File $filename does not exist"
}

error命令可用于产生TCL_ERROR。(这里没看懂,error是用于增加报错内容的吗?)

proc get_file_content { filename } {
  if {[catch {
    set FH [open $filename r]
    set content [read $FH]
    close $FH
  } errorstring]} {
    error " File $filename could not be opened : $errorstring "
  }
  return $content
}

9.调用外部程序

使用exec调用外部程序,使用时要确保外部程序可以适配当前操作系统。

set result [exec /bin/perl <path_to>/my_perl_script.pl]

10.自定义设计规则检查(DRC)

DRC定义了一系列设计规则,并检查当前设计是否符合这些规则,打印找到的错误和冲突部分。
可以通过report_drc执行DRC,检查并报告当前设计中的违例部分。
当发现设计违背设计规则时,可以通过create_dec_violation定义且标识违例行为。
可以通过create_dec_check命令创建用户自定义DRC。
可以通过create_dec_ruledeck命令创建drc集合,集合中可以同时有自定义DRC和官方DRC,可以通过add_drc_checks在集合中新增DRC。

10.1 创建tcl检查函数

创建一个proc对设计中感兴趣的对象进行检查,最终以DRC违例报告形式返回一个明确定义的错误。新增的脚本必须在report_drc执行之前导入。

# 示例中dataWidthCheck检查WRITE_B总线宽度是否符合要求。
# This is a simplistic check -- report BRAM cells with WRITE_WIDTH_B wider than 36.
proc dataWidthCheck {} {
# list to hold violations
set vios {}
# iterate through the objects to be checked
foreach bram [get_cells -hier -filter {PRIMITIVE_SUBGROUP == bram}] {
set bwidth [get_property WRITE_WIDTH_B $bram]
if { $bwidth > 36} {
# define the message to report when violations are found
set msg "On cell %ELG, WRITE_WIDTH_B is $bwidth"
set vio [ create_drc_violation -name {RAMW-1} -msg $msg $bram ]
lappend vios $vio
}; # End IF
}; # End FOR
if {[llength $vios] > 0} {
return -code error $vios
} else {
return {}
}; # End IF
} ; # End PROC

10.2 新建DRC检查

建立tcl检查函数之后,还需要在vivado中将其定义为DRC,并加入到系统DRC报告内容中。
首先需要通过create_drc_check声明建立新的检查规则,该命令需要用户自定义一个检查名字(向DRC集合中添加该检查,或在DRC报告中找到该检查,会用到名字),在上面的示例中,DRC名为RAMW-1。除此以外,create_drc_check还需要添加proc名字,作为-rule_body,上述例子中,proc名为dataWidthCheck。
DRC检查规则有is_enable特性,可以通过set_property进行配置,当其为fulse时,执行report_drc时不会检查这一条。

10.3 新建DRC检查集

可以手动将多个DRC检查加入DRC检查集,通过create_drc_ruledesk创建检查集,通过add_drc_checks新增检查,通过remove_drc_checks删除检查。

create_drc_ruledeck myrules
add_drc_checks -ruledeck myrules {RAMW-1 RAMW-2 RAMW-3}
remove_drc_checks {RAMW-2} -ruledeck myrules

DRC检查集也有is_enable属性。

10.4 单独运行自定义DRC

用户自定义的DRC、DRC集合可以单独运行。

report_drc -check {RAMW-1}
report_drc -check {RAMW-1 RAMW-2}
report_drc -ruledecks myrules

10.5 DRC属性设置

DRC就像其他对象一样可以通过get_property查看属性、set_property设置属性。

Vivado% report_property [get_drc_checks RAMW-1]
Property         Type     Read-only  Visible  Value
ARCHITECTURES    string*  true       true
CLASS            string   true       true     drc_check
DESCRIPTION      string   true       true     Block RAM Data Width Check
GROUP            string   true       true     RAMW
HIERNAME         string   true       true     RAMB Checks
IS_ENABLED       bool     false      true     1
IS_USER_DEFINED  bool     true       true     1
MESSAGE          string   true       true
MSG_ID           int      true       true     1
NAME             string   true       true     RAMW-1
SEVERITY         enum     false      true     Advisory

DRC属性只有IS_ENABLE和SEVERITY可以设置。

set_property IS_ENABLED false [get_drc_checks RAMW-1]
set_property SEVERITY {Critical Warning} [get_drc_checks RAMW-1]
# 将设置属性初始化
reset_drc_check [get_drc_checks]

11.自定义GUI按钮

Tools > Custom Commands > Customize Commands.

12.提高tcl运行效率的方法

以下几种方法可以提高tcl脚本的运行效率。

12.1运用嵌套

一条命令在tcl控制台执行时,首先通过tcl编译器对命令进行解析,之后进入C++层继续执行这条命令,执行结束后返回正确的值给tcl编译器,之后执行下一条命令,tcl编译器到C++层会消耗一定时间,因此如果可以将两个命令通过嵌套变为一个命令,则系统只需在tcl编译器和C++层变化一次,节省了一定时间。举例来说:

set nets [get_nets -hier]
set pins [get_pins -of_objects $nets

这样执行时间将会长于

set pins [get_pins -of_objects [get_nets -hier]]

12.2 缓存对象

当有一些运行结果需要多次使用时,最好先将其设置为一个变量,避免每次使用时都要重新检索或计算一遍。

12.3 vivado的object可以直接当作string作为其他命令的参数

当一些命令需要输入字符串时,vivado的设计对象可以直接输入,而无需再调用设计对象的NAME属性。

if {[regexp {.*enable.*} $MyObject]} { ... }
if {[regexp {.*enable.*} [get_property NAME $MyObject]]} { ... }

第一种写法不仅比第二种易读,同时运行时间更短。

12.4 写更高效的代码

提高运行时间的一种方法是高效地编写代码,以便构建一个容器,并在整个容器上运行一个命令,而不是在一个循环中对作为容器一部分的每个项目运行命令。(即将循环中的数据整合成一个列表,之后对列表进行统一操作)。

# 低效写法
foreach bram [get_cells -hier -filter {PRIMITIVE_SUBGROUP == bram}] {
set bwidth [get_property WRITE_WIDTH_B $bram]
if { $bwidth > 36} {
highlight_object -color red [get_cells $bram]
}; # End IF
}; # End FOR

# 高效写法
foreach bram [get_cells -hier -filter {PRIMITIVE_SUBGROUP == bram}] {
set bwidth [get_property WRITE_WIDTH_B $bram]
if { $bwidth > 36} {
lappend bram_list $bram
}; # End IF
}; # End FOR
highlight_object -color red [get_cells $bram_list]

12.5 获取用户输入

在通常的tclsh环境下,通过stdin获取用户输入:

gets stdin answer

而在vivado环境下,tcl脚本会在不同系统环境下运行,stdin很难兼容所有情况。因此除非确定脚本只在某些情况下运行,并且stdin可以全部兼容时,才使用这个命令。
vivado环境下,通常建议将所有输入整合成一个tcl脚本文件,之后通过source来执行输入文件,即可完成参数输入。用户需要更改配置时,只需要更改文件中的数据即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在vivado中使用tcl脚本(UG894) 的相关文章

  • TestBench编写_激励产生

    TestBench编写 激励产生 TestBench编写 激励产生 基本背景 读取函数介绍 a fopen函数使用 b fread函数使用 c fclose函数使用 实际使用 TestBench编写 激励产生 基本背景 最近遇到项目中需要对
  • 【FPGA】面试问题及答案整理合集

    面试问题及答案整理合集 1 硬件描述语言和软件编程语言的区别 2 FPGA选型问题 3 建立时间和保持时间问题 3 亚稳态问题 4 竞争和冒险问题 5 乒乓操作问题 6 同步和异步逻辑电路 7 同步复位和异步复位 8 MOORE 与 MEE
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • Verilog HDL——Modelsim仿真

    常用testbench语法 finish 和 stop finish任务用于终止仿真并跳出仿真器 stop任务则用于中止仿真 timescale time unit time precision time unit指定计时和延时的测量单位
  • [从零开始学习FPGA编程-28]:进阶篇 - 基本组合电路-奇偶校验生成器(Verilog语言版本)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第1章 奇偶校验生成器 1 1 什么是奇校验 1 2 Verilog语言描述
  • 【PIPE】流水线设计中的基本模块

    大概分成以下几节 1 概述及协议 2 valid forward valid超前 3 bubble collapse 消除气爆 4 input output skid 不知中文怎么说 5 pipe halt 流水停顿 6 idle pres
  • 使用七牛云进行文件上传

    目录 一 七牛云入门测试 1 注册七牛云账号 完成后选择对象存储 2 在里面创建空间 一个空间相当于一个文件夹 就是将对象上传到的地方 3 查看个人秘钥 注册完成账号后 会有一个秘钥 上传文件的时候进行授权和认证 4 文件上传测试 二 封装
  • FPGA学习笔记(一)__电平知识

    常见电平标准 文章目录 1 TTL电平标准 2 LVTTL电平标准 1 LVTTL3V3 2 LVTTL2V5 3 CMOS电平标准 4 LVCOMS电平标准 1 LVCOMS3V3 2 LVCOMS2V5 3 LVCOMS1V8 4 LV
  • 画时序图软件——TimeGen和Timing Designer下载

    在写实验报告的时候需要画波形图 但是手头没有很好的软件 就上网搜了一些 分享出来 这里分享的是TimeGen和Timing Designer两个软件 资源均来自网上 有侵权请联系 TimeGen使用和安装都比较简单 我发的应该里面有破解方法
  • [从零开始学习FPGA编程-24]:进阶篇 - 基本组合电路-编码器与译码器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125247358 目录 前言 Veri
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • 【ZYNQ学习】PL第一课

    这节课讲什么 这节课的名字本来是想写为LED 但这一课里除了LED也有按键 又想换为GPIO控制 但关于PL的GPIO控制 不应该这么草率和简单 而且这一课有很多和ZYNQ或者PL关联性不强的东西要说 所以我写了删删了写改了好几遍 终于定为
  • 串口通信知识点总结

    串口是串行接口 serial port 的简称 也称为串行通信接口或COM接口 串口通信是指采用串行通信协议 serial communication 在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式 串口按电气标准及协议来划分
  • 时序约束理解

    异步配置信息 跨时钟域 配置信息一般set max delay按照3delay来约束 2 异步回读 rst clear信号 设置set false path 放松时序约束要求 不应分析设计中的逻辑路径 因为不关心点到点时序要求
  • 同时读取和写入寄存器

    我计划在 FPGA 上用 VHDL 设计一个类似 MIPS 的 CPU CPU 将具有经典的五级管道 没有转发和危险预防 在计算机体系结构课程中 我了解到第一个 MIPS CPU 用于在时钟上升沿读取寄存器文件并在时钟下降沿写入 我使用的F
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • VHDL 中的 BRAM_INIT

    我正在模拟基于处理器的设计 其中程序存储器内容保存在 BRAM 中 我正在使用 VHDL 推断 BRAM 实现程序存储器 我试图避免使用 CoreGen 因为我想保持设计的可移植性 最终该设计将进入 FPGA 我想看看是否有一种方法可以使用
  • 无符号和 std_logic_vector 之间的区别

    谁能告诉我以下书面陈述之间的区别 signal A unsigned 3 downto 0 signal B std logic vector 3 downto 0 Both std logic vector and unsigned ar

随机推荐

  • 无线 连接公司服务器,客户端无线连接服务器

    客户端无线连接服务器 内容精选 换一换 您可以在弹性负载均衡服务中创建一个负载均衡器 该负载均衡器会接收来自客户端的请求 并将请求转发到一个或多个可用区的后端服务器中进行处理 请求的流量分发与负载均衡器配置的分配策略类型相关 共享型和独享型
  • apache kafka_Apache Kafka简介

    apache kafka During the last years technologies for building real time data pipelines and event streaming apps have emer
  • 红队隧道应用篇之DNS协议传输(九)

    简介 DNS隧道是一种相对隐蔽的隧道 通过将其他协议封装到DNS协议中来进行传输通信 因为DNS协议是网络中的基础协议且必不可少 所以大部分防火墙和入侵检测设备是不会对DNS流量进行拦截 这就给DNS作为隐蔽通信提供了有力条件 从而可以利用
  • 程序员面试题精选100题(30)-赋值运算符重载函数[C/C++/C#]

    程序员面试题精选100题 30 赋值运算符重载函数 C C C 问题 给出如下CMyString的声明 要求为该类型添加赋值运算符函数 class CMyString public CMyString char pData NULL CMy
  • 蓝桥杯题库 历届试题部分(C++、Java)代码实现(46-60)

    文章目录 五 历届试题 PREV 46 填字母游戏 PREV 47 区间移位 PREV 48 数组操作 PREV 49 发现环 PREV 50 对局匹配 PREV 51 观光铁路 PREV 52 小数第n位 PREV 53 分考场 PREV
  • 使用 ChatGPT 总是出现「Something went wrong」解决方案

    1 前言 最近使用 ChatGPT 总是出现 Something went wrong If this issue persists please contact us through our help center at help ope
  • ARM汇编快速入门

    本文主要分享如何快速上手ARM汇编开发的经验 汇编开发中常见的Bug以及Debug方法 用的Convolution Dephtwise算子的汇编实现相对于C 版本的加速效果三方面内容 前言 神经网络模型能够在移动端实现快速推理离不开高性能算
  • c++STL标准库排序函数std::sort使用

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 错误原因 二 修改后的代码 前言 C sort 排序函数 C STL 标准库中的 sort 函数 本质就是一个模板函数 正如表 1 中描述的 该函数专门用来对容器或普通数组中指定范围内
  • js json格式数组自定义key

    封装对象数组的key进行自定义的方法 changeKey arr key let newArr arr forEach item index gt let newObj for var i 0 i lt key length i newOb
  • python 学习笔记 opencv 安装

    OpenCV opencv 是一个跨平台的计算机视觉库 有英特尔公司发起并参与开发 在以下领域应用广泛 增强现实 人脸识别 手势识别 人机交互 动作识别 运动跟踪 物体识别 图像分区 机器人 Windows python下的安装 下载地址
  • VSCode下载和安装教程(超详细)以及解决VSCode下载速度特别慢的问题

    文章目录 1 引言 2 下载VSCode 3 解决VSCode下载速度特别慢 4 安装VSCode 1 引言 今天用WebStorm运行前端代码时 发现不太好打断点 于是 打算改用VSCode来运行前端代码 但前提是要安装VSCode 如下
  • SAM-Med2D:打破自然图像与医学图像的领域鸿沟,医疗版 SAM 开源了!

    关注公众号 发现CV技术之美 本文转载自书生 OpenGVLab 由于医学图像和自然图像之间存在较大差异 以及缺少大规模医学图像基准数据集 这是导致AI在医学领域进展缓慢的原因之一 构建大规模基准数据集和可靠的基线模型 能够推动AI在医疗领
  • 关于Python的定义

    Python是一种高级编程语言 它被广泛应用于人工智能 大数据分析 网络编程 游戏开发等领域 Python的语法简单易学 代码可读性较高 使用简便 成为初学者入门的优秀选择 Python具有丰富的第三方库 可以轻松地实现各种功能 其中最为出
  • 最新让机器“看见”—计算机视觉原理及实战-从OpenCV基础到深度学习实战

    课程目标让机器 看见 计算机视觉原理及实战 从OpenCV基础到深度学习实战课程简介课程由浅入深 图文并茂 在讲述概念的同时注重和实际系统结合 为快速上手并深入研究无人驾驶 智能机器人 人机交互 医疗等行业应用奠定坚实基础 下载地址 百度网
  • 可见光与红外双模态图像融合行人检测

    摘要 由于传统融合检测方法未能较好地解决双模态融合中冗余信息带来的误检 漏检问题 为了更有效地利用双模态信息 提出一种光照感知和卷积块注意模块相结合的双模态特征融合行人检测网络 IWFC Net 首先根据可见光图像提取光照感知值 将其作为融
  • STM32------ADC基本原理

    目录 一 ADC 1 ADC简介 2 stm32f10x ADC特点 3 stm32f10x 大容量芯片带3个ADC控制器 4 ADC通道和引脚对应关系 5 ADC引脚 6 ADC框图 7 STM32F1的ADC的各个通道可以单次 连续 扫
  • Stable Diffusion Prompt用法

    Stable Diffusion可以根据你输入的提示词 prompt 来绘制出想象中的画面 1 正向提示词 Prompt 提高图像质量的prompt prompt 用途 HDR UHD 64K HDR UHD 4K 8K和64K 这样的质量
  • TinyMCE的上传文件的功能

    记录一下TinyMCE的上传文件的功能 用Base64上传图片 if meta filetype image var input document createElement input input setAttribute type fi
  • windows下安装使用git-lfs克隆大文件

    下载安装git lfs工具 首先去git lfs这里 下载相应平台的工具 我下载的windows版本 非安装版本 直接配置到系统环境变量里 执行以下命令验证是否成功 git lfs install 克隆数据集 这样自动会下载里边的大文件 g
  • 在vivado中使用tcl脚本(UG894)

    本文源自UG894 主要介绍如何在vivado中使用tcl脚本 1 vivado中如何获取tcl help vivado中任何自带的命令都可以通过 help 获取帮助信息 也可以直接输入 help 取得vivado命令合集 并通过 help