【PicoRV32】學習過程紀錄 & 文章素材

RVC

RVC AI翻唱+语音变声器:RVC语音转换训练推理用WebUI,3分钟极速训练新模型


!!! 個人零碎筆記,未來整個架構搞懂了才會重新整理

設計架構

1. 怎麼理解整個設計架構

------- 模組介紹 ---------

模組名稱描述
picorv32_wrapper.sv整合picorv32axi4_memory_bhv
picorv32使用 native memory interface 的主 CPU
picorv32_axi提供 AXI4-Lite master 介面的 CPU
picorv32_axi_adapternative memory ↔ AXI4 bridge
picorv32_wbWishbone master 介面
picorv32_pcpi_*外接乘法 / 除法協同處理器
axi4_memory_bhv.sv在模擬環境中充當 AXI4-Lite 介面Slave端的記憶體模型

先大致畫出整個module 階層的block digram
PicoRV32 module 架構圖

接著從程式碼中可以得知編譯好的firmware.hex檔,在picorv32_wrapper.sv中讀入,到axi4_memory_bhv.sv中的memory陣列(模擬ram)
picorv32_wrapper.sv 讀入firmware.hex檔

下一步就是去axi4_memory_bhv.sv查看他的行為

介面通道省去了LNE、ID、BURST、RESP等完整AXI訊號


picorv32.sv

picorv32.sv 主要分為三個部分

  1. Memory Interface
    look-ahead 訊號 : 下一拍會讀或寫哪個位址、資料與 byte enable

  2. Instruction Decoder

  3. Main State Machine

- mem_state

mem_state 是 PicoRV32 記憶體存取狀態機的核心暫存器,用來:
• 區分 CPU 當前是否在 取指、讀資料、寫資料,或閒置。
• 控制 mem_valid / mem_instr / mem_wstrb 等訊號的組合。
• 等待外部記憶體或匯流排的 mem_ready 回應。
• 配合 RVC(壓縮指令集) 處理跨 32-bit 邊界的抓取。

mem_state實際語意(依你的程式)關鍵行為摘要
0Idle(閒置)若 `mem_do_prefetch
1Read/Fetch 進行中這一態處理「指令抓取或資料讀取」的實際握手。mem_xfer 成功後:— 若有 RVC 需要第二半字,可能設 mem_la_secondword 繼續讀;— 否則結束讀取:若這次是「rinst/rdata」→ 回 0;若這次只是 prefetch → 轉 3。
2Write 進行中實際資料寫入(mem_wstrb != 0)。mem_xfer 成功後清 mem_valid,回 0。
3Prefetch-hold(只預取、暫停等真正取指)僅在「做過 prefetch 但尚未真的 rinst」時短暫停留;一旦 mem_do_rinst 成立即回 0。

RISCV 壓縮指令集

  1. 什麼是 RISC-V 壓縮指令集(RVC)
    • RVC 是 RISC-V 的 C 擴展(Compressed Extension),將常用的 32 位元指令(4 bytes) 壓縮成 16 位元指令(2 bytes)。
    • 主要目標:
    1. 減少程式碼體積(code size)。
    2. 提升指令快取(I-Cache)命中率。
    3. 降低指令記憶體頻寬需求(對嵌入式、低功耗系統特別有用)。

  1. RVC 判斷與基本規則
    • 判斷指令是否為壓縮格式:

    RISC-V 定義:

    若指令低 2 bits (instr[1:0]) ≠ 11(二進制),則為壓縮指令(16-bit)
    若 instr[1:0] == 11(二進制),則為標準 32-bit 指令

    instr[1:0]指令類型
    00, 01, 1016-bit RVC
    1132-bit RVC
  2. 取指流程與 PicoRV32 處理邏輯
    因為 16-bit 壓縮指令與 32-bit 指令混用,取指單元需要特別處理:

    1. 取第一個 32-bit word(可能只用前半 16-bit)。
    2. 判斷是否為壓縮指令:
      • 是 → 直接解碼執行,剩下的 16-bit 暫存在 mem_16bit_buffer。
      • 否 → 需要讀取完整的 32-bit 再解碼。
    3. 連續壓縮指令處理:
      • 如果前一個 cycle 已有剩下的高 16-bit,下一條指令直接使用它,不需要再讀記憶體。

另一個要注意的是壓縮指令使否跨過不同的word(4-byte),先舉個簡單的例子:
假設記憶體內容(每格是 1 byte,地址右邊是位址的 hex):

Word0:  [Byte0] [Byte1] [Byte2] [Byte3]
         0x00    0x01    0x02    0x03
Word1:  [Byte4] [Byte5] [Byte6] [Byte7]
         0x04    0x05    0x06    0x07
  • 情況: RVC 跨 word
    PC = 0x03
    不可能是合法的 32-bit 指令對齊,但對 RVC 來說是合法的(因為 RVC 只要對齊 2 bytes)。
    指令第一半在 Word0 的 Byte3,第二半在 Word1 的 Byte4
    必須多抓 下一個 word(Word1),才能湊滿 16-bit
    這時 mem_la_firstword_xfer = 1,mem_la_addr = {next_pc[31:2] + 1, 2’b00} → 去抓 Word1

picorv32.sv中,349行就是在確認上述的情況,
可以清楚的看到next_pc[1]這個條件,就是在檢測"跨 word",
因為在沒有"跨 word"的情況下,指令是對齊4byte,也就是地址最低兩位一定是 2'b00
在这里插入图片描述

Assert用法

在這段程式碼中,assert(…) 是用來在模擬(simulation)期間檢查條件是否成立的斷言(assertion),如果條件不成立,就會在模擬時報錯,方便開發者及早發現邏輯錯誤。

MEM_STATE_FETCH_OR_READ: begin
          assert(mem_wstrb == 0);
          assert(mem_do_prefetch || mem_do_rinst || mem_do_rdata);
          assert(mem_valid == !mem_la_use_prefetched_high_word);
          assert(mem_instr == (mem_do_prefetch || mem_do_rinst));
          if (mem_xfer) begin
            if (COMPRESSED_ISA && mem_la_read) begin
              mem_valid <= 1;
              mem_la_secondword <= 1;
              if (!mem_la_use_prefetched_high_word)
                mem_16bit_buffer <= mem_rdata[31:16];
            end else begin
              mem_valid <= 0;
              mem_la_secondword <= 0;
              if (COMPRESSED_ISA && !mem_do_rdata) begin
                if (~&mem_rdata[1:0] || mem_la_secondword) begin
                  mem_16bit_buffer <= mem_rdata[31:16];
                  prefetched_high_word <= 1;
                end else begin
                  prefetched_high_word <= 0;
                end
              end
              mem_state <= mem_do_rinst || mem_do_rdata ? MEM_STATE_IDEL : MEM_STATE_PREFETCH;
            end
          end
        end
┌──────────────────────────────────────────────────────────────┐
│  State: MEM_STATE_FETCH_OR_READ                              │
│  ※ 進入此狀態時,以下斷言必須成立:                            │
│    A1) mem_wstrb == 0                                        │
│    A2) mem_do_prefetch || mem_do_rinst || mem_do_rdata       │
│    A3) mem_valid == !mem_la_use_prefetched_high_word         │
│    A4) mem_instr == (mem_do_prefetch || mem_do_rinst)        │
└──────────────┬───────────────────────────────────────────────┘
               │
               │  等待資料交換完成
               ▼
          ┌───────────┐   mem_xfer = 1 ?
          │ mem_xfer? │────────────────────────┐
          └─────┬─────┘       否(No)           │ 是(Yes)
                │                              ▼
                │                         ┌───────────────┐
                │                         │  COMPRESSED?  │  (COMPRESSED_ISA && mem_la_read)
                │                         └──────┬────────┘
                │                                │
                │                          是(Yes)│ 否(No)
                │                                ▼
                │                     ┌───────────────────────────────┐
                │                     │  for C-ISA 取「第二個 half」   │
                │                     │  mem_valid <= 1               │
                │                     │  mem_la_secondword <= 1       │
                │                     │  if (!mem_la_use_prefetched_  │
                │                     │      high_word)               │
                │                     │    mem_16bit_buffer <=        │
                │                     │      mem_rdata[31:16];        │
                │                     └───────────┬───────────────────┘
                │                                 │
                │                                 └─────→ (留在本狀態等待下一拍)
                │
                ▼
      (No path change,本拍什麼都不做)

                               ┌──────────────────────────────────────────────┐
                        否(No) │    一般情形(或讀資料 load)                   │
                               │    mem_valid <= 0                            │
                               │    mem_la_secondword <= 0                    │
                               │    if (COMPRESSED_ISA && !mem_do_rdata) {    │
                               │      if (~&mem_rdata[1:0] ||                 │
                               │          mem_la_secondword) {                │
                               │        mem_16bit_buffer <= mem_rdata[31:16]; │
                               │        prefetched_high_word <= 1;            │
                               │      } else {                                │
                               │        prefetched_high_word <= 0;            │
                               │      }                                       │
                               │    }                                         │
                               │    mem_state <= (mem_do_rinst ||             │
                               │                  mem_do_rdata) ?             │
                               │                 MEM_STATE_IDLE :             │
                               │                 MEM_STATE_PREFETCH;          │
                               └──────────────────────────────────────────────┘

訊號意義

mem_valid

mem_validPicoRV32 裡的作用,就是 CPU 對外宣告「我有一筆記憶體存取請求要送出」,直到外部用 mem_ready=1 回應為止。
它是 CPU 端主動拉高 的信號,外部只讀它、不會去驅動它。

mem_ready

mem_readyPicoRV32 裡的作用,就是 外部記憶體或匯流排介面回應「資料已經準備好」或「寫入已完成」的握手訊號。
它是 由外部模組(記憶體模型、AXI adapter 等)驅動,CPU 只是讀它來判斷是否可以結束這次 bus transaction。

mem_instr

PicoRV32mem_instr 是 CPU 與外部記憶體介面之間的一條標記訊號,作用是:
CPU跟MEM(或arbiter)說,這次 mem_valid 發出的存取是「取指令」而不是資料讀寫。

您可能感兴趣的与本文相关的镜像

 RVC

RVC

PyTorch
语音合成
RVC

RVC AI翻唱+语音变声器:RVC语音转换训练推理用WebUI,3分钟极速训练新模型

内容概要:本文介绍了一种用于电磁暂态(EMT)研究的第四类全变流器型风力发电系统的通用Simulink仿真模型,旨在构建一个能够准确反映实际风电系统动态特性的简化通用模型。该模型涵盖了风力机、传动链、发电机、全功率变流器及其控制策略等关键组成部分,重点突出系统在电网故障、风速波动等复杂工况下的动态响应能力,适用于风电并网电磁暂态分析、新型电力系统稳定性评估及高比例可再生能源接入场景的研究。模型设计兼顾准确性与仿真效率,便于研究人员快速搭建和调试,推动风电系统建模与控制技术的发展; 适合人群:具备一定电力系统理论基础和MATLAB/Simulink仿真能力,从事新能源发电、电力电子变换、风电并网控制及相关方向的研究生、科研人员及工程技术人员; 使用场景及目标:①开展风电系统在电网扰动下的电磁暂态仿真分析;②研究全功率变流器风电机组的动态行为与控制特性;③支撑新型电力系统中高渗透率风电接入的稳定性与电能质量评估,服务于学术研究、课程教学与工程项目前期仿真验证; 阅读建议:建议读者结合文中提供的模型结构与参数设置,在Simulink环境中动手复现并调试仿真模型,通过设置不同运行工况(如三相短路、低电压穿越、风速突变等)观察系统响应,深入理解全变流器风电机组的建模方法、控制逻辑与动态特性,进而拓展应用于更复杂的多机并网或综合能源系统仿真场景。
内容概要:本文探讨了Hash算法在芯片行业,特别是网络处理器(NPU)中的性能优化实践,聚焦于如何通过硬件流水线设计实现纳秒级高速哈希查找。文章分析了传统软件哈希方案在高带宽场景下的局限性,提出基于硬件描述语言或高层次综合(HLS)的设计方法,采用CRC32等硬件友好型哈希函数、并行多路哈希、流水线化解耦以及双端口存储结构等核心技术,实现低延迟、无阻塞的数据包处理。通过C++风格的HLS代码示例,展示了从算法选择到资源优化的完整硬件加速逻辑,并深入剖析了循环展开、位宽控制、内存映射和流水线调度等关键实现细节。最后展望了可编程交换机、P4语言支持及TCAM与哈希混合架构等未来发展方向。; 适合人群:具备数字电路基础、熟悉Verilog/SystemVerilog或HLS的芯片设计工程师,以及从事网络芯片、FPGA加速、高性能路由设备研发的技术人员(工作年限1-5年为宜);也适合对硬件加速算法感兴趣的研究人员。; 使用场景及目标:①掌握如何将哈希算法高效映射到硬件逻辑中以满足线速转发需求;②理解流水线设计、资源约束优化、读写冲突规避等在实际芯片项目中的应用;③为开发高性能网络处理器中的流表/路由表查找单元提供技术参考与实现范例。; 阅读建议:学习时应结合HLS工具(如Xilinx Vitis HLS)进行代码仿真与综合,重点关注#pragma指令对硬件结构的影响,并对比不同哈希算法在资源占用与时序表现上的差异,深入理解&ldquo;空间换时间&rdquo;的硬件优化本质。
内容概要:本文系统研究了基于粒子群优化(PSO)、灰狼优化(GWO)、鲸鱼优化(WOA)、哈里斯鹰优化(HHO)、蜣螂优化(DBO)和麻雀搜索算法(SSA)六种智能优化算法在无人机三维路径规划中的应用,并在Matlab平台上实现了相应的仿真代码。研究构建了复杂的三维地形与障碍物环境模型,设计了包含路径长度、飞行时间、能耗及安全性等多维度的成本函数,通过定义合理的适应度函数与飞行约束条件,对各类算法的路径搜索能力、收敛速度与规划质量进行了全面对比分析。通过仿真实验验证了各算法在静态复杂环境下的性能表现,旨在为实际无人机任务中优化算法的选择提供科学依据和技术支持。; 适合人群:具备一定Matlab编程基础,从事智能优化算法、无人机路径规划、自动化控制及相关领域研究的研究生、科研人员或工程技术人员。; 使用场景及目标:① 掌握主流群智能优化算法在无人机三维路径规划中的建模与实现方法;② 对比分析不同算法在相同复杂环境下的性能差异,为算法选型提供量化依据;③ 为后续研究动态环境路径规划、多无人机协同任务分配等问题奠定理论与技术基础; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点关注适应度函数的设计、障碍物规避策略的实现以及多目标成本函数的权衡机制,同时可通过调整参数设置或引入新型优化算法进行扩展实验,以深化对算法性能的理解与实际应用能力。
内容概要:本文研究了复杂威胁环境下基于多段杜宾斯(Dubins)路径的多无人机协同路径规划问题,提出了一种结合无人机运动学约束与优化算法的协同规划方法。通过Matlab平台实现了路径规划算法的建模与仿真,构建了包含障碍物、禁飞区及动态威胁因素的复杂环境模型,采用优化策略对多无人机系统的飞行路径进行全局协同优化,确保各无人机在满足Dubins路径连续性和曲率约束的前提下,实现任务最优或近优完成。该方法有效解决了多机路径间的冲突规避问题,提升了路径的安全性、可行性和整体效率,具有较强的工程应用价值。; 适合人群:具备一定编程基础和自动化、航空航天、智能无人系统等相关学科背景的科研人员及研究生,尤其适合从事路径规划、多智能体协同控制、智能优化算法研究的专业人士。; 使用场景及目标:①应用于军事侦察、灾害救援、边境巡检、区域监控等多无人机协同作业的实际任务场景;②为复杂环境下多智能体系统的避障、协同决策与路径优化提供算法支持与技术参考;③辅助研究人员复现算法模型,开展进一步的创新性研究与性能对比分析。; 阅读建议:此资源以Matlab代码实现为核心,强调理论与仿真实践相结合,建议读者在掌握Dubins路径基本原理的基础上,结合所提供的代码进行参数调试与仿真实验,深入理解协同优化机制与算法收敛特性,从而提升对多无人机系统路径规划问题的整体认知与研究能力。
内容概要:本文提出一种基于灰狼优化算法(GWO)改进互补集合经验模态分解(CEEMDAN)的混合储能系统风电功率平抑策略。通过GWO智能优化CEEMDAN的关键参数,显著提高了对非平稳风电功率信号的分解精度与自适应性,有效解决了传统方法中存在的模态混叠与残余噪声问题。在此基础上,结合混合储能系统(如锂电池与超级电容)的动态特性,设计合理的功率分配机制,将分解后的高低频分量分别交由适宜的储能单元响应,充分发挥各储能器件的优势,实现对风电功率高频波动与低频变化的协同平抑。研究通过Matlab平台进行算法编程与系统建模,开展仿真验证,结果表明该策略能显著降低储能系统的综合损耗,提升风电并网功率的平滑度与稳定性,延长储能设备使用寿命。; 适合人群:具备电力系统自动化、新能源并网技术、信号处理或智能优化算法等相关专业知识,熟悉Matlab/Simulink仿真工具,从事风电并网控制、储能系统优化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于风电场实际运行中,优化储能系统参与功率平抑的控制策略;②为解决高比例新能源接入带来的电网波动问题提供先进的信号分解与功率分配技术方案;③作为智能优化算法(GWO)与先进信号处理技术(CEEMDAN)在能源系统交叉应用的研究范例。; 阅读建议:读者应重点结合提供的Matlab代码,深入理解GWO算法的寻优流程、CEEMDAN的改进实现细节以及混合储能功率分配的逻辑设计,建议动手复现整个仿真过程,通过调整参数和对比不同工况,以全面掌握该策略的性能优势与应用要点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值