芯片原厂必学课程 – 第十篇章 – 基于 RISC-V SoC 的 1024 点 FFT 设计

10-02-05 1024 点 FFT 的 RISC-V SoC 整体架构

新芯设计:专注,积累,探索,挑战

文章目录

  • 芯片原厂必学课程 – 第十篇章 – 基于 RISC-V SoC 的 1024 点 FFT 设计
  • 10-02-05 1024 点 FFT 的 RISC-V SoC 整体架构
    • 引言
    • 一、FFT 系统的架构设计
    • 二、FFT 系统的总线设计
    • 三、FFT 系统的资源分析与功耗分析

引言

  本次项目主要设计了一个基于 RISC-V 指令集架构的 SoC,这是一个具有 1024 点的时频转换功能的 FFT 系统。在理想情况下,只要指令存储器和数据存储器的容量足够大,基本上可以实现任意点的 FFT。本章《基于 RISC-V SoC 的 1024 点 FFT 的设计》针对 1024 点的 FFT,首先给出了 FFT 系统的整体架构和 RISC-V 内核的硬件设计。接着,对于 RISCV 交叉编译环境的搭建进行了相关的概述。最终,针对基于 RISC-V SoC 的 FFT 设计,构造了基于软硬件协同仿真验证的 UVM 框架,证实了大点数 FFT 的 C 软件程序及其 RISC-V 硬件设计系统功能的正确性。

  NOTES:本文来自《芯片原厂必学课程 – 第十篇章 – 基于 RISC-V SoC 的 1024 点 FFT 设计》技术专栏


一、FFT 系统的架构设计

  本次项目主要是基 2 时分 FFT 并行算法的 C 软件程序实现以及搭载 RISCV 专用内核的 SoC 硬件架构设计。这是能够实现 1024 点 FFT 的 RISC-V SoC 的整体架构。其主要是由集成的 32 位 RISC-V 处理器核、简化版的总线和基本的外设组成的。针对 FFT 系统的具体组成及其相关功能,大体上可以划分为如下的六个模块。

  ✅ 1. 内核:FFT 系统的 CPU 是一款支持 RV32IM 架构的、按序单发射的、基于三级流水线设计的 RISC-V 处理器。它主要用于 FFT 相关参数的生成、蝶形运算的处理以及整体系统的控制等等。

  ✅ 2. 总线:FFT 系统的总线分为存储总线和外设总线。这是一种比较简化的总线结构,以数据选择器和状态机为核心部件,删除了不必要的总线协议,仅保存了一些总线的接口信号如读写地址、读写数据、读写标志以及请求响应,来实现主设备与从设备之间的基本的信息交互。

  ✅ 3. 指令存储器:FFT 系统的指令存储器的原型主要是调用了 Xilinx 的 ROM IP。对于 1024 点的 FFT 系统,其具有较高的指令存储空间占比。以 ROM 外设来替代内核中的 ITCM,不仅能够有效地减少 RISC-V 内核的资源占用,还能够提高 RISC-V 内核的主频,让 RISC-V 处理器更加专注于执行高性能的蝶形计算。

  ✅ 4. 数据存储器:作为 FFT 系统的内存,数据存储器 RAM 主要用于存储一些必要的中间变量与数据处理结果。RAM 容量的大小也决定了 FFT 系统能够处理的 FFT 点数的多少。

  ✅ 5. 串口:UART 外设是 FFT 系统与 PC 主机之间进行通信的桥梁。通过 UART 接口,可以输出 FFT 的数据到主机 PC 端进行显示,从而进行相关信号的频谱分析、硬件性能测试、以及系统功能验证等等。

  ✅ 6. 引脚:GPIO 外设可以实现 FFT 系统的人机交互功能。通过 GPIO 约束的按键来控制 FFT 系统的启动、运行、相关模式的转换、以及有关数据的传输等等。

  本次设计实验以 Verilog 为电路设计语言、以 Xilinx 的 Vivado 2019.1 为开发工具,来进行 RISC-V SoC 及其子模块的相关设计与实现。这是 FFT 系统的 RTL 电路图。FFT SoC 电路设计的层次结构分明,在硬件实现上完美地映射了 RISC-V SoC 的整体架构设计方案。其中,RV32IM_Core 是基于 RV32IM 指令集架构的关键内核,RIBBus 是外设总线和存储总线集成的一个总线模块,指令存储器和数据存储器分别是 INST_ROM 和 DATA_ROM,UART 和 GPIO 分别是串口外设和引脚外设。


二、FFT 系统的总线设计

  FFT 系统的总线架构采用了 2 个主设备与 4 个从设备的数据通信的互联模式。不同于 AXI4 总线,FFT 系统的总线仅有单个数据传输通道。在优先逻辑和仲裁逻辑的主从设备选择机制的情况下,在同一时刻仅支持一对一的数据通信模式。

  无论是优先逻辑还是仲裁逻辑,都是以数据选择器为核心的组合逻辑。在本次项目中,设置了主设备 0 作为 FFT 系统总线的最高优先级别。当且仅当主设备 0 的请求信号无效且主设备 1 发出请求信号的时候,主设备 1 的数据与地址才能够进入传输通道中。对于从设备的命中,采取了地址仲裁的方式。取 FFT 系统的总线地址的最高两位来作为从设备的地址,其二进制的值依次对应着 FFT 系统总线上的 4 个外设。每个从设备都具备相应的地址,对于更多的外设,可以相应的拓展从设备地址仲裁的位宽。在对总线地址的最高两位进行逻辑判断后,来决定访问哪一个从设备。以 2’b00 的地址为例,那么对应的就是从设备 0(Slave 0)。

  FFT 系统的互联总线中具备了总线的关键的数据交互信号。以请求信号和应答信号来作为主从设备之间的握手机制,类似于 AXI4-Stream 总线协议的 Tready 与 Tvalid 信号。当且仅当主设备发出访问请求信号且从设备处于空闲正常的时候,主从设备之间宣布握手成功,之后准备进行数据传输通信。


三、FFT 系统的资源分析与功耗分析

  接下来,以 Vivado 设计套件(Vivado Design Suite,VDS)对整个 FFT 系统进行综合。本次综合的平台是 Xilinx Kintex-7 系列的 KC705 开发板,这是以 XC7K325TFFG900C 为核心芯片的中端 FPGA 开发板。这是一款具有较强的数字信号处理能力、较多的硬件逻辑资源以及较高工作频率的板上晶振的 FPGA 开发板,是本次设计较为理想的一个开发平台。如下所示,这是 FFT 系统在 Kintex-7 系列的 FPGA 开发板上的资源利用率。

  1024 点的 FFT 系统具有较少的 FPGA 资源占比,适合小面积的嵌入式设备领域,其相关的资源占用的总结如下:

  ✅ 1. LUT:一共使用了 6246 个 LUT(Look Up Table,查找表),占据了 KC705 开发板上 LUT 的 3.06%。这部分逻辑资源主要是用于 RISC-V 处理器中的译码模块和通用寄存器堆模块;

  ✅ 2. FF:一共使用了 3612 个 FF(Flip-Flop,触发器),占据了 KC705 开发板上 FF 的 0.89%。这部分逻辑资源主要是用于 RISC-V 处理器中的通用寄存器堆模块;

  ✅ 3. BRAM:一共使用了 23 个 BRAM(Block RAM,块 RAM),占据了 KC705 开发板上 BRAM 的 5.17%。这部分存储资源全部是用于 FFT 系统中的指令存储器和数据存储器。其中,ROM 和 RAM 的深度分别为 8192 和 17024,各自占用了 8.5 和 14.5 个 BRAM;

  ✅ 4. DSP:一共使用了 4 个 DSP(Digital Signal Processor,数字信号处理器),占据了 KC705 开发板上 DSP 的 0.48%。这部分计算资源全部是用于 RISC-V 处理器中的执行模块,更精确的讲,就是组成了执行乘法指令的高性能乘法单元。

  对于更少点数的 FFT 系统,如 512 点和 256 点等,其总的 BRAM 的资源占比还可以大幅度地减少,以适配更为精简的 FFT 系统。此外,还统计出了 FFT 系统在 KC705 开发板上各个部分的功耗占比,FFT 系统的动态功耗和静态功耗分别为 134 mW 和 160 mW,主要是信号、逻辑和存储功耗的消耗占比较高。其主要是由于 FFT 的蝶形因子是基于 PC 端初始化生成的,消除了大量的专用硬件计算资源与功耗,从而使得该 FFT 系统非常适合于低功耗的嵌入式场景。