可编程逻辑/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 项目的“版本”。这允许确定在硬件上测试的是什么代码。该“版本”应该与版本/源代码控制系统相协调。