`include在Verilog中的应用

"文件包含"处理`include

所谓"文件包含"处理是一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。Verilog HDL语言提供了`include命令用来实现"文件包含"的操作。其一般形式为:

`include "文件名"

图中意思为:在编译的时候,需要对`include命令进行"文件包含"预处理:将File2.v的全部内容复制插入到`include "File2.v"命令出现的地方,即将File2.v被包含到File1.v中,得到图C的结果。在接着往下进行编译中,将"包含"以后的File1.v作为一个源文件单位进行编译。

"文件包含"命令是很有用的,它可以节省程序设计人员的重复劳动。可以将一些常用的宏定义命令或任务(task)组成一个文件,然后用`include命令将这些宏定义包含到自己所写的源文件中,相当于工业上的标准元件拿来使用。另外在编写Verilog HDL源文件时,一个源文件可能经常要用到另外几个源文件中的模块,遇到这种情况即可用`include命令将所需模块的源文件包含进来。

[例1]:

(1)文件aaa.v

1
2
3
4
5
6
module  aaa(a,b,out);
input  a, b;
output  out;
wire  out;
assign  out = a^b;
endmodule

(2)文件 bbb.v

1
2
3
4
5
6
7
8
9
` include  "aaa.v"
module  bbb(c,d,e,out);
input  c,d,e;
output  out;
wire  out_a;
wire  out;
aaa aaa(.a(c),.b(d),.out(out_a));
assign  out=e&out_a;
endmodule

在上面的例子中,文件bbb.v用到了文件aaa.v中的模块aaa的实例器件,通过"文件包含"处理来调用。模块aaa实际上是作为模块bbb的子模块来被调用的。在经过编译预处理后,文件bbb.v实际相当于下面的程序文件bbb.v:

1
2
3
4
5
6
module  aaa(a,b,out);
input  a, b;
output  out;
wire  out;
assign  out = a ^ b;
endmodule
1
2
3
4
5
6
7
8
module  bbb( c, d, e, out);
input  c, d, e;
output  out;
wire  out_a;
wire  out;
aaa aaa(.a(c),.b(d),.out(out_a));
assign  out= e & out_a;
endmodule

关于"文件包含"处理的四点说明:

1) 一个`include命令只能指定一个被包含的文件,如果要包含n个文件,要用n个`include命令。注意下面的写法是非法的`include"aaa.v""bbb.v"

2) `include命令可以出现在Verilog HDL源程序的任何地方,被包含文件名可以是相对路径名,也可以是绝对路径名。例如:'include"parts/count.v"

3) 可以将多个`include命令写在一行,在`include命令行,只可以出空格和注释行。例如下面的写法是合法的。

'include "fileB" 'include "fileC" //including fileB and fileC

4) 如果文件1包含文件2,而文件2要用到文件3的内容,则可以在文件1用两个`include命令分别包含文件2和文件3,而且文件3应出现在文件2之前。例如在下面的例子中,即在file1.v

中定义:

1
2
3
4
5
6
7
8
` include "file3.v"
` include "file2.v"
module  test(a,b,out);
input [1:`size2] a, b;
output [1:`size2] out;
wire [1:`size2] out;
assign  out= a+b;
endmodule

file2.v的内容为:

1
2
3
4
`define size2 `size1+1
.
.
.

file3.v的内容为:

1
2
3
4
`define size1 4
.
.
.

这样,file1.v和file2.v都可以用到file3.v的内容。在file2.v中不必再用 `include "file3.v"了。

5) 在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。例如

上面的问题也可以这样处理。

它的作用和下图的作用是相同的。

本文摘自夏宇闻老师的《Verilog HDL教程》

 转自http://www.cnblogs.com/icelyb24/archive/2011/09/29/2195779.html

PLL(Phase-Locked Loop,锁相环)在数字信号处理、通信系统、计算机等领域广泛应用Verilog-A是一种硬件描述语言,可以用于模拟连续时间电路。下面是一个简单的PLL Verilog-A建模的例子: ```verilog `include "disciplines.vams" module pll_va (in, out, clk, rst); electrical in; electrical out; electrical clk; electrical rst; parameter real Kp = 0.1; // 比例增益 parameter real Ki = 0.01; // 积分增益 parameter real Kd = 0.01; // 微分增益 parameter real N = 10; // 分频系数 parameter real Fref = 100e6; // 参考频率 parameter real Fout = 1e9; // 输出频率 real vco_gain = Fout / Fref / N; // VCO增益 real phase_error, freq_error; real integrator, differentiator; real vco_output; analog begin // 相位比较器 phase_error = in.p - out.p; freq_error = in.f - out.f * N; // PID控制器 integrator += Ki * freq_error * dt; differentiator = Kd * (phase_error - prev(phase_error)) / dt; // VCO输出 vco_output = vco_gain * (Kp * phase_error + integrator + differentiator); // 输出信号 out <= vco_output; clk <= vco_output; end endmodule ``` 在这个模型,输入信号 `in` 是参考信号,输出信号 `out` 是锁相环输出信号,时钟信号 `clk` 是VCO输出的方波,复位信号 `rst` 用于重置积分器。 该模型包含了相位比较器、PID控制器和VCO输出三个部分。相位比较器计算输入信号和输出信号之间的相位误差和频率误差。PID控制器根据误差计算积分项和微分项,并将它们加入到比例项得到控制信号,该控制信号通过VCO增益转换为VCO输出信号。最后,输出信号和时钟信号都等于VCO输出信号。 这只是一个简单的PLL Verilog-A建模例子,实际情况可能需要更复杂的模型,例如包含环路滤波器等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值