写在前面
在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加点自己的理解)分享给大家。
这是网站原文:Verilog Tutorial
这是系列导航:Verilog教程系列文章导航
介绍
假设现在要设计一个能兼容不同宽度、但具有相同的功能的计数器。也许我们可以假设我们的设计需要大量具有相似功能的不同深度和宽度的 RAM。通常我们所做的是创建不同宽度的计数器,然后使用它们。同样的规则也适用于我们讨论的 RAM。
但是Verilog提供了一种强大的方法来克服这个问题:它为我们提供了一种叫做参数(parameter)的东西;这些参数就像该特定模块的本地常量。
我们可以使用 defparam 或在实例化期间传递一组新参数来覆盖默认值。我们称其参数覆盖(parameter overriding)。
参数(Parameters)
Verilog 将参数定义为在模块结构中声明的常量值。该值可用于定义模块的一组属性,这些属性可以表征其行为及其物理表示。
- 在模块内部定义
- 局部范围
- 可以在实例化时被覆盖
- 如果定义了多个参数,则必须按照定义的顺序覆盖它们。如果未指定覆盖值,则使用默认参数声明值
- 可以使用 defparam 语句进行更改
实例化时的参数传递
module secret_number;
parameter my_secret = 0;
initial begin
$display("My secret number in module is %d", my_secret);
end
endmodule
module param_overide_instance_example();
secret_number #(11) U0();
secret_number #(22) U1();
endmodule
使用defparam进行参数传递
module secret_number;
parameter my_secret = 0;
initial begin
$display("My secret number is %d", my_secret);
end
endmodule
module defparam_example();
defparam U0.my_secret = 11;
defparam U1.my_secret = 22;
secret_number U0();
secret_number U1();
endmodule
传递多个参数
module ram_sp_sr_sw (
clk , // Clock Input
address , // Address Input
data , // Data bi-directional
cs , // Chip Select
we , // Write Enable/Read Enable
oe // Output Enable
);
parameter DATA_WIDTH = 8 ;
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
// Actual code of RAM here
endmodule
当实例化多个参数时,参数值应按照在子模块中声明的顺序传递。
module ram_controller ();//Some ports
// Controller Code
ram_sp_sr_sw #(16,8,256) ram(clk,address,data,cs,we,oe);
endmodule
Verilog 2001
在 Verilog 2001 中,上面的代码可以工作,但新功能使代码更具可读性且无错误。
module ram_controller ();//Some ports
ram_sp_sr_sw #(
.DATA_WIDTH(16),
.ADDR_WIDTH(8),
.RAM_DEPTH(256)) ram(clk,address,data,cs,we,oe);
endmodule
这是学的VHDL?
- 📣您有任何问题,都可以在评论区和我交流📃!
- 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
- 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!