Verilog基础知识
- 模块
Verilog HDL语言的基本单元为模块(module),一个模块代表一个特定功能的电路,它的基本结构为: - 模块调用
调用的语法格式为:
模块名<参数列表>实例名(端口列表);
如需多次调用:
模块名<参数列表>实例名1(端口列表1);
<参数列表>实例名2(端口列表2);
…
还可以使用阵列调用方式:
模块名<实例阵列名>阵列边界; - 端口对应方式
1、 端口位置对应:模块名<参数表>实例名(<信号1>,<信号2>,……);
2、 端口名称对应: 模块名<参数表>实例名(.端口名1(<信号名1>),.端口名2(<信号2>)……);
为了增强程序的可维护性与易读性,推荐使用第二种端口对应方式。 - 位宽不匹配
1) 未连接端口,输入端赋值被置为z。
2) 端口位宽不同: - 内置的门级器间
- 连续赋值语句
作用:对线网进行赋值(wire型变量)。
显示连续赋值 assign #=assignment expression
隐式连续赋值
<net_declaration><derive_strength>#=assignment expression
例:wire(strong0,weak1)[3:0]#(2,1,3)w=(ab)&(mn); - 逻辑运算符
算术运算符:加法(+),减法(-),乘法(*),除法(/)和取模(%)
算术运算的结果位宽由最终赋值结果的位宽决定。
关系运算符:大于(>),小于(<),大于等于(>=),小于等于(<=),比较结果为1bit信号,成立为“1‘b1”,否则为“1’b0”,不确定状态为“1‘bx”,操作数的位宽不同时,位宽短的信号左边补0.
相等运算符:等于(),不等于(!=),全等(=),非全等(!==)。等于与不等于为逻辑等式运算符,结果由操作数的值决定,而全等和非全等运算符对操作数进行按位比较。两个操作数必须完全一致。
逻辑运算符:逻辑运算符有三种,逻辑与(&&)、逻辑或(||)、逻辑非(!)。前两种为双目运算符,最后一个则为单目运算符。操作数只能为0或1。如果操作数为1位则0为假1为真,多位则全0为逻辑0,只要有一位为1则为逻辑1.
按位运算符:五类,按位取反(),按位与(&),按位或(|),按位异或(^),按位同或(^) ,按位运算符是对每一位进行运算。位少的会在高位补0.
归约运算符:与(&),或(|),异或(^),以及相应的非操作。归约运算符的操作数只有一个,由低向高操作。
移位运算符:左移位(<<),右移位(>>),所移动的位数由右边的操作数决定。
条件运算符:条件运算符为唯一的三目运算符表达形式为:
<条件表达式>?<表达式1>:<表达式2>
条件表达式为真时,输出表达式1,为假时输出表达式2.
例:assign out=(!sel)?in1:in2;
连接和复制运算符:连接运算符({}),复制运算符({{}}),又称拼接运算符。
拼接:{信号1某几位,信号2某几位,……}
重复运算符({{}})将一个表达式放入双重括号中,复制因子在第一层。。