您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > verilog学习笔记
模块的结构、数据类型、变量和基本运算符号module模块名(口1,口2,.....)引用模块端口:严格按照端口的顺序来连接:模块名(连接端口1信号名,连接端口2信号名,.....);引用时用'.'符号,标明原模块是定义时规定的端口号:模块名(.端口1名(连接信号1名),.端口2名(连接信号2名)....);eg;mydesignM1(.sin(serialin),.pout(parallel))sin/pout是M1的mydesign的端口,serialin/parallel是M1的端口,是M1引用mydesign的模块输入口:input[信号位宽-1:0]端口名1;输出口:output[信号位宽-1:0]端口名2;输入/输出端口:inout[信号位宽-1:0]端口名3I/O说明写在端口声明中:modulemodule_name(inputport1,ouputport2,inoutport3);reg[width-1:0]R变量1,变量2.....;wire[width-1:0]W变量1,变量2.....;assign后面加一个方程式即可eg;assigna=b&c#延时单位时间eg;#2延时两个单位时间always用来描述组合逻辑和时序逻辑;always@(posedgeclkorposedgeclr);//上下列子等价beginif(clr)q=0;elseif(en)q=d;endassign、时例元件、always块是同时执行的,相当于并发运行的,顺序不会影响实现的功能四种最基本的数据类型:reg、wire、integer、parameter//其他类型;large、medium、scalared、time、small、tri、trio、tril、triand、trior、trireg、vectored、wand、wor整数四种进制表示;二进制/b/B八进制/o/O十进制/d/D十六进制/h/H三种表示方式:位宽‘进制数字//3'b001‘进制数字//默认位宽,由具体的机器决定,至少是32位数字//默认位宽和进制(十进制)eg;4位二进制数的位宽是44位十六进制数的位宽是16x,zx代表不定值,z代表高阻值,z可写作?//提高程序可读性//x在16进制中表示4位二进制,8进制表示3位二进制,二进制中一位负数只需要在位宽前面加'-'号//必须写在数字定义表达式的前面//-3'b001下划线分隔开数提高程序的可读性//只能用于具体的数字之间//3'b0_0_1parameter型定义一个标识符代表一个常量,是参数型数据的确认符:parameter参数1=表达式,参数2=表达式,.......//表达式可以是数字或者已定义过的参数eg;parameteraverage_delay=(r+f)/2;eg:moduleDecode(A,F);parameterWidth=1,polarity=1;...endmodulemoduleTop;wire[3:0]A4;wire[4:0]A5;wire[15:0]F16;wire[31:0]F32;Decode#(4,0)D1(A4,F16)//Wieth=4,Polarity=0Decode#(5)D1(A4,F16)//Wieth=5,Polarity=1defparam改变另一个模块中的参数//利用这种方法把布线延迟通过布线工具生成的延迟参数文件反标注到焖鸡Verilog网表上eg;'include'Top.v''include'Block,v''include'Annotate,v'moduleTest;wireW;TopT();endmodulemoduleTop;wireW;BlockB1();BlockB2();endmodulemoduleBlock;parameterP=0;//--endmodulemoduleAnnotate;defparamTset.T.B1.P=2;//--=2Tset.T.B2.P=3;//--=3endmodulewire/tri网络类型的变量不能储存值,只能由驱动器驱动//门或连续赋值语句,assign,驱动器为连接网络,该变量的值为高阻值z:wire表示单个门驱动或连续赋值语句驱动的网络型数据,tri表示多驱动器驱动的网络型数据wire:输入输出参数类型默认定义为wirewire[n-1:0]/[n:1]数据名1,数据名2,......数据名i//i条总线,每条总线内有n条线路eg;wirea;//1个1位的wire数据wire[7:0]b;//1个8位的wire数据wire[4:1]c,d;//2个4位的wire数据reg:寄存器数据类型关键字,默认初始值为x/一位,通常用来表示always模块内的指定信号,通过行为描述语句表达逻辑关系always模块内每一个信号必须定义为reg型reg[n-1:0]/[n:1]数据名1,数据名2,......reg数据是一个表达式中的操作数时,它的值被当做无符号值,即正值memory:对reg变量建立数组来对储存器建模,可以描述RAM存储器、ROM存储器、reg文件。数组中的每一个单元通过一个数组索引进行寻址,没有多维数组。memory数据是通过扩展reg型数据的地址范围来生成的。reg[n-1:0]存储器名[m-1:0]/[m:1]//n位存储器,m个存储器eg;reg[7:0]mema[255:0]对存储器进行地址索引的表达式必须是常数表达式对于同一数据类型声明。可以同时定义存储器类型和reg类型eg;parameterwordsize=16,memsize=256;reg[wordsize-1:0]mem[memsize-1],writerreg,readreg;reg[n-1:0]/regmema[n-1:0]不同eg;reg[wordsize-1:0]mem[memsize-1],writerreg,readreg;writerreg=0;/men[3]=0;//第三个存储单元赋值为0运算符:算术运算符+-x/%赋值运算符==关系运算符==逻辑运算符&&||!条件运算符?:位运算符~|^&^~//除~单目,为双目移位运算符拼接运算符{}单目运算符:带一个操作数,放置运算符右边双目运算符:带两个操作数,放置运算符两边三目运算符:r=s?t:u在硬件电路中信号有四种状态0,1,x,z不同长度的数据进行位运算时,右端对齐,较小位数操作数高端填充0运算符、赋值语句和结构说明语句逻辑运算符:&&逻辑与||逻辑或!逻辑非&&||优先级低于关系运算符!优先级高于算术运算符关系运算符优先级低于算术运算符等式运算符:==等于!==不等于====等于!==不等于移位运算符:0填充补移出的空位移位的位数变化:eg;4'b10011=5'b100104'b10012=6'b10010004'b10011=4'b01014'b10012=4'b010016=32'b1000000//默认最少是32位位拼接运算符:把多个信号的某些位拼接起来进行位操作{信号1的某几位,信号2的某几位,信号3的某几位,......信号n的某几位}eg;{a,b[3:0],w,3'b101}={a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}不允许存在没有指明位数的信号eg;{4{w}}={w,w,w,w}/{b,{3{a,b}}}={b,a,b,a,b,a,b}//4,3必须是常数表达式缩减运算符:单目运算符,具有与或非运算规则运算法则:第一步先将操作数的第1位与第2位进行与或非运算,第二步先将操作数的第2位与第3位进行与或非运算,......eg;reg[3:0]B;regc;c=&B;相当于c=((B[0]&B[1])&B[2])&B[3]优先级别:!~-*/%-+---==-==!=====!===-&-^^~-|-&&-||?:关键词:MD太多了,不想记!!!!赋值语句:非阻塞不能立即为下面的语句所用,块结束才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的,时序逻辑电路常用非阻塞赋值符号=阻塞时序逻辑电路赋值会得到意想不到的结果块语句:多条语句组合在一起,更像是一条语句begin_end//顺序执行,顺序块/fork_join//并行执行,并行块顺序块:每条语句的延迟时间是相对于前一条语句的仿真时间而言begin语句1;语句2;...语句n;end//begin:块名//块名即该块的名字,一个标识名,声明语句可以是参数声明语句、reg、interger、real块内声明语句语句1;语句2;...语句n;并行块://每条语句的延迟时间是相对于程序流程控制进入块内的仿真时间而言,延迟时间是用来给赋值语句提供执行时序的fork语句1;语句2;...语句n;join//fork:块名、//声明语句可以是参数声明语句、reg、interger、real、time、事件event语句1;语句2;...语句n;join块名://块内定义局部变量,允许块被其他语句调用/disable,静态变量/所有的变量只有一个唯一的存储地址条件语句、循环语句、块语句和生成语句if_elseif()if()/elseif()/elseif()/elseelse总与最近的if配对条件语句必须在过程块中使用0,x,z为假case//常用于微处理器的指令译码case(表达式)case分支endcasecasez(表达式)case分支endcasecasex(表达式)case分支endcasecase(sele)16'b2:reu=10'd916'b3:reu=10'd316'b5:reu=10'd1default:reu=10'd5endcasecasez处理不考虑高阻值z的比较过程,casex则将高阻值z和不定值x都视为不关心的情况循环语句:foreverrepeatwhileforforever/连续的执行语句forever语句repeat/连续执行一条语句n次repeat(表达式)语句eg;repeat(size)beginif(shif_opb[1])result=result+shif-opa;shif_oba=shif_opa1;shif_opb=shif_opb1;endwhile/执行一条语句直到满足while(表达式)语句eg;while(tempreg)beginif(tempreg[0])count=count+1;tepreg=rempreg+1;endforfor(表达式1;表达式2,表达式3)语句eg;for(tempi=0;tempimemsize;tempi=tempi+1)/for(tempi=rega;tempi;tempi1)命名块:可以ton更说层次名引用进行访问,可以被禁用moduletop;initialbegin:block1integeri://静态本地变量i,top.block1.i被其他模块引用..end禁用/disable,从循环中退出,处理错误条件及根据控制信号来控制某些代码段是否被执行eg;reg[15:0]flag;integeri;initialbeginflag=16‘b0010_0000_0000_0000;i=0;begin:block1while(i1)beginif(flag[i])begin$display(xdcfvgbhnijok)disbleblock1;endi=i+1;endendend生成块:控制变量的声明、人任务或函数的调用、对实例引用进行全面控制/generate-end..可以是模块、用户定义原语、门级原语、连续赋值语句、initial、always生成范围内声明下列数据类型:net、reg、integer、real、time、realtime、eventdefparam任务和函数不允许在循
本文标题:verilog学习笔记
链接地址:https://www.777doc.com/doc-1465867 .html