行为级建模
超过4级 if else要用case语句
case(控制表达语句)
值1:语句块1
值2:语句块2
…
值n:语句块n
default:语句块n+1
endcase
case是全等比较,不仅比较值,还会比较x与z;
casex
casez
使用case语句需要注意的是:
1)值1到值n之间必须各不相同,一旦判断到与某值相同并执行相应语句块后,case语句的执行便结束。
2)如果某几个连续排列的值项执行的是同一条语句,则这几个值项间可以用逗号相隔,而将语句放在这几个值项的最后一个中。
3)default选项相当于if else中的else部分,可依据需要用或者不用。
4)case语句的所有表达式的值的位宽必须相等,只有这样的表达式和分支表达式才能进行比较。
case语句是组合电路:化简表达式,卡诺图,真值表,形成电路。
module latch_case (a,b,sel,out)
input a,b;
input [1:0]sel;
ouput out;
reg out;
always@(a,b,sel)
case(sel)
2’b00:out = a;
2’b11:out = b;
default:out = 0;
endcase
endmodule
数字电路重复是利用计数器,并不是循环语句。
连续赋值语句只有一个 assign;通过运算符可以描述所有的组合电路。
结构化建模
用语言的方式将模块连接在一起。
模块的结构描述方式分为以下三类:
(1)模块级建模:通过调用由用户设计生成的低级子模块来对硬件电路结构进行说明,这种情况下模块由低级模块实例组成。
模块的调用;在VerilogHDL中,模块可以被任何其他模块调用,这种调用实际上是将模块所描述的电路复制并连接的,调用的基本语法格式是:
模块名<参数列表>实例名(端口名列表);
实例名是被调用模块在当前模块中间的名称。
一个简单调用的例子:
module and_2(a,b,c) //2输入与门
input a,b;
output c;
assign c=a&b;
endmodule;
module logic(in1,in2,q); //顶层模块
input in1,in2;
output q;
and_2 U1(in1,in2,1) //模块的调用 U1为实例名
endmodule
当需要对一个模块进行多次调用时,还可以采用阵列,语法格式如下:
<被调用模块名><实例阵列名>阵列左边界 : 阵列右边界;
模块参数值
parameter a = 1;
defparam
(2)门级建模:通过调用VerilogHDL内部的基本门级元件来对硬件电路的结构进行说明,这种情况下模块将由基本门级元件的实例组成。
基本门,and nand
三态门 buf
and A1(out,in1,in2);
or(a,b,c,d)
(3)开关级建模:通过调用verilogHDL内部的基本开关元件来对硬件电路的结构进行说明,这种情况下模块将由基本开关级元件的实例组成。