附录A verilog源代码.pdf
文本预览下载声明
附录A
Verilog源代码
本书第 1 版和第 2 版所附 Verilog 源代码采用了 IEEE 1364-1995 标准[340] 。本书充分利
用 IEEE 1364-2001(在 IEEE 书店大概 100 美元可以购买到)规定的标准,对第三版做出了
一些修订,该标准花费 100 美元就可以从 IEEE 书店得到[341,342] 。现在在所有主要设计工
具中都已采用 Verilog 2001 修订,文献[343~345]和本书简要回顾了一下所用到的最重要的
新功能。如果想要了解全部新功能请查询文献[341], 这里仅回顾已实现的新功能。
● 1364-1995 ( Kernighan
标准 中的实体说明要求所有的端口出现两次 类似于 和
Ritchie C )
编码 ,第一次是在端口清单中,然后是在端口数据类型说明中,如
module iir_pipe (x_in, y_out, clk); // Interface
parameter W = 14; // Bit width -1
input clk;
input [W:0] x_in; // Input
output [W:0] y_out; // Result
...
注意,所有的端口(x_in, y_out 和 clk)都定义了两次。1364-2001 标准(请参阅语言参考
手册 12.3.4 节)不再需要这样的重复说明,即,新编码如下所示:
module iir_pipe // Interface
# (parameter W = 14) // Bit width -1
(input clk,
input signed [W:0] x_in, // Input
output [W:0] signed [W:0] y_out) ,// Result
● 1364-2001 标准支持有符号数据类型,从而简化了有符号算术运算。在符号定义行,
在输入、输出、寄存器或布线关键字之后引入有符号关键字:
reg signed [W:0] x, y;
有符号和无符号类型之间的转换可以通过$signed 和$unsigned 转换函数实现,请参阅
语言参考手册 4.5 节。对于有符号常数,在连字符和基数之间引入小写的 s 或大写的 S,
E2 数字信号处理的 FPGA 实现(第 3 版)
如sd90 就表示有符号常数 90 。有符号算术运算可以使用原有的除法或乘法运算符。对于2
的幂因子可以使用新的左移()或右移()算术运算符,请参阅语言参考手册 4.1.23 节。
可以看到 3 个移位运算符用于区别其中使用两个移位符号的无符号移位。有符号或 0 扩展
是根据数据类型自动进行的。从 IIR 滤波器示例中可以用新运算符代替旧类型的运算符:
...
y = x+{y[W],y[W:1]}+{{2{y[W]}},y[W:2]};
... //i.e,x+y/2+y/4;
1364-2001 Verilog 类型运算符使用如下除法运算符:
y = x+y/ sd2 + y/ sd4; // div with/uses 92 LEs
注意:在为常数定义有符号除法时,下列代码
y = x+y/2 + y/4;
在 Quartus II 的 4.0 、4.2 、5.0、5.1 版本下将呈现出错误的仿真结果,但在 Web 版 6.0
中会正确运行。或者也可以使用算术右移运算符实现2 的幂的除法。
y = x+ (y 1) + (y2); // div with uses 60 LEs
显示全部