- 模块结构
- assign
模块结构:
module 模块名([端口列表]);
[端口信号声明;]
[参数声明;]
常用语句:
- assign
- always
- 底层模块调用
endmodule
2选1多路选择器的Verilog描述
#2选1多路选择器
#模块名 端口列表
module MUX21 (a,b,c,d);
#端口信号声明
#说明哪个是输出,哪个是输入
input a,b,c;
output d;
#assign语句
assign d = (a?b:c);
endmodule
边沿D触发器的Verilog描述
#边沿D触发器
module DFF(CLK,D,Q);
output Q;
input CLK,D;
reg Q;
always @(posedge CLK)
Q<=D;
endmodule
模块说明部分:
端口信号声明:输出输入的属性 数据类型 位宽 名称
参数声明:parameter 数据类型 参数名 = 初值
模块名
是电路的名字,由用户指定的,一般与文件名一致
端口列表
电路的输入/输出信号名称列表,信号是由用户指定的,各个名称用逗号隔开
端口信号声明
声明端口信号的输入输出属性、信号的数据类型,信号的位宽
输入输出属性:input output inout
信号的数据类型:wire 线类型
reg 寄存器类型
位宽:[n1:n2]
同一类信号用逗号隔开
位宽不做说明的话,默认是一位
数据类型不做说明,默认是wire型
参数声明
参数的名称+初值
例子
module full_adder (A,B,CIN,S,COUT);
input [3:0] A,B;
input CIN;
output reg [3:0]S;
output COUT;
endmodule
S位宽是4位。对应信号为S[3]S[2]S[1]S[0]
assign语句
连续赋值语句
assign y=a;
assign y =a&b;
总是处于激活状态,只要表达式中的操作数有变化,立即进行计算和赋值(区别于过程赋值语句)
赋值目标必须是wire(电路间的连线)
算术型
*乘法
/除法
+加法
-减法
%求余 只能是整数,取第一个操作数的符号
**求幂
逻辑型
!非
&&与
||或
结果可以为 1 0 x(不确定)
不是0或者x就一定是1
表达式要加括号
等价运算符
==等于
!=不等于
===case等于
!==case不等于
等于和不等于结果是 0 1 x
对于x和z,认为是不确定的,比较结果也是x
case运算,结果只能是1或者0
对于x和z认为是确定的值,参加比较
按位运算符
~ 按位非
&按位与
|按位或
^按位异或
~^按位同或
^~按位同或
操作数为1位或者多位的二进制数,除了按位非以外(一个),可以是两个及以上
位宽不一样的,自动左填0补齐
结果与操作数位宽相同
缩减运算符
&缩减与
~&缩减与非
|缩减或
~|缩减或非
^缩减异或
~^缩减同或
^~缩减同或
缩减运算的操作数是1位或者多位二进制数
缩减运算操作数只有一个,将该数的各位自左向右进行逻辑运算,结果只有一位
移位运算符
>>右移
<<左移
>>>算术右移
<<<算术左移
格式:操作数 移位符 n;
向左、右移动n位
对有符号数的算术右移自动补齐符号位
其他的自动补零
拼接复制运算符
{} 拼接 {操作数1,操作数2,操作数3, ...} 将多个操作数拼接起来
{{}} 复制拼接 {n{操作数1,操作数2,操作数3, ...}} 将多个操作数复制n遍拼接起来
可以组合使用
条件运算符
?:用于条件赋值
Y=A? B : C
如果 A=1,Y=B
如果A=0,Y=C
如果A=x,Y=x
可以嵌套