吴明

FPGA设计思维定式(内有Altera VDMA 代码链接)

2
阅读(481) 评论(10)

    看了很多,不管是书籍或是资料,现在的FPGA,verilog讲的东西都严重同质化,所以我写这篇博客的目的只是想表达一下,对于FPGA设计还是存在”十分另类“的看法

    这回要拿实实在在的工程代码来说事。本人水平有限凑合着看就好。

    altera vdma 下载地址

    FPGA设计有那些思维定式呢,这些条条框框是不是真的有用呢?

    简单罗列一下那些”设计规矩“

  1. 自下到上,自上到下设计

  2. 写代码前,端口信号规定

  3. 模块化(简洁还是多功能?)

  4. 状态机,and 多少段

  5. 仿真

既然是有工程来讲,那就先从工程代码开始吧(这也只是完整工程里面独立的功能)

功能框图:( I hate draw)

VDMA.png

Write_Video_stream[7:0]-->>Stream_fifo[7:0] -->>Write_Arbitration[0:0] -->>Altera_DDR3_IP_Core

Read_Video_stream[7:0]<<--Stream_fifo[7:0] <<--Read_Arbitration[0:0] <<--Altera_DDR3_IP_Core

       八路写视频流+八路读视频流,各经过一个FIFO,当任意一个FIFO,数据量到达阈值时(读为FIFO空闲的大小大于阈值),通过仲裁器对IP Core发起读或写请求。

------------------------------------------------------------------------------------------------------------------

自下到上,自上到下设计

    看似很理所当然的,而我却认为有所谓的(或者严格意义上的)“自下到上,自上到下设计”,设计更像是“忒修斯之船”,必须不断的去修修补补,替换,更新,慢慢地“船”已经不像原来的“船”了(你们看到的代码只是我最后完成的code,其实期间我写的量大概是这个的四倍,每个模块也都已经不是最初的原型,平均起来,差不多每个模块都是第三版 A版到C版)。所以,没必要,也不太可能一开始就定义好每一个下层模块,必须让模块不断的进化,改进,前几篇博客我也提到,第一次设计的时候往往是试探性的,只有至少重复一次后,才会明白问题。《黑客与画家》中说写代码更像是画画创作随时涂涂改改,是必须的。自上而下,也不可能太过详细,太详细就会落入重复造轮子的坑(那时候你造出了轮子才知道自己掉坑),白白增加工作量,有些已经有的现成子模块是可以用上的。即不能明确上层,又不能稳定下层,也就没有“自下到上,自上到下设计”。我的基本的思路就是有个大概的框图(上层设计)+一些现成的子模块(下层,可能会随着设计深入,需要改进),由点到面的设计。

写代码前,端口信号规定

    我很想说”如果是不同人员间交互设计,规定端口是必须的“(我并没有和别人太多的共同设计经历)。端口尽量简洁,比如用标准总线。但如果是个人设计,可以不必规定死,这个VDMA设计端口信号,修改+增减的我大概动了20%吧(在我认识到interface威力前)。文档?,如果一个模块端口信号需要一个详细的文档来说明,那么一定不是好的设计。现在我的设计全部走interface设计,没有文档,时序就是interface时序。模块的交互不是只有input output变量,是时序的交互,明显区别于其他语言,interface刚好满足。

模块化

    简洁,简洁,再简洁,不要在一个模块里面做太多兼容,宁愿写多个模块,用generate来选择不同模块,比如VDMA里面需要把数据流拼接成256位,而视频有8位,16位,24位,32位,个个需要拼接的数量都不一样,特别是24的,对于256不是整数倍。不要把8-32都写在一个模块里面,这样会极度增加这个模块的调试难道。xilinx的我就是写到一个模块里面,到现在我还在填坑。

状态机

    三段,其他的就是不好,三段式才能对时序做完全的控制,特别特别是总线的握手信号(虽然本VDMA没有用到总线)。状态机对时序控制十分重要,变量的组织会清晰很多,即使只是一个3个状态的状态机,在另外一片博客我会再提状态机对hdl的意义。

    仿真

    没要仿真,工程什么都不是。90+%的问题都可以通过功能仿真暴露(我从没做过后仿真,也没觉得有必要做)。仿真对于设计的不断迭代至关重要,一个Q2工程跑完少则需要十几分钟,而modelsim,是要十几秒,一天能对代码做上百次修改,都是仿真的功劳。还有一定要有自己的自动化部署脚本,搭建一个新modelsim工程平台,消耗半小时以上是不可接受的。最好就是输入一行命令就能做迁移。

    注:仲裁代码为修改友晶源码,原码只能做4口。

  1. 感觉看不大懂。看来自己水品还是太低了

  2. 博主好人,还有代码

  3. @赵小数   

    吴老师 关于FPGA有没视频课程可以分享?

    我什么时候成老师了 :—————)

    还真没有视频可以分享的,我也没看过FPGA视频课程,好像视频的多是指导软件使用

  4. 吴老师 关于FPGA有没视频课程可以分享?

  5. @老莫   

    吴总写得真好!

    有时间就写写

  6. 吴总写得真好!

  7. 多多学习!

  8. 难得的好文章,关键还有代码,呵呵

  9. 多多学习!

  10. 醍醐灌顶啊