Verilog HDL程序笔记4

Verilog HDL程序笔记4

Verilog HDL程序笔记1:写出属于你的第一个Verilog HDL模块

Verilog HDL程序笔记2:Testbench模块的使用

Verilog HDL程序笔记3:另外两种电路描述方式

前言

上一章我们学习了另外两种电路描述的方式。我们做出了更加复杂的仿真实验。今天我们将要介绍另外一种变量,具体是什么呢?请往下看。

一、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的模块化和层次化有更深的概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值