资源描述:
《Verilog模块modul》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第二讲Verilog语法Verilog模块moduleVerilog语法要素Verilog数据类型及逻辑系统2.1模块module模块是verilog设计中的基本功能块,在第一讲有简单交待,这里详细介绍模块内部构成module模块名(端口列表);端口声明,参数声明wire,reg和其它类型的变量声明数据流语句(assign)低层模块实例always和initial块,所有行为语句都在块内任务和函数endmodule必须出现可选module能够表示:物理块,如IC或ASIC单元逻辑块,如一个CPU设计的ALU部分整个系统每一个模块的描述从关键词module开始,有一个
2、名称(如SN74LS74,DFF,ALU等等),由关键词endmodule结束。module内部的5个部分:变量声明数据流语句低层模块实例行为描述块任务和函数每一部分在module内部出现的顺序是任意的。一个verilog源文件中可以有多个模块,且对排列顺序不做要求。端口(Terminal)端口是模块与外界环境交互的接口.例如IC芯片的输入、输出引脚就是它的端口。对于外部环境来讲,模块内部是不可见的,对模块的调用(实例引用)只能通过其端口进行。这种特点为设计者提供了很大的灵活性:只要接口保持不变,模块内部的修改并不会影响到外部环境.我们也常常将端口称为终端(Term
3、inal)。模块端口等价于芯片的管脚(pin)模块通过端口与外部通信端口列表和端口声明端口在模块名字后的括号中列出端口可以说明为input,output及inout端口等价于硬件的引脚(pin)input输入端口output输出端口inout双向端口端口声明也可以采用类似ANSIC格式来声明端口//D触发器moduleD_FF(inputd,clk,clr,outputregq,qb);……………………endmodulemoduleadder(cout,sum,a,b,cin);input[2:0]a,b;inputcin;outputcout;output[2:0
4、]sum;assign{cout,sum}=a+b+cin;endmodule例设计三位全加器这个例子描述了一个三位的加法器。从例子中可以看出整个VerilogHDL程序是嵌套在module和endmodule声明语句里的,只出现了一个assign语句。addersum[2:0]a[2:0]b[2:0]cincout模块名端口列表端口声明数据流语句例SR触发器模块//SR触发器moduleSR_FF(Q,Q_n,S,R);outputQ,Q_n;//端口声明inputS,R;nandn1(Q,S,Q_n);nandn2(Q_n,R,Q);endmodule模块中的5
5、个部分并没全部出现,只出现在低层次模块实例化nand为verilog中的与非门门级原语部件D触发器模块//D触发器moduleD_FF(d,clk,clr,q,qb);outputq,qb;inputd,clk,clr;regq,qb;//输出端口q,qb值保存always@(posedgeclk)beginif(clr)q=1’b0;elseq=d;endnot(qb,q);endmodule该模块内包括always行为块语句always块行为描述语句4位寄存器设计moduleD_FF(d,clk,clr,q,qb);....endmodulemoduleREG4
6、(d,clk,clr,q,qb);output[3:0]q,qb;input[3:0]d;inputclk,clr;D_FFd0(d[0],clk,clr,q[0],qb[0]);D_FFd1(d[1],clk,clr,q[1],qb[1]);D_FFd2(d[2],clk,clr,q[2],qb[2]);D_FFd3(d[3],clk,clr,q[3],qb[3]);endmodule模块中只出现在低层次模块实例化可以将模块的实例通过端口连接起来构成一个大的系统或元件。在上面的例子中,REG4有模块DFF的四个实例。注意,每个实例都有自己的名字(d0,d1,d2,
7、d3)。实例名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。实例中端口的次序与模块定义的次序相同。模块实例化与调用程序不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。模块实例化(moduleinstances).端口与外部信号的连接在调用模块时,可以用顺序连接和按名连接把模块定义的端口与外部信号连接起来顺序连接:需要连接的信号需要与模块声明的端口列表一致;按名连接:端口和外部信号按名字连接在一起.D_FFd0(d[0],clk,clr,q[0],qb[0]);D_FFd1(d[1],clk,clr,q[1],qb[1]);D_FFd2(d[2