再谈fpga开发(怎么写verilog)

发布于:2025-07-29 ⋅ 阅读:(12) ⋅ 点赞:(0)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        如果你学fpga,很多人都会告诉你,verilog和c差不多。也就是说,如果有c的基础,学习verilog很容易。确实,verilog的语法不是很难。难的是后面思维模式,即并发处理和状态机的处理模式。fpga里面写的其实不是verilog代码,而是后面的数字电路,即时序电路和组合逻辑电路。今天正好分析下,该怎么写verilog。

1、先画流程和波形图

        fpga的基础其实是信号。这些信号可以是真实的信号,比如来自于各个pin引脚的信号,也可以是抽象的信号,比如说来自于sdram的数据。为什么说是抽象的信号,因为很多fpga的ide支持ip配置,基本上不需要自己写ip,即可以很灵活地访问sdram里面的数据,这种情况下使用sdram就非常轻松了,相关的信号就好比是抽象的一个数据信号。

        有了这些基础信号,或者是基础数据之后,下面就是作业流程。比如说会经过哪些状态,信号和信号之间有什么依赖,按时间轴运行下去的话,不同信号应该怎么变化等等。在这一阶段可以不用写代码,而是先确认业务流程和业务逻辑。

2、确认输入、输出

        如果是简单的模块,那么就是clk、rst和外部pin脚。编写子模块的画,那就是clk、rst,输入就是data、data_valid,输出就是result、result_en。

3、拆分状态,构建状态机

        对于复杂的逻辑,最好把业务或者是算法,拆分成若干个状态。这个状态可以是模块的状态,也可以是模块内的子状态。拆分状态有一个好处,就是后续信号编写的时候,只需要判断当前状态下自己是如何变化的即可,相当于所有的信号都围绕这个状态机去进行判断。

4、添加中间变量寄存器,依据状态机编写代码

        和c语言编写一样,对于输入和输出之间,需要很多的中间变量。fpga也差不多,为了达到我们的设计目的,在fpga运行的过程当中,为了实现基本功能,除了状态机之外,还需要添加很多的中间变量。变量和变量之间存在依赖,这个时候状态机就派上用场了。按照之前波形图的设计,分成输入、中间寄存器、输出三个部分。中间寄存器是可以随时来增删处理的,编写中间寄存器的代码,基本也是根据波形图和状态机来进行处理的。

        比如说某一个中间结果寄存器,确认下它有哪几个状态,不同状态下是怎么进行变化的。实际编写的时候,可以一个状态、一个状态去编写代码,也可以先把一个中间寄存器的所有状态都编写好,再去编写下一个中间寄存器,这都是可以的。个人其实是比较推荐第一种处理方式。

        需要注意的是,同一状态下的register都是并发运行的,这个是和c编程不太一致的地方。假设计算0到100,第一个clock,就是0+99、1+98是并发运算的,这一点需要稍微注意下。

5、继续编写仿真代码、确认波形

        实际编写verilog代码的时候,难免有失误,这种情况就需要通过编写仿真代码,来进行验证和处理了。不要一下子就去编译、综合、直接上板子调试,浪费时间,效率也比较低。等到仿真差不多了,没有明显的错误之后,再去进行fpga实际验证,这是比较务实的处理办法。仿真的意义,就是在于提前从逻辑层面,验证信号逻辑和自己设计的业务流程,是否一致。

6、多看、多练习

        纸上得来终觉浅,绝知此事要躬行。很多时候,我们看资料、看文档,觉得自己学会了某个协议、某个算法,但是没有动手去实践一下,其实未必是真的掌握了。所以,最好的处理办法就是自己动手去实践、去分析。在实践的过程当中,我们遇到了错误、分析错误,这样才是真正掌握了对应的开发知识,而不仅仅是纸上谈兵。

7、学习别人的verilog代码

        对于同一个问题,可以自己先去尝试。用各种办法尝试,实在没有办法了,再去看答案,而不是一上来就抄别人的答案,这样效果会差很多。别人写得再好,也不是自己的。只有自己反复思考,通过比较两者之间的差别,才能把别人的东西变成自己的东西。


网站公告

今日签到

点亮在社区的每一天
去签到