工具:为Verilog状态机自动生成状态定义代码

工具:为Verilog状态机自动生成状态定义代码

更新历史
20200411:

  1. 首次发布

作为一名电子学工程师,FPGA的逻辑开发是少不了的。用Verilog开发FPGA逻辑时,我发现:

  • 状态机中的状态数量很多时,状态定义代码写起来费时费力,且很容易出错
  • 插入、删除状态后,状态定义代码容易变得杂乱

例如,以下代码中,STATE2 的编码不小心写错了,但这个错误并不容易被一眼看出来 (尤其是在状态数量非常多的时候)。不仅如此,当我要加入一个新的状态 STATE4 时,所有的状态编码都需要被修改一遍。。。。天哪!

//状态定义代码,采用 one hot编码
localparam STATE0 = 4'b0001;
localparam STATE1 = 4'b0010;
localparam STATE2 = 4'b0010; //此处正确的应该是4'b0100
localparam STATE3 = 4'b1000;

以上问题常常令人感到苦不堪言。因此,开发一个工具,使得状态定义代码能够自动生成,是非常有必要的。以下为这种工具的介绍。



工具介绍

针对 Verilog 状态机,我发布了三个工具 (都是exe程序,仅能在Windows系统下使用),分别为:

  • state_def_code_binary:自动生成状态机的 binary 编码 (自然二进制码)
  • state_def_code_gray:自动生成状态机的 gray 编码 (格雷码)
  • state_def_code_one_hot:自动生成状态机的 one hot 编码 (独热码)

三个工具的用法相同,用法为:

  1. 将状态机代码 (一段式状态机,或者二段式状态机中含有case语句的那一段,或者三段式状态机中含有case语句的任意一段。代码中允许有注释。) 保存到一个文本文件中 (该文件需保存到工具所在的目录下)。这里假定文件名为:a.txt。
  2. 运行工具(exe程序),根据弹出的控制台窗口的提示,输入文本文件的名称,然后按下回车键。工具会自动识别文本文件的编码,并将生成的状态定义代码输出到新的文本文件中 (在工具所在的目录下,会生成一个扩展名为 .new 的文件,该文件中保存了自动生成的状态定义代码。对于 a.txt,对应的 .new 文件为:a.txt.new)

下图展示了自动生成状态定义代码的原理:

工具:为Verilog状态机自动生成状态定义代码_第1张图片

注意事项:

  • one hot 编码结果必然是存在冗余的,这个无需多说。
  • binary 编码结果和 gray 编码结果,也都存在编码冗余:例如,上图的 binary 编码结果中,其实只需用 2 bit 的 nstate 就可以为所有需要定义的状态提供编码,但是结果中的 nstate 为 3 bit。这么处理的原因在于:状态机中还有 default 状态,所以可用编码的数量应当大于需要定义的状态的数量
    -如果工具运行出错,则导致错误的可能原因如下:
    • 保存了状态机代码的文本文件,其编码没有被识别出来。解决办法:(法一) 将文本文件的编码改成GB2312;(法二) 在文本文件中,加入一些注释,这些注释有助于工具更加准确地解析文本文件的编码格式。
    • Verilog代码存在语法错误。解决办法:更正代码中的语法错误。
    • 其他未知的原因:请使用者在本文的评论区留言通知我,感谢。

写在最后

工欲善其事,必先利其器。希望上述工具能够帮助电子学工程师摆脱"手动敲状态定义代码"之苦,同时写出更加整洁的逻辑代码。∩ˍ∩

你可能感兴趣的:(硬件逻辑开发)