Verilog
教程
- 维基百科中Verilog条目非常详细, 可以当作简单的入门教程: https://zh.wikipedia.org/wiki/Verilog
- <<Verilog 数字系统设计教程>>
语法
wire和reg
-
reg
的值是上次被赋给的值,wire
的值由激励源决定(自己并不是一个可以保存值的东西, 它的值完全由激励源决定, 用assign指定激励源). 所以reg
在过程块中赋值, 而wire
在过程块外赋值.(不过reg
也可以在过程块外用assign持续赋值) -
模块间交互时, 驱动源可以是
reg
/wire
, 被驱动的只能是wire
. 具体到模块: 模块的输入端口只能是wire
, 但是输入端口的驱动源可以是reg
/wire
. 输出端口可以是reg
/wire
, 但是输出端口只能驱动wire
变量. - 更多详解: http://blog.sina.com.cn/s/blog_6c7b6f030101cpjx.html
其它语法
- 数组可以使用变量下标, 但是向量中的位置不能使用变量(宏和genvar算常量)
- 数组无法整个做为module参数
-
不建议在模块编写中使用
inout
端口, 会降低时序
技巧
- 如果对要移植的函数不是完全了解, 建议先用python将原函数用有助于fpga实现的方式实现一遍或几遍
- 要调用多个的子module如果输入输出复杂, 可以用generate来代替module. 这样相当于可以同时输入输出, 而且还节省传输资源
源码
负数比较
如果要比较的两个数中可能有负数, 或者要比较的运算结果中可能有负数, 不能简单的直接用>
之类的来比较. if (a-b >= c)
假设是32位的可以写成if (((a-b-c) & 32'h80000000) == 0)
. if (a-b > c)
假设是32位的可以写成if (((a-b-c-1) & 32'h80000000) == 0)
流水示例
http://www.cnblogs.com/shengansong/archive/2011/05/23/2054414.html