Verilog入门学习笔记——第二弹
扫描二维码
随时随地手机看文章
一、Verilog内部的基本门级元件
-
多输入的逻辑门:多个输入,一个输出。多输出门……
-
多输入门的输出不为高阻态z
-
多输入与门调用例举:
1and A1(out, in1, in2, ..., inN);
-
多输出门调用形式:
1buf B1(out1, out2, ..., outN, in); 2not N2(out1, out2, ..., outN, in);
-
三态门:一个门输出、一个数据输入、一个输入控制
输入控制信号无效时,输出为高阻态z -
三态门调用形式:
1bufif1 B1(out, in, ctrl);bufif0 B0(out, in, ctrl); 2notif1 N1(out, in, ctrl);notif0 N0(out, in, ctrl);
二、Verilog基本结构
1、模块module
-
定义模块基本语法结构
1module模块名(端口名1, 端口名2,端口名3,...); 2端口模式说明(input, output, inout); //说明部分 inout双向端口 3参数定义(可选); 4数据类型定义(wire, reg等); 5 6实例化低层次模块或基本门级元件; //逻辑功能描述部分,排序任意 7连续赋值语句(assign); 8过程块结构(initial和always) 9 行为描述语句; 10endmodule
-
例
-
门级描述
1/*module mux2to1(D0, D1, S, Y); //2选1数据选择器 2 input D0, D1, S; //输入端口声明 3 output Y; //输出... 4 */ 5module mux2to1(input D0, D1, S, output Y); 6 wire Snot, A, B; //内部节点... 7 //↓描述逻辑功能 8 not U1(Snot, S); 9 and U2(A, D0, Snot); 10 and U3(B, S, D1); 11 or U4(Y, A, B); 12endmodule
-
数据流描述
1module mux2to1_dataflow(D0, D1, S, Y); 2 input D0, D1, S; 3 output Y; 4 wire Y; 5 //电路功能描述 6 assign Y = (~S & D0)|(S & D1); //★表达式左边变量的数据类型必须为wire 7endmodule
-
行为描述(工作效率更高)

S=0时,Y=D0;S=1时,Y=D1
1/*module mux2to1_bh(D0, D1, S, Y); 2 input D0, D1, S; 3 output Y; 4 reg Y; //变量的数据类型声明 5 always@(S or D0 or D1) //S、D0、D1中有任何一个输入端信号变动都会执行 6 if(S==1) //if(S) Y=D1; 7 Y=D1; 8 else 9 Y=D0; //★表达式的左边必须为reg型数据类型 10endmodule 11*/
可简化为↓
1module mux2to1_bh( 2 input D0, D1, S, 3 output reg Y 4); 5 always@(D0, D1, S) 6 begin 7 if(S) Y=D1; 8 else Y=D0; 9 end 10endmodule
-
always@(S or D0 or D1)无分号,表示括号中任一个变量发生变化时,下面的赋值语句会被执行一次,执行完最后一条语句后,执行挂起,always再次等待变量发生变化。
括号内的为敏感变量
-
组合逻辑电路中所有输入信号皆为敏感变量。都应写在括号内。
-
过程赋值语句只能赋值寄存器型变量,输出Y的数据类型定义为reg。
always@(*)对比assign
-
被assign赋值的信号为wire型
被always@(*)结构块下的信号定义为reg型,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿出发的写法才会综合为触发器,在仿真时才具有触发器的特性。 -
连续赋值语句assign可以并行执行,相当于描述的是连线
always@(*)描述组合逻辑时,begin和end之间是串行,一条一条语句执行
三、仿真
搭建测试平台Test Bench
矢量波形文件(.vwf)





