Golden 顶层文件:告别 FPGA 引脚分配的繁琐操作

别再手动分配 FPGA 引脚了。直接使用电路板厂商提供的 Golden顶层电路板配置文件(GTBC) 即可。这些文件已经完成了 FPGA 输入输出接口与板载硬件的正确映射。将文件导入你的项目,就能立刻投入代码编写,无需再为引脚规划器费心。

这种映射关系经过了完整的设计和测试,过程虽然枯燥,但这正是引脚分配工作应有的样子。

为了帮助你更好地理解Golden顶层电路板配置文件,以下是关键要点:

  1. Golden顶层电路板配置文件不涉及逻辑设计,仅用于实现 FPGA 引脚与板载硬件的映射。
  2. 它为开发板提供引脚映射表,并采用具有描述性的向量命名方式,例如SW[9:0]
  3. 硬件命名规则与开发板用户手册中的命名保持一致。
  4. 配置文件中包含电路板推荐的引脚驱动电压参数。

需要注意的一点:这类简洁的命名方式不会体现引脚极性信息,例如低电平有效的 LED 灯就无法通过命名直接判断。

此外,Golden顶层电路板配置文件由电路板开发商提供,而非 FPGA 原厂。当你的设计脱离开发板、转向自定义硬件时,该文件的作用就不再重要了。

Golden顶层电路板配置文件包含哪些内容?

这份Golden配置文件由两个能大幅节省时间的文件组成:

  1. 带有预制输入输出向量的顶层 Verilog 代码
  2. 引脚分配映射文件,在 Quartus 软件中,该文件对应的是通常由引脚规划器生成的.qsf 文件

下文的代码清单 1 和代码清单 2 分别展示了这两个文件的片段。这两个文件共同定义了 FPGA 开发板上硬件资源的种类和对应位置。你当然可以手动重建这些文件,但这需要投入大量的时间和精力,还很容易引入难以排查的错误。最棘手的情况之一就是 DRAM 引脚分配错误,这类问题排查难度极大,因为无法通过物理手段探测 DRAM 或 FPGA 引脚的实际状态。

你可能会花费数小时甚至数天的时间,在软件逻辑错误和硬件连接错误之间反复排查,却难以定位问题根源。

module top(

      ///////// CLOCK /////////
      input              CLOCK0_50,
      input              CLOCK1_50,

      ///////// KEY /////////
      input    [ 3: 0]   KEY, 

      ///////// SW /////////
      input    [ 9: 0]   SW,

      ///////// LED /////////
      output   [ 9: 0]   LEDR,

代码清单 1:顶层模块端口声明片段

#============================================================
# CLOCK
#============================================================
set_instance_assignment -name IO_STANDARD "1.2-V" -to CLOCK0_50
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to CLOCK1_50
set_location_assignment PIN_K43  -to CLOCK0_50
set_location_assignment PIN_A8   -to CLOCK1_50

#============================================================
# KEY
#============================================================
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to KEY[0]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to KEY[1]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to KEY[2]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to KEY[3]
set_location_assignment PIN_K26  -to KEY[0]
set_location_assignment PIN_K27  -to KEY[1]
set_location_assignment PIN_BK10 -to KEY[2]
set_location_assignment PIN_W12  -to KEY[3]

代码清单 2:顶层.qsf 文件代码片段,实现硬件名称到 FPGA 引脚的映射

极性问题考量

Golden顶层电路板配置文件的标识符通常设计得尽可能简洁,只会使用 LED、SW 这类基础名称。引脚极性的定义,也就是高电平有效还是低电平有效,需要由开发者自行确定。

关于负逻辑的常见误解,往往会在 FPGA 第一次烧录程序后显现出来。

要明确的是,所有已映射的输出引脚都会由逻辑电路驱动。但如果没有被 FPGA 逻辑明确驱动,综合器会默认将其设置为低电平输出。这就会导致所有未被驱动的低电平有效 LED 灯全部亮起。

针对极性问题,我们有两种解决方案:

  1. 采用位取反操作。这种方法非常不推荐,因为代码中会到处充斥着~取反运算符,不仅会埋下潜在的 bug,还会增加理解设计逻辑的脑力负担。
  2. 在单一位置集中处理 LED 引脚的取反操作,具体实现如代码清单 3 所示。在这个方案中,逻辑电平会先赋值给 LED_req(请求信号)变量,再通过一次 10 位宽的整体取反操作,就能完成所有引脚的极性校正。
    wire [9:0] LED_req;    
    assign LEDR = ~LED_req;

    assign LED_req[2] = SW[2];
    assign LED_req[1] = SW[1];
    assign LED_req[0] = SW[0];

代码清单 3:低电平有效 LED 灯的位取反实现方式

未使用的引脚分配需要保留吗?

这个问题的核心在于时间成本和代码清晰度的权衡。

顶层模块和.qsf 文件是一一对应的配对文件。Verilog 代码中的信号与物理输入输出引脚之间存在严格的映射关系,修改其中任何一个文件,都必须花费时间同步修改另一个文件。

需要注意,Verilog 不是顺序执行的代码!保留未使用的引脚映射不会产生任何性能损耗,代码长度和最终的综合结果几乎没有关联,对未使用输入输出引脚的映射更是如此。实际上,未使用的引脚会被默认驱动为固定的低电平信号。

当然,保留未使用的映射关系也存在一个缺点,那就是可能增加代码的复杂度,影响可读性。尤其是当顶层模块中实例化的模块越来越多时,这个问题会更加明显。我的建议是保持引脚映射代码的完整性,不做任何修改,将其作为一个独立的文本模块。同时,可以考虑将部分顶层模块的实例化内容迁移到子模块中。如果需要的话,你还可以用开始:请勿修改结束:请勿修改这样的标记,将这份Golden配置代码块包裹起来。

综合时间成本和代码长度的影响来看,我们几乎没有理由去修改这些信号与引脚的映射关系。

Golden顶层电路板配置文件的局限性

一般来说,Golden顶层电路板配置文件完全适用于板载电路的开发。但当需要连接特定的外部硬件时,情况就会变得复杂。以 Terasic DE23-Lite 开发板为例,它配备了一个 2×20 引脚的 GPIO 扩展接口(见图 1)。外部硬件的输入输出接口种类繁多,而配置文件中定义的GPIO_D[35:1]这类通用名称太过抽象。此时,使用与硬件功能匹配的名称会是更优的选择,过于笼统的命名很容易掩盖潜在的错误。比如,当你在 GPIO 接口上连接了一个 SPI 协议的传感器时,使用MyProjectSCLKMyProjectMOSI这类具有自描述性的名称会更加清晰。

图 1:Terasic DE23-Lite 开发板及 40 引脚扩展接口

结语

本文中的示例基于 Intel Quartus 软件和 Terasic 开发板,但相同的设计理念也适用于其他 FPGA 工具链,例如 Xilinx 或 Lattice 的工具。