Verilog HDL程序笔记4
Verilog HDL程序笔记1:写出属于你的第一个Verilog HDL模块
Verilog HDL程序笔记2:Testbench模块的使用
前言
上一章我们学习了另外两种电路描述的方式。我们做出了更加复杂的仿真实验。今天我们将要介绍另外一种变量,具体是什么呢?请往下看。
一、parameter变量是什么?
我们在学习其他语言的时候,当我们写一个方法时,往往会留下一个接口。当我们调用这个方法的时候就会将参数带入,改变方法内部运算的值,得到我们想要的结果。parameter就是参数变量。
二、使用步骤
1.留下接口
代码如下(示例):
module mytri(out,in,enable);
output out;
reg out;
input in,enable;
parameter control = 0;//定义参数变量control,默认值为0
assign enable=control?1:0;
always @(in,enable)
begin
if(enable)on=in;
else out='bz;
end
endmodule
2.改变参数
I.方法一:创建一个新的module调用
代码如下(示例):
module Annotate;
defparam
t1.top1.mytrist1.control=0,t1.top1.mytrist2.control=0;
endmodule
II.方法二:在创建mytri实例的时候调用
代码如下(示例):
module top(out,ain,bin,enable1,enable2,select);
output out;
input ain,bin,enable1,enable2,select;
mytri #0 mytrist1(.out(out1),.in(ain),.enable(enable1));//mytri里只有一个参数,所以可以直接用#0赋值0
mytri #0 mytrist2(.out(out2),.in(bin),.enable(enable2));
muxtwo mymux(.out(out),.a(out1),.b(out2),.sl(select));
endmodule
三、举个例子
如图这个例子大家应该很熟悉了,这就是上节课的例子。mytri1就是mytri模块的实例,mymux就是muxtwo的实例。
而他们共同组成的模块叫做top模块。
所以我们就可以把这整个逻辑关系抽象成了这样:
那么,top模块有了,为什么他没有实例呢?
top的实例其实我们上节课也写了。他出现在top的testbench里:
这里的dog和我们的top是一样的,只不过我改了个名而已。所以dog1就是dog的实例,我们理所当然也可以创建top1的实例了。
1.方法一
我们先用第一种方式来试一下改变参数的值:
mytri模块:
module mytri(out,in,enable);
output out;
reg out;
input in,enable;
parameter control = 0;
assign enable=control?1:0;
always @(in,enable)
begin
if(enable)on=in;
else out='bz;
end
endmodule
muxtwo模块:
module muxtwo(out,a,b,sl);
input a,b,sl;
output out;
reg out;
always @(sl or a or b)
if(!sl) out = a;
else out = b;
endmodule
top模块:
module top(out,ain,bin,enable1,enable2,select);
output out;
input ain,bin,enable1,enable2,select;
mytri mytrist1(.out(out1),.in(ain),.enable(enable1));
mytri mytrist2(.out(out2),.in(bin),.enable(enable2));
muxtwo mymux(.out(out),.a(out1),.b(out2),.sl(select));
endmodule
最后创建top的实例并仿真——topTestbench:t1
module t1;
reg ain,bin,select;
reg enable1,enable2;
wire outw;
initial
begin
select=0;
enable1=0;
enable2=0;
ain=0;
bin=0;
#100
select=0;
enable1=0;
enable2=0;
ain=0;
bin=1;
#100
select=0;
enable1=0;
enable2=0;
ain=1;
bin=0;
#100
select=0;
enable1=0;
enable2=0;
ain=1;
bin=1;
#100
select=0;
enable1=0;
enable2=1;
ain=0;
bin=0;
#100
select=0;
enable1=0;
enable2=1;
ain=0;
bin=1;
#100
select=0;
enable1=0;
enable2=1;
ain=1;
bin=0;
#100
select=0;
enable1=0;
enable2=1;
ain=1;
bin=1;
#100
select=0;
enable1=1;
enable2=0;
ain=0;
bin=0;
#100
select=0;
enable1=1;
enable2=0;
ain=0;
bin=1;
#100
select=0;
enable1=1;
enable2=0;
ain=1;
bin=0;
#100
select=0;
enable1=1;
enable2=0;
ain=1;
bin=1;
#100
select=0;
enable1=1;
enable2=1;
ain=0;
bin=0;
#100
select=0;
enable1=1;
enable2=1;
ain=0;
bin=1;
#100
select=0;
enable1=1;
enable2=1;
ain=1;
bin=0;
#100
select=0;
enable1=1;
enable2=1;
ain=1;
bin=1;
/
#100
select=1;
enable1=0;
enable2=0;
ain=0;
bin=0;
#100
select=1;
enable1=0;
enable2=0;
ain=0;
bin=1;
#100
select=1;
enable1=0;
enable2=0;
ain=1;
bin=0;
#100
select=1;
enable1=0;
enable2=0;
ain=1;
bin=1;
#100
select=1;
enable1=0;
enable2=1;
ain=0;
bin=0;
#100
select=1;
enable1=0;
enable2=1;
ain=0;
bin=1;
#100
select=1;
enable1=0;
enable2=1;
ain=1;
bin=0;
#100
select=1;
enable1=0;
enable2=1;
ain=1;
bin=1;
#100
select=1;
enable1=1;
enable2=0;
ain=0;
bin=0;
#100
select=1;
enable1=1;
enable2=0;
ain=0;
bin=1;
#100
select=1;
enable1=1;
enable2=0;
ain=1;
bin=0;
#100
select=1;
enable1=1;
enable2=0;
ain=1;
bin=1;
#100
select=1;
enable1=1;
enable2=1;
ain=0;
bin=0;
#100
select=1;
enable1=1;
enable2=1;
ain=0;
bin=1;
#100
select=1;
enable1=1;
enable2=1;
ain=1;
bin=0;
#100
select=1;
enable1=1;
enable2=1;
ain=1;
bin=1;
end
top top1(.out(outw),.ain(ain),.bin(bin),.enable1(enable1),.enable2(enable2),.select(select));
endmodule
现在我们的逻辑关系图变成了这样:
t1模块内调用top模块创建了实例top1。如果用第一种方法改变参数的话,我们还需要创建一个新的模块来调用t1里的东西:
module Annotate;
defparam
t1.top1.mytrist1.control=0,t1.top1.mytrist2.control=0;
endmodule
t1.top1.mytrist1.control=0这一句话是重点。我们再来看一下逻辑关系图:
Annotate模块调用了t1,t1调用了mytri1,而mytri1调用了自己的control参数变量,并将其赋值为0.
2.方法二
方法二更简单了,我们的逻辑关系图像这张图这样就好了:
唯一需要改变的地方只是在top模块中加上赋值就好了
module top(out,ain,bin,enable1,enable2,select);
output out;
input ain,bin,enable1,enable2,select;
mytri #0 mytrist1(.out(out1),.in(ain),.enable(enable1));
mytri #0 mytrist2(.out(out2),.in(bin),.enable(enable2));
muxtwo mymux(.out(out),.a(out1),.b(out2),.sl(select));
endmodule
总结
本章讲述了参数变量的使用。刚开始大家可能会有点绕。但是通过画了逻辑关系图之后,希望大家可以对Verilog的模块化和层次化有更深的概念。