Zynq中級開發七項必修課-第三課:S_AXI_GP0 主動訪問 PS 地址空間

Zynq中級開發七項必修課-第三課:S_AXI_GP0 主動訪問 PS 地址空間

目標

  • 1.0 編寫 AXI-Lite Master:按鍵計數 → 寫入 PS 內存
  • 1.1 PL 觸發中斷 → PS 響應并串口打印按鍵計數值

BD圖

請添加圖片描述

axi_lite_master.v

// =====================================================
// AXI4-Lite Simple Master (single-shot, non-pipelined)
// - Pure Verilog-2001
// - Robust to 0-cycle / very-fast responses (no miss)
// - Works with SmartConnect / Zynq PS S_AXI_GP*
// =====================================================
module axi_lite_master #(parameter ADDR_WIDTH = 32,parameter DATA_WIDTH = 32
)(input  wire                     clk,input  wire                     rst_n,          // active-low reset, sync to clk// ---------------- AXI4-Lite Master IF ----------------// Write addressoutput reg  [ADDR_WIDTH-1:0]    m_axi_awaddr,output reg  [2:0]               m_axi_awprot,output reg                      m_axi_awvalid,input  wire                     m_axi_awready,// Write dataoutput reg  [DATA_WIDTH-1:0]    m_axi_wdata,output reg  [(DATA_WIDTH/8)-1:0] m_axi_wstrb,output reg                      m_axi_wvalid,input  wire                     m_axi_wready,// Write responseinput  wire [1:0]               m_axi_bresp,   // 2'b00=OKAYinput  wire                     m_axi_bvalid,output reg                      m_axi_bready,// Read addressoutput reg  [ADDR_WIDTH-1:0]    m_axi_araddr,output reg  [2:0]               m_axi_arprot,output reg                      m_axi_arvalid,input  wire                     m_axi_arready,// Read data/respinput  wire [DATA_WIDTH-1:0]    m_axi_rdata,input  wire [1:0]               m_axi_rresp,   // 2'b00=OKAYinput  wire                     m_axi_rvalid,output reg                      m_axi_rready,// ---------------- User Side (single request at a time) ---------------input  wire                     write_req,     // pulse: 1clk = start one writeinput  wire [ADDR_WIDTH-1:0]    write_addr,input  wire [DATA_WIDTH-1:0]    write_data,output reg                      write_done,    // pulse: 1clk when write completesoutput reg                      write_err,     // latched for 1clk at doneinput  wire                     read_req,      // pulse: 1clk = start one readinput  wire [ADDR_WIDTH-1:0]    read_addr,output reg  [DATA_WIDTH-1:0]    read_data,output reg                      read_done,     // pulse: 1clk when read completesoutput reg                      read_err,      // latched for 1clk at doneoutput wire                     busy           // 1=there's an in-flight txn
);// ---------------- Edge detect to make interface tolerant to level inputsreg wr_req_d, rd_req_d;wire wr_pulse = write_req & ~wr_req_d;wire rd_pulse = read_req  & ~rd_req_d;// In-flight markers (no full FSM needed)wire wr_inflight = m_axi_awvalid | m_axi_wvalid | m_axi_bready;wire rd_inflight = m_axi_arvalid | m_axi_rready;assign busy = wr_inflight | rd_inflight;// ---------------- Registerslocalparam [2:0] PROT_DEFAULT = 3'b000;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginwr_req_d       <= 1'b0;rd_req_d       <= 1'b0;m_axi_awaddr   <= {ADDR_WIDTH{1'b0}};m_axi_awprot   <= PROT_DEFAULT;m_axi_awvalid  <= 1'b0;m_axi_wdata    <= {DATA_WIDTH{1'b0}};m_axi_wstrb    <= {(DATA_WIDTH/8){1'b0}};m_axi_wvalid   <= 1'b0;m_axi_bready   <= 1'b0;m_axi_araddr   <= {ADDR_WIDTH{1'b0}};m_axi_arprot   <= PROT_DEFAULT;m_axi_arvalid  <= 1'b0;m_axi_rready   <= 1'b0;write_done     <= 1'b0;write_err      <= 1'b0;read_done      <= 1'b0;read_err       <= 1'b0;read_data      <= {DATA_WIDTH{1'b0}};end else begin// sample requests for edge detectionwr_req_d <= write_req;rd_req_d <= read_req;// default: clear 1-cycle pulseswrite_done <= 1'b0;read_done  <= 1'b0;// ============================================================// WRITE: fire when wr_pulse && !busy// - AW/W raised together; BREADY asserted immediately// ============================================================if (wr_pulse && !busy) beginm_axi_awaddr  <= write_addr;m_axi_awprot  <= PROT_DEFAULT;m_axi_awvalid <= 1'b1;m_axi_wdata   <= write_data;m_axi_wstrb   <= {(DATA_WIDTH/8){1'b1}};m_axi_wvalid  <= 1'b1;m_axi_bready  <= 1'b1;   // ready to accept response ASAPwrite_err     <= 1'b0;   // clear error for new txnend// AW handshake completes -> drop AWVALIDif (m_axi_awvalid && m_axi_awready)m_axi_awvalid <= 1'b0;// W handshake completes -> drop WVALIDif (m_axi_wvalid && m_axi_wready)m_axi_wvalid <= 1'b0;// B response: complete write on any cycle handshake occursif (m_axi_bvalid && m_axi_bready) beginm_axi_bready <= 1'b0;write_done   <= 1'b1;write_err    <= (m_axi_bresp != 2'b00); // OKAY=00end// ============================================================// READ: fire when rd_pulse && !busy// - AR raised; RREADY asserted immediately// ============================================================if (rd_pulse && !busy) beginm_axi_araddr  <= read_addr;m_axi_arprot  <= PROT_DEFAULT;m_axi_arvalid <= 1'b1;m_axi_rready  <= 1'b1;   // be ready for 0-cycle dataread_err      <= 1'b0;end// AR handshake completes -> drop ARVALIDif (m_axi_arvalid && m_axi_arready)m_axi_arvalid <= 1'b0;// R data: complete read on any cycle handshake occursif (m_axi_rvalid && m_axi_rready) beginm_axi_rready <= 1'b0;read_data    <= m_axi_rdata;read_done    <= 1'b1;read_err     <= (m_axi_rresp != 2'b00); // OKAY=00endendendendmodule

key_debounce.v

// ============================================================================
// Module name : key_debounce
// Author      : ming
// Description : 按鍵消抖模塊
//               - 按鍵持續按下超過設定時間后,輸出一個時鐘周期脈沖
//               - 累計按鍵按下次數
// Parameters  : P_CLK_FREQ_MHZ - 輸入時鐘頻率 (MHz)
//               P_DEBOUNCE_MS  - 消抖時間 (ms)
//               L_CNT_WIDTH    - 計數器位寬
// ============================================================================module key_debounce
#(parameter P_CLK_FREQ_MHZ = 50,  // 時鐘頻率 MHzparameter P_DEBOUNCE_MS  = 20,  // 消抖時間 msparameter L_CNT_WIDTH    = 32   // 計數器位寬
)
(input   wire        i_clk,           // 系統時鐘input   wire        i_rst_n,         // 全局復位,低有效input   wire        i_key,           // 按鍵輸入(低有效)output  reg         o_key_pulse,     // 消抖脈沖output  reg [31:0]  o_key_pulse_cnt  // 按鍵次數
);// 根據時鐘頻率和消抖時間計算最大計數值localparam L_MAX_CNT = P_CLK_FREQ_MHZ * 1000 * P_DEBOUNCE_MS;reg [L_CNT_WIDTH-1:0] r_cnt;// 計數器:按鍵按下計時always@(posedge i_clk or negedge i_rst_n)if(!i_rst_n)r_cnt <= {(L_CNT_WIDTH+1){1'b0}};else if(i_key == 1)r_cnt <= {(L_CNT_WIDTH+1){1'b0}};else if(i_key == 0 && r_cnt < L_MAX_CNT-1)r_cnt <= r_cnt + 1'b1;elser_cnt <= r_cnt;// 輸出脈沖:穩定按下超過設定時間,輸出 1 個時鐘周期脈沖always@(posedge i_clk or negedge i_rst_n)if(!i_rst_n) begin o_key_pulse     <= 1'b0;o_key_pulse_cnt <= 32'd0;end else if(r_cnt == L_MAX_CNT-2) begin o_key_pulse     <= 1'b1;o_key_pulse_cnt <= o_key_pulse_cnt + 1;end elseo_key_pulse <= 1'b0;endmodule

pulse_rise_counter.v

`timescale 1ns/1ps
// pulse_rise_counter.v — 上升沿計數器(簡潔版)
// - 記錄 i_sig 的上升沿個數到 o_count
// - 含兩級同步,適合異步來源(IO/外設)
// - 計數回卷(溢出后從 0 重新計)
//
// 端口:
//   i_clk   : 時鐘
//   i_rst_n : 低有效復位
//   i_sig   : 需要計數的脈沖/電平信號
//   o_count : 上升沿累計計數
module pulse_rise_counter #(parameter integer P_WIDTH = 32
)(input  wire                 i_clk,input  wire                 i_rst_n,input  wire                 i_sig,output reg  [P_WIDTH-1:0]   o_count
);// 兩級同步,避免亞穩態reg r_sync1, r_sync2;always @(posedge i_clk or negedge i_rst_n) beginif (!i_rst_n) beginr_sync1  <= 1'b0;r_sync2  <= 1'b0;o_count  <= {P_WIDTH{1'b0}};end else beginr_sync1 <= i_sig;r_sync2 <= r_sync1;// 上升沿檢測:前一拍0,這一拍1if (r_sync1 & ~r_sync2)o_count <= o_count + 1'b1;endendendmodule

blink_led.v

module blink_led #(parameter P_CLK_FREQ  = 50_000_000,   // 時鐘頻率parameter P_BLINK_HZ  = 1             // 閃爍頻率
)(input   i_clk,input   i_rst_n,output   o_led
);localparam integer L_HALF_CYCLES = P_CLK_FREQ / (2 * P_BLINK_HZ);reg [$clog2(L_HALF_CYCLES):0] r_cnt = 0;reg r_led;assign o_led = r_led;always @(posedge i_clk or negedge i_rst_n) beginif (!i_rst_n) beginr_cnt  <= 0;r_led <= 0;end else beginif (r_cnt == L_HALF_CYCLES - 1) beginr_cnt  <= 0;r_led <= ~r_led;end else beginr_cnt <= r_cnt + 1;endendendendmodule

system.xdc


#開發板約束文件#時序約束
create_clock -period 20.000 -name PL_GCLK [get_ports PL_GCLK]#IO引腳約束
#----------------------系統時鐘---------------------------
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports PL_GCLK]#----------------------系統復位---------------------------
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports PL_RESET]#----------------------PL_KEY---------------------------
set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports KEY0]
set_property -dict {PACKAGE_PIN K16 IOSTANDARD LVCMOS33} [get_ports KEY1]#----------------------PL_LED---------------------------
#底板
set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports LED0]
set_property -dict {PACKAGE_PIN L15 IOSTANDARD LVCMOS33} [get_ports LED1]#----------------------PL_UART(RS232)/RS485---------------------------
set_property -dict {PACKAGE_PIN K14 IOSTANDARD LVCMOS33} [get_ports PL_UART_RXD]
set_property -dict {PACKAGE_PIN M15 IOSTANDARD LVCMOS33} [get_ports PL_UART_TXD]

PS 裸機測試

#include "xil_io.h"
#include "xil_mmu.h"
#include "xil_printf.h"#include "xparameters.h"
#include "xscugic.h"
#include <stdio.h>
//共享內存基地址
#define SHARE_MEM_BASE  0x01000000U
//S_AXI_GP0 接口寫入的集地址
#define BASE_ADDR       0x01000000U
#define MAX_INDEX       30// ======= PL中斷號 =======
#define PL_IRQ_ID61       61
#define GIC_DEVICE_ID 				XPAR_PS7_SCUGIC_0_DEVICE_ID
// GIC 控制器實例
XScuGic intc;
// =============================
// PL 中斷服務函數
// 對應 PL 觸發的 IRQ 信號 (IRQ_F2P)
// =============================
static void PL_IRQHandler(void *ctx) {uintptr_t irq_src = (uintptr_t)ctx;static int  irq_cnt=0;irq_cnt++;xil_printf("PL%d triggered %d!\r\n",irq_src,irq_cnt);int regInx=0;u32 read_val = Xil_In32(BASE_ADDR + 4 * regInx);xil_printf("[r %d] = 0x%08X / %u\r\n", regInx, read_val, read_val);
}// =============================
// 中斷控制器初始化函數
// 配置 GIC,用于使能 PL 觸發的中斷
// =============================
static int IRQ_Init(void)
{int status;XScuGic_Config *cfg = XScuGic_LookupConfig(GIC_DEVICE_ID);if (!cfg) return XST_FAILURE;// 1) 初始化 GIC(只此一次)status = XScuGic_CfgInitialize(&intc, cfg, cfg->CpuBaseAddress);if (status != XST_SUCCESS) return status;// 2) 頂層異常框架(只此一次)Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&intc);// 3) 觸發方式 & 優先級(可選但推薦;數值越小優先級越高)// PL 直連 IRQ_F2P 通常上升沿(0x3),示例優先級 0x80(高于 UART)XScuGic_SetPriorityTriggerType(&intc, PL_IRQ_ID61,     0x80, 0x3);// 4) 連接中斷源status = XScuGic_Connect(&intc, PL_IRQ_ID61,(Xil_ExceptionHandler)PL_IRQHandler, (void*)0);if (status != XST_SUCCESS) return status;// 5) 使能XScuGic_Enable(&intc, PL_IRQ_ID61);// 6) 全局開中斷(只此一次)Xil_ExceptionEnable();return XST_SUCCESS;
}int main() {xil_printf("S_AXI_GP0  test.\n");//直接把 Cortex-A9 的數據緩存(D-Cache)全局關閉。// Xil_DCacheDisable();//把指定的地址段(通常 1MB 對齊)標記為 “非緩存、可共享” 內存Xil_SetTlbAttributes(SHARE_MEM_BASE, NORM_NONCACHE | SHAREABLE);IRQ_Init();char cmd;int index;u32 value;while (1) {xil_printf("> ");if (scanf(" %c", &cmd) != 1)continue;switch (cmd){case 'r':if (scanf("%d", &index) == 1){if (index < 0 || index > MAX_INDEX){xil_printf("Error: index out of range [0 ~ %d]\r\n", MAX_INDEX);while (getchar() != '\n');continue;}u32 read_val = Xil_In32(BASE_ADDR + 4 * index);xil_printf("[r %d] = 0x%08X / %u\r\n", index, read_val, read_val);}else{xil_printf("Invalid input. Use: r <index>\r\n");while (getchar() != '\n');}break;case 'w':if (scanf("%d %u", &index, &value) == 2){if (index < 0 || index > MAX_INDEX){xil_printf("Error: index out of range [0 ~ %d]\r\n", MAX_INDEX);while (getchar() != '\n');continue;}Xil_Out32(BASE_ADDR + 4 * index, value);xil_printf("[w %d] = 0x%08X / %u\r\n", index, value, value);}else{xil_printf("Invalid input. Use: w <index> <value>\r\n");while (getchar() != '\n');}break;case 'l':{break;}default:xil_printf("Unknown command '%c'. Use 'r' or 'w'.\r\n", cmd);while (getchar() != '\n');break;}}return 0;
}

測試結果

在這里插入圖片描述

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

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

相關文章

CVPR | 2025 | MAP:通過掩碼自回歸預訓練釋放混合 Mamba - Transformer 視覺骨干網絡的潛力

文章目錄CVPR | 2025 | MAP&#xff1a;通過掩碼自回歸預訓練釋放混合 Mamba - Transformer 視覺骨干網絡的潛力創新點初步研究初步結論方法確定一個混合網絡方法掩碼機制掩碼比例MAP的transformer解碼器重建目標實驗ImageNet-1k 上的 2D 分類CVPR | 2025 | MAP&#xff1a;通過…

Spring Boot + Spring AI 最小可運行 Demo

一. 項目依賴&#xff08;pom.xml&#xff09;<project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/mav…

AI重塑校園教育:中小學AI智慧課堂定制方案+AI作業批改減負,告別一刀切學生進步快

家長們&#xff0c;你有沒有聽過孩子抱怨上學的煩惱&#xff1f;課堂上老師講的內容&#xff0c;有的同學覺得太簡單 “吃不飽”&#xff0c;有的卻跟不上 “聽不懂”&#xff1b;放學后作業堆成山&#xff0c;老師要熬夜批改到半夜&#xff0c;錯題反饋要等第二天才能拿到&…

舊物循環,交易新生——舊物回收二手交易小程序,引領綠色消費新風尚

在資源日益緊張、環境污染問題日益突出的今天&#xff0c;綠色消費已經成為時代發展的必然趨勢。舊物回收二手交易小程序&#xff0c;作為綠色消費的重要載體&#xff0c;正以其獨特的優勢和魅力&#xff0c;引領著一場關于舊物循環、交易新生的綠色革命。一、舊物循環&#xf…

刷機維修進階教程-----如何清除云賬號 修復wifi 指南針 相機 指紋等刷機故障

在刷機、系統升級或降級過程中,是否遇到過以下問題:WiFi無法開啟、相機無響應、指南針或陀螺儀失靈 指紋等故障?另外,云賬號是否仍會保留,即使通過9008模式刷機也無法徹底清除?那么這篇博文都可以找到答案。 通過博文了解?????? 1??????----云賬號信息分區如…

AI翻唱實戰:用[靈龍AI API]玩轉AI翻唱 – 第6篇

歷史文章 [靈龍AI API] 申請訪問令牌 - 第1篇 [靈龍AI API] AI生成視頻API&#xff1a;文生視頻 – 第2篇 圖生視頻實戰&#xff1a;用[靈龍AI API]玩轉AI生成視頻 – 第2篇&#xff0c;從靜圖到大片 單圖特效實戰&#xff1a;用[靈龍AI API]玩轉AI生成視頻 – 第3篇&#…

大模型0基礎開發入門與實踐:第11章 進階:LangChain與外部工具調用

第11章 進階&#xff1a;LangChain與外部工具調用 1. 引言 在上一章&#xff0c;我們成功地創造了我們的第一個“生命”——一個可以對話的機器人。我們為它的誕生而興奮&#xff0c;但很快我們就會發現它的局限性。它就像一個被囚禁在玻璃房中的天才大腦&#xff0c;擁有淵博…

SQL 日期處理:深入解析與高效實踐

SQL 日期處理&#xff1a;深入解析與高效實踐 引言 在數據庫管理中&#xff0c;日期和時間數據的處理是不可或缺的一部分。SQL&#xff08;結構化查詢語言&#xff09;提供了豐富的日期和時間函數&#xff0c;使得對日期的處理變得既靈活又高效。本文將深入探討SQL日期處理的相…

源代碼部署 LAMP 架構

源代碼部署 LAMP 架構 &#xff08;Linux Apache MySQL PHP&#xff09; 一、LAMP 架構概述 LAMP 是一套經典的開源 Web 服務架構&#xff0c;通過源代碼安裝可實現高度定制化&#xff0c;適用于對軟件版本、功能模塊有特定需求的場景。本指南基于 CentOS 7 系統&#xf…

GO環境變量中GO111MODULE到底是干啥的?

查看GO111MODULE變量GO111MODULE的作用GO111MODULE的案例演示 一&#xff0c;查看GO111MODULE變量 ]# go env GO111MODULE 或者 ]# go env | grep GO111MODULE二&#xff0c;GO111MODULE的作用 auto : 自動判斷機制 當項目位于 $GOPATH/src 目錄外且包含 go.mod 文件時&…

在線培訓機構如何降低培訓視頻被盜錄的風險

每一節精心錄制的培訓視頻&#xff0c;都凝聚著講師的心血與機構的巨大投入。然而&#xff0c;只需一個簡單的錄屏軟件&#xff0c;這一切都可能被輕易竊取。一旦被盜取&#xff0c;不但會損失經濟利益&#xff0c;還可能會影響機構的聲譽。那么&#xff0c;在線培訓機構如何降…

Docker:安裝配置

目錄一、卸載舊版本二、配置Docker的yum庫三、安裝Docker3.1 在線安裝方式3.2 離線安裝方式四、配置阿里云鏡像加速【選配】五、Docker服務相關命令六、導出和導入鏡像官網 一、卸載舊版本 首先如果系統中已經存在舊版本的Docker&#xff0c;則先卸載&#xff1a; yum remov…

RabbitMQ:SpringAMQP 入門案例

目錄一、概述二、基礎配置三、生產者四、消費者一、概述 這是一篇Java集成RabbitMQ的入門案例&#xff0c;在這里我們做一個小案例&#xff0c;來體會一下RabbitMQ的魅力。 首先我們要做的就是創建一個生產者一個消費者&#xff1a; 生產者直接向RabbitMQ的隊列&#xff08;Q…

Ubuntu 下面安裝搜狗輸入法debug記錄

目錄0. 整體安裝流程1. 在鍵盤輸入法系統中&#xff0c;沒有“fcitx”選項解決方法0. 整體安裝流程 詳細的Ubuntu搜狗輸入法安裝指南請參考官方教程&#xff1a;Ubuntu搜狗輸入法安裝指南 1. 在鍵盤輸入法系統中&#xff0c;沒有“fcitx”選項 即使是安裝完 fcitx&#xff0…

Jenkins+GitLab在CentOS7上的自動化部署方案

最近在安裝jenkins實現微服務的自動發布&#xff0c;記錄配置過程以免再次踩坑。 Centos7環境準備 jenkins、gitlab配置&#xff0c;全程使用ftpuser普通用戶操作 &#xff08;1&#xff09;安裝好jdk并配置好環境變量 安裝路徑/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.…

打開或者安裝Navicat時出現Missing required library libcurl.dll,126報錯解決方法(libmysql_e.dll等)

提示 Missing required library libcurl.dll 出現原因是由于Navicat安裝目錄下libcurl.dll可能不能用了&#xff0c;下載該文件放到Navicat安裝目錄下即可。下載地址&#xff1a;libcurl.dll — download free for Windows 下載解壓包里只有個libcurl.dll 提示 Missing requir…

基于SpringBoot的流浪動物領養管理系統【2026最新】

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

Qt實現TabWidget通過addTab函數添加的頁,頁內控件自適應窗口大小

前言&#xff1a;因為項目的要求&#xff0c;需要把幾個不同類型功能的界面集成在同一個窗口中&#xff0c;方便用戶不切換窗口&#xff0c;也能快捷的操作不同類型的功能。我首先想到的是通過選項卡方式&#xff0c;讓幾個類別的功能界面通過不同選項卡進行切換&#xff0c;這…

代碼隨想錄算法訓練營27天 | ??56. 合并區間、738.單調遞增的數字、968.監控二叉樹(提高)

題目鏈接&#xff1a;56. 合并區間、738.單調遞增的數字、968.監控二叉樹 文章鏈接&#xff1a;代碼隨想錄 貪心算法 1. 合并區間 &#xff08;待更新...&#xff09; class Solution { private:static bool cmp(const vector<int>& a, const vector<int>&…

從 H.264/H.265 到 H.266:RTSP播放器的跨代際演進

引言&#xff1a;H.266與實時視頻的交匯點 視頻編解碼的發展歷程&#xff0c;始終是 帶寬效率與視覺體驗的博弈。從 H.264 的普及&#xff0c;到 H.265/HEVC 的深化應用&#xff0c;每一次標準迭代&#xff0c;都在推動視頻向更高分辨率、更高幀率、更復雜場景的應用邁進。而 …