跳转到内容

可编程逻辑/VHDL 编码和项目风格

来自维基教科书,开放的书籍,开放的世界

通用 VHDL 编码技巧

[编辑 | 编辑源代码]

编码风格

[编辑 | 编辑源代码]
  • 使用空格和缩进以反映代码的目的。代码的格式应强调其功能并帮助读者理解其流程。
  • 使用空格缩进,制表符在所有文本编辑器中不一致。
  • 在命名信号时使用一致的风格。作者之一使用以下方式:
    • 使用小写字母 "s" 作为信号的前缀,并将名称的首字母大写,例如 sFlag
    • 变量使用 "v" 作为前缀,常量使用 "c" 作为前缀,数组和其他通用类型使用 "t" 作为前缀,进程使用 "p" 作为前缀,记录类型使用 "r" 作为前缀,并采用类似的方式。
    • 信号名称中每个新词的首字母大写。(sStatusFlag)
    • 使用 _next 后缀来指定寄存器的输入。如果 sQ 是寄存器的输出,则包含其在下一个时钟上升沿的值的信号为 sQ_next。
  • 尽可能避免重复代码。检查您的综合工具的功能。如果该工具支持多维数组、记录类型、循环和/或生成语句,请使用它们。
  • 使用记录类型(如果可能)在模块之间传递大量的状态位或控制位。如果状态位的数量或类型发生改变,受影响实体的实体和端口映射也不需要改变。此外,这可以避免记住向量中哪些位片用于哪个标志或控制信号。
  • 在设计中使用记录类型或数组时,将这些类型定义在包中,而不是在架构中。这允许它们在模块之间共享。
  • 使用枚举类型来指定状态机的状态。这提高了代码的可读性,并在使用模拟器调试时帮助跟踪事物。如果需要控制状态机编码,请咨询综合工具,并在需要时使用 "attribute" 语句。
  • 不要在进程中直接赋值给输出端口。将输出赋值给一个内部信号,然后使用并发语句将值赋值给输出。这可以在需要时检查输出值(通过调试代码或 ILA 模块,如果以后需要)。
  • 支持列编辑的文本编辑器在编写 VHDL 时非常有用。(UltraEdit 是其中一款付费的…)(NotePad++ 和 SciTE 则是免费的…)

架构命名

[编辑 | 编辑源代码]

架构名称应该描述它所描述的设计的“类型”。以下是一些通用指南:

  • 对于测试台和大多数行为描述代码(一般不可综合)使用 "behave"。
  • 对于大多数可综合代码使用 "rtl"。
  • 对于主要使用端口映射将其他模块粘合在一起的模块(顶层等)使用 "struct"。

文件命名和组织

[编辑 | 编辑源代码]
  • 每个 VHDL 实体创建一个文件。
  • 以包含的 VHDL 实体或包命名文件,例如 address_decoder.vhd 包含实体 address_decoder。
  • 对于除最大设计之外的所有设计,建议将实现设计的所有文件保存在同一个目录中。这在尝试通过文件跟踪信号时可以节省时间。将测试台文件放在其他地方很有用。这可以避免目录过于杂乱。
  • VHDL 项目的有效目录结构如下所示:
    • /doc - 设计文档保存在这里
    • /loads - 编程文件保存在这里
    • /sim - 模拟脚本、项目和测试台文件保存在这里
    • /syn - 综合项目和文件保存在这里(如果综合作为布线过程的一部分完成,例如使用 Xilinx 设计中的 XST,则可选)
    • /par - 布线/实现项目和文件保存在这里。
    • /src - 源 VHDL/Verilog 文件保存在这里
  • 在您的 FPGA 项目中使用版本/源代码控制(Subversion、CVS)。软件编程领域已经积累了许多关于管理源代码的经验。其中许多经验也可以应用于 HDL 代码。
  • 如果可能,应该实现一种方法来轮询 FPGA/CPLD 项目的“版本”。这允许确定在硬件上测试的是什么代码。该“版本”应该与版本/源代码控制系统相协调。
华夏公益教科书