您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > Java > Verilog语言快速入门
1Verilog设计快速入门2内部信号声明assign语句底层模块或门原语调用(包括生成块)Initial或always语句块任务和函数定义module模块名([端口列表]);[端口信号声明;][参数声明;]endmodulespecify块(路径延迟)Verilog模块结构说明:浅色部分用得较少;常用语句只有三种:assign语句always语句底层模块调用语句三种语句顺序无关除开始的module模块名和结束的endmodule必须写外,其他都是可选的。功能描述部分模块说明部分3Verilog模块结构例1:二选一数据选择器的描述二选一数据选择器的结构之一二选一数据选择器的符号设a、b、s波形已知,可得y波形:4Verilog模块结构2选1多路选择器的Verilog描述内部信号声明assign语句底层模块或门原语调用always语句块module模块名([端口列表]);[端口信号声明;][参数声明;]endmoduleabsyMUX21a5Verilog程序结构例2:边沿D触发器的Verilog描述内部信号声明assign语句底层模块或门原语调用always语句块module模块名([端口列表]);[端口信号声明;][参数声明;]endmodule6Verilog模块结构1.模块说明部分module模块名([端口列表]);[端口信号声明;][参数声明;]模块名是指电路的名字,由用户指定,最好与文件名一致(特别是在QuartusII软件中调试时);端口列表是指电路的输入/输出信号名称列表,信号名由用户指定,各名称间用逗号隔开;端口信号声明是要说明端口信号的输入输出属性、信号的数据类型,以及信号的位宽;输入输出属性有input,output,inout三种,信号的数据类型常用的有wire和reg两种;信号的位宽用[n1:n2]表示;同一类信号之间用逗号隔开;参数声明要说明参数的名称和初值输入输出属性数据类型位宽名称parameter数据类型参数名=初值7例:modulefull_adder(A,B,CIN,S,COUT);input[3:0]A,B;inputCIN;outputreg[3:0]S;outputCOUT;位宽如果不做说明的话,默认是1位;数据类型不做说明的话,默认是wire型的。S位宽为4位,对应信号为S[3]、S[2]、S[1]、S[0]根据模块说明部分,我们可以得出电路符号ABCINSfull_adderCOUT82.assign语句内部信号声明assign语句底层模块或门原语调用always语句块module模块名([端口列表]);[端口信号声明;]endmoduleassign语句称作连续赋值语句assign赋值目标=表达式例:特点:之所以称为连续赋值语句是指其总是处于激活状态,只要表达式中的操作数有变化,立即进行计算和赋值。(与连续赋值语句对应的另一种语句称为过程赋值语句)赋值目标必须是wire型的,wire表示电路间的连线。ayAbyassigny=a;assigny=a&b;基本格式:92.assign语句例:assignM=B|C;assignY=A&M;MM和Y都必须是wire型的102.assign语句Verilog具有丰富的表达式运算功能,可用于assign语句详见夏宇闻教材第6章,自学。(1)算术型*乘法/除法+加法-减法%求余**求幂例:Y=5%2;Y=2**3;求余,结果为1求幂,结果为8说明加减乘除、求幂的操作数可以是实数也可以是整数,求余运算的操作数只能是整数。求余运算结果取第一个操作数的符号;(2)逻辑型!逻辑非&&逻辑与||逻辑或例:Y=!(32)Y=(23)&&(56);Y=(23)||(56);Y=(23)&&1’bx;Y=(2+3)||(3-3);逻辑非,结果为0逻辑与,结果为0说明逻辑型运算的结果可能是1(逻辑真)、0(逻辑假)、x(不确定);逻辑运算的操作数可以是任意表达式,表达式的结果被当做逻辑值处理,只有1、0、x三种情况,非0、x即1;表达式最好加括号。逻辑或,结果为1逻辑与,结果为x逻辑或,结果为1(3)关系运算符大于小于=大于等于=小于等于例:Y=(32)Y=(32);Y=(3=2);Y=(3=2);Y=(3=1’bx);结果为1结果为0说明关系运算的结果可能是1(逻辑真)、0(逻辑假)、x(不确定);结果为1结果为0结果为x(4)等价运算符==等于!=不等于===case等于!==case不等例:Y=(3==2);Y=(3!=2);Y=(3==3);Y=(1’b1==1’bx);Y=(1’bx==1’bx);Y=(1’b1===1’bx);Y=(1’bx===1’bx);结果为0结果为1说明等于和不等于运算的结果可能是1(逻辑真)、0(逻辑假)、x(不确定);对于x或z,认为是不确定的值,比较结果为x;case等和case不等的结果只能是1或0,对于x、z认为是确定的值,参加比较;结果为1结果为x结果为x结果为0结果为1(5)按位运算符~按位非&按位与|按位或^按位异或~^^~按位同或例:Y=~4’b1001;Y=4’b1001&4’b0111Y=4’b1001|4’b0111;Y=3’b001|4’b0111;Y=3’b001|4’b0111&3’b101;结果为0110结果为0001说明按位运算的操作数是1位或多位二进制数,按位非的操作数只有一个,将该数的每一位求非运算。其它按位运算的操作数有2个或多个,将两个操作数对应的位两两运算;如果操作数位宽不同,位宽小的会自动左添0补齐;结果与操作数位宽相同;结果为1111结果为0111结果为0101(6)缩减运算符&缩减与~&缩减与非|缩减或~|缩减或非^缩减异或~^^~缩减同或例:Y=&4’b1001;Y=~&4’b1001;结果为0结果为1说明缩减运算的操作数是1位或多位二进制数;缩减运算的操作数只有一个,将该数的各位自左至右进行逻辑运算,结果只有一位。(7)移位运算符右移左移算术右移算术左移例:Y=4’b10011;Y=4’sb10011;结果为0100结果为1100说明移位运算的操作数是1位或多位二进制数;向左或向右移n位;只有对有符号数的算术右移自动补符号位;其他移位均自动补0。操作数移位符n;格式(8)拼接复制运算符{}拼接{{}}复制拼接例:Y={4’b1001,2’b11};Y={4{2’b01}};Y={{4{2’b01}},2’b11};结果为100111结果为01010101说明将多个操作数拼接起来;将操作数复制n遍并拼接起来;可以组合使用。{操作数1,操作数2,…}格式{n{操作数1,操作数2,…}}格式(9)条件运算符?:用于条件赋值例:Y=a?b:c;Y=s1?(s0?d3:d2):(s0?d1:d0);如果a=1,则y=b;如果a=0,则y=c。如果a=x,则y=x。说明根据表达式1的值,决定运算结果;如果表达式1值为1,则结果等于表达式2;如果表达式1值为0,则结果等于表达式3;如果表达式1值为x,则结果为x;可以嵌套。表达式1?表达式2:表达式3格式一203.always语句块内部信号声明assign语句底层模块或门原语调用always语句块module模块名([端口列表]);[端口信号声明;]endmodulealways语句块又称过程块基本格式:always@(敏感信号条件表)各类顺序语句;特点:always语句本身不是单一的有意义的一条语句,而是和下面的语句一起构成一个语句块,称之为过程块;过程块中的赋值语句称过程赋值语句;该语句块不是总处于激活状态,当满足激活条件时才能被执行,否则被挂起,挂起时即使操作数有变化,也不执行赋值,赋值目标值保持不变;赋值目标必须是reg型的。例:always@(posedgeCLK)Q=D;3.always语句块激活条件由敏感信号条件表决定,当敏感条件满足时,过程块被激活。敏感条件有两种,一种是边沿敏感,一种是电平敏感。电平敏感:(posedge信号名)边沿敏感:(negedge信号名)(信号名列表)信号上升沿到来信号下降沿到来例:(posedgeclk)例:(negedgeclk)信号列表中的任一个信号有变化例:(a,b,c)当a,b,c中有一个发生变化说明:逗号可以换成or例:(aorborc)3.always语句块例:always@(posedgeCLK)Q=D;当CLK上升沿到来时,激活该语句块,将D的值赋给Q;否则,该语句块挂起,即使D有变化,Q的值也保持不变,直到下一次赋值。例:always@(D)Q=D;当D有变化时(不管是由1变0还是由0变1),激活该语句块,将D的值赋给Q;否则,该语句块挂起,Q的值保持不变,直到下一次赋值。DQDCLKQDQ3.always语句块说明:过程块中的赋值目标必须是reg型的。由于always语句可以描述边沿变化,在设计时序电路中得到广泛应用。always语句中还可以使用if、case、for循环等语句,其功能更加强大。例:always@(posedgeCLK)Q=D;例:always@(D)Q=D;必须是reg型的3.always语句块253.always语句块assign语句和always语句的主要区别:•连续赋值语句总是处于激活状态,只要操作数有变化马上进行计算和赋值;•过程赋值语句只有当激活该过程时,才会进行计算和赋值,如果该过程不被激活,即使操作数发生变化也不会计算和赋值。•verilog规定assign中的赋值目标必须是wire型的,而always语句中的赋值目标必须是reg型的。assignQ=Dalways@(posedgeclk)Q=D;例:只要D发生变化,马上进行计算和赋值;Q必须是wire型。只有当clk上升沿到来时,才能激活该块语句,才能进行计算和赋值;否则,即使D发生变化也不会计算和赋值。在未被激活时,Q的值保持不变。Q必须是reg型。263.always语句块always语句块中除了可以使用表达式赋值以外,还可以使用if,case等行为描述语句,还能够描述边沿变化,因此其功能比assign语句更强大(assign语句不能使用if等语句,也不能描述边沿变化)。例:moduleDFF2(CLK,D,Q,RST,EN)inputCLK,D,RST,EN;outputQ;regQ;always@(posedgeCLKornegedgeRST)beginif(!RST)Q=0;elseif(EN)Q=DendendmoduleDENQDCLKQRST273.always语句块always语句块中如果有多条赋值语句必须将其用beginend包括起来,assign语句中没有beginend。例:moduleadder(a,b,cin,s,cout)inputa,b,cin;outputs,cout;regs,cout;always@(a,b,cin)begins=a^b^cin;cout=(a&b)|(a&cin)|(b&cin);endendmodule思考问题:在仿真时,begin和end之间的语句执行顺序如何?请大家画出该模块的端口符号图和电路图3.always语句块beginend之间的赋值语句有阻塞赋值和非阻塞赋值之分。阻塞赋值:语句顺序执行,前面的执行完才能执行后面;赋值符号:=非阻塞赋值:所有语句并行执行。赋值符号:=赋值目标1=表达式1;赋值目标2=表达式2;赋值目标1=表达式1;赋值目标2=表达式2;赋值语句1会阻塞赋值语句2,即只有当赋值语句1执行完才能执行赋值语句2。赋值语句1不会阻塞赋值语句2,赋值语句1和赋值语句2并行执行。3.always语句块举例比较:阻塞赋值beginm=a*b;y=m;end非阻塞赋值beginm=a*b;y=m;end当m=a*b执行完才能执
本文标题:Verilog语言快速入门
链接地址:https://www.777doc.com/doc-6922902 .html