VS Code下開發FPGA——FPGA開發體驗提升__下

上一篇:IntelliJ IDEA下開發FPGA-CSDN博客

Type:Quartus

一、安裝插件

????????在應用商店先安裝Digtal IDE插件

安裝后,把其他相關的Verilog插件禁用,避免可能的沖突。重啟后,可能會彈出下面提示

這是插件默認要求的工具鏈,在擴展設置中可以選擇其他幾個。這里遵循默認,進入Vivado網址,下載

安裝教程可參考Vivado 安裝教程 - Digital Lab 2024

安裝完成后,可以在VS Code的設置里,找到擴展選項,再找到安裝路徑設置,注意斜杠的方向

不過在使用時,經常會報下面錯誤,應該是VS Code的日常bug吧

二、基本使用?

1,網表

? ? ? ? 在編寫的模塊中,點擊Netlist就可以生成網表

在開啟右邊設置里的渲染動畫時,點擊每條支路都會有流光動畫

2,文檔

? ? ? ? 點擊右上角,可以打開文檔,里面有該模塊的所有總結信息

生成的代碼文檔足夠詳細,甚至包含注釋的信息

3、代碼檢查

? ? ? ? 在語法解析完成的情況下,對代碼的檢查可謂是相當給力,點擊下方的提示可自動轉到

而且對System Verilog文件也能進行正常檢查,不必擔憂中文注釋

基于這個代碼檢查,編寫模塊文件和測試文件都可以使用表達能力更好的System Verilog

4,git插件

? ? ? ? 至于前篇提到的內置git不是很好用,在一些插件的幫助下,有了質的提升

5,文件綱要

6,代碼格式化

? ? ? ? 右鍵屏幕,點擊格式化文檔,即可自動對齊代碼

三、自動流程

1,創建任務

? ? ? ? 由于FPGA芯片為Intel類型,因此綜合(或仿真)需要用到Quartus(或ModelSim)。如想達到如IntelliJ IDEA中非常方便的運行目標,需要配置任務

①創建模板

? ? ? ? 選擇模板創建

選擇Others

然后會自動生成配置文件

????????語法很簡單,label是該任務的名稱,type是任務的類型,command就是該任務的執行命令,也就是名為label的任務使用shell執行command。這些內容在上篇IntelliJ IDEA的配置運行目標中可以見到,只不過這里更為自由

②運行任務

? ? ? ? 此時執行任務試試

可以看到輸出臺上

③配置為生成任務(構建)

? ? ? ? 點擊配置默認生成任務,在點擊之前創建的任務即可(這里已經選擇過了)

? ? ? ? 在模板里可以看到,json里添加了新的兩個選項(標簽)

④使用快捷鍵

? ? ? ? 由于VS Code的運行任務不像IntelliJ IDEA之間在上方顯示,每次運行時都需要點擊【運行】→【運行任務】→【xxx任務】。因此可以把需要執行的任務配置為默認生成任務,然后通過Ctrl +?Shift + B快速執行

⑤任務啟動插件

當然,這樣依舊并不是很方便,比如現在有綜合、仿真等任務,來回切換就有些不夠清晰直觀。為解決這個問題,首先要想的便是插件,可以看到豐富的插件

????????這里就隨便選擇一個,比如Task Manager,安裝之后左邊會出現一個小圖標,點擊之后就會顯示所有任務

光標懸停在任務上面,就會出現綠色的執行鍵,點擊執行就會出現下面圖標,簡單好用

2,綜合任務

①編寫腳本

綜合

? ? ? ? 基于上面內容,現在我們可以輕松仿照上篇中關于綜合任務的配置。其基本思路是,編寫一個ps1腳本,讓任務目標使用shell終端來執行ps1腳本,ps1腳本里則是各種終端命令。

? ? ? ? ????????任務shell腳本工具命令

????????現在先寫一個ps1腳本,與前篇的一樣(前篇有詳細講解和代碼)

為了讓腳本更加通用,工作目錄可以通過參數的方式傳入,項目名從工作目錄里提取


param([Parameter(Mandatory=$true)] # 強制要求參數[string]$WORK_DIR        # 聲明參數變量
)# 設置程序路徑
$QUARTUS_BIN = "E:\Tools\Develop\Embedded\intelFPGA\quartus\bin64"# 從路徑提取目錄名
$PROJECT_NAME = (Get-Item $WORK_DIR).Name  # 初始化環境
$env:PATH = "$QUARTUS_BIN;$env:PATH"
Set-Location $WORK_DIR# 執行流程
$commands = @("quartus_map --read_settings_files=on --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME","quartus_fit --read_settings_files=off --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME","quartus_asm --read_settings_files=off --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME","quartus_sta $PROJECT_NAME -c $PROJECT_NAME","quartus_eda --read_settings_files=off --write_settings_files=off $PROJECT_NAME -c $PROJECT_NAME"
)foreach ($cmd in $commands) {Write-Host "Run: $cmd" -ForegroundColor CyanInvoke-Expression $cmdif ($LASTEXITCODE -ne 0) {Write-Host "[Error] $LASTEXITCODE" -ForegroundColor Redexit $LASTEXITCODE}
}

????????任務腳本需要改一下,名稱為sythesis,命令為腳本名稱。args里是存放各種參數,逗號相當于空格,起分隔作用

{// See https://go.microsoft.com/fwlink/?LinkId=733558// for the documentation about the tasks.json format"version": "2.0.0","tasks": [{"label": "synthesis","type": "shell","command": "powershell.exe",  // 顯式調用 PowerShell"args": ["-ExecutionPolicy", "Bypass", // 繞過權限限制"-File", "${workspaceFolder}/usr/scripts/powershell/synthesis.ps1", // 腳本路徑"${workspaceFolder}"// 傳入工作目錄],"options": {"cwd": "${workspaceFolder}" // 設置工作目錄為項目根目錄},// 配置為生成任務"problemMatcher": [],"group": {"kind": "build","isDefault": true},}]
}

執行效果如下

添加報告

? ? ? ? 為了綜合后能顯示一些重要信息,可以在上面的ps1腳本末尾添加一些提取信息的命令,通過正則表達式匹配信息。比如可以從output_files目錄下的xxx.sta.rpt文件里提取Fmax

# 提取 Fmax 值
$reportPath = Join-Path $WORK_DIR "output_files\$PROJECT_NAME.sta.rpt"
if (Test-Path $reportPath) {$content = Get-Content $reportPath -Raw$pattern = '(?s); \w+\s+\d+mV\s+(?<temp>[0-9-]+C)\s+Model Fmax Summary.*?; (?<fmax>\d+\.\d+) MHz'$matches = [regex]::Matches($content, $pattern)if ($matches.Count -gt 0) {$data = @()foreach ($match in $matches) {$temp = $match.Groups["temp"].Value -replace "C", ""$fmax = $match.Groups["fmax"].Value$data += [PSCustomObject]@{temp = $tempFmax = "$fmax MHz"}}# 修正列寬計算方式$tempWidth = [Math]::Max(4, ($data.temp | ForEach-Object { $_.ToString().Length } | Measure-Object -Maximum).Maximum)$fmaxWidth = [Math]::Max(5, ($data.Fmax | ForEach-Object { $_.ToString().Length } | Measure-Object -Maximum).Maximum)# 輸出彩色表格Write-Host "--------------------------------------------------"Write-Host "Fmax Report for $PROJECT_NAME" -ForegroundColor YellowWrite-Host "--------------------------------------------------"# 標題行Write-Host ("{0,-$tempWidth} {1,-$fmaxWidth}" -f "temp", "Fmax") -ForegroundColor CyanWrite-Host ("{0,-$tempWidth} {1,-$fmaxWidth}" -f "----", "-----------") -ForegroundColor DarkGray# 數據行foreach ($item in $data) {# 溫度用綠色,Fmax用藍色Write-Host ("{0,-$tempWidth}" -f $item.temp) -NoNewline -ForegroundColor GreenWrite-Host (" {0,-$fmaxWidth}" -f $item.Fmax) -ForegroundColor Blue}} else {Write-Host "Failed to find Fmax values in report" -ForegroundColor Red}
} else {Write-Host "Report file not found: $reportPath" -ForegroundColor Red
}

②查看報告

? ? ? ? 生成的報告都在output_files目錄,其中fit.map和map.rpt是我們需要關注的,在fit.map中,大概兩百多行處就是資源消耗的總結報告

? ? ? ? 由于沒有什么rpt文件相關的插件,如果想要更詳細的信息,那么還是到Quartus里查看比較好

資源消耗報告

? ? ? ? 不過既然想做一站式開發,頻繁切換開發環境并不好。因此我們可以同前面一樣,在腳本后面加一些命令來解析rpt文件獲取一些重要信息,比如掌管資源消耗的xxx.fit.rpt文件

? ? ? ? 需注意,這些腳本的路徑都是基于項目路徑,只要項目路徑傳輸正確并且output_files能正確在項目路徑里生成(這一條是由Quartus自動生成的)

# 提取 資源消耗
$reportPath = Join-Path $WORK_DIR "output_files\$PROJECT_NAME.fit.rpt"
if (-not (Test-Path $reportPath)) {Write-Host "Report file not found: $reportPath" -ForegroundColor Redexit 1
}# 讀取報告內容
$content = Get-Content $reportPath -Raw# 提取頂層實體名
if ($content -match '; Top-level Entity Name\s+;\s*(?<entity>\S+)\s*;') {$topEntity = $matches.entity
} else {$topEntity = "Unknown"
}# 定義要提取的關鍵資源項
$resourcePatterns = @{"Total Logic Elements"          = '; Total logic elements\s+;\s+(.*?)\s*;'"Total Registers"               = '; Total registers\*\s+;\s+(.*?)\s*;'"I/O Pins"                      = '; I/O pins\s+;\s+(.*?)\s*;'"Used LABs"                     = '; Total LABs:\s+partially or completely used\s+;\s+(.*?)\s*;'"Global Clocks"                 = '; Global clocks\s+;\s+(.*?)\s*;'"Peak Interconnect Usage"       = '; Peak interconnect usage.*?\s+;\s+(.*?)\s*;'"Max Fan-out"                   = '; Maximum fan-out\s+;\s+(.*?)\s*;'"Memory (M9Ks)"                 = '; M9Ks\s+;\s+(.*?)\s*;'"PLLs"                          = '; PLLs\s+;\s+(.*?)\s*;'"Average Interconnect Usage"    = '; Average interconnect usage.*?\s+;\s+(.*?)\s*;'
}# 提取數據
$resourceData = @{}
foreach ($key in $resourcePatterns.Keys) {if ($content -match $resourcePatterns[$key]) {$resourceData[$key] = $matches[1].Trim()} else {$resourceData[$key] = "N/A"}
}# 創建表格數據
$reportData = @()
foreach ($key in $resourceData.Keys) {$reportData += [PSCustomObject]@{Resource = $keyValue    = $resourceData[$key]}
}# 自動調整表格列寬
$maxResourceLength = ($reportData.Resource | Measure-Object -Maximum -Property Length).Maximum
$maxValueLength    = ($reportData.Value | Measure-Object -Maximum -Property Length).Maximum# 輸出彩色表格
Write-Host "--------------------------------------------------"
Write-Host "Fitter Resource Usage Report for [$topEntity]" -ForegroundColor Yellow
Write-Host "--------------------------------------------------"# 標題行
Write-Host ("{0,-$maxResourceLength} {1,-$maxValueLength}" -f "Resource", "Value") -ForegroundColor Cyan
Write-Host ("{0,-$maxResourceLength} {1,-$maxValueLength}" -f "--------------------------------", "--------------------------------") -ForegroundColor DarkGrayforeach ($item in $reportData) {# 根據資源類型設置顏色$valueColor = if ($item.Value -match "\d+%\s*\)") { "Cyan" } else { "Magenta" }Write-Host ("{0,-$maxResourceLength}" -f $item.Resource) -NoNewline -ForegroundColor GreenWrite-Host (" {0,-$maxValueLength}" -f $item.Value) -ForegroundColor $valueColor
}Write-Host "--------------------------------------------------"

效果如下,需要什么效果就用正則表達式提取相應信息,生成想要的格式

3,仿真任務

????????與前篇一致,插件仿真默認使用的是iverilog,那么對sv文件的支持就相當差了,點擊爬蟲沒有反應,但對v文件有反應。

①ModelSim_GUI

? ? ? ? 那么也如前面,創建一個仿真任務,在原任務下面即可,逗號不要忘記添加

{// See https://go.microsoft.com/fwlink/?LinkId=733558// for the documentation about the tasks.json format"version": "2.0.0","tasks": [{"label": "synthesis","type": "shell","command": "powershell.exe",  // 顯式調用 PowerShell"args": ["-ExecutionPolicy", "Bypass", // 繞過權限限制"-File", "${workspaceFolder}/usr/scripts/powershell/synthesis.ps1", // 腳本路徑"${workspaceFolder}"// 傳入工作目錄],"options": {"cwd": "${workspaceFolder}" // 設置工作目錄為項目根目錄},// 配置為生成任務"problemMatcher": [],"group": {"kind": "build","isDefault": true},},{"label": "modelsim_gui", "type": "shell","command": "quartus_sh","args": ["-t","E:/tools/develop/embedded/intelfpga/quartus/common/tcl/internal/nativelink/qnativesim.tcl", // TCL 腳本路徑"--rtl_sim","${workspaceFolderBasename}", "${workspaceFolderBasename}"],"options": {"cwd": "${workspaceFolder}", // 設置工作目錄// 添加環境變量"env": {"PATH": "E:/Tools/Develop/Embedded/intelFPGA/quartus/bin64;${env:PATH}"}},"problemMatcher": []    // 無錯誤匹配器}]
}

? ? ? ? 執行效果如下

②ModelSim_CMD

? ? ? ? 此時是讓ModelSim以命令行的形式運行,原流程是quartus_sh自動讀取tcl腳本,然后生成對應的do腳本,再讓vsim以命令行的形式執行這個do腳本。如果改寫tcl腳本的話,有些麻煩,于是準備使用ps1腳本,讓其直接讀取qsf文件中仿真的配置,然后生成do腳本,再讓vsim執行do腳本。

? ? ? ? 那么這個ps1腳本可以先使用正則表達式匹配到關鍵信息,再利用模板生成特定的do腳本

param([string]$ProjectFloder,[string]$QsfPath,[string]$DoScript,[string]$VsimFloderPath,[string]$SimMode = "RTL"
)# 設置環境變量
$env:PATH = "$VsimFloderPath;$env:PATH"# 強制覆寫設置(移除了備份邏輯)
if (Test-Path $DoScript) {Write-Host "Force overwriting existing DO script [$DoScript]"Remove-Item $DoScript -Force
}# 2. 解析QSF文件
$Config = @{SimTool = ""    # ModelSim-Altera (SystemVerilog)TopEntity = "" # 頂層模塊名TopEntityFile = ""ActiveTestbench = ""TestbenchFile = ""
}# 解析狀態跟蹤
$currentSection = $nullGet-Content $QsfPath | ForEach-Object {# 捕獲section聲明if ($_ -match '-section_id\s+([^\s]+)') {$currentSection = $matches[1]}switch -regex ($_) {# 關鍵參數解析'set_global_assignment\s+-name\s+EDA_SIMULATION_TOOL\s+"(.+)"' {$Config.SimTool = $matches[1]Write-Host "[SimTool]: $($matches[1])" -ForegroundColor Green}# 捕獲頂層模塊名'set_global_assignment\s+-name\s+TOP_LEVEL_ENTITY\s+(.+)' {$Config.TopEntity = $matches[1]Write-Host "[TopEntity]: $($matches[1])" -ForegroundColor Green}# 捕獲頂層模塊文件名'set_global_assignment\s+-name\s+(VERILOG_FILE|SYSTEMVERILOG_FILE)\s+(.+)' {if($($Config.TopEntityFile) -eq ""){$filePath = $matches[2]$fileName = [IO.Path]::GetFileNameWithoutExtension($filePath)if ($fileName -eq $Config.TopEntity) {$Config.TopEntityFile = $filePathWrite-Host "[TopEntityFile]: $filePath" -ForegroundColor Green}}}# 捕獲激活的測試平臺'set_global_assignment\s+-name\s+EDA_NATIVELINK_SIMULATION_TEST_BENCH\s+"?(.+?)"?\s' {if ($currentSection -eq 'eda_simulation') {$Config.ActiveTestbench = $matches[1]Write-Host "[ActiveTestbench]: $($matches[1])" -ForegroundColor Green}else {Write-Host "[Warning] Ignoring non-testbench section: $currentSection -> $($matches[1])"  -ForegroundColor Red}}# 捕獲測試平臺文件名'set_global_assignment\s+-name\s+EDA_TEST_BENCH_FILE\s+(.+)\s+-section_id\s+(.+)' {$filePath = $matches[1]$fileName = [IO.Path]::GetFileNameWithoutExtension($filePath)$testbenchName = $matches[2]# 測試激勵文件名與測試激勵名稱應匹配if(-not $fileName -eq $testbenchName){throw "[Error]: Testbench file name mismatch: $fileName != $testbenchName"}# 匹配測試激勵文件if($testbenchName -eq $($Config.ActiveTestbench)){$Config.TestbenchFile = $matches[1]Write-Host "[TestbenchFile]: $($matches[1])" -ForegroundColor Green}}}
}# 對Config里面的內容做一次檢查
if($($Config.TopEntityFile) -eq ""){throw "[Error]: No top entity file found in QSF file"
}Write-Host ""# 3. 確定測試平臺文件
if (-not [string]::IsNullOrEmpty($Config.ActiveTestbench)) {
}
else {throw "No active testbench found in QSF file"
}# 4. 生成DO腳本
$DoContent = @("transcript on","if {[file exists rtl_work]} {","    vdel -lib rtl_work -all","}","vlib rtl_work","vmap work rtl_work",""
)# 生成仿真命令
$fileDirectory = [IO.Path]::GetDirectoryName($($Config.TopEntityFile))
$logCmd1 = "vlog -sv -work work +incdir+$ProjectFloder/$fileDirectory {$ProjectFloder/$($Config.TopEntityFile)}"$fileDirectory = [IO.Path]::GetDirectoryName($($Config.TestbenchFile))
$logCmd2 = "vlog -sv -work work +incdir+$ProjectFloder/$fileDirectory {$ProjectFloder/$($Config.TestbenchFile)}"$simCmd ="vsim -t 1ps -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneive_ver -L rtl_work -L work -voptargs=`"+acc`" $($Config.ActiveTestbench)"$DoContent += @("",$logCmd1,$logCmd2,$simCmd,"add wave *","view structure","view signals","run -all","quit"
)# 5. 安全寫入文件
try {$DoContent = $DoContent -join "`r`n"$DoContent | Out-File $DoScript -Encoding ASCII -ForceWrite-Host "DO script generated: $DoScript"  -ForegroundColor Blue# 執行仿真if ($Config.SimTool -match "ModelSim") {Write-Host "Launching ModelSim..."  -ForegroundColor BlueStart-Process vsim.exe -ArgumentList "-c -do `"$DoScript`"" -Wait -NoNewWindow}
}
catch {if (Test-Path $DoBackupPath) {Move-Item $DoBackupPath $DoScript -ForceWrite-Host "Restored original DO script"}throw $_
}

同前面一樣,再創建一個仿真任務

        {"label": "modelsim_cmd", "type": "shell","command": "powershell.exe",  // 顯式調用 PowerShell"args": ["-ExecutionPolicy", "Bypass", // 繞過權限限制"-File", "${workspaceFolder}/usr/scripts/powershell/modelsim_cmd.ps1", // 腳本路徑"${workspaceFolder}",// 傳入工作目錄"${workspaceFolder}/${workspaceFolderBasename}.qsf",// 傳入qsf文件"${workspaceFolder}/simulation/modelsim/modelsim.do",// 設置do腳本的路徑(自己隨便設,不一定要在simulation路徑)"E:/Tools/Develop/Embedded/intelFPGA/ModelSim/modelsim_ase/win32aloem"// 傳入vsim路徑],"options": {"cwd": "${workspaceFolder}/simulation/modelsim", // 設置工作目錄},}

啟動任務后,ModelSim就以命令行的形式調用,正常進行仿真

????????需要說明的是,這種方式只生成了do腳本,與之配套的庫之類的還是依賴Quartus的tcl腳本生成,也就意味著運行do腳本的目錄需要放到simulation目錄里,而且前面必須至少執行過一次modelsim_gui任務(確保運行過tcl腳本在simulation目錄里生成相應的庫)

③查看波形

? ? ? ? 查看波形已經沒必要再Surfer里去查看,因為插件自帶一個查看vcd文件的功能。想要生成波形,測試激勵文件里必須加上下面這句

initial begin$dumpfile("xxx.vcd");// 填寫對應的名稱$dumpvars;
end

點擊生成的vcd文件后,會出現這樣的一個波形圖,此時空空如也。點擊右上角

選擇需要的信號

左邊就會出現你需要的信號,右鍵信號會有一些配置選項

此時,需要點擊信號(變亮就行,點亮后波形也更亮),再點擊紅色箭頭指向的位置,移動到最左邊,不然波形不一定能看得到(如果太短的話)

調整到合適的位置之后,箭頭所指方向,有三種不同的顯示方式,旁邊還有數值的顯示方式。想要調節,那么左邊的信號必須被點亮

第一種是數字型,第二種是離散化,第三種是模擬

其他仿真波形,“?”是高阻態,即z。“x”是未知值,紫色是數據幀

4,qsf文件的基礎分析

? ? ? ? qsf文件對于Quartus相當于CMakeLists或者makefile對于C項目的管理,而目前的自動化流程是在Quartus綜合的基礎上構建的,因此需要簡單理解一些基礎的命令來更快的輔助開發。同時為了避免過度修改導致工程出現問題,要么手動備份,要么使用版本控制。

? ? ? ? 在qsf文件中我們可以看到這樣的寫法,“#”就是行注釋,里面的命令不區分順序,并且可以出現空行,命令要頂格寫且選項參數遵循間要有空格(同時也方面ps1腳本解析)

????????這些命令不需要強記,因為這里我只要會修改即可,而且僅從“-name”后面的內容就可以看出它大概是干什么的了。比如下面,顯然,上面是芯片族,下面是具體芯片型號

set_global_assignment -name FAMILY "Cyclone IV E"
set_global_assignment -name DEVICE EP4CE6E22C8
①引腳綁定

? ? ? ? qsf文件里面的命令并不一定是整齊排列的,為了便于我們管理,可以主動整理。比如引腳信號,在不確定引腳不常改變的情況下,可以先整理一下引腳,備份引腳便于下次新建工程時或者切換模塊時快速恢復引腳

? ? ? ? 配置引腳時是需要使用Quartus里的引腳綁定窗口,這里只是提供一種備份的思路

②資源文件

? ? ? ? 如果文件都放在同一目錄下,在Quartus里添加文件并不是一件方便的事。我們可以找到類似于下面這樣的命令,把它們放到一起,前面可以加上一些注釋來表明。-name后面左邊的是文件類型,右邊是對應的文件

SYSTEMVERILOG_FILE說明它是.sv文件,VERILOG_FILE自然就是.v文件,SDC_FILE是時序約束文件

set_global_assignment -name SYSTEMVERILOG_FILE xxx.sv
set_global_assignment -name VERILOG_FILE xxx.v

? ? ? ? 測試激勵文件與前面類似,不過它只有一種類型EDA_TEST_BENCH_FILE,后面緊跟著文件名(相對路徑,相對于項目根目錄),-section_id后面跟著的是名稱,需要確保測試模塊名稱、仿真文件名稱和這里的名稱相同

③頂層文件

? ? ? ? 這里的頂層文件指的不僅有模塊頂層文件,還有測試模塊文件。TOP_LEVEL_ENTITY描述的是模塊頂層文件,EDA_NATIVELINK_SIMULATION_TEST_BENCH描述的是選中的仿真文件。

? ? ? ? 需要注意的是它們都是名稱而非文件,只不過模塊名稱與文件名稱需要相同罷了

# ========================================================================
#                                   Entity
# ========================================================================
set_global_assignment -name TOP_LEVEL_ENTITY regs
set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH regs_tb -section_id eda_simulation

? ? ? ? 此外,由于前面腳本解析的原因,需要確保指定頂層模塊的命令放在前面,至少在資源文件定義前面

④測試激勵文件綁定

????????針對于一個仿真測試模塊,需要三條命令來約束

????????連著不容易看懂,可以把它們每三個按空格隔開

????????前面如果添加了這是激勵文件,這里也要同步添加名稱,這里的配置不常改,只要把三個復制一下然后改一下名稱即可

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75551.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Python從零開始構建端到端文本到圖像 Transformer大模型

簡介&#xff1a;通過特征向量從文本生成圖像 回顧&#xff1a;多模態 Transformer 在使用Python從零實現一個端到端多模態 Transformer大模型中&#xff0c;我們調整了字符級 Transformer 以處理圖像&#xff08;通過 ResNet 特征&#xff09;和文本提示&#xff0c;用于視覺…

Webpack中的文件指紋:給資源戴上個“名牌”

你是否想過&#xff0c;當你修改代碼后&#xff0c;瀏覽器為什么仍然拿著舊版資源不放&#xff1f;秘密就在于——文件指紋&#xff01;簡單來說&#xff0c;文件指紋就像給每個構建出來的文件貼上獨一無二的“姓名牌”&#xff0c;告訴瀏覽器&#xff1a;“嘿&#xff0c;我更…

python可變對象與不可變對象

文章目錄 Python 中的可變對象與不可變對象不可變對象(Immutable Objects)可變對象(Mutable Objects)重要區別 Python 中的可變對象與不可變對象 在 Python 中&#xff0c;對象可以分為可變對象(mutable)和不可變對象(immutable)&#xff0c;這是 Python 中非常重要的概念&…

DeepSeek私有化部署性能怎么樣?企業級AI落地實戰解析!

1. 私有化部署是什么&#xff1f;為什么企業需要它&#xff1f; 很多公司在考慮用AI時都會問&#xff1a;“DeepSeek私有化部署性能怎么樣&#xff1f;能不能在我們自己的服務器上跑&#xff1f;” 私有化部署的意思就是把AI模型裝在你自己的機房或者云服務器上&#xff0c;而…

SQL學習--基礎語法學習

SQL和excle對比 學習目標 單表查詢 項目背景 SQL 練習環境 SQL Online Compiler - Next gen SQL Editor 商品信息表&#xff1a;https://study-zhibo.oss-cn-shanghai.aliyuncs.com/test/%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF%E8%A1%A8.csv 訂單明細表&#xff1a;https://…

【Docker基礎-網絡】--查閱筆記4

目錄 Docker 網絡網絡類型none 網絡host 網絡bridge 網絡自定義網絡 容器間通信IP 通信Docker DNS Serverjoined 容器 容器與外部通信容器訪問外部外部訪問容器 Docker 網絡 學習Docker提供的幾種原生網絡如何創建自定義網絡容器間通信&#xff0c;容器于外界交互 Docker 安裝…

GPT模型架構與文本生成技術深度解析

核心發現概述 本文通過系統分析OpenAI的GPT系列模型架構&#xff0c;揭示其基于Transformer解碼器的核心設計原理與文本生成機制。研究顯示&#xff0c;GPT模型通過自回歸機制實現上下文感知的序列生成&#xff0c;其堆疊式解碼器結構配合創新的位置編碼方案&#xff0c;可有效…

AWTK-MVVM 如何讓多個View復用一個Model記錄+關于app_conf的踩坑

前言 有這么一個業務&#xff0c;主界面點擊應用窗口進入聲納顯示界面&#xff0c;聲納顯示界面再通過按鈕進入菜單界面&#xff0c;菜單界面有很多關于該聲納顯示界面的設置項&#xff0c;比如量程&#xff0c;增益&#xff0c;時間顯示&#xff0c;亮度&#xff0c;對比度等…

CrystalDiskInfo電腦硬盤監控工具 v9.6.0中文綠色便攜版

前言 CrystalDiskInfo是一個不用花錢的硬盤小幫手軟件&#xff0c;它可以幫你看看你的電腦硬盤工作得怎么樣&#xff0c;健不健康。這個軟件能顯示硬盤的溫度高不高、還有多少地方沒用、傳輸東西快不快等等好多信息。用了它&#xff0c;你就能很容易地知道硬盤現在是什么情況&…

數據分析-數據預處理

數據分析-數據預處理 處理重復值 duplicated( )查找重復值 import pandas as pd apd.DataFrame(data[[A,19],[B,19],[C,20],[A,19],[C,20]],columns[name,age]) print(a) print(--------------------------) aa.duplicated() print(a)只判斷全局不判斷每個 any() import p…

如何用海倫公式快速判斷點在直線的哪一側

一、海倫公式的定義與推導 1. 海倫公式的定義 海倫公式&#xff08;Heron’s Formula&#xff09;是用于計算三角形面積的一種方法&#xff0c;適用于已知三角形三邊長度的情況。公式如下&#xff1a; S s ( s ? a ) ( s ? b ) ( s ? c ) S \sqrt{s(s - a)(s - b)(s - c…

python推箱子游戲

,--^----------,--------,-----,-------^--,-------- 作者 yty---------------------------^----------_,-------, _________________________XXXXXX XXXXXX XXXXXX ______(XXXXXXXXXXXX(________(------ 0 [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,…

使用Python建模量子隧穿

引言 量子隧穿是量子力學中的一個非常有趣且令人神往的現象。在經典物理學中,我們通常認為粒子必須克服一個勢壘才能通過它。但是,在量子力學中,粒子有時可以“穿越”一個勢壘,即使它的能量不足以克服這個勢壘。這種現象被稱為“量子隧穿”。今天,我們將通過 Python 來建…

Vuex Actions 多參數傳遞的解決方案及介紹

Vuex Actions 多參數傳遞的解決方案及介紹 引言 在Vuex狀態管理模式中&#xff0c;Actions 扮演著至關重要的角色。它主要用于處理異步操作&#xff0c;并且可以提交 Mutations 來修改全局狀態。然而&#xff0c;在實際開發中&#xff0c;我們常常會遇到需要向 Actions 傳遞多…

設計模式 --- 策略模式

?策略模式&#xff08;Strategy Pattern&#xff09;是一種 ??行為型設計模式??&#xff0c;用于動態切換算法或策略??&#xff0c;使得算法可以獨立于客戶端變化。它通過封裝算法策略并使其可互換&#xff0c;提升了系統的靈活性和擴展性&#xff0c;尤其適用于需要多種…

【論文閱讀】RMA: Rapid Motor Adaptation for Legged Robots

Paper: https://arxiv.org/abs/2107.04034Project: https://ashish-kmr.github.io/rma-legged-robots/Code: https://github.com/antonilo/rl_locomotion訓練環境&#xff1a;Raisim 1.方法 RMA&#xff08;Rapid Motor Adaptation&#xff09;算法通過兩階段訓練實現四足機器…

QQ風格客服聊天窗口

QQ風格客服聊天窗口 展示引入方式 展示 引入方式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

【家政平臺開發(37)】家政平臺蛻變記:性能優化與代碼重構揭秘

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

PostgreSQL 的 COPY 命令

PostgreSQL 的 COPY 命令 PostgreSQL 的 COPY 命令是高效數據導入導出的核心工具&#xff0c;性能遠超常規 INSERT 語句。以下是 COPY 命令的深度解析&#xff1a; 一 COPY 命令基礎 1.1 基本語法對比 命令類型語法示例執行位置文件訪問權限服務器端COPYCOPY table FROM /p…