一、verilog基本结构
verilog使用模块,每个模块对应电路中的逻辑实体,模块module由下面几部分组成:
1.1 模块声明
格式: module 模块名(端口1,....,端口n);
例子: module example (in1,out1 ,inout1);
1.2 输入/输出端口说明
格式: input [n-1,0] 端口名;
output [n-1,0] 端口名
inout [n-1,0] 端口名;
例子: input [3,0] in1; //定义一个端口名为in1的四位输入
1.3 信号类型声明
对信号的数据类型进行声明
格式: wire 信号名
reg[n-1,0] 信号名
例子: reg[3,0] sub //定义信号sub的数据类型为4位reg型
1.4 逻辑功能描述
逻辑功能描述是模块module的核心,定义逻辑功能常用的几种方法:
1.4.1 数据流描述
数据流描述使用assign持续赋值语句
格式: assign [延迟] 变量名(信号名)=表达式
例子: assign Y = sel? D1:D0 //2选1的选择器
1.4.2 结构描述
结构描述又称为元件例化,将现有的电路单元和模块module作为元件来调用,调用现有电路单元叫做门级结构描述,调用定义的module叫做模块结构描述
现有的电路单元: and , nand , or ,nor, xor,xnor, not, buf ,bufif0(反着念,低电平使能三态缓冲器),bufif1,notif0,notif1(高电平使能三态非门),共12个门类型,根据们类型的端口特点,分为多输入门、多输出门(buf,not)和三态门。
现有的模块:即定义的module
例子: and(y,x1,x2) //x1和x2与操作之后给y,
//门极结构描述端口列表位先输出后输入
例子: module example(in1,in2,out); //定义模块
.........
example mux(x1,x2,y) //调用该模块
//模块结构描述端口列表的实际信号顺序必须与模块定义时的端口顺序完全相同!
1.4.3行为描述
行为描述常用always语句,always块语句中常用多种行为语句来表达逻辑,注意,在always块中被赋值的信号变量必须被定义位reg型!
格式:always @(信号1 or 信号2 or 信号n)
begin
......
end
1.4.4 混合描述
混合描述以行为描述为核心,穿插使用数据流描述和结构描述
例子:
//参考《现代数字电子技术设计及verilog设计》第49页
module full_add (a,b,c,sum,cout) ; //模块声明
intput a,b,c;
output sum,cout;
reg m1,m2,m3;
wire cout,s;
xor(s1,a,b)
assign sum=s1^c; //数据流描述
always @(a or b or c) //行为描述
begin
m1=a & b;
m2=b&c;
m3 =a&c;
end
endmodule